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

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

## 解決策
- GitHub Actionsを使って定期的にPRを出す

CIなら何でもよかったんですが、[並列実行数が比較的多く](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-github-actions#usage-limits)他のjobをしなそうだったのでGitHub Actionsを選びました。
[無料枠が十分ある](https://help.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-actions#about-billing-for-github-actions)のもよかった。


## やり方
1. workflowの実行をスケジュール指定する
1. 特定のブランチをcheckoutする
1. PRを出す
1. 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の実行をスケジュール指定する
```yaml
on:
  schedule:
    - cron: 0 6 * * 5
```
onでscheduleを指定して、実行したい時間のcronを書きます。
cronの書き方をよく忘れるので、 [crontab guru](https://crontab.guru/)というサービスを使って書いています。

### 2. 特定のブランチをcheckoutする
```yaml
    - name: checkout develop branch
      uses: actions/checkout@v1
      with:
        ref: develop
```
この例では`develop`という名前のブランチを指定してcheckoutしています。

### 3. PRを出す
```yaml
    - 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](https://github.com/github/hub)を使ってPRを作ります。
[https://github.com/geertvdc/setup-hub](https://github.com/geertvdc/setup-hub)をinstallして、`hub pull-request`でPRを作っています。
`geertvdc/setup-hub`を使うのに`GITHUB_USER`と`GITHUB_TOKEN`を指定する必要があるので、[secretsを使って値を指定](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)します。
`GITHUB_TOKEN`は何も設定せずに使えるようになっているので、`GITHUB_USER`だけ指定します。

### 5. Slackに通知する(オマケ)
```yaml
    - 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](https://github.com/8398a7/action-slack)を使って、Workflowの実行結果をSlack通知させています。
`GITHUB_TOKEN`と`SLACK_WEBHOOK_URL`が必要なので、ここでも同様に`SLACK_WEBHOOK_URL`だけ[secretsを使って値を指定](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)します。
GitHub Actionは通常、途中のstepが失敗すると以降のstepを実行せずに終わってしまうのですが、`if: always()`と指定することで、どこかのstepが失敗したとしてもSlack actionが実行されるようになります。