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をパースして失敗デプロイにフラグを立てるなどの処理が必要になりそうに思いました。

以上です。

コメント