🔄

GitHub Actionsで、同一ブランチからの別ベースブランチへのPull Requestを自動生成する

2022/03/23に公開

株式会社ヴァージニアのエンジニアリング本部本部長兼CTOの村上です。今回は小ネタとなります。
"エンジニアのためのマネジメントキャリアパス"という本には、どのような立場になっても完全には技術から離れない方が良い、というようなことが書かれています。そんな大義名分を元に、表題の問題を隙間時間に解決したのでその紹介をしたいと思います。

背景

SMARTCRMでは現在、Gitflowを採用しています。フロントエンドのリポジトリでは、プライマリブランチの中にdevelopbetaを用意しています。
developはStaging環境の役割です。ではbetaが何かというとこちらも、同じStaging環境のAPIを叩きながらも、AWS Amplifyとしてはdevelopと別アプリケーションとして構築しています。そうすることで、PRのレビューが通り次第すぐにbetaにマージして単体テストが実行できるようになります。
しかし、このやり方の場合、developbetaそれぞれをベースブランチにしたPRを作成する必要があります。これが意外に面倒なのと、ラベルなどで見分けが付くようにしておかないとややこしいという問題があります。

解決方法

上記の問題を解決するには、

  1. PR作成時に、当該PRの情報を元にbetaブランチをベースブランチにしたPRを作成する
  2. develop向けのPRにラベルを付与する

の2つの作業が必要になります。
それぞれを

  1. https://github.com/repo-sync/pull-request
  2. https://github.com/andymckay/labeler

を使って解決しました。
以下がそのGitHub ActionsのYAMLファイルとなります。

name: create a pull request for beta

on:
  pull_request:
    types: [ opened ]
    branches: [ develop ]
jobs:
  action:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set variables
        run: |
          echo 'PR_BODY<<EOF' >> $GITHUB_ENV
          echo "the same as #${{ github.event.pull_request.number }}" >> $GITHUB_ENV
          echo "" >> $GITHUB_ENV
          echo "---" >> $GITHUB_ENV
          echo "" >> $GITHUB_ENV
          echo "${{ github.event.pull_request.body }}" >> $GITHUB_ENV
          echo 'EOF' >> $GITHUB_ENV
      - name: pull-request
        uses: repo-sync/pull-request@v2
        with:
          source_branch: "${{ github.event.pull_request.head.ref }}"
          destination_branch: beta
          github_token: ${{ secrets.GITHUB_TOKEN }}
          pr_label: beta
          pr_title: "${{ github.event.pull_request.title }}"
          pr_body : |
            ${{ env.PR_BODY }}
      - name: Labeling
        uses: andymckay/labeler@master
        with:
          add-labels: "develop"

ポイントは以下となります

  1. トリガーとして pull_requesttypes: [ opened ]を指定することで、PR作成時のみに限定する
  2. 以下のページに書かれた、pull_requestのpayloadを駆使して作成元のPRのうち、作成するPRに必要な情報を集める
  3. GITHUB_ENVを使って、PRのdescriptionに相当する内容の入った環境変数を定義する

1については、repo-sync/pull-requestが新規にPRを作成することのみに対応しているからです。3については、公式のSetting an environment variableに書かれているので何も難しいことは無いのですが、意外に動的に環境変数をGitHub Actionsで指定することが私はこれまで無かったので、念の為ポイントとして上げさせて頂きました。

このGitHub Actionsの結果が以下となります。

ラベルがあることで、やはり見分けが付きやすくなっています。また、PRのリンクがありつつもdescriptionもコピーされていることで、内容もわかりやすくなっています。反面この設定の欠点としては、PR作成時にタイトルとdescriptionをきちんと書いておかないと中途半端な内容で複製される、というものがあります。ただ、PRのリンクは掲載しているのと最初にちゃんと書くという意識付けにもなるので、意外にもあまり困ってはいません。

本当にこれだけの記事なので恐縮ですが、同様のことをしたいと思っている方の参考になれば幸いです。

VIRGINIA Tech Blog

Discussion