💯

GitHub ActionsでCODEOWNERSファイルの変更を詳細に報告するツール

2023/11/24に公開

皆さん、こんにちは! @hoshinotsuyoshi です。今回は、私が開発した便利なツールについて紹介したいと思います。このツールは、GitHubのCODEOWNERSファイルの変更を正確に報告し、プルリクエストのレビューを効率的に進めるのに役立ちます。

背景

プロジェクトの管理では、CODEOWNERSファイルを使用して、特定のファイルやディレクトリに対する所有者(コードの保有者)を指定することがあります。

しかし、このファイルの解釈・パースは複雑怪奇で、このファイルの内容が変更された場合、具体的にどのファイルが影響を受けるのかを把握するのは簡単ではありません。

同僚のmh4gfさんの記事 GitHubのCODEOWNERSで一部サブディレクトリだけ別のオーナーを指定する も御覧ください。 サブディレクトリだけ別のオーナーを指定するときにこんな書き方をしないといけないんです。 どうです、すごく難しいでしょう? CODEOWNERSファイル自体のレビューが大変なんです。

この問題に対処するために、私はGitHub Actionを利用したツールを開発しました。

GitHub Actions用のファイル

こんなのを作りました。

# .github/workflows/post-codeowners-result-diff.yml
name: post-codeowners-result-diff

on:
  pull_request:
    paths:
      - .github/CODEOWNERS
      - .github/workflows/post-codeowners-result-diff.yml

jobs:
  post-codeowners-result-diff:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    timeout-minutes: 10

    steps:
      - name: setup codeowners
        run: |
          mkdir /opt/bin
          curl -sL "https://github.com/hmarr/codeowners/releases/download/v${CODEOWNERS_VERSION}/codeowners_${CODEOWNERS_VERSION}_linux_amd64.tar.gz" -o /tmp/codeowners.tar.gz
          hash=$(sha256sum /tmp/codeowners.tar.gz  | awk '{ print $1 }')
          if [ "$hash" = "e69a42a4a28efd58a87a0dc0d8f32223c1f6ccda7954afd40108abf98517a13f" ]; then
              cat /tmp/codeowners.tar.gz | tar zfx - -C /opt/bin
          else
              echo $hash
              echo invalid
              exit 1
          fi
        env:
          CODEOWNERS_VERSION: 1.1.2

      - uses: actions/checkout@v3
        with:
          ref: ${{ github.base_ref }}

      - name: call codeowners command on github.base_ref
        run: |
          /opt/bin/codeowners > /tmp/result.1

      - uses: actions/checkout@v3
        with:
          ref: ${{ github.ref }}

      - name: call codeowners command on github.ref
        run: |
          /opt/bin/codeowners > /tmp/result.2

      - name: make report file
        run: |
          echo '<details><summary>codeowners diff report (.github/workflows/post-codeowners-result-diff.yml)</summary>' > /tmp/diffs
          echo ''        >> /tmp/diffs
          echo '```diff' >> /tmp/diffs
          diff -u /tmp/result.1 /tmp/result.2 >> /tmp/diffs | true
          echo '```' >> /tmp/diffs
          echo ''    >> /tmp/diffs
          echo '</details>' >> /tmp/diffs

      - name: post comment
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          hide_and_recreate: true
          header: report
          path: /tmp/diffs

使い方

上記のファイルを .github/workflows/ の下に.ymlファイルとしてプロジェクトに追加します。それだけです。

あとは、以下のことが GitHub Actionsで自動で動きます

  1. GitHub上でプルリクエストが開かれた際に、CODEOWNERSファイルに変更があるかどうかを自動的に検知します。
  2. 変更がある場合、プルリクエストに自動的に詳細な差分レポートがコメントとして投稿されます。

サンプルレポート

変更があった場合、以下のような詳細な差分レポートが生成されます。

report

どうです! わかりやすそうでしょう!?

結び

このツールを使えば、CODEOWNERSファイルの変更に関する不透明な部分を解消し、チーム全体でのコードの所有権を確実に管理できます。ぜひお試しください!

最後に、このツールのレビューをしてくれた社内の方と、 CODEOWNERSパーサーの開発者の方に感謝申し上げます。 というかこのパーサーが便利すぎて嬉しくて感謝コメントを投稿しました。

皆さんのフィードバックをお待ちしています!

それでは、Happy coding!

ROUTE06 Tech Blog

Discussion