GitHub Actionsのイベントによって挙動を変える

2022.07.29

GitHub Actionsでは定期実行(schedule)のイベントがサポートされておりCron形式で定期的に実行されるワークフローを定義できます。しかし、scheduleではなくpushイベントで動作を確認したいときでも、定期的に実行されるワークフローの中に破壊的な処理(ファイル書き込みやAPI呼び出し)があると安心して実行することができません。

ローカルでDockerコンテナを使って確認するactというツールもありますが、個人ごとに環境を用意する必要があったり、微妙に挙動が不安に感じることもあってnot for meな気がしています。

そこで、各種CLIに付随するdry run的な挙動を実現するために、Workflowをトリガーするイベントによって処理を分岐させ安全に挙動を確認できるようにしました。

イベントによって挙動を変える

次のワークフローはDenoで外部APIから取得してきたデータをファイルに格納し、add-and-commitアクションでリポジトリにcommitするものです。

.github/workflows/task.yml
name: Run task

on:
  schedule:
    - cron:  '30 0 * * *'
  push:

jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - run: echo "event name is:" ${{ github.event_name }}

      - name: Checkout repo
        uses: actions/checkout@v3

      - name: Setup Deno
        uses: denoland/setup-deno@v1
        with:
          deno-version: v1.23

      # ファイルの書き込みを行うプログラムを実行しています
      - name: Run script
        run: >
          deno run
          --allow-write
          --allow-env=MY_SECRET_TOKEN
          --allow-net=api.example.com
          index.ts
        env:
          MY_SECRET_TOKEN: ${{ secrets.MY_SECRET_TOKEN }}

      # 作成されたファイルのDiffが出力される
      - run: git add . -N && git diff . 
      
      - uses: EndBug/add-and-commit@v9
        if: github.event_name == 'schedule' # この条件文によってScheduleのときだけコミットされるようになる

ワークフローのイベントにはScheduleとPushが設定されているため、定期的に実行されるだけでなくプッシュされたときにもワークフローが実行されます。 ただ、プッシュされた時はファイルが作成されたことは確認したいのですが、コミットされるのは望ましくありません。

そこでStepに条件文を指定し、トリガーとなったイベント名を取得するgithub.event_nameを使ってScheduleの時のみコミットを行うように指定します。 また、デバッグ用として作成されたファイルのDiffを表示するためにgit add . -N && git diff . を実行するようにしました。

これら対応を行うことである程度安心して挙動を確認できるようになりました。

まとめ

GitHub Actionsのワークフロー構文に関してはドキュメントがしっかりしていて、しかも日本語対応しています。ドキュメントを読みましょう。

今回は触れませんでしたが、簡単なタスクを書くのであればDenoが良かったです。