この記事は個人ブログと同じ内容です
Github Actions を用いて定期的にプルリクエストを作成する際に、特定のファイルの存在を知らせたかったのでやってみます。
特定のファイルの存在を知らせる
知らせるのは「通知」という意味ではなくて、プルリクの説明欄にこれらのファイル名を記載して、いちいち確認しなくてもこれらのファイルが存在していることをわかるようにします。
定期に自動でプルリクを作成しているような状況なのでフィーチャーブランチのプルリクというよりはリリースのプルリクやローカルに向けたプルリクなどを想定しているとして、例えば PHP フレームワークの Laravel だと、マイグレーションファイルとかサンプルの環境変数ファイルの変更とかは、プルリクの中身を確認しなくても追加や変更の存在がわかるといいな。みたいな状況感です。(プルリクを取り込んだけど環境変数追加あったの見逃しててエラーになるみたいなのを防ぎたいモチベーション)
プルリクの説明欄への記載
hub コマンドでプルリクを作成する場合は、 -m オプションでプルリクのタイトルと説明を指定できます。
最初の 1 行目がプルリクのタイトルになり、空行を挟むとそれ以降が説明欄の文章になります。
MESSAGE="ここがプルリクのタイトルになる ## これ以降が説明欄の文章になる * テスト * test markdown で書ける。 " hub pull-request -m "$MESSAGE" -b main -h dev
上記コマンドで作成されたプルリクは以下のようになります。
特定のファイルを抽出する
差分から検索して抽出しようと思います。
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 コマンドでプルリクを作成するとこんな感じです。
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 を回して実行してみます。
抽出されたファイルのリストが説明欄に書き込まれてプルリクが作成されました。
まとめ
定期のプルリクエスト作成に限らず、手動でのプルリク作成時にもこういったファイルを検出してコメントするみたいな事に応用できそうだなと思いました。
任意のファイル抽出やコメントへの書き込み(プルリク作成も含め)は、探せば GitHub Marketplace にワークフローが公開されているかもしれないので探してみるのも良いかもしれません。