git-pr-release with GitHub Actions

# 基本

develop ブランチにPRがマージされたら、masterへのリリースPRを作成する。
すでにある場合は内容を更新する。
PR には `release` というラベルをつける。

## Configuring a workflow

- develop に push されたら動かす。
- チェックアウト。
  - checkout@v2は `fetch-depth: 0` と指定し、全てのhistoryを取らないと差分PRを列挙できない。
- rubyのセットアップ。
- 認証は環境変数に設定される `GITHUB_TOKEN` を使う。
- git-pr-release をインストールして実行。

```
$ vim .github/workflows/create-release-pr.yml
name: Create a release pull request

on:
  push:
    branches:
      - develop

jobs:
  create-release-pr:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.6.x

    - name: Create a release pull request
      env:
        GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        GIT_PR_RELEASE_BRANCH_PRODUCTION: master
        GIT_PR_RELEASE_BRANCH_STAGING: develop
        GIT_PR_RELEASE_LABELS: release
      run: |
        gem install -N git-pr-release -v "1.2.0"
        git-pr-release --no-fetch
```

## :tada: 

<img width="600" alt="temp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53551/49ad47af-add1-61cd-8d92-b7c63b7b5318.png">


GITHUB_TOKENが用意されるのが助かります、GitHub Actions。


# 応用

`release/**` `hotfix/**` というブランチがpushされたら、masterへ向けたPRを作成する。
すでにある場合は内容を更新する。
PR には `release`　や `hotfix` といったブランチ名の最初のセクションをラベルとして設定する。

## Configuring a workflow (practical version)

- `.git-pr-release-template` というファイルに、PRの本文テンプレートを書いておく。(erb)
- `release/**` `hotfix/**` に push されたら動かす。
    - `**` は `/` を含んでいてもマッチする。
- チェックアウト。
- rubyのセットアップ。
- 環境変数 `GITHUB_REF` をパースして、ブランチ名と、ブランチ名の先頭セクションを取得する。
    - `::set-output`で後続のステップに値を渡す。
- git-pr-release をインストールして実行。

```
$ vim .git-pr-release-template
<%= ENV['GIT_PR_RELEASE_TITLE'] %>
<% pull_requests.each do |pr| -%>
<%=  pr.to_checklist_item %>
<% end -%>
```

```
$ vim .github/workflows/create-release-pr.yml
name: RELEASE - Creates a release pull request

on:
  push:
    branches:
      - release/**
      - hotfix/**

jobs:
  create-release-pr:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.6.x

    - name: Setup vars
      id: vars
      run: |
        echo "::set-output name=branch_name::${GITHUB_REF#refs/heads/}"
        echo "::set-output name=branch_prefix::$(echo ${GITHUB_REF} | cut -d '/' -f 3)"

    - name: Creates a release pull request
      env:
        GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        GIT_PR_RELEASE_BRANCH_PRODUCTION: master
        GIT_PR_RELEASE_BRANCH_STAGING: ${{ steps.vars.outputs.branch_name }}
        GIT_PR_RELEASE_LABELS: ${{ steps.vars.outputs.branch_prefix }}
        GIT_PR_RELEASE_TITLE: "[ReleasePR] ${{ steps.vars.outputs.branch_name }}"
        GIT_PR_RELEASE_TEMPLATE: .git-pr-release-template
      run: |
        gem install -N git-pr-release -v "1.2.0"
        git-pr-release --no-fetch
```

## :confetti_ball: 

<img width="600" alt="_ReleasePR.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53551/e92ec0b0-04fc-e4cf-5c22-6a2e0e71f79c.png">


# 参照

*git-pr-release*
https://github.com/motemen/git-pr-release

*Workflow syntax for GitHub Actions*
https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions

*GitHub Actions: Default environment variables*
https://help.github.com/en/github/automating-your-workflow-with-github-actions/virtual-environments-for-github-actions#default-environment-variables