FourKeysのデプロイ頻度をpull requestから計測したいのですが、productionマージをしたからといって本番リリースを実施するというわけではないという運用をしています。
この運用だと、productionマージとリリース数が一致しません。
何か使える情報はないか検討したところ本番リリースをする場合に、GitHub上でリリースの作成、公開を行っていたので、この作業をトリガーに、指定したエンドポイントにリリース情報を送信するGitHub Actionを作ってみました。
ActionはComposit Actionで利用する側でパラメーターを指定して実行します。
send-deployment-frequency-action/.github/actions/send-deployment-frequency/action.yml at main · kemsakurai/send-deployment-frequency-action
GitHubのComposit Actionになります。
name: 'Send realease info'
description: 'Sends release information to the specified WebHookURL. The purpose is to record the deployment frequency of Four Keys.'
inputs:
web-hook-url:
description: 'Web hook URL to which release information will be sent'
required: false
default: 'https://httpbin.org/post'
github-token:
description: 'GitHub token'
required: true
runs:
using: "composite"
steps:
- name: Get release info and Post Data
shell: bash
env:
GITHUB_TOKEN: ${{ inputs.github-token }}
run: |
gh api graphql -f id="${{ github.event.release.node_id }}" -f query='
query ($id: ID!) {
node(id: $id) {
... on Release {
id
author {
login
}
description
isDraft
isPrerelease
databaseId
name
repository {
name
}
resourcePath
updatedAt
publishedAt
createdAt
tag {
name
}
tagCommit {
additions
deletions
}
tagName
url
}
}
}' |
jq -r '.data.node |
{
id: .id,
user: .author.login,
description: .description,
isDraft: .isDraft,
isPrerelease: .isPrerelease,
databaseId: .databaseId,
name: .name,
repositoryName: .repository.name,
resourcePath: .resourcePath,
publishedAt: .publishedAt,
updatedAt: .updatedAt,
createdAt: .createdAt,
additions: .tagCommit.additions,
deletions: .tagCommit.deletions,
tagName: .tagName,
url: .url
} |
@json' |
curl '${{ inputs.web-hook-url }}' -X POST -H 'accept: application/json' -H 'Content-Type: application/json' -d @-
GitHub Webhookでの同じような情報が取得できますが、GitHub Actionを作ったのは以下の理由からです。
-
送信する際の条件を詳細に絞り込むことができる。 Webhookも送信条件を絞り込むことはできますが、GitHub Actionよりも大雑把な指定しかできません。
-
フラットなJSONとして情報を送信できる。
Webhook のイベントとペイロード - GitHub Docs に記載がありますが、GitHubのWebhookからの送信情報はJSONのネストが深いです。SlackのWebhookは、第1階層までのネストが浅い情報しか受け取ることができません。
mixcloud-java-api/.github/workflows/send-release-info.yml at master · kemsakurai/mixcloud-java-api
Composit Actionを利用しているGitHub Actionです。
on:
release:
types:
- published
jobs:
send-release-info:
runs-on: ubuntu-latest
steps:
- name: Get release info and Post Data
uses: kemsakurai/send-deployment-frequency-action/.github/actions/send-deployment-frequency@main
with:
web-hook-url: 'https://httpbin.org/post'
github-token: ${{ secrets.GITHUB_TOKEN }}
情報の送信先は、'https://httpbin.org/post'
にしていますが、ここには本来Webhook URLを指定します。
- 実際利用するときに考慮が必要なところ
変更失敗率の記録を考えると、リリース情報の説明欄にあらかじめpull requestの情報を特定の記法で記入しておいて、情報を受け取った後の処理で、Descriptionをパースして失敗デプロイにフラグを立てるなどの処理が必要になりそうに思いました。
以上です。
コメント