ご挨拶
お世話になっております。
都内の某企業でエンジニアをやっている ひろしま という者です。
とあるお仕事で、GitLabを使って.NETアプリのパイプライン構築をしていたのですが、
MRにユニットテストのカバー率を表示する際に、WEB上に最新情報が落ちていなくてハマったので
記事にしてみようと思います。
参考サイト
参考にしたWEBサイトは、GitLab公式の1年前の記事です。
https://www.gitlab.jp/blog/2021/09/27/gitlab-coverage-dotnet/
本題
このサイトに書かれている内容が古く、ハマってしまいました。
主に古いのは、dotnet-reportgenerator-globaltool
が吐き出すHTMLレポートファイルの形式です。
参考サイトのサンプル画像を見て分かる通り、1年前の時点ではのっぺりとしたデザインのレポートでした。
しかし、どうも最近デザインがシャレオツになってしまった結果、面倒くさいHTMLファイルになってしまいました。
もちろん正規表現バリバリLinuxのコマンドサクサクみたいな人はつまづかないのでしょうけど……。
具体的にはこの部分です。
after_script:
- dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
- grep 'Line coverage:' coverage/index.html
coverage: "/Line coverage:/"
1年前はたったこれだけでよかったのですが、どうもシャレオツになった結果、
1行分取れば良いわけではなく、2行目を取らないとカバー率が取得できなくなっています。
しかも、アクセシビリティに配慮してか、title
属性まで付与されており、その中に123 of 123
のように数字が入っています。
結論
こうしてください。
after_script:
- dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
- grep -A 1 'Line coverage:' coverage/index.html
coverage: "/\\<td.*\\>(\\d+.\\d+)%/"
解説
まず、 grep -A 1 'Line coverage:' coverage/index.html
の-A 1
についてです。
新デザインではカバー率の値の部分が改行されているので、マッチした1行分だけでは取れません。
なので、-A 1
オプションを付けて、マッチした行+1行分下まで表示するようにします。
次に、coverage: "/\\<td.*\\>(\\d+.\\d+)%/"
についてですが、
これはgrep
でひっかけてきた2行分のうちの2行目のカバー率の値だけにマッチさせています。
どうやら coverage:
は、その文字列中に最初に見つかった数字をカバー率として認識するらしく、
冒頭でも書いた通りこのtd
タグにはtitle
属性で123 of 123
のような数字が含まれています。
なので、その部分を無視するようにマッチさせています。
最後に
簡単ではありますが、これからGitLabを使って同じことをしようと思っている方の助力になれば幸いです。
追記:2022/11/10
出力するレポートの種類をHTMLではなくTextSummaryにすれば、こんなことしなくても取れるみたいです。
after_script:
- dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:TextSummary
- grep 'Line coverage:' coverage/Summary.txt
coverage: "/(\\d+.\\d+)%/"
勉強不足でした。。