ReSharperでC#のコードを静的解析するアクションを作りました

muno-92.hatenablog.com

の記事で紹介したReSharper Command Line Toolsを使った静的解析について、再利用しやすいようにアクションを作成しました。

github.com

on: [push]

jobs:
  inspection:
    runs-on: ubuntu-latest # or macos-latest, windows-latest
    name: Inspection
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup .NET
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: '5.0.x' # or 3.1.x
      - name: Restore
        run: dotnet restore
      - name: Inspect code
        uses: muno92/resharper_inspectcode@1.0.0
        with:
          solutionPath: ./解析対象のソリューション.sln

のように指定して頂ければ、解析結果がアノテーションとして差し込まれます。

f:id:muno_92:20210511222430p:plain

良かったら使ってみて下さい。

これより下はどのようにアクションを作ったかについての内容になります。

TypeScriptでのアクション作成

アクションは「Docker」「JavaScript」「複合実行ステップ」の3種類がありますが、今回アクションを作成するに当たって以下の点を満たしたいと考えました。

  • 解析結果のXML(サンプル)でメッセージとは別のタグに記載されている重要度を取得してアノテーションに反映させたい
  • 複数のOS・.NETのバージョンで動くようにしたい
    • 複数の.NETでの動作は最低限可能にする(LTSの.NET Core3.1 + 最新の.NET5)
    • 複数OSでの動作は出来たら良いかな、という位

それに加え、普段使っていないTypeScriptを触ってみたかったので、公式から提供されているTypeScriptでJavaScriptアクションを作成するテンプレートを使ってアクションを作成しました。

アクションの中身

処理としてはhtmlparser2でXMLをパースして取り出した指摘事項を公式ツールキットのIssueCommand関数に渡してアノテーションとして表示されるようにしています。

www.npmjs.com

XMLのパースにどのライブラリを使ったら良いのか分かりませんでしたが、ダウンロード数やTypeScriptでの使いやすさ、Issue/PRが溜まっていないかといった点をチェックしてhtmlparser2を選びました。

このライブラリの方が良いよ、というのがあったら教えて頂けると嬉しいです。

アノテーションの表示については最初はツールキットのcore.warning()`やcore.error()で出力したメッセージのパターンをProblem Matchersで指定しようとしたのですが、この方法ではアノテーションとして表示されませんでした。

blog.utgw.net

によるとProblem Matchersは標準出力/標準エラー出力を読み取っているようですが、この記事を参考にRunnerのコードを追ってみた所、

と違いがあったため、それが原因ではないかと思います。

上記記事やActionCommandManagerのコードを見て初めてwarningやerrorのメッセージを出力する際にファイル情報をプロパティとして指定出来ると分かったため、その方法を採りました。
(この記事を書いている今になってドキュメントに記載されていると気づきました・・・)

ツールキットを使うと以下のような形になります。

import {issueCommand} from '@actions/core/lib/command'

issueCommand('warning', {file: 'ファイルパス', line: 行番号, col: 列番号}, 'メッセージ')

Problem Matchersを使った方法では正規表現を読み解かないとどのようなメッセージ形式なのか分かりませんが、こちらは明示的ですね。

感想

今回TypeScriptでアクションを作成しましたが、公式でテンプレートやツールキットが用意されており、作成し易かったです。

TypeScript自体についても、不慣れなライブラリを使う際に使い方が合っているか型で確認出来るので、やっぱり型があるのは良いなと思いました。

GitHub Actionsに限定せず、機会を見つけてTypeScriptを使っていこうと思います。