🔖

CI で ReShaper command line tools での Unity の静的コード検査

2023/10/27に公開

CI で ReShaper command line tools での Unity の静的コード検査

私は C# のプログラマーで日頃 ReSharper command line tools で CI でコードの静的検査を行っています。Rider でも確認しているので、CI は保険の意味が強いのですがとても助かっています。

Unity は C# でコードを書けるので同じようにやりたいのですが、ビルドシステムなどは Unity のものが利用されていて、.NET のエコシステムをすんなり利用できません。「そうは問屋が卸さねぇ!」のオンパレードです。

なんとかなりましたので、メモを残します。

利用したのは Game CI が用意している Docker イメージ unityci/editor:2022.3.11f1-linux-il2cpp-2 です。

リポジトリ Unity Sample Game でいろいろ挑戦中です。

静的検査を組み込む

ビルドの前に Unity にライセンスを組み込まないといけないのですが、ライセンスの取得や組み込み方法は GameCI 公式ドキュメントの Activation あたりを参考に頑張ってください。

.sln.csproj の出力

ReSharper command line tools の静的コード検査は .sln.csproj がないと機能しません。Unity は統合開発環境連携のためにこれらを出力しますが、バージョン管理から除外するのが一般的です。まずはこれを出力しなければなりません。

ググればいろんな方法が見つかります。しかし、これらの方法は統合開発環境が入っていないとうまく動きませんでした。

次のように、Unity の Rider 拡張に含まれる ProjectGeneration クラスが便利でした。

Assets/Builder/Editor/Export.cs
using Packages.Rider.Editor.ProjectGeneration;
using UnityEditor;

public static class Export
{
    public static void VSSolution()
    {
        AssetDatabase.Refresh();
        var generator = new ProjectGeneration();
        generator.Sync();
    }
}

これをコマンドラインから呼び出します。

$ unity-editor -quit -batchmode -nographics -logfile - -executeMethod Export.VSSolution

...

$ ls *.sln *.csproj
Assembly-CSharp-Editor.csproj  Assembly-CSharp.csproj  unity-sample-game.sln

ReSharper command line tools のインストール

ReSharper command line tools の実行のためにまずは .NET SDK をインストールします。方法は何でもいいのですが、dotnet-install スクリプトを使いました。

$ wget https://dot.net/v1/dotnet-install.sh
$ chmod +x dotnet-install.sh
$ ./dotnet-install.sh --channel 6.0 --install-dir dotnet
$ export PATH=$PATH:$PWD/dotnet

ReSharper command line tools の .NET Tools 版を Unity プロジェクトにインストールします。

$ dotnet new tool-manifest
$ dotnet tool install JetBrains.ReSharper.GlobalTools

これで検査できるようになります。

$ dotnet jb inspectcode --output=report.xml --build unity-sample-game.sln

...

Inspection report was written to /project/report.xml

レポートを一部抜粋します。

<Issue TypeId="InconsistentNaming" File="Assets\Builder\Editor\Export.cs" Offset="254-264" Line="9" Message="Name 'VSSolution' does not match rule 'Methods'. Suggested name is 'VsSolution'." />

Unity の検査ルールにする

静的コード検査はできるようになったのですが、Rider では問題なしのコードが ReSharper command line tools では問題ありと報告されます。Rider と同様に Unity 用の Rider 拡張を組み込む必要がありました。

$ dotnet jb inspectcode --output=report.xml --build --extensions=JetBrains.Unity unity-sample-game.sln

例外が出ますが気にしません。

これで無事に Rider + Unity と同じ静的コード検査が得られます。

ついでの GitLab Code Quality

GitLab は Merge Request に静的コード検査の結果を表示することができます。標準では Code Climate を利用しますが、レポート形式さえ合わせれば Code Climate 以外も利用できます。

ReSharper command line tools のレポートは独自形式のため、これを Code Quality 形式に変換します。変換ツールはいろいろありますが、私が開発している Ignis.ReSharper.Reporter を使います。

まずはインストールします。

$ dotnet tool install Ignis.ReSharper.Reporter.Tool

レポートを変換します。

$ dotnet tool resharper-reporter --input report.xml --export "type=codequality;file=gl-code-quality-report.json"

.gitlab-ci.yml で、Unity ライセンスの組み込み、.NET SDK やツール類のインストール、静的コード検査、レポートの変換を行い、artifacts:reports:codequality に Code Quality 形式のレポートを添付します。

.gitlab-ci.yml
inspectcode:
  script: # ここに処理を書く
  artifacts:
    name: inspectcode
    reports:
      codequality: gl-code-quality-report.json
    when: always

うまくいけば Merge Request に静的コード検査の結果が表示されます。

他に試したこと

  • Unity には mono / dotnet が付属していますが、これを使ってもうまくいきませんでした。
  • ReSharper command line tools で SARIF 形式での出力 (--format=Sarif) は例外で途中で止まります。 (--extensions=JetBrains.Unity をつけるとダメ)
  • Unity から出力した .csproj のビルドには Unity に含まれるパッケージが必要で、なおかつ必要なパッケージへの依存関係が絶対パスになっていました。静的コード検査で .NET SDK Docker イメージを使ってみましたが、ビルドができませんでした。

Discussion