継続的インテグレーション (CI) 環境で .NET SDK を使用する

この記事では、ビルド サーバーで .NET SDK とそのツールを使用する方法の概要を示します。 .NET ツールセットは、開発者がコマンド プロンプトにコマンドを入力する対話式と、継続的インテグレーション (CI) サーバーがビルド スクリプトを実行する自動の、両方に対応しています。 コマンド、オプション、入力、出力は同じです。ユーザーは、ツールの取得方法とアプリを構築するシステムだけを指定します。 この記事では、CI のツール取得のシナリオと、ビルド スクリプトの設計と構造化の方法に関する推奨事項を取り上げます。

CI ビルド サーバーのインストール オプション

GitHub をお使いの場合、インストールは非常に簡単です。 GitHub Actions を使用して、ワークフローに .NET SDK をインストールできます。 ワークフローに .NET SDK をインストールするには、actions/setup-net-core-sdk アクションを使用することをお勧めします。 詳細については、GitHub マーケットプレースの .NET Core SDK のセットアップ アクションを参照してください。 このしくみの例については、「クイック スタート: ビルド検証 GitHub ワークフローを作成する」を参照してください。

ネイティブ インストーラー

macOS、Linux、Windows の場合、ネイティブ インストーラーを利用できます。 このインストーラーは、ビルド サーバーへの admin (sudo) アクセスを必要とします。 ネイティブ インストーラーを使用することの利点は、ツールを実行するために必要なあらゆるネイティブ依存性がインストールされることです。 ネイティブ インストーラーはまた、システム全体に SDK をインストールします。

macOS をご利用の場合、PKG インストーラーをお使いください。 Linux の場合、フィードベースのパッケージ マネージャーを利用できます。Ubuntu の apt-get や CentOS の yum などです。あるいは、パッケージ自体、DEB または RPM を利用できます。 Windows の場合、MSI インストーラーをご利用ください。

最新の安定したバイナリは、.NET ダウンロードのページにあります。 最新の (安定性に欠ける場合があります) プレリリース ツールを使用する場合は、dotnet/installer GitHub リポジトリのリンクをご利用ください。 Linux ディストリビューションの場合、tar.gz アーカイブ (別名、tarballs) をご利用いただけます。アーカイブ内のインストール スクリプトを利用して .NET をインストールしてください。

インストーラー スクリプト

インストーラー スクリプトを使用すると、ビルド サーバーで管理者以外のインストールが可能になり、ツールの取得を簡単に自動化できます。 スクリプトにツールがダウンロードされ、既定の場所か指定された場所に抽出されます。 インストールするツールのバージョンと、SDK 全体をインストールするか、それとも共有ランタイムだけをインストールするかも指定できます。

インストーラー スクリプトは、ビルドの開始時に実行され、必要なバージョンの SDK を取得し、インストールするように自動化されています。 必要なバージョンとは、プロジェクトのビルドに必要な SDK のバージョンです。 このスクリプトでは、サーバーのローカル ディレクトリに SDK をインストールし、インストールした場所からツールを実行し、ビルド後にクリーンアップできます (あるいは、CI サービスにクリーンアップさせます)。 これにより、ビルド プロセス全体にカプセル化と分離性が提供されます。 インストール スクリプト参照は dotnet-install の記事にあります。

注意

Azure DevOps Services

インストーラー スクリプトの使用時、ネイティブ依存性は自動的にはインストールされません。 オペレーティング システムにネイティブ依存性がない場合、それをインストールする必要があります。 詳細については、.NET の依存関係と要件に関するセクションを参照してください。

CI セットアップ例

このセクションでは、PowerShell またはバッシュ スクリプトを利用した手動セットアップについて説明し、SaaS (サービスとしてのソフトウェア) CI ソリューションを紹介します。 対象となる SaaS CI ソリューションは Travis CIAppVeyor、および Azure Pipelines です。 GitHub Actions については、「GitHub Actions と .NET」を参照してください

手動セットアップ

各 SaaS サービスには、ビルド プロセスを作成し、構成するための方法があります。 一覧に記載されている以外の SaaS ソリューションを使用する場合、あるいは事前にパッケージに含まれているサポート以上のカスタマイズが必要な場合、少なくとも一部に手動構成が必要になります。

全般的に、手動セットアップでは、あるバージョンのツール (あるいはツールの最新のナイトリー ビルド) を取得し、ビルド スクリプトを実行する必要があります。 PowerShell またはバッシュ スクリプトを使用し、.NET コマンドを調整したり、プロジェクト ファイルを使用してビルド プロセスの概要を伝えたりできます。 オーケストレーション セクションで、これらのオプションについて詳しく説明されています。

手動 CI ビルド サーバー セットアップを実行するスクリプトを作成したら、それを開発マシンで使用し、テスト目的でコードをローカルでビルドします。 スクリプトがローカルで問題なく動作していることを確認したら、CI ビルド サーバーに展開します。 比較的単純な PowerShell スクリプトを使用して、.NET SDK を取得し、Windows ビルド サーバーにインストールする方法を示します。

スクリプトの終わりで、自分のビルド プロセスの実装を指定します。 スクリプトはツールを取得し、ビルド プロセスを実行します。

$ErrorActionPreference="Stop"
$ProgressPreference="SilentlyContinue"

# $LocalDotnet is the path to the locally-installed SDK to ensure the
#   correct version of the tools are executed.
$LocalDotnet=""
# $InstallDir and $CliVersion variables can come from options to the
#   script.
$InstallDir = "./cli-tools"
$CliVersion = "6.0.7"

# Test the path provided by $InstallDir to confirm it exists. If it
#   does, it's removed. This is not strictly required, but it's a
#   good way to reset the environment.
if (Test-Path $InstallDir)
{
    rm -Recurse $InstallDir
}
New-Item -Type "directory" -Path $InstallDir

Write-Host "Downloading the CLI installer..."

# Use the Invoke-WebRequest PowerShell cmdlet to obtain the
#   installation script and save it into the installation directory.
Invoke-WebRequest `
    -Uri "https://dot.net/v1/dotnet-install.ps1" `
    -OutFile "$InstallDir/dotnet-install.ps1"

Write-Host "Installing the CLI requested version ($CliVersion) ..."

# Install the SDK of the version specified in $CliVersion into the
#   specified location ($InstallDir).
& $InstallDir/dotnet-install.ps1 -Version $CliVersion `
    -InstallDir $InstallDir

Write-Host "Downloading and installation of the SDK is complete."

# $LocalDotnet holds the path to dotnet.exe for future use by the
#   script.
$LocalDotnet = "$InstallDir/dotnet"

# Run the build process now. Implement your build script here.

Travis CI

csharp 言語と dotnet キーを使用して .NET SDK をインストールするように Travis CI を構成できます。 詳細については、公式 Travis CI ドキュメントの「Building a C#, F#, or Visual Basic Project」(C#、F#、または Visual Basic プロジェクトのビルド) を参照してください。 Travis CI 情報にアクセスするときは、コミュニティが保守管理している language: csharp 言語識別子は F# や Mono を含む、あらゆる .NET 言語で機能することにご留意ください。

Travis CI は、"ビルド マトリックス" において、macOS ジョブと Linux ジョブの両方を実行できます。ここでは、ランタイム、環境、除外/追加の組み合わせを指定し、アプリのビルド組み合わせを範囲に含めます。 詳細については、Travis CI ドキュメントの「Customizing the Build」 (ビルドをカスタマイズする) の記事を参照してください。 MSBuild ベースのツールのパッケージには、長期サポート (LTS) ランタイムと標準期間サポート (STS) ランタイムが含まれています。SDK をインストールすると、ビルドに必要なすべてが入手できます。

AppVeyor

AppVeyor は、Visual Studio 2022 ビルド ワーカー イメージを使用して .NET 6 SDK をインストールします。 異なるバージョンの .NET SDK を含む他のビルド イメージも利用できます。 詳細については、AppVeyor ドキュメントの worker イメージのビルドに関する記事を参照してください。

.NET SDK バイナリがインストール スクリプトを使用してダウンロードおよび解凍され、PATH 環境変数に追加されます。 複数の .NET SDK バージョンとの統合テストを実行するためにビルド マトリックスを追加します。

environment:
  matrix:
    - CLI_VERSION: 6.0.7
    - CLI_VERSION: Latest

Azure DevOps Services

以下のいずれかの手法で .NET プロジェクトをビルドするように Azure DevOps Services を構成します。

  • コマンドを利用し、手動セットアップ手順からスクリプトを実行します。
  • .NET ツールを使用するように構成された、Azure DevOps Services の複数の組み込みビルド タスクで構成されるビルドを作成します。

いずれのソリューションも有効です。 ツールはビルドの一部としてダウンロードしているので、手動セットアップ スクリプトを使用し、取得したツールのバージョンを管理します。 ビルドはスクリプトから実行されます。そのスクリプトを作成する必要があります。 この記事では、手動オプションについてのみ説明します。 Azure DevOps Services ビルド タスクを使用したビルドの構築の詳細については、Azure Pipelines のドキュメントを参照してください。

Azure DevOps Services で手動セットアップ スクリプトを使用するには、新しいビルド定義を作成し、ビルド手順で実行するスクリプトを指定します。 これは Azure DevOps Services ユーザー インターフェイスを使用して実行できます。

  1. 最初に新しいビルド定義を作成します。 作成するビルドの種類を定義するためのオプションを指定する画面が表示されたら、 [空] オプションを選択します。

    Selecting an empty build definition

  2. ビルドするリポジトリを構成すると、ビルド定義が表示されます。 [ビルド ステップの追加...] を選択します。

    Adding a build step

  3. [タスク カタログ] が表示されます。 このカタログには、ビルドで使用するタスクが含まれています。 スクリプトがあるので、PowerShell: Run a PowerShell スクリプト[追加] ボタンを選択します。

    Adding a PowerShell script step

  4. ビルド手順を構成します。 ビルドしているリポジトリからスクリプトを追加します。

    Specifying the PowerShell script to run

ビルドの調整

このドキュメントの多くは、.NET ツールを取得し、さまざまな CI サービスを構成する方法についての説明であり、"実際にビルドする" (.NET を使ってコードを書く) 方法についての説明はありません。 ビルド プロセスの構造化方法の選択肢は、ここでは取り上げることができないさまざまな要因に依存します。 Travis CIAppVeyorAzure Pipelines でビルドを調整する方法については、それぞれの文書に記載されている資料とサンプルを参照してください。

.NET ツールを使用して .NET コードのビルド プロセスを構築するには、MSBuild を直接使用する方法と .NET コマンドライン コマンドを使用する方法の 2 つが一般的です。 いずれの手法を採用するかは、手法と複雑性との兼ね合いで使いやすいものを選択してください。 MSBuild を利用すれば、タスクやターゲットとしてビルド プロセスを表現できますが、MSBuild プロジェクト ファイルの構文は複雑で、学習の難易度が上がります。 .NET コマンドライン ツールを使用する方が簡単ですが、bash や PowerShell などのスクリプト言語でオーケストレーション ロジックを記述する必要があります。

ヒント

true に設定する MSBuild プロパティの 1 つは ContinuousIntegrationBuild です。 このプロパティによって、ローカル開発ビルドではなく、公式ビルドにのみ適用される設定が有効になります。

関連項目