Azure Pipelinesとの連携によるCI/CD自動化(1)
Azure Artifactsの真価は、CI/CDパイプラインとの連携で発揮されます。コード変更からパッケージ公開まで自動化されたワークフローを構築していきます。
基本的なCI/CDパイプラインの構築
プロジェクトルートに「azure-pipelines.yml」というファイルを作成し、まずはパイプライン全体に関係するセクションを記述していきます。
# (1)パイプライン実行条件の設定
trigger:
branches:
include:
- main
- develop
paths:
include:
- Wings.MathLibrary/*
exclude:
- README.md
- docs/*
# (2)セマンティックバージョニング用変数定義
variables:
buildConfiguration: 'Release'
majorVersion: '1'
minorVersion: '0'
patchVersion: $[counter(variables['Build.SourceBranchName'], 0)]
triggerとvariablesセクションを記述しました。ここでポイントとなる部分について説明します。
(1)パイプライン実行条件の設定
triggerセクションでは、パイプラインが実行される条件を細かく制御しています。mainとdevelopブランチへのコミット時のみ実行され、Wings.MathLibraryフォルダ内の変更のみを対象とします。READMEやドキュメントの変更では不要なビルドを避けることで、リソースを効率的に活用できます。
(2)セマンティックバージョニング用変数定義
variablesセクションでは、メジャー・マイナー・パッチバージョンを管理し、counter関数を使用してブランチごとに自動的にパッチバージョンをインクリメントします。これにより、一貫したバージョン管理が実現できます。
パイプラインの基本的な挙動を定義
次にパイプラインの具体的な動作を定義するstagesセクションを追加していきます。
# (3)段階的デプロイメント構成
stages:
- stage: Build
displayName: 'ビルド・テスト段階'
jobs:
- job: BuildAndTest
displayName: 'ビルドとテスト実行'
# (4)マトリックス戦略による複数環境でのビルド
strategy:
matrix:
ubuntu:
imageName: 'ubuntu-latest'
windows:
imageName: 'windows-latest'
pool:
vmImage: $(imageName)
steps:
# .NET SDKセットアップ
- task: UseDotNet@2
displayName: '.NET SDK設定'
inputs:
packageType: 'sdk'
version: '8.x'
# (5)Azure Artifacts対応のNuGet復元
- task: DotNetCoreCLI@2
displayName: 'NuGetパッケージ復元'
inputs:
command: 'restore'
projects: '**/*.csproj'
feedsToUse: 'select'
includeNuGetOrg: true
# ビルド実行
- task: DotNetCoreCLI@2
displayName: 'プロジェクトビルド'
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'
(3)段階的デプロイメント構成
stagesセクションは用途に応じてステージを分割して定義できます。今回はBuild→Package→Deployの3段階に分割しています(PackageとDeployの詳細は後述)。各ステージは前ステージの成功を条件とし、問題が発生した時点で停止するため、安全なデプロイメントが保証されます。
BuildステージではAzure Artifactsからソースコードを取得し、ビルドを実行していきます。
(4)マトリックス戦略による複数環境でのビルド
strategyセクションでは、UbuntuとWindows両方の環境でパイプラインを並列実行します。これにより、クロスプラットフォーム対応の確認と、環境固有の問題の早期発見が可能になります。
今回はビルドステージでのみ両方の環境でのビルドを実施することで、クロスプラットフォーム対応がされているかどうかを確認しています。
(5)Azure Artifacts対応のNuGet復元
feedsToUseとincludeNuGetOrgの設定により、Azure ArtifactsのプライベートフィードとパブリックなNuGet.orgの両方からパッケージを復元できます。企業内パッケージと外部パッケージの統合利用が可能になります。
パッケージングの定義
次にPackageステージの内容を追記します。
# (7)条件付きパッケージング段階
- stage: Package
displayName: 'パッケージング段階'
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- job: CreatePackage
displayName: 'NuGetパッケージ作成'
steps:
- task: UseDotNet@2
displayName: '.NET SDK設定'
inputs:
packageType: 'sdk'
version: '8.x'
# (8)動的バージョン番号生成
- task: PowerShell@2
displayName: 'バージョン番号設定'
inputs:
targetType: 'inline'
script: |
$version = "$(majorVersion).$(minorVersion).$(patchVersion)"
Write-Host "##vso[task.setvariable variable=packageVersion]$version"
Write-Host "Package version set to: $version"
# NuGetパッケージ作成
- task: DotNetCoreCLI@2
displayName: 'NuGetパッケージ作成'
inputs:
command: 'pack'
packagesToPack: '**/Wings.MathLibrary.csproj'
configuration: '$(buildConfiguration)'
packDirectory: '$(Build.ArtifactStagingDirectory)'
versioningScheme: 'byEnvVar'
versionEnvVar: 'packageVersion'
# パッケージ成果物公開
- task: PublishBuildArtifacts@1
displayName: 'ビルド成果物公開'
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'NuGetPackages'
Packageステージは、ビルドに成功したコードをNuGet形式のパッケージにするステージです。
(7)条件付きパッケージング段階
Packageステージは、Buildステージが成功し、かつmainブランチでの実行時のみ動作します。これにより、開発ブランチでは不要なパッケージ生成を避け、安定したコードのみがパッケージ化されます。
(8)動的バージョン番号生成
PowerShellスクリプトを使用して、変数から動的にバージョン番号を生成し、パイプライン変数として設定します。これにより、後続のタスクで一貫したバージョン番号を使用できます。
