Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

.NET Coreのグローバルツールを作る勉強でdotnet-mlbを作ったので仕組みの整理とCI/CDの手順をまとめた

こんにちは。MLBお兄さんこと松村です。
連休中の勉強ネタとして .NET Core のグローバルツールを勉強してみました。

.NET Coreグローバルツールとは

公式ドキュメントにはこのように記されています。

.NET Core グローバル ツールは、コンソール アプリケーションを含む特殊な NuGet パッケージです。 グローバル ツールは、PATH 環境変数に含まれている既定の場所またはカスタムの場所のマシンにインストールできます。

docs.microsoft.com

つまり dotnet コマンドを拡張するためにインストールすることができるツールです。
npm install -g {package} でインストールできる、npmのグローバルツールのようなものです。

仕組み

dotnet tool install -g {ツール名} でグローバルツールをインストールします。
このとき指定されたツールは %USERPROFILE%\.dotnet\tools に配置されます。(LinuxやmacOSでは $HOME/.dotnet/tools となる)
このディレクトリにパスを通すことで、端末内のどこでも実行できることになります。

また .NET Coreグローバルツールは2種類の実行方法があります。

  • dotnet <toolName>
  • <toolName>

つまり dotnet をつけるかどうかの違いになりますが、実行形式ファイルのファイル名の付け方によって呼び出し方が変わります。

  • dotnet-<toolName>.exe -> dotnet <toolName>
  • <toolName>.exe -> <toolName>

作り方

.NET Coreグローバルツールはもちろん自作することができます。
詳しくはこちらのドキュメントをご覧ください。

docs.microsoft.com

ざっくり説明すると、下記のルールで作っていけば良いです。

  • コンソールアプリケーションであること (dotnet new console)
  • ツールとして使用することを csproj ファイルに記述する
    • <PackAsTool>
    • <ToolCommandName>
    • <PackageOutputPath>
  • .nupkg ファイルとしてパッケージを作成する (dotnet pack)

サンプルを作ってみた

ということで勉強がてらサンプルを作ってみました。

github.com

yuta> dotnet tool install -g dotnet-mlb
次のコマンドを使用してツールを呼び出せます。dotnet-mlb
ツール 'dotnet-mlb' (バージョン '0.2.0') が正常にインストールされました。
yuta>
yuta> dotnet mlb
https://www.mlb.com/
yuta>
yuta> dotnet mlb --teams
=== American League ===
Baltimore Orioles
Boston Red Sox
New York Yankees
Tampa Bay Rays
Toronto Blue Jays
Chicago White Sox
Cleveland Indians
Detroit Tigers
Kansas City Royals
Minnesota Twins
Houston Astros
Los Angeles Angels
Oakland Athletics
Seattle Mariners
Texas Rangers

=== National League ===
Atlanta Braves
Miami Marlins
New York Mets
Philadelphia Phillies
Washington Nationals
Chicago Cubs
Cincinnati Reds
Milwaukee Brewers
Pittsburgh Pirates
St. Louis Cardinals
Arizona Diamondbacks
Colorado Rockies
Los Angeles Dodgers
San Diego Padres
San Francisco Giants

(特に意味のないジョークツールですw)

自作した .NET Coreツールを公開する

自作した .NET CoreツールはNuGetに公開することで他のユーザーにも配布することができます。
NuGetに手動でアップロードして公開するなら、こちらのドキュメントが参考になります。

docs.microsoft.com

私が勉強用に作った dotnet-mlb も NuGet に公開していますので、良かったら使ってみてください。

www.nuget.org

Azure DevOpsで自動化する

.NET Core ツールを修正するたびに手動で公開作業するのは愚の骨頂です。自動化できるものは自動化しちゃいましょう。
今回はAzure DevOpsを使って、公開作業を自動化してみます。

※Azure DevOpsアカウントの作成手順は省略します。

プロジェクトを作成する

Azure DevOpsのトップ画面の [New project] からプロジェクトを作成します。
このときプロジェクト名は組織のなかでユニークになるようにしましょう。

f:id:tech-tsubaki:20191023220909p:plain

パッケージ作成のパイプラインを構成する

次に .NET Core ツールのソースコードからパッケージを作成するパイプラインを構成します。
[Pipelines] > [Builds] > [New pipeline] と進み、ビルドパイプラインを作成します。今回はGUIでパイプラインを構成します。

f:id:tech-tsubaki:20191023220938p:plain

ソースコードはGitHubなど、自身が保管しているリポジトリを指定します。
なおAzure DevOpsにもAzure Reposという、プライベートGitリポジトリを作成できる機能があります。

f:id:tech-tsubaki:20191023220957p:plain

パイプラインはいくつかテンプレートが用意されており、今回はASP.NET Coreのテンプレートを使用します。

f:id:tech-tsubaki:20191023221017p:plain

テンプレートとして dotnet restore, dotnet build, dotnet test, dotnet publish, Publish Artifact の5つのタスクが構成されますが、4番目の dotnet publishdotnet pack に変更します。

f:id:tech-tsubaki:20191023221145p:plain

きちんとビルドパイプライン定義を保存して、自動でパッケージ作成を行うパイプラインの構成が終わりました。

パッケージを nuget.org に自動リリースするパイプラインを構成する

次は自動で作成したパッケージを nuget.org に自動で公開するパイプラインを構成します。
[Pipelines] > [Releases] > [New pipeline] > [Empty job] と進み、空のステージを用意します。

f:id:tech-tsubaki:20191023221234p:plain

リリース対象として [Add an artifact] にて先程作成したビルドパイプラインを指定します。
また雷マークで、自動ビルドが成功したらリリースパイプラインを自動的に開始する設定にします。

f:id:tech-tsubaki:20191023221304p:plain

f:id:tech-tsubaki:20191023221318p:plain

ステージの [1 job, 0 task] > [Agent job] の横の+ボタンから、NuGetのテンプレートを指定し、以下の変更を行います。

f:id:tech-tsubaki:20191023221455p:plain

きちんとでリリースパイプライン定義を保存して、自動でパッケージを公開するパイプラインの構成が終わりました。


これでCI/CDの構成ができたため、あとはコードを書いてGitリポジトリにプッシュするだけで、.NET Coreツールを公開することができます。