GeekFactory

int128.hatenablog.com

Step Functions の結果を EventBridge 経由で Slack に通知する

下記の記事で EventBridge から Slack への通知が紹介されていたため、Step Functions で試してみました。

dev.classmethod.jp

基本的な流れは記事で説明されているので省略します。Step Functions 固有の内容だけ本記事で説明します。

Step Functions のイベント

EventBridge では state machine の ARN やステータスを絞り込めます。例えば、以下のように記述すると全 state machine の成功と失敗のイベントを受け取ります。

{
  "source": ["aws.states"],
  "detail-type": ["Step Functions Execution Status Change"],
  "detail": {
    "status": ["SUCCEEDED", "FAILED"]
  }
}

実際に Step Functions から受け取ったイベントを貼っておきます。

{
  "executionArn":"arn:aws:states:us-west-2:ACCOUNT:execution:helloworld:7cdd674c-eaac-12de-b073-549373ca07fa",
  "stateMachineArn":"arn:aws:states:us-west-2:ACCOUNT:stateMachine:helloworld",
  "name":"7cdd674c-eaac-12de-b073-549373ca07fa",
  "status":"SUCCEEDED",
  "startDate":1643530763937,
  "stopDate":1643530764140,
  "input":"{\n    \"Comment\": \"Insert your JSON here\"\n}",
  "inputDetails":{"included":true},
  "output":"\"World\"",
  "outputDetails":{"included":true}
}

inputoutput には state machine の入出力が設定されます。state machine で通知本文を出力する使い方がありそうです。

イベントの内容をダンプするには Input Transformer で以下を指定します。Slack にそのまま JSON がポストされます。

{"json":"$.detail"}
{
  "channel": "ID",
  "text": <json>
}

Slack の通知内容

以下のように state machine execution へのリンクを付けておくと便利です。

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "<status> `<output>`"
            }
        },
        {
            "type": "context",
            "elements": [
                {
                    "type": "mrkdwn",
                    "text": "https://us-west-2.console.aws.amazon.com/states/home?region=us-west-2#/executions/details/<executionArn>"
                }
            ]
        }
    ]
}

Renovate で特定のパッケージを同時に上げる

Renovate で特定のパッケージ群のバージョンを同時に上げる方法を調べたのでメモです。

解決したい課題

TypeScript GitHub Action で以下のパッケージのバージョンアップを個別に受け取るので CI が失敗してしまう。auto merge できない。

  • jest
  • jest-circus
  • ts-jest

解決策

Group all packages starting with abc together in one PR を参考にしました。Renovate の設定で matchPackageNames, groupName を指定すると1つの PR にまとめてバージョンアップされます。

具体的には以下のように設定します。

  "packageRules": [
    {
      "matchPackageNames": ["jest", "ts-jest"],
      "matchPackagePrefixes": ["jest-"],
      "groupName": "jest"
    }
  ]

これで複数のパッケージをまとめた PR を受け取れました。

github.com

Pull Request Review 情報を API で取得する

Pull Request のレビューで Code Owner が設定されているかどうかを取得する方法を調べたのでメモ。

GraphQL APIReviewRequest オブジェクトで Code Owner かどうか取得できます。クエリの例を書いておきます。

query { 
  repository(owner: "OWNER", name: "REPO") {
    pullRequest(number: 1918) {
      reviewRequests(first: 10) {
        nodes {
          asCodeOwner
          requestedReviewer {
            ... on Team {
              team: name
            }
            ... on User {
              user: login
            }
          }
        }
      }
    }
  }
}
{
  "data": {
    "repository": {
      "pullRequest": {
        "reviewRequests": {
          "nodes": [
            {
              "asCodeOwner": true,
              "requestedReviewer": {
                "team": "sre"
              }
            },
            {
              "asCodeOwner": false,
              "requestedReviewer": {
                "user": "int128"
              }
            }
          ]
        }
      }
    }
  }
}