概要
GitHub Actionsを利用して、指定した時間等、定期的に処理を実行する方法について説明します。
やりたいこと
私は、GitHub Actionsを利用して、CI/CDを実施しています。具体的には、指定した時間にサーバーにビルドしたファイルを配置するというようなことをしています。
これを実現する方法として、GitHub Actionsには、cronの形式で時間を指定できる機能があります。しかし、私の環境では、これだけでは不十分でした。
私は、Pull Requestによるマージを任意の時間にしたいと思っていました。mainブランチの変更を自動でサーバーに反映させているので、そのmainブランチへの変更をマージの時間を調整するという流れです。
方法
私が今回、GitHub Actionsのcron機能とMerge ScheduleというActionsを利用して実現しました。
https://github.com/marketplace/actions/merge-schedule
cronでは、1時間おきにMerge ScheduleのActionsを実行して、マージ可能なPull Requestについて、マージを実行します。
name: Merge Schedule
on:
pull_request:
types:
- opened
- edited
- synchronize
schedule:
- cron: '0 * * * *'
jobs:
merge_schedule:
runs-on: ubuntu-latest
steps:
- uses: gr2m/merge-schedule-action@v2
with:
merge_method: squash
require_statuses_success: 'true'
automerge_fail_label: 'merge-schedule-failed'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
また、GitHub ActionsがPull Requestsの内容を編集できるように、リポジトリのSettingsから権限も付与しておきます。

これで設定は終わりです。
Merge Scheduleの使い方として、マージを行いたいPull Requestで次のようなコマンドを記入します。時刻の書き方はISO8601に沿った記述です。
/schedule 2023-06-16T09:00:00.000Z
これを書いておくことで、cronによってGitHub Actionsが実行された際に、現在時刻が/scheduleに書かれた時刻を過ぎていればマージが実行されます。
さいごに
今回は、cronの機能とMerge Schedule Actionsを利用して、指定した時間にPull Requestをマージするようにしました。
もしも、無料で実行できるGitHub Actionsの時間が厳しいという場合は、cronの実行時刻は4時間おきや8時間おきなどにするとよいです。
参考になればうれしいです。