Github Actions でのプルリク作成時に特定のファイルの存在を知らせる

この記事は個人ブログと同じ内容です

www.ritolab.com


Github Actions を用いて定期的にプルリクエストを作成する際に、特定のファイルの存在を知らせたかったのでやってみます。

特定のファイルの存在を知らせる

知らせるのは「通知」という意味ではなくて、プルリクの説明欄にこれらのファイル名を記載して、いちいち確認しなくてもこれらのファイルが存在していることをわかるようにします。

定期に自動でプルリクを作成しているような状況なのでフィーチャーブランチのプルリクというよりはリリースのプルリクやローカルに向けたプルリクなどを想定しているとして、例えば PHP フレームワークの Laravel だと、マイグレーションファイルとかサンプルの環境変数ファイルの変更とかは、プルリクの中身を確認しなくても追加や変更の存在がわかるといいな。みたいな状況感です。(プルリクを取り込んだけど環境変数追加あったの見逃しててエラーになるみたいなのを防ぎたいモチベーション)

プルリクの説明欄への記載

hub コマンドでプルリクを作成する場合は、 -m オプションでプルリクのタイトルと説明を指定できます。

最初の 1 行目がプルリクのタイトルになり、空行を挟むとそれ以降が説明欄の文章になります。

MESSAGE="ここがプルリクのタイトルになる

## これ以降が説明欄の文章になる
* テスト
* test

markdown で書ける。
"

hub pull-request -m "$MESSAGE" -b main -h dev

上記コマンドで作成されたプルリクは以下のようになります。

f:id:ro9rito:20220125182046p:plain

特定のファイルを抽出する

差分から検索して抽出しようと思います。

MESSAGE="プルリクのタイトルです。\n\n"

# 変更ファイルを取得
DIFF=`git diff main dev --name-only`

# 探したいファイルのパスや名前で該当の行を抽出
ENV_FILES=`echo "$DIFF" | sed -n '/\.env\./p'`
MIGRATION_FILES=`echo $DIFF | sed -n '/database\/migrations\//p'`

# 説明欄のコメントを追加
if [ -n "$ENV_FILES" ]; then
  MESSAGE+="環境変数ファイルの変更が含まれます。\n$ENV_FILES\n\n"
fi
if [ -n "$MIGRATION_FILES"  ]; then
  MESSAGE+="マイグレーションファイルが含まれます。\n$MIGRATION_FILES\n\n"
fi

echo -e "$MESSAGE"

git diff で差分を持ってきます。

ここでは main ブランチと dev ブランチの差分を、--name-only オプションでファイル名のみを取得しています。(変更があった、新規に追加されたファイルの一覧が入ってくる。)

入ってきたファイルリスト($DIFF)に対して sed -n で指定の文字列を含む行のみを抽出します。

あとはコメントを組み立てて出力です。

上記を実行するとこんな感じで出力されます。

プルリクのタイトルです。

環境変数ファイルの変更が含まれます。
.env.example

マイグレーションファイルが含まれます。
database/migrations/2022_01_22_000000_create_users_table.php
database/migrations/2022_01_22_000000_create_books_table.php

hub コマンドでプルリクを作成するとこんな感じです。

f:id:ro9rito:20220125182150p:plain

Github Actions で作成

上記を踏まえてこれらを Github Actions 側に実装します。

.github/workflows/xxxx.yml(メッセージ・プルリク作成部分のみ抜粋)

# ブランチ名作成
- name: Make branch name
  id  : setting
  env:
    TZ: 'Asia/Tokyo'
  run : |
    DATE=`date +"%Y%m%d_%H%M%S"`
    BRANCH_NAME="release/$DATE"
    echo ::set-output name=branch_name::$BRANCH_NAME

# プルリクのメッセージ作成
- name: Make pull request message
  id: message_making
  env:
    BRANCH_NAME: ${{ steps.setting.outputs.branch_name }}
  run: |
    MESSAGE="$BRANCH_NAME\n\n"
    
    DIFF=`git diff main dev --name-only`
    ENV_FILES=`echo "$DIFF" | sed -n '/\.env\./p'`
    MIGRATION_FILES=`echo "$DIFF" | sed -n '/database\/migrations\//p'`
    if [ -n "$ENV_FILES" ]; then
      MESSAGE+="環境変数ファイルの変更が含まれます。\n$ENV_FILES\n\n"
    fi
    if [ -n "$MIGRATION_FILES"  ]; then
      MESSAGE+="マイグレーションファイルが含まれます。\n$MIGRATION_FILES\n\n"
    fi
    echo ::set-output name=message::$MESSAGE

# ブランチ作成
- name: Create Branch
  uses: peterjgrainger/action-create-branch@v2.1.0
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
    branch: ${{ steps.setting.outputs.branch_name }}

# プルリクエスト作成
- name: Create Pull Request
  id: create_pull_request
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    BRANCH_NAME: ${{ steps.setting.outputs.branch_name }}
    MESSAGE: ${{ steps.message_making.outputs.message }}
  run: |
    PULL_REQUEST_MESSAGE=`echo -e "$MESSAGE"`
    hub pull-request -m "$PULL_REQUEST_MESSAGE" -b main -h $BRANCH_NAME

1 点だけポイントで、組み立てたメッセージはエスケープ文字を使用している(改行部分)ため、hub pull-request で指定する前に echo -e で出力してエスケープ文字を有効にしておきます。

# エスケープ文字を有効にする
PULL_REQUEST_MESSAGE=`echo -e "$MESSAGE"`

Github Actions を回して実行してみます。

f:id:ro9rito:20220125182338p:plain

抽出されたファイルのリストが説明欄に書き込まれてプルリクが作成されました。

まとめ

定期のプルリクエスト作成に限らず、手動でのプルリク作成時にもこういったファイルを検出してコメントするみたいな事に応用できそうだなと思いました。

任意のファイル抽出やコメントへの書き込み(プルリク作成も含め)は、探せば GitHub Marketplace にワークフローが公開されているかもしれないので探してみるのも良いかもしれません。