16
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

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

背景

  • 毎週決まった曜日・時間に開発環境へ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が実行されるようになります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
16
Help us understand the problem. What are the problem?