GitHub ActionsのDockerコンテナアクションでproblem matchersを使う

Dockerコンテナアクション

GitHub Actions (GHA)のDockerコンテナアクション

  • アクションを呼び出したときに実行したいスクリプト(entrypoint.sh)
  • その実行環境としてのDockerfile

を用意してGHAのアクションとしてまとめたもの。かんたんに他のリポジトリから利用できるアクションを作ることができる。

problem matchers

GHAにはproblem matchersという機能がある。この機能を使うと、アクション実行時に標準出力に現れる文字列(多くは静的解析ツールが出力する警告など)を解析する正規表現を含む設定ファイルを事前に::add-matcherコマンドで登録することで、プルリクエスト (PR)の"Files changed"タブにアノテーションを表示できる。

アノテーションとは、具体的には次のような表示のこと。

problem matchersによるアノテーションの表示。この例ではRuboCopの解析結果を表示している

Dockerコンテナアクションの実行時にproblem matchersを有効化する

以上の機能を組み合わせて、Dockerコンテナアクションで静的解析ツールを実行して、その結果をproblem matchersによってアノテーションとして表示したいときは次のようにする。

まず、アクションのentrypoint.shで::add-matcherをechoしておく。

#!/bin/sh -l

# アクションのリポジトリの.github/matcher.jsonにmatcherの定義を書いておく
echo "::add-matcher::.github/matcher.json"

# 静的解析ツールの実行など…

これでmatcherの設定ファイルがGHAに認識され、登録される。

あとは、matcherで定義したパターンの文字列(ファイル行を含む)を標準出力に出力すると、matcherがパターンを解析して、アクションを呼び出したPRの"Files changed"タブのdiff上で対応する行にアノテーションを付与する。

::add-matcherのドキュメントの例では、ワークフロー上でmatcherを追加する例だけが載っているだけなのだが、GHAとしては標準出力に::add-matcherが出ていれば、それを見てmatcherを登録するだけなので、アクション側のスクリプトでechoしても問題ないというのが発見だった。