Azure Pipelinesによるビルドパイプラインの作成と実行(1)
ここからは実際にAzure Pipelinesを使って、.NETアプリケーションのCI/CDパイプラインを作成していきます。
今回は、前回の記事で作成したASP.NET CoreのWebアプリケーションを対象にパイプラインを作成するので、Azure Reposにコードがプッシュされていない場合は、あらかじめ前回の記事を参考に、リポジトリを作成しておくようにしてください。
MSにパイプラインの無料利用枠の申請を行う
DevOps組織で初めてAzure Pipelinesを利用する場合、Microsoftに無料利用枠の申請を行う必要があります。これは、昨今増加している暗号通貨マイニングなどにAzure Pipelinesが不正利用されているため、許可制となった背景があります。
申請を行う場合は、以下の手順で操作を行ってください。
1. Azure DevOps Parallelism Request Formにアクセスします。
2. フォームに必要事項を入力します。
- What is your name?:使用者の氏名を入力
- What is your email address?:連絡先メールアドレスを入力
- What is the name of your Azure DevOps Organization?:Azure DevOpsの組織名を入力
- Are you requesting a parallelism increase for Publi or Private projects?:「Private」を選択
3. フォーム下部の「送信」ボタンから申請します。
4. 申請後、Microsoftからの承認を待ちます。通常、数日以内に承認されます。
ビルドパイプラインの作成(CI)
パイプラインの作成は、Azure DevOpsのプロジェクトダッシュボードから行います。
プロジェクトダッシュボードの「Pipelines」セクションを選択し、「Create Pipeline」ボタンから新しいパイプラインの作成を開始します。

まずは、接続するリポジトリサービスを選択します。本稿では、前回の記事で作成したリポジトリを使用するため、Azure Repos Gitを選択します。

Azure Repos Gitを選択すると、同一プロジェクト内のリポジトリが表示されるので、該当のリポジトリを選びます。

次の画面では、ビルド対象のプロジェクトの種類を選択します。前回作成したアプリケーションはASP.NET CoreのWebアプリケーションなので、「ASP.NET Core (.NET Framework)」を選択します。

最後にパイプラインの肝となるYAMLファイルを編集します。ここでは、.NETアプリケーションのビルドとテスト、Azure Web Appへのデプロイを行う基本的なYAML構成を作成します。

ブラウザ上にYAMLエディタが表示されるので、以下のコードを入力します。
# パイプラインのトリガー設定 trigger: - main # mainブランチへのPushをトリガーにする・・・(1) # ビルドエージェントの指定 pool: vmImage: 'windows-latest' # Windows環境でジョブを実行する・・・(2) # ビルドとデプロイのための変数定義 variables: buildConfiguration: 'Release' dotnetVersion: '8.0.x' # 対象の .NET バージョン # ビルドステップの定義 steps: - task: UseDotNet@2 # .NET SDKをインストールするタスク・・・(3) inputs: packageType: 'sdk' version: '$(dotnetVersion)' - task: NuGetToolInstaller@1 # NuGetをインストールするタスク・・・(4) - task: NuGetCommand@2 # NuGetパッケージの復元・・・(5) inputs: restoreSolution: '**/*.sln' - task: DotNetCoreCLI@2 # .NET Core CLIを使用してビルド・・・(6) inputs: command: 'build' projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 # アプリをデプロイ可能な形式(発行物)に変換する・・・(7) inputs: command: 'publish' publishWebProjects: true arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)' zipAfterPublish: true - task: PublishBuildArtifacts@1 # ビルド成果物をアーティファクトとして公開・・・(8) inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
パイプラインのYAMLは、「trigger」「pool」「steps」の3つのセクションに分かれています。また「variables」はビルドやデプロイで使用する変数を定義するセクションで、任意で設定します。
triggerはいつパイプラインを実行するかを定義し、ここではmainブランチへのPushをトリガーにしています(1)。poolはどの仮想マシンでジョブを実行するかを指定し、今回はWindows環境を使用しています(2)。
stepsには実際のビルドやデプロイの処理をtaskという単位で順番に定義していきます。UseDotNet@2は事前に必要な.NET SDKをインストールするためのステップです(3)。
NuGetToolInstaller@1はNuGetをインストールするタスクで、NuGetパッケージの復元に必要です(4)。NuGetCommand@2はソリューションファイルから依存関係を復元するためのステップです(5)。
DotNetCoreCLI@2は.NET Core CLIを使用してプロジェクトをビルドするためのステップで、ここではビルドコマンドを指定しています(6)。
次のDotNetCoreCLI@2はアプリケーションをデプロイ可能な形式(ここではZIP形式)に変換するための発行ステップです(7)。
最後のPublishBuildArtifacts@1で、(7)で作成したビルド成果物をアーティファクトとして保存します(8)。
Azure Pipelinesでのアーティファクトとは、ビルド成果物をデプロイパイプラインなどで再利用できるようにAzure DevOps上にアップロードしたファイルのことを指します。
YAMLの内容を確認したら、「Save and run」をクリックしてパイプラインを保存し、初回の実行を開始します。なお、YAMLファイルは、「azure-pipelines.yml」という名前でリポジトリのルートに保存されます。これにより、Azure DevOpsはこのYAMLファイルを基にパイプラインを実行します。

パイプラインのYAMLを保存すると、Azure DevOpsが自動的にパイプラインを実行します。実行結果は「Pipelines」セクションで確認することができます。

パイプラインの実行が完了すると、ビルドの結果やテストの合否、デプロイのステータスなどが表示されます。もしエラーが発生した場合は、ログを確認して原因を特定します。

上の画像にあるエラー「No hosted parallelism has been purchased or granted. To request a free parallelism grant, please fill out the following form https://aka.ms/azpipelines-parallelism-request」が発生した場合は、Azure DevOpsの無料利用枠である「ホステッドパイプライン」の並列実行数が不足していることを示しています。
この場合は、前述の「MSにパイプラインの無料利用枠の申請を行う」セクションで説明した通り、無料利用枠の申請を行う必要があります。