LoginSignup
27
17

More than 3 years have passed since last update.

GitHub Actionsを使ってPRを定期的に作る

Last updated at Posted at 2019-12-11

背景

  • 毎週決まった曜日・時間に開発環境へdeployするためのPRを出したい
    • いつも同じことしたくない・・!

解決策

  • GitHub Actionsを使って定期的にPRを出す

CIなら何でもよかったんですが、並列実行数が比較的多く他のjobをしなそうだったのでGitHub Actionsを選びました。
無料枠が十分あるのもよかった。

やり方

  1. workflowの実行をスケジュール指定する
  2. 特定のブランチをcheckoutする
  3. PRを出す
  4. Slackに通知する(オマケ)

以下のworkflowでは「developブランチをcheckoutしてmasterブランチへ[Scheduled]develop to masterというタイトルのPRを作成し、PRを作成したらSlackの特定のchannelへ通知する」というjobを毎週金曜日の日本時間15時に走るように設定しています。
また、jobのどこかで失敗すると@hereメンション付きで失敗も通知されます。

workflowの全体像

workflow.yml
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_USERGITHUB_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_TOKENSLACK_WEBHOOK_URLが必要なので、ここでも同様にSLACK_WEBHOOK_URLだけsecretsを使って値を指定します。
GitHub Actionは通常、途中のstepが失敗すると以降のstepを実行せずに終わってしまうのですが、if: always()と指定することで、どこかのstepが失敗したとしてもSlack actionが実行されるようになります。

27
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
17