LoginSignup
1

PowerShell + GitHub Actions + Codecov でカバレッジを可視化する

Posted at

はじめに

以前 Pester でテストコードを書く方法と PSScriptAnalyzer で静的解析する方法の紹介記事を投稿していました。
ただ、ここまで記事を書いて CI の方法を紹介しないのは尻切れトンボ感が強いと思い、
GitHub Actions で git push したときに自動でテストコードと静的解析を実行し、
Codecov でカバレッジをいい感じに可視化するまでを試してみたので、その手順も残しておきます。

関連する過去の記事はこちら。

本稿で紹介する一式のソースコードはこちらに置いてます。

CI で使用するツールについて

GitHub Actions

PowerShell 界隈では AppVeyor がよく利用される CI サービスになってますが、今回は GitHub Actions を採用しています。
かつては Windows 環境を無料で提供する CI サービスといえば AppVeyor が主流でしたが、
2019 年頃から GitHub や他の CI サービスでも無料で Windows 環境を利用できるようになりました。

この記事では、GitHub にサンプルを公開しているので、 GitHub Actions をそのまま CI サービスとして使うことにしました。
GitHub の公開リポジトリであれば無料で使えるので。
※ 本稿では基本的なところの説明は省きます。

Codecov

カバレッジツールは Codecov を使いましたが、他にも有名どころとしては Coveralls があります。
ただ、 Codecov の方が使用感の評価が高い印象を持っていたことと、
PowerShell のカバレッジを Coveralls に連携できる確かな情報がなかったので、Codecov を採用しました。

ちなみに、こちらも公開リポジトリであれば無料で使えます。

Pester でカバレッジレポートを出力する

Codecov に連携するカバレッジレポートは Invoke-Pester に CodeCoverage 関連の設定を有効にすることで出力できます。

設定情報は Invoke-Pester で該当するパラメータを指定するやり方(-CodeCoverage, -CodeCoverageOutputFile など)と
PesterConfiguration オブジェクトを作ってそれを -Configuration に渡す
やり方があります。
指定可能なオプションの詳細は New-PesterConfiguration | Pester をご参照ください。

今回は yml ファイルで管理しやすいように後者を使っています。
書き方はざっくり以下のようになります。

$PesterPreference = New-PesterConfiguration
$PesterPreference.Run.Path = ".\PwshCIDemo.Tests"
$PesterPreference.CodeCoverage.Enabled = $true
$PesterPreference.CodeCoverage.Path = ".\PwshCIDemo\*.ps*1"
Invoke-Pester -Configuration $PesterPreference

上記以外にも設定項目はありますが、基本デフォルト設定で問題ないです。
デフォルトの場合、 coverage.xml というファイルで JaCoCo 形式にカバレッジレポートが出力されます。

ちなみにテストが失敗すると以下のように GitHub Actions から確認できます。

image.png

image.png

PSScriptAnalyzer での解析結果を出力する

静的解析の範囲としてテストコードは対象外にしたいので、 PwshCIDemo 配下の PowerShell ファイルのみを対象にしています。
※ ファイルパターンを特に指定していなければ、.ps1.psm1 および .psd1 が評価されます。

CI で実行する際は -OutVariable を使って解析結果を PowerShell オブジェクトで取得し、メッセージの出し分けを行うようにしました。

Invoke-ScriptAnalyzer -Path ".\PwshCIDemo" -Recurse -OutVariable issues
$errors   = $issues | ? {$_.Severity -eq 'Error'}
$warnings = $issues | ? {$_.Severity -eq 'Warning'}
if ($errors) {
    Write-Error "There were $($errors.Count) errors and $($warnings.Count) warnings total." -ErrorAction Stop
} else {
    Write-Output "There were $($errors.Count) errors and $($warnings.Count) warnings total."
}

もし、 $errors が1件以上であれば、GitHub Actions で以下のような表示になります。

image.png

GitHub Actions を設定する

これまで説明した Pester と PSScriptAnalyzer のコマンドを GitHub Actions の設定ファイルに記載したのが以下のファイルです。

実行するプラットフォームとして、 Ubuntu, macOS, Windows の各最新バージョンを指定しています。

    strategy:
      matrix:
        platform: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.platform }}

これらのプラットフォームには、必要最小限のものしか入っていないので、
Install from PSGallery にて Pester と PSScriptAnalyzer を PSGallery からインストールします。

ちなみに、 shell に pwsh を指定していますが、 Windows 環境であれば powershell も指定可能です。
ただ、 pwsh が 7 系なのに対して、 powershell は 5 系が使われるようになるため注意が必要です。

今回はマルチプラットフォームに対応する PowerShell モジュールを想定しているので、 pwsh のみにしています。

テストが Pass しているかのバッジを README.md につける

直前のテストが成功しているかどうかを示すために、README.md にバッジを追加します。

表示するバッジは以下の URL から取得できます。

https://github.com/<OWNER>/<REPOSITORY>/actions/workflows/<WORKFLOW_FILE>/badge.svg

今回ですとこちらです。

参考:

Codecov を設定する

Pester で生成した coverage.xml を Codecov へアップロードする設定をしていきます。
Codecov へ連携するためには、ユーザ登録と Codecov の GitHub App のインストールが必要です。

まだの方は、以下のリンクから実施できます。

GitHub Actions の設定内容はこちらです。
secrets.CODECOV_TOKEN を設定していますが、公開リポジトリの場合はなくても大丈夫です。

- name: Upload test coverage to Codecov
  uses: codecov/codecov-action@v1.0.13
  with:
    name: Output coverage with Codeocv
    token: ${{ secrets.CODECOV_TOKEN }}
    file: coverage.xml

出力結果はこちらのリンクから確認できます。

こんな感じで1ファイルごとにカバレッジが把握できます。

image.png

各ファイルを開けば、どの行でテストが実施・未実施なのかが一目でわかります。

image.png

カバレッジの数値を示すバッジを README.md につける

Codecov で表示しているカバレッジの数値もバッジで表示できます。
バッジは以下の URL から取得しました。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1