🗓️

GitHub Actions で特異なタイミングのジョブをスケジュールする

2024/04/22に公開

本記事では、GitHub Actions の schedule を使用して毎月第一月曜日や隔週金曜日にジョブを実行する方法について解説します。

毎月第一月曜日

実行できないパターン

on:
  schedule:
    - cron: '0 0 1-7 * 1'

jobs:
  target_job:
    runs-on: ubuntu-latest
    steps:
      - name: main job
        run: .........

一見問題ないように見えますが、POSIX 規格の crontab の構文では日時と曜日が指定されている場合、日時と曜日の OR 判定となります。

つまり

  • 毎月 1 日〜 7 日の 0:00 (UTC)
  • 毎週月曜日の 0:00 (UTC)

で実行されることになるため、日付と曜日の判定を分ける必要があります。

実行できるパターン

on:
  schedule:
    - cron: '0 0 1-7 * *'
  workflow_dispatch:

jobs:
  target_job:
    runs-on: ubuntu-latest
    steps:
      - name: set day of week
        id: date
        run: |
          day_of_week=$(LANG=C date '+%A')
          echo "day-of-week=$day_of_week" >> $GITHUB_OUTPUT
      - name: main job
        if: ${{ github.event_name == 'workflow_dispatch' || steps.date.outputs.day-of-week == 'Monday' }}
        run: .........

毎月 1 日〜 7 日の 0:00 (UTC) で実行し、曜日で if 判定を行うことで main job を実行しないようにします。
もちろん逆に 毎週月曜日の 0:00 (UTC) で実行し、日付で if 判定でもよいと思います。

隔週金曜日

隔週金曜日では 毎週金曜日の 0:00 (UTC) で実行し、曜日番号で if 判定を行うことで main job を実行しないようにします。

on:
  schedule:
    - cron: "0 0 * * fri"

jobs:
  target_job:
    runs-on: ubuntu-latest
    steps:
      - id: get_week
        name: get week
        run: |
          is_even_week=$(( $(date +%W) % 2 ))
          echo "is_even_week=$is_even_week" >> $GITHUB_OUTPUT

      - name: main job
        if: ${{ steps.get_week.outputs.is_even_week == 0 }}
        run: ...........

同様の方法で 3 週間おきなども可能になります。

crontab の場合

crontab で設定する場合は test を使って if 文を実行します。

0 0 * * fri test $(( $(date +%W) % 2 )) -eq 0 && .....

まとめ

GitHub Actions のスケジュール設定を使用して、毎月の特定の曜日や隔週の曜日にジョブを実行する方法を紹介しました。
cron 式の構造や条件付き実行を理解することで、より柔軟なジョブのスケジュール管理が可能となります。

これらの設定を活用して、プロジェクトや開発作業の自動化を効果的に行いましょう!

ROUTE06 Tech Blog

Discussion