Terraformデプロイメントでは、3つのステージを持つAzure DevOpsパイプラインを使用します。
適用段階では、手動の承認(チェック)がある環境で展開ジョブを使用します。計画段階で変更がない場合は、適用段階とテスト段階を「スキップ」します。したがって、適用ステージには次のyaml設定を使用しようとします。
- stage: ApplyShared
dependsOn: PlanShared
jobs:
- job: CheckSharedChanges
steps:
- task: DownloadPipelineArtifact@2
inputs:
artifactName: TerraformBuild
downloadPath: $(System.DefaultWorkingDirectory)
- bash: |
# using a file for indicating changes in TF plan, since
# you cannot pass variables between stages in Azure DevOps
if [ -f ".shared-changes" ]; then
echo '##vso[task.setvariable variable=shared_changes]yes'
fi
name: Check
- deployment: ApplyShared
dependsOn: CheckSharedChanges
# this condition seems to be ignored, if there is a manual
# approval on the stage
condition: eq(dependencies.CheckSharedChanges.outputs['Check.shared_env'], 'yes')
displayName: 'Apply - shared'
# we configured a manual approval (check) for this environment,
# so the pipeline stops and asks for an operator to approve the deployment
environment: 'infra-shared'
この MS開発者コミュニティの問題 によると、承認のあるステージの条件は承認前にチェックされないため、アプローチは機能しません。
私の質問は、これを実装する他の方法を知っていますか?
ステージは多くのジョブで構成でき、各ジョブは複数のリソースを消費できます。ステージの実行を開始する前に、そのステージで使用されるすべてのリソースに対するすべてのチェックが満たされている必要があります。 Azure Pipelinesは、各ステージの前にパイプラインの実行を一時停止し、保留中のすべてのチェックが完了するまで待機します。これが、シナリオで条件が機能しない理由です。詳細についてはこちらを確認してください:
ロードマップにはすでに同様のアイデアがあります。次のリンクを追跡できます。
現在、 手動実行 を開始して、パイプラインのいくつかのステージをスキップすることを検討できます。