michimani.net

CodeCommit リポジトリへのプルリクエストの承認を SNS 経由で Slack に通知してみた

2020-02-20

CodeCommit リポジトリへのプルリクエストに対する承認について通知を受け取ることができるようになったので試してみました。

後で気づきましたが、実際にやってみた中で approve のスペルを完全に間違っていました。恥ずかしい。

目次

概要

以前に AWS の Code シリーズ (CodeCommit, CodeBuild, CodeDeploy, CodePipeline) の各サービスから Amazon SNS (と AWS Chatbot(beta) ) に対して通知を送ることができるようになりましたが、今回は CodeCommit リポジトリへのプルリクエストに対する承認に関する通知にも対応したようです。
詳細については下記の公式アナウンスを参照してください。

前回 CodeBuild で通知を試したときの話はこちらです。

追記 2020/04/23

AWS Chatbot が一般利用可能 (GA) になりました。CLoudWatch Aram を Slack に通知してみた記事を書いたのでこちらも参考にしてみてください。

やってみる

さっそくやってみます。
が、承認の通知の前に、プルリクエストの作成そのものに対する通知も設定してみます。

通知の設定

通知を設定したいリポジトリの上部に表示されている 通知 から設定します。
(いつ作成したかも忘れているリポジトリがあったのでそれを使います)

CodeCommit PR notification 1

設定項目もこれまでと同様に下記の項目です。

このうち、 通知をトリガーするイベントPull request の項目で、とりあえず全てにチェックを入れておきます。
また、今回新たに追加された Approvals の項目にもチェックを入れておきます。

CodeCommit PR notification 2

今回ターゲットには、 CodeCommit からの通知イベントの json をそのまま Slack に通知する SNS トピックを指定しています。

( そのまま というか、 通知イベント内の event['Records'][0]['Sns']['Message'] にあたる部分を返しています。)

あとは Submit ボタンを押して通知設定は完了です。

承認テンプレートの作成

今回は承認フローの通知を試すので、リポジトリに対して承認の設定をしておきます。

下記のような承認テンプレートを作成し、ユーザ 1 人からの承認を必要とするようにします。

CodeCommit PR notification 3

プルリクエストの作成

では、このリポジトリに対してプルリクエストを作成してみます。

CodeCommit PR notification 4

develop ブランチから master ブランチへの PR を作成します。

プルリクエストを作成すると、まもなくして Slack に通知が来ました。通知イベントの json は下記のような内容でした。

{
  "account": "123456789012",
  "detailType": "CodeCommit Pull Request State Change",
  "region": "ap-northeast-1",
  "source": "aws.codecommit",
  "time": "2020-02-20T00:47:20Z",
  "notificationRuleArn": "arn:aws:codestar-notifications:ap-northeast-1:123456789012:notificationrule/4d66e120fe93497bccceXXXXXXXXXXXXXXXXXXXX",
  "detail": {
    "sourceReference": "refs/heads/develop",
    "lastModifiedDate": "Thu Feb 20 00:47:08 UTC 2020",
    "author": "arn:aws:iam::123456789012:user/hoge",
    "isMerged": "False",
    "pullRequestStatus": "Open",
    "notificationBody": "A pull request event occurred in the following AWS CodeCommit repository: qiita_demo. User: arn:aws:iam::123456789012:user/hoge. Event: Created. Pull request name: 6. Additional information: A pull request was created with the following ID: 6. The title of the pull request is: PR for apploving test. For more information, go to the AWS CodeCommit console https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/qiita_demo/pull-requests/6?region=ap-northeast-1.",
    "destinationReference": "refs/heads/master",
    "callerUserArn": "arn:aws:iam::123456789012:user/hoge",
    "creationDate": "Thu Feb 20 00:47:08 UTC 2020",
    "pullRequestId": "6",
    "title": "PR for apploving test",
    "revisionId": "5853753132e2cb33a83e7617af03c69e288d6bc9dddaXXXXXXXXXXXXXXXXXXXX",
    "repositoryNames": [
      "qiita_demo"
    ],
    "destinationCommit": "ebe4b9a5f6f53d00e74aXXXXXXXXXXXXXXXXXXXX",
    "event": "pullRequestCreated",
    "sourceCommit": "0a560861bae31d5d65a3XXXXXXXXXXXXXXXXXXXX"
  },
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:123456789012:qiita_demo"
  ],
  "additionalAttributes": {}
}

ブランチ、コミットの情報などが入っています。

プルリクエストの承認

ここで、別ユーザ (cc-applove-user-1) にてプルリクエストの承認をしてみます。

CodeCommit PR notification 5

承認すると、まもなく次のような通知イベントが届きました。

{
  "account": "123456789012",
  "detailType": "CodeCommit Pull Request State Change",
  "region": "ap-northeast-1",
  "source": "aws.codecommit",
  "time": "2020-02-20T00:50:49Z",
  "notificationRuleArn": "arn:aws:codestar-notifications:ap-northeast-1:123456789012:notificationrule/4d66e120fe93497bccceXXXXXXXXXXXXXXXXXXXX",
  "detail": {
    "approvalStatus": "APPROVE",
    "sourceReference": "refs/heads/develop",
    "lastModifiedDate": "Thu Feb 20 00:47:08 UTC 2020",
    "author": "arn:aws:iam::123456789012:user/hoge",
    "isMerged": "False",
    "pullRequestStatus": "Open",
    "notificationBody": "A pull request event occurred in the following AWS CodeCommit repository: qiita_demo. User: arn:aws:iam::123456789012:user/cc-applove-user-1. Event: Updated. Pull request name: 6. Additional information: A user has changed their approval state for the pull request. State change: APPROVE. For more information, go to the AWS CodeCommit console https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/qiita_demo/pull-requests/6?region=ap-northeast-1.",
    "destinationReference": "refs/heads/master",
    "callerUserArn": "arn:aws:iam::123456789012:user/cc-applove-user-1",
    "creationDate": "Thu Feb 20 00:47:08 UTC 2020",
    "pullRequestId": "6",
    "title": "PR for apploving test",
    "revisionId": "5853753132e2cb33a83e7617af03c69e288d6bc9dddaXXXXXXXXXXXXXXXXXXXX",
    "repositoryNames": [
      "qiita_demo"
    ],
    "destinationCommit": "ebe4b9a5f6f53d00e74aXXXXXXXXXXXXXXXXXXXX",
    "event": "pullRequestApprovalStateChanged",
    "sourceCommit": "0a560861bae31d5d65a3XXXXXXXXXXXXXXXXXXXX"
  },
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:123456789012:qiita_demo"
  ],
  "additionalAttributes": {}
}

detail.approvalStatusAPPROVE になっています。

続いて、一旦この承認を取り消してみます。

CodeCommit PR notification 6

下記のような通知イベントが届きました。

{
  "account": "123456789012",
  "detailType": "CodeCommit Pull Request State Change",
  "region": "ap-northeast-1",
  "source": "aws.codecommit",
  "time": "2020-02-20T00:52:34Z",
  "notificationRuleArn": "arn:aws:codestar-notifications:ap-northeast-1:123456789012:notificationrule/4d66e120fe93497bccceXXXXXXXXXXXXXXXXXXXX",
  "detail": {
    "approvalStatus": "REVOKE",
    "sourceReference": "refs/heads/develop",
    "lastModifiedDate": "Thu Feb 20 00:47:08 UTC 2020",
    "author": "arn:aws:iam::123456789012:user/hoge",
    "isMerged": "False",
    "pullRequestStatus": "Open",
    "notificationBody": "A pull request event occurred in the following AWS CodeCommit repository: qiita_demo. User: arn:aws:iam::123456789012:user/cc-applove-user-1. Event: Updated. Pull request name: 6. Additional information: A user has changed their approval state for the pull request. State change: REVOKE. For more information, go to the AWS CodeCommit console https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/qiita_demo/pull-requests/6?region=ap-northeast-1.",
    "destinationReference": "refs/heads/master",
    "callerUserArn": "arn:aws:iam::123456789012:user/cc-applove-user-1",
    "creationDate": "Thu Feb 20 00:47:08 UTC 2020",
    "pullRequestId": "6",
    "title": "PR for apploving test",
    "revisionId": "5853753132e2cb33a83e7617af03c69e288d6bc9dddaXXXXXXXXXXXXXXXXXXXX",
    "repositoryNames": [
      "qiita_demo"
    ],
    "destinationCommit": "ebe4b9a5f6f53d00e74aXXXXXXXXXXXXXXXXXXXX",
    "event": "pullRequestApprovalStateChanged",
    "sourceCommit": "0a560861bae31d5d65a3XXXXXXXXXXXXXXXXXXXX"
  },
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:123456789012:qiita_demo"
  ],
  "additionalAttributes": {}
}

detail.approvalStatusREVOKE になりました。

再度承認して、最後にプルリクエストをマージします。

ちなみに、承認ルールを上書きした場合には下記のような通知イベントが届きます。

{
  "account": "123456789012",
  "detailType": "CodeCommit Pull Request State Change",
  "region": "ap-northeast-1",
  "source": "aws.codecommit",
  "time": "2020-02-20T00:43:48Z",
  "notificationRuleArn": "arn:aws:codestar-notifications:ap-northeast-1:123456789012:notificationrule/4d66e120fe93497bccceXXXXXXXXXXXXXXXXXXXX",
  "detail": {
    "sourceReference": "refs/heads/develop",
    "lastModifiedDate": "Thu Feb 20 00:30:17 UTC 2020",
    "author": "arn:aws:iam::123456789012:user/hoge",
    "isMerged": "False",
    "pullRequestStatus": "Open",
    "notificationBody": "A pull request event occurred in the following AWS CodeCommit repository: qiita_demo. User: arn:aws:iam::123456789012:user/cc-applove-user-1. Event: Updated. Pull request name: 5. Additional information: An override event has occurred for the approval rules for this pull request. Override status: OVERRIDE. For more information, go to the AWS CodeCommit console https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/qiita_demo/pull-requests/5?region=ap-northeast-1.",
    "destinationReference": "refs/heads/master",
    "callerUserArn": "arn:aws:iam::123456789012:user/cc-applove-user-1",
    "creationDate": "Thu Feb 20 00:30:17 UTC 2020",
    "pullRequestId": "5",
    "title": "PR for apploving test",
    "revisionId": "02a04395842c449148dc0f880d45ed75a04b637e4ae450e1810b5ec14bb7281e",
    "repositoryNames": [
      "qiita_demo"
    ],
    "destinationCommit": "ebe4b9a5f6f53d00e74aXXXXXXXXXXXXXXXXXXXX",
    "event": "pullRequestApprovalRuleOverridden",
    "sourceCommit": "0a560861bae31d5d65a3XXXXXXXXXXXXXXXXXXXX",
    "overrideStatus": "OVERRIDE"
  },
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:123456789012:qiita_demo"
  ],
  "additionalAttributes": {}
}

detail.overrideStatusOVERRIDE になっています。

プルリクエストのマージ

今回は 3way merge でマージしてみました。

CodeCommit PR notification 7

その際の通知イベントは下記のとおりです。

{
  "account": "123456789012",
  "detailType": "CodeCommit Pull Request State Change",
  "region": "ap-northeast-1",
  "source": "aws.codecommit",
  "time": "2020-02-20T00:55:40Z",
  "notificationRuleArn": "arn:aws:codestar-notifications:ap-northeast-1:123456789012:notificationrule/4d66e120fe93497bccceXXXXXXXXXXXXXXXXXXXX",
  "detail": {
    "sourceReference": "refs/heads/develop",
    "lastModifiedDate": "Thu Feb 20 00:55:36 UTC 2020",
    "author": "arn:aws:iam::123456789012:user/hoge",
    "isMerged": "True",
    "pullRequestStatus": "Closed",
    "notificationBody": "A pull request event occurred in the following AWS CodeCommit repository: qiita_demo. User: arn:aws:iam::123456789012:user/hoge. Event: Updated. Pull request name: 6. Additional information: The pull request merge status has been updated. The status is merged. For more information, go to the AWS CodeCommit console https://ap-northeast-1.console.aws.amazon.com/codesuite/codecommit/repositories/qiita_demo/pull-requests/6?region=ap-northeast-1.",
    "destinationReference": "refs/heads/master",
    "callerUserArn": "arn:aws:iam::123456789012:user/hoge",
    "creationDate": "Thu Feb 20 00:47:08 UTC 2020",
    "pullRequestId": "6",
    "title": "PR for apploving test",
    "revisionId": "5853753132e2cb33a83e7617af03c69e288d6bc9dddaXXXXXXXXXXXXXXXXXXXX",
    "repositoryNames": [
      "qiita_demo"
    ],
    "destinationCommit": "ebe4b9a5f6f53d00e74aXXXXXXXXXXXXXXXXXXXX",
    "event": "pullRequestMergeStatusUpdated",
    "mergeOption": "THREE_WAY_MERGE",
    "sourceCommit": "0a560861bae31d5d65a3XXXXXXXXXXXXXXXXXXXX"
  },
  "resources": [
    "arn:aws:codecommit:ap-northeast-1:123456789012:qiita_demo"
  ],
  "additionalAttributes": {}
}

detail.isMergedTruedetail.pullRequestStatusCloseddetail.mergeOptionTHREE_WAY_MERGE になっています。

まとめ

CodeCommit リポジトリへのプルリクエストに対して通知を受け取ることができるようになったので試してみた話でした。
どの通知イベントについても言えるのは detail.notificationBody に詳細なメッセージが入っているので、 Slack に通知する際にはこのメッセージをメインに流せば良さそうな気がします。これまではプルリクエストに対する承認を人間の手で誰かしらに通知していましたが、今回のアップデートで、開発がよりスムーズに進められるようになりそうです。(そもそも今までなんでなかったんでしょうね…)

前回の CodeBuild のときにも思いましたが、めちゃくちゃ簡単に通知の設定ができるのは良いですね。


comments powered by Disqus