🍣

GitHub Actionsを用いてリリース内容の社内向けSlack告知を自動化しました

2023/06/22に公開

概要

GitHub Actionsを用いて、新機能のリリース内容を社内向けのSlack板に通知する自動化を行った話です。

背景

社内にて、開発チームがリリースした新機能をBiz向けに告知する専用のSlack板があります(ちなみにBizもノーコードでプロトタイピングしたものを書き込んだりします)。
これまでリリースするたびに担当のエンジニアが忘れないようにリリース板に書き込んでいたのですが、

  • フォーマットが個人によってバラバラ
  • そもそも書くのを忘れてリリースがBizに告知されない

などちょっとした問題が起きていました。

なので、GitHub Actionsを用いて、release用ブランチにマージしたらリリース内容をSlackに告知する仕組みを作りました。

方針

リリース内容を告知するといっても、複数の方針があると思います。

  • コミットメッセージをそのままSlackに流す
  • リリース内容を人力で担当者が数十文字程度で指定し、それをSlackに流す
  • ChatGPTなどでソースコード差分を見て、開発内容を推論してそれをSlackに流す

ここでは、コミットメッセージだと内容が端的すぎたり、リリース後の諸注意などを書き込めないことから、より融通を求める必要があったり、ChatGPT等の自動化は内容が安定しないと思われることから「リリース内容を人力で担当者が数十文字程度で指定し、それをSlackに流す」の方針で進めることとしました。

具体的には以下のような運用フローで行います。

  • developブランチに開発ブランチをマージする
    • ※自動でステージング環境にデプロイされます
  • 同時にdevelopブランチ→masterブランチへのRelease Pull Requestが作成 or 更新される
    • git-pr-releaseを使っています
    • 作成タイミングで、リリースコメントの書式を「github-actions[bot]」がコメントしてくれます
  • 開発者は、Release Pull Requestに規定の書式でコメントを書き込みます
    • ※複数リポジトリにまたがる機能の場合はどれか任意の1つのPull Requestに書きます
  • リリース担当者は、コメントが書き込まれていることをダブルチェックのうえ、master mergeします
  • master mergeを検知して、GitHub Actionsが動作し、書き込まれたコメントをSlackにそのままPOSTします

太字で記載したところが今回組んだGitHub Actionsです。
以下順に解説していきます。

リリースコメントの書式をコメントしてくれるGitHub Actions

リリースコメントの書式を忘れてしまうので、masterブランチへのPull Requestごとに、書式を投稿してくれるようにしました。

name: Auto Release Comment Format

on:
  pull_request:
    branches:
      - master

jobs:
  add_pr_comment:
    runs-on: ubuntu-latest
    steps:
      - name: Add PR Comment
        uses: peter-evans/create-or-update-comment@v3
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            ---
            (以下をコピーしてリリース内容をコメントしてね)
            ■施策タイトル


            ■施策説明


            ■ストーリーポイント


            ---

ここはアナログな方法にはなってしまいますが、これをコピペしてコメントする感じです。

一旦、項目としては施策タイトル、説明、ストーリーポイントの3つにしています。特にストーリーポイントは、Bizの方にも施策の規模感が何となく伝わっていただけるといいなということで、掲載するようにしています。

フォーマットに基づいて、リリースする施策を実装者に以下のように書き込んでおいてもらいます。

master mergeを検知して、書き込まれたコメントをSlackにそのままPOSTするGitHub Actions

master merge時にリリースコメントをPOSTするGitHub Actionsはこちらです。

name: Auto Release Comment Post to Slack

on:
  pull_request:
    branches:
      - master
    types:
      - closed

jobs:
  get_pr_comments:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Fetch PR comments
        id: pr_comments
        uses: actions/github-script@v6
        with:
          script: |
            const prNumber = context.payload.pull_request.number;
            // github-scriptを使ってPRのコメントを取得
            const response = await github.rest.issues.listComments({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: prNumber
            });
            const comments = response.data;
            let pr_comments = '';
            let comment_count = 0;
            // PRのコメントをループして、リリース内容のコメントを取得
            for(let i = 0; i < comments.length; i++) {
              // github-actions[bot]のコメントは除外
              if(comments[i].user.login != "github-actions[bot]") {
                // 2回目以降のコメントは区切り線を入れる
                comment_count++;
                if (comment_count > 1) {
                  pr_comments += '-------------------------------\n';
                }
                // GitHubのユーザー名を記載
                pr_comments += '\n■担当エンジニア\n<' + comments[i].user.html_url + '|@' + comments[i].user.login + '>\n\n' + comments[i].body + '\n';
              }
            }
            return pr_comments;

      - name: Post comments to Slack
        id: slack
        uses: slackapi/slack-github-action@v1.24.0
        with:
          payload: |
            {
              "text": ${{ steps.pr_comments.outputs.result }}
            }
        env:
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL_RELEASE_CHANNEL }}

これにより、master merge後、数秒したら以下のようにSlackにリリースコメントが流れます。

実装のポイント

  • actions/github-script@v6を使っています。今回初めて知ったのですが、GitHub上からのデータ取得をJavaScriptで実装できるActionです。await github.rest.issues.listComments関数によって指定したIssue(ここではPull Requestですが、GitHubにとってはIssueもPull RequestもIssueらしいです)のコメントが取得できます。APIを呼び出すより直感的に記述できます
  • comments[i].user.login != "github-actions[bot]"によって、フォーマットを投稿したBotのコメントを省いています。そうでなければ、SlackにフォーマットもPOSTされてしまいます
  • 担当エンジニアが自動でわかるように、GitHubのUsernameをリンクの見た目で表示するようにマークアップを書いています
  • 複数行のテキストをSlackにPOSTするとき、利用できるActionが意外と少なかったのでハマりました
  • secrets.SLACK_WEBHOOK_URL_RELEASE_CHANNELを、各リポジトリに設定するのが面倒なのでOrganization LevelのSecretとして設定しました

今後の課題

かなりアナログなところは残っていますが、一旦回っていそうなのでしばらくこれで運用してみます。

たとえば発展・改善の余地としては

  • 該当Pull Requestに含まれているにも関わらずコメントしていない実装者が居た場合マージを何らかの方法でブロックする
    • ※複数リポジトリにまたがる単一機能のリリース時に矛盾するのでよくない制約かも
    • ブロックするほどではないにせよリリース担当者(≒マージの担当者)がきづける仕組みがあるといいかも
  • フォーマットを毎回コピペするのが原始的なのでもっとスマートにしたい。が、そもそも良い仕様のアイデアが浮かばない

まとめ

以上の施策によって、統一されたフォーマットで、リリース内容の告知を社内Slackに自動で投稿する仕組みが完成しました。こんな感じで、社内で「仕組み化」をモットーに施策を各エンジニアが立案・実行していく文化がありますので、もしこんな仕組みを使ったら上手くいったよ!といったお話などありましたらぜひご連絡ください!

マナリンク Tech Blog

Discussion