Azure DevOps サービス
オープンソースの自動化サーバーである Jenkins は、従来、企業が独自のデータ センターにインストールし、オンプレミスで管理します。 多くのプロバイダーは、マネージド Jenkins ホスティングも提供しています。
または、Azure Pipelines はクラウド ネイティブの継続的インテグレーション パイプラインです。 クラウドでホストされているマルチステージ パイプラインとビルド エージェント Azure Virtual Machines の管理を提供します。
また、Azure Pipelines には、コードを保持し、エンタープライズ データ センター内でビルドする必要があるコンプライアンスやセキュリティに関する懸念があるお客様向けに、 Azure DevOps Server で完全にオンプレミスのオプションが用意されています。
さらに、Azure Pipelines では、ハイブリッド クラウドモデルとオンプレミス モデルがサポートされています。 Azure Pipelines では、ビルドとリリースのオーケストレーションを管理し、クラウドとオンプレミスの両方でビルド エージェントを有効にすることができます。
この記事では、Jenkins パイプライン構成を Azure Pipelines に変換するためのガイドを提供します。 コンテナー ベースのビルドの移動とビルド エージェントの選択、環境変数のマッピング、ビルド パイプラインの成功と失敗の処理方法に関する情報が含まれています。
コンフィギュレーション
Jenkins 宣言型パイプラインから Azure Pipelines YAML 構成への使い慣れた移行が見つかります。 この 2 つは概念的に似ています。"コードとしての構成" をサポートし、バージョン管理システムに構成を確認できます。 ただし、Jenkins とは異なり、Azure Pipelines は業界標準の YAML を使用してビルド パイプラインを構成します。
Jenkins と Azure Pipelines の概念と構成方法は似ています。 Jenkinsfile にはビルド プロセスの 1 つ以上の ステージ が一覧表示され、それぞれに順番に実行される 1 つ以上の ステップ が含まれています。 たとえば、"ビルド" ステージでは、タスクを実行してビルド時の依存関係をインストールし、コンパイル手順を実行できます。 "テスト" ステージでは、ビルド ステージで生成されたバイナリに対してテスト ハーネスを呼び出すことができます。
例えば次が挙げられます。
Jenkinsfile
pipeline {
agent none
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
}
}
jenkinsfile は、各ステージに対応するジョブと、各 ジョブ で実行する手順を含む Azure Pipelines YAML 構成に簡単に変換できます。
azure-pipelines.yml
jobs:
- job: Build
steps:
- script: npm install
- script: npm run build
- job: Test
steps:
- script: npm test
コンテナベースのビルド
ビルド パイプラインでコンテナーを使用すると、パイプラインに必要な正確な依存関係が既に構成されている Docker イメージ内でビルドおよびテストできます。 これにより、より多くのソフトウェアをインストールしたり、環境を構成したりするビルド手順を含める必要ができなくなります。 Jenkins と Azure Pipelines の両方で、コンテナー ベースのビルドがサポートされています。
さらに、Jenkins と Azure Pipelines の両方で、docker に対する -v フラグを使用して、ホスト エージェント上のビルド ディレクトリをコンテナー ボリュームと共有できます。 これにより、同じソースを使用して同じ出力ディレクトリに書き込むことができる複数のビルド ジョブを連結できます。 これは、スタックでさまざまなテクノロジを使用する場合に特に便利です。.NET Core コンテナーと TypeScript コンテナーを使用してフロントエンドを使用してバックエンドを構築できます。
たとえば、Ubuntu 22.04 ("Jammy") コンテナーでビルドを実行するには、Ubuntu 24.04 ("Noble") コンテナーでテストを実行します。
Jenkinsfile
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'ubuntu:jammy'
args '-v $HOME:/build -w /build'
}
}
steps {
sh 'make'
}
}
stage('Test') {
agent {
docker {
image 'ubuntu:noble'
args '-v $HOME:/build -w /build'
}
}
steps {
sh 'make test'
}
}
}
}
Azure Pipelines には、コンテナー内でビルドを実行するためのコンテナー ジョブ が用意されています。
azure-pipelines.yml
resources:
containers:
- container: jammy
image: ubuntu:jammy
- container: noble
image: ubuntu:noble
jobs:
- job: build
container: jammy
steps:
- script: make
- job: test
dependsOn: build
container: noble
steps:
- script: make test
さらに、Azure Pipelines には、イメージを実行、ビルド、またはプッシュできる Docker タスク が用意されています。
エージェントの選択
Jenkins では、ビルド パイプライン (またはパイプラインの特定のステージ) が特定のビルド エージェント マシンで確実に実行されるように、 agent オプションを使用してビルド エージェントを選択できます。 同様に、Azure Pipelines には、ビルド環境の実行場所を構成するための多くのオプションが用意されています。
ホストエージェントの選択
Azure Pipelines には、Linux、Windows、macOS ビルド用のクラウドでホストされるビルド エージェントが用意されています。 ビルド環境を選択するには、使用できます
vmimageキーワード (keyword)。 たとえば、macOS ビルドを選択するには、次のようにします。
pool:
vmimage: macOS-latest
さらに、 container を指定し、ビルドの実行方法をきめ細かく制御するための Docker イメージを指定することもできます。
オンプレミス エージェントの選択
オンプレミスでビルド エージェントをホストする場合は、マシンのアーキテクチャまたはインストールしたソフトウェアに基づいて ビルド エージェントの "機能" を定義できます。 たとえば、 java 機能を使用してオンプレミスのビルド エージェントを設定した場合は、 demands キーワードを使用してジョブを確実に実行できます。
pool:
demands: java
環境変数
Jenkins では、通常、パイプライン全体の環境変数を定義します。 たとえば、 CONFIGURATION=debug と PLATFORM=x86の 2 つの環境変数を設定するには、
Jenkinsfile
pipeline {
agent any
environment {
CONFIGURATION = 'debug'
PLATFORM = 'x64'
}
stages {
stage('Build') {
steps {
sh 'echo $CONFIGURATION $PLATFORM'
}
}
}
}
同様に、Azure Pipelines では、YAML 構成内で使用され、ジョブの実行中に環境変数として設定される変数を構成できます。
azure-pipelines.yml
variables:
configuration: debug
platform: x64
さらに、Azure Pipelines では、特定のジョブ中にのみ設定される変数を定義できます。
azure-pipelines.yml
jobs:
- job: debug build
variables:
configuration: debug
steps:
- script: ./build.sh $(configuration)
- job: release build
variables:
configuration: release
steps:
- script: ./build.sh $(configuration)
定義済みの変数
Jenkins と Azure Pipelines の両方で、継続的インテグレーション システムの実行環境の検査と操作に役立つ 環境変数が多数 設定されています。
| Description | Jenkins | Azure Pipelines |
|---|---|---|
| 現在のビルド呼び出しの一意の数値識別子。 | BUILD_NUMBER |
BUILD_BUILDNUMBER |
| 現在のビルドの呼び出しに対する一意の識別子(必ずしも数値ではありません)。 | BUILD_ID |
BUILD_BUILDID |
| ビルド ログを表示する URL。 | BUILD_URL |
この値は Azure Pipelines では環境変数として設定されませんが、他の変数から派生させることができます。1 |
| 現在のビルドが実行されているコンピューターの名前。 | NODE_NAME |
AGENT_NAME |
| このプロジェクトまたはビルド定義の名前。 | JOB_NAME |
RELEASE_DEFINITIONNAME |
| ビルドを識別するための文字列で、ビルド番号は一意的な識別子として適切です。 | BUILD_TAG |
BUILD_BUILDNUMBER |
| ビルドを実行しているホストの URL。 | JENKINS_URL |
SYSTEM_TEAMFOUNDATIONCOLLECTIONURI |
| 現在実行されているビルド 実行プログラムまたはビルド エージェントの一意の識別子。 | EXECUTOR_NUMBER |
AGENT_NAME |
| チェックアウトしたソースの場所。 | WORKSPACE |
BUILD_SOURCESDIRECTORY |
| ビルドされているソフトウェアのバージョンに対応する Git コミット ID。 | GIT_COMMIT |
BUILD_SOURCEVERSION |
| GitHub、Azure Repos、または別のリポジトリ プロバイダー上の Git リポジトリへのパス。 | GIT_URL |
BUILD_REPOSITORY_URI |
| ビルド中の Git ブランチ。 | GIT_BRANCH |
BUILD_SOURCEBRANCH |
1 Azure Pipelines でビルド ログを表示する URL を派生するには、次の環境変数をこの形式で結合します。
${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}/${SYSTEM_TEAMPROJECT}/_build/results?buildId=${BUILD_BUILDID}
成功と失敗の処理
Jenkins では、パイプラインの post セクションを使用して、ビルドが完了したときにコマンドを実行できます。 ビルドが成功した場合 ( success セクションを使用)、ビルドが失敗した場合 ( failure セクションを使用)、または常に ( always セクションを使用して) 実行するコマンドを指定できます。 例えば次が挙げられます。
Jenkinsfile
post {
always {
echo "The build has finished"
}
success {
echo "The build succeeded"
}
failure {
echo "The build failed"
}
}
同様に、Azure Pipelines には、パイプラインの成功や失敗などの多くの条件に基づいて、ジョブまたはジョブのステップを実行できる豊富な条件付き実行フレームワークがあります。
Jenkins postビルド条件をエミュレートするには、 always()、 succeeded() 、または failed() 条件に基づいて実行するジョブを定義できます。
azure-pipelines.yml
jobs:
- job: always
steps:
- script: echo "The build has finished"
condition: always()
- job: success
steps:
- script: echo "The build succeeded"
condition: succeeded()
- job: failed
steps:
- script: echo "The build failed"
condition: failed()
注
Jenkins では、post、always、successを超える追加のfailure条件がサポートされています。
-
changed: 現在のパイプラインの実行の完了状態が前回の実行と異なる場合にのみ実行されます。 -
fixed: 現在の実行が成功し、前回の実行が失敗したか不安定であった場合にのみ実行されます。 -
unstable: 現在のパイプラインの実行状態が "不安定" である場合にのみ実行されます (通常はテストエラーが原因です)。 -
cleanup: パイプラインの状態に関係なく、他のすべての事後条件が評価された後に実行されます。
Azure Pipelines では、不安定なビルドのなどの式でeq(variables['Agent.JobStatus'], 'SucceededWithIssues')を使用して、同様の機能を実現できます。
さらに、個々のタスク、環境変数、または実行環境の成功または失敗に基づいてタスクを実行する機能など、 他の条件を組み合わせて、豊富な実行パイプラインを構築できます。
資格情報の処理
Jenkins には、パイプラインに資格情報を安全に挿入するためのcredentials() ディレクティブ内のenvironment ヘルパーが用意されています。 Jenkins では、シークレット テキスト、ユーザー名とパスワードのペア、シークレット ファイルなど、いくつかの資格情報の種類がサポートされています。
Jenkinsfile
pipeline {
agent any
environment {
AWS_ACCESS_KEY_ID = credentials('aws-access-key-id')
AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key')
}
stages {
stage('Deploy') {
steps {
sh 'aws s3 ls'
}
}
}
}
Azure Pipelines では、 変数グループ、 Azure Key Vault 統合、またはパイプラインでシークレット変数を直接定義することで、シークレットを管理できます。
azure-pipelines.yml
variables:
- group: my-aws-credentials # Variable group linked to Azure Key Vault or containing secrets
jobs:
- job: Deploy
steps:
- script: aws s3 ls
env:
AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID)
AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
AzureKeyVault@2 タスクを使用して、Azure Key Vault からシークレットを直接参照することもできます。
steps:
- task: AzureKeyVault@2
inputs:
azureSubscription: 'my-azure-subscription'
KeyVaultName: 'my-key-vault'
SecretsFilter: 'AWS-ACCESS-KEY-ID,AWS-SECRET-ACCESS-KEY'
- script: aws s3 ls
env:
AWS_ACCESS_KEY_ID: $(AWS-ACCESS-KEY-ID)
AWS_SECRET_ACCESS_KEY: $(AWS-SECRET-ACCESS-KEY)