🧹

GitHub ActionsでKnipを使ってデッドコードを自動検出・レポートする

に公開

何?

KnipをGitHub Actionsで自動実行し、デッドコードを定期的に検出・レポートするよう設定をします。

KnipのGitHub Actionsガイド の通りに実装すると、デッドコードが検出された際にCIが失敗ステータスになります。しかし、これではプルリクエストにKnipの修正を強制的に含める必要があるため、プルリクのコメントとして出力する形を採用します。

CIのチェックとして組み込むと、プルリクにデッドコードの修正を含める必要があります。しかし、コードの削除は慎重に行いたい作業です。また、仮に指摘を無視する場合でも、その判断を1つのプルリクに含めるのは可能であれば避けたい。

このような理由から、プルリクの差分を小さく保つため、Knipの実行結果をコメントとして出力する方式を選びました。

GitHub Actionsワークフローに組み込み

jobs:
  report-dead-code:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: package.json
      - run: npm ci
      - id: knip
        continue-on-error: true
        run: npx knip --reporter=markdown --no-progress > knip-report.md
      - if: ${{ steps.knip.outcome == 'failure' }}
        run: |
          gh pr comment ${{ github.event.pull_request.number }} --body-file knip-report.md --edit-last --create-if-none
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

説明

CIとしてコケてしまうとプルリクにデッドコードの削除を混ぜ込まないといけないのであくまでもコメントとして指摘するまでに留めてます。

- id: knip
  continue-on-error: true
  run: npx knip --reporter=markdown --no-progress > knip-report.md

この部分でKnipを実行し、デッドコードのレポートをMarkdown形式でknip-report.mdへ出力します。continue-on-error: trueとしています。Knipによるデッドコードの検出があっても、CIとしてのチェックは失敗扱いになってほしくないので継続させます。

- if: ${{ steps.knip.outcome == 'failure' }}

Knipがデッドコードを検出した場合のみ次のステップが実行されます。

gh pr comment ${{ github.event.pull_request.number }} --body-file knip-report.md --edit-last --create-if-none

--edit-last --create-if-none でコミットを重ねた際も既存のコメントが更新される形で、プルリクのコメント欄にKnipのレポートが表示されます。

活用のポイント

このケースは、コメントされるのが鬱陶しいので直そう! という力学が働いてくれることを期待して、プルリクコメントへ出力させるようにしました。

ちゃんとGitHub ActionsのJob Summariesページに行って見てくれて、放置されなそう! ということであれば、以下のように$GITHUB_STEP_SUMMARYへ出力する形にしても良さそうです。

jobs:
  report-dead-code:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: package.json
      - run: npm ci
      - run: npx knip --reporter=markdown --no-progress --no-exit-code >> $GITHUB_STEP_SUMMARY

とかでも良さそう。

Discussion