【デプロイするだけ】CodeCommitのプルリクやコメントをSlackへ通知しよう!

こんにちは、平野です。

案件でCodeCommitを使って開発を行っています。 前まではプルリクエストを出した際などに、Slackで「プルリク出しました!確認お願いします」とかやってたのですが、 Slackだったら通知飛ばせるように連携しなくちゃね、ということで実装をしてみました。 一通り形になって、実際に業務に使っていますが、コメント言及箇所へのリンクもついているのでなかなか便利です。 ServerlessFrameworkの仕組みでデプロイするだけなので、是非使ってみてください!

なお、ServerlessFrameworkのインストール方法や使い方、 Lambda関数からSlackへ通知を送るやり方等については、 たくさんの解説記事がありますのでこの記事では割愛させて頂きます。

配布

配布場所

https://github.com/cm-hirano-shigetoshi/CodeCommitNotification

インストール

下準備として、SlackでWebHookURLによる通知が行えるように設定してください。 これは検索すればすぐにやり方が見つかるかと思います。 また、今回のアプリはServerlessFrameworkで作成したので、ServerlessFrameworkのインストールもして下さい。

次に上記のGitHubをcloneしたら、デプロイスクリプトshell/deploy.shにある下記の変数を設定してください。

変数 説明
AWS_PROFILE 対象アカウントのプロファイル名1
SLACK_HOOK_URL WebHookのURL
SLACK_MENTION_MEMBERS メンションするSlackのUserId(カンマ区切り)

あとはデプロイを実行するだけです。

bash shell/deploy.sh

完了すれば、アカウントの全てのリポジトリから通知が飛ぶようになります。

通知機能の内容

通知が飛ぶタイミングは以下の3種類です。

  • プルリクエストの作成・変更・クローズ
  • プルリクエストへのコメント
  • コミットへのコメント

[cm_hirano_test01]というリポジトリの、
テストファイルの追加というプルリクエスト内の、
test01.txtにコメントがついた時の通知例はこんな感じです。

コメントされたファイル名も表示されていますし、 タイトルリンクをクリックすればCodeCommitの該当箇所に飛びます。

また、SLACK_MENTION_MEMBERSにSlackのUserIdを設定すると、 プルリクエストの作成時にはメンション付きでの通知が飛ぶようになります。 (これはかなりアドホックにつけた機能なので、 他の通知にもメンションをつけるなどはコードを修正する必要があります。)

中身の簡単な説明

デプロイしたら動くという代物なので中はブラックボックスでもいいのですが、 ちょっと苦労した(わかりにくい)点を紹介させてください。

通知設定の種類

CodeCommitのイベントからどうLambdaを発火させるかですが、少し紛らわしいです。

マネジメントコンソールからCodeCommitの設定画面を開くと「通知」というタブがあり、 そこから通知先のSNSを設定することができます。 また、「通知」の隣に「Triggers」というタブもあり、こちらも連携先としてSNSやLambdaを指定できるので、 ここからでもLambdaを発火させることができます。

しかし今回作ったものでは、CloudWatch Eventsでルールを作成してLambdaを発火しています。 理由としては、「通知」から飛ぶSNSでは、通知に含めたい情報が十分に含まれていないことと、 「Triggers」ではコメントがあった場合には通知が飛ばないためです。

コメント内容の取得

コメントされたことが通知されるからには、Slack上から(Webページを開かずに)コメントを確認したいです。 しかしCloudWatch Events経由で飛ぶ情報にはコメントの本文は記載されません。 なのでLambda関数からCodeCommitのリソースへアクセスしてコメントを取得するようにしています。 CommentIdが入っているので、実装自体はとても簡単です。

コメントされたファイル名の取得

通知例の画像のように、特定のファイルにコメントされた場合には、そのファイル名を取得して通知しています。 これにはさらに少し工夫が必要で、プルリクエストに対するコメント一覧を取得し、 合致するCommentIdの情報を取ってくるようにしています。
内部的な細かい話ですが、もしコードを読んで改造される方は参考にしてください。

なお、コミットへのコメントについてはファイル名がうまく取れませんでした。 このやり方を知っている方は教えて頂ければありがたいです! (コミットへのコメントってほとんど使ってないですが...)

CodeCommitの料金について

最後にCodeCommitの料金についての注意点です。

CodeCommitはリポジトリの数などではなく、使用するユーザ数によって課金されます。 5ユーザまでは無料なのですが、この5ユーザというカウントにはプログラム的にアクセスするユーザも含まれます。 なので、Lambda関数内からコメントを取得しに行くような仕組みを入れた場合、 このLambda関数もユーザとしてカウントされてしまうようですので、ご注意ください。

https://aws.amazon.com/jp/codecommit/pricing/

まとめ

CodeCommitのイベント情報をSlackへ通知するアプリケーションを作成しました。 ServerlessFrameworkでアプリケーションをデプロイするだけで導入できるので、 この組み合わせで業務を行っている方はぜひ導入してみてください。


  1. ~/.aws/credentials~/.aws/configに書く名前です