背景
- 毎週決まった曜日・時間に開発環境へdeployするためのPRを出したい
- いつも同じことしたくない・・!
解決策
- GitHub Actionsを使って定期的にPRを出す
CIなら何でもよかったんですが、並列実行数が比較的多く他のjobをしなそうだったのでGitHub Actionsを選びました。
無料枠が十分あるのもよかった。
やり方
- workflowの実行をスケジュール指定する
- 特定のブランチをcheckoutする
- PRを出す
- Slackに通知する(オマケ)
以下のworkflowでは「developブランチをcheckoutしてmasterブランチへ[Scheduled]develop to master
というタイトルのPRを作成し、PRを作成したらSlackの特定のchannelへ通知する」というjobを毎週金曜日の日本時間15時に走るように設定しています。
また、jobのどこかで失敗すると@here
メンション付きで失敗も通知されます。
workflowの全体像
name: scheduled_create_pr
on:
schedule:
- cron: 0 6 * * 5
jobs:
create_pr:
runs-on: ubuntu-latest
steps:
- name: checkout develop branch
uses: actions/checkout@v1
with:
ref: develop
- name: install hub
uses: geertvdc/setup-hub@v1.0.0
- name: create PR
env:
GITHUB_USER: ${{ secrets.GITHUB_USER }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
hub pull-request -b master -m "[Scheduled]develop to master"
- uses: 8398a7/action-slack@v2
with:
status: ${{ job.status }}
only_mention_fail: 'here'
author_name: Scheduled PR action
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: always()
1. workflowの実行をスケジュール指定する
on:
schedule:
- cron: 0 6 * * 5
onでscheduleを指定して、実行したい時間のcronを書きます。
cronの書き方をよく忘れるので、 crontab guruというサービスを使って書いています。
2. 特定のブランチをcheckoutする
- name: checkout develop branch
uses: actions/checkout@v1
with:
ref: develop
この例ではdevelop
という名前のブランチを指定してcheckoutしています。
3. PRを出す
- name: install hub
uses: geertvdc/setup-hub@v1.0.0
- name: create PR
env:
GITHUB_USER: ${{ secrets.GITHUB_USER }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
hub pull-request -b master -m "[Scheduled]develop to master"
GitHub製のコマンドラインツールhubを使ってPRを作ります。
https://github.com/geertvdc/setup-hubをinstallして、hub pull-request
でPRを作っています。
geertvdc/setup-hub
を使うのにGITHUB_USER
とGITHUB_TOKEN
を指定する必要があるので、secretsを使って値を指定します。
GITHUB_TOKEN
は何も設定せずに使えるようになっているので、GITHUB_USER
だけ指定します。
5. Slackに通知する(オマケ)
- uses: 8398a7/action-slack@v2
with:
status: ${{ job.status }}
only_mention_fail: 'here'
author_name: Scheduled PR action
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: always()
Slack通知Actionのaction-slackを使って、Workflowの実行結果をSlack通知させています。
GITHUB_TOKEN
とSLACK_WEBHOOK_URL
が必要なので、ここでも同様にSLACK_WEBHOOK_URL
だけsecretsを使って値を指定します。
GitHub Actionは通常、途中のstepが失敗すると以降のstepを実行せずに終わってしまうのですが、if: always()
と指定することで、どこかのstepが失敗したとしてもSlack actionが実行されるようになります。