🐈

GitHub Actions を月初の日本時間0〜9時に実行したい

2022/08/06に公開

GitHub Actions の cron はタイムゾーンの指定ができない(UTC)

ちょっとした月次処理のスクリプトを書いてみました。
これを毎月1日と28日の日本時間午前0時から9時の間に実行したい。
これはちょっと困るやつです。
タイムゾーンで日本を指定できるなら、

'15 3 1,28 * *'    # 毎月1,28日の3:15に実行

とかでいいんですが、UTCなので前日を指定しないといけない。
1日の前日(つまり前月の末日)は月によって違うし、うるう年も考えないといけないし。

しょうがないから毎日実行して日本時間での日付を確認する

  1. 時間は同じでいいので、9時間引いた値を設定しておく。

    on:
    schedule:
        - cron: '15 18 * * *' # 毎日 3:15(JST) に実行
    
  2. 次のステップの if に使えるよう、環境変数に日本時間の日(1-31)をセットする。
    タイムゾーンを Asia/Tokyo に設定した状態で、 date コマンドで日を取り出して GITHUB_ENV にセット。

        - name: Set current day of month as env variable
            env:
              TZ: 'Asia/Tokyo' # タイムゾーン指定
            run: echo "CURRENT_DAY_OF_MONTH=$(date +'%-d')" >> $GITHUB_ENV
    

    あとは if の条件で env.CURRENT_DAY_OF_MONTH の値をチェックすればいいはず。

お試し workflow の全体像

日本時間が反映されているかの確認と、ステップの実行を1日かそうでないかで制御しています。

./github/workflows/current-date-timezone.yml
name: Check Date

on:
  schedule:
    - cron: '15 18 * * *' # 毎日 3:15(JST) に実行
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out
        uses: actions/checkout@v3

      - name: Set current day of month as env variable
        env:
          TZ: 'Asia/Tokyo' # タイムゾーン指定
        run: |
          echo "CURRENT_DATETIME=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_ENV
          echo "CURRENT_DAY_OF_MONTH=$(date +'%-d')" >> $GITHUB_ENV

      - name: Show current date
        run: echo ${{ env.CURRENT_DATETIME }}   # 現在日時(JST) が表示される

      - name: Show day of month
        run: echo ${{ env.CURRENT_DAY_OF_MONTH }}   # 日(1-31) が表示される

      - name: Is the first day of the month
        if: ${{ env.CURRENT_DAY_OF_MONTH == 1 }}    # 1日の場合に実行
        run: echo "Today is the first day of the month!"

      - name: Is NOT the first day of the month
        if: ${{ env.CURRENT_DAY_OF_MONTH != 1 }}    # 1日ではない場合に実行
        run: echo "Today is NOT the first day of the month."

時差の計算面倒だし、タイムゾーン指定できるようになるといいなー。

Discussion