📆

GitHub Actionsのワークフロー内でpushイベントなのかscheduleイベントなのかを判定したい

2021/04/21に公開

GitHub Actionsである処理をpushとscheduleの両方から実行する際にscheduleの時はこのステップは処理したくないという要件があり、調べても参考事例を見つけられなかったので記事にしておこうと思います。

最初に結論

githubコンテキストに event_name というプロパティがあり、ここにワークフローがトリガーされたイベント名が入っています(pushなら'push'、scheduleなら'schedule'、pull_requestなら'pull_request' です)。
https://docs.github.com/ja/actions/reference/context-and-expression-syntax-for-github-actions#:~:text=github.event_name

これを使うことでscheduleの場合だけこのステップを実行する/しない、という処理がかけます。

サンプルコード

Node.jsのアプリケーションをデプロイするワークフローでmainブランチにコミットが積まれたときと定期的にデプロイをかけたいケースを想定していて、スケジューラーでデプロイが成功した時は通知をしないという要件を満たしてみます。

name: Deploy
on:
  push:
    - main
  schedule:
    - cron: 0 21 * * *

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Setup node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Resolve frontend dependencies
      run: yarn install
      
    - name: Deploy
      run: yarn deploy

    - name: Notify to slack on success
      # scheduleの場合はデプロイ成功通知を送らないようにする
      if:  ${{ success() && github.event_name != 'schedule' }}
      uses: tokorom/action-slack-incoming-webhook@main
      env:
        INCOMING_WEBHOOK_URL: https://hooks.slack.com/services/hogehoge
      with:
        text: "デプロイが完了しました。"

    - name: Notify to slack on failure
      if: ${{ failure() }}
      uses: tokorom/action-slack-incoming-webhook@main
      env:
        INCOMING_WEBHOOK_URL: https://hooks.slack.com/services/hogehoge
	with:
          text: "デプロイに失敗しました。"

${{ github.event_name != 'schedule' }} を使うことでscheduleイベントなら...と分岐を使うことができます。

おわりに

今まではCircleCIを使っていてGitHub Actionsにはまだまだ慣れていないのですが、.github/workflows/ にファイルを設置するだけでジョブが実行されるのは楽で嬉しいですね。
日本語ドキュメントのアンカーが壊れていたり、今回のような細かい要件を満たすための参考事例がCircleCIと比べると少ないように感じるので今後のコミュニティの成長に期待したいと思います!😸

Discussion