我正在尝试创建一个管道(在Azure Devops)运行一些Terraform代码。我要做的逻辑是:
- 运行地形规划
- 检查地形规划是否有变化
- 如果是,提示用户手动检查更改,然后接受/拒绝
- 如果被接受,继续进行地形申请
我有地形计划阶段全部工作,但我正在努力确定如何以编程方式确定地形计划的输出是否有更改要审查。
我试图使用以下环境变量,这些变量在运行' terraform plan '后应该设置为true/false
TERRAFORM_PLAN_HAS_CHANGES
TERRAFORM_PLAN_HAS_DESTROY_CHANGES
但是它似乎没有被设置,至少在我使用的Terraform版本(v1.4.2)中。
以编程方式检查是否有需要审查的更改的最佳方法是什么?或者我应该改变我的逻辑吗?
环境变量不会在Azure pipeline的步骤之间自动保存。
如果您希望在任务之间持久化信息,则必须使用##vso
logging命令来设置输出变量。如果您希望在作业或阶段之间持久化它,则必须另外设置isOutput=true
。
terraform plan -input=false -no-color -detailed-exitcode
retVal=$?
if [ $retVal -eq 2 ]; then
echo "##vso[task.setvariable variable=planChanged;isOutput=true]true"
else
echo "##vso[task.setvariable variable=planChanged;isOutput=true]false"
fi
然后,在下游的另一个工作中,你会设置条件:
condition: and(succeeded(), eq(coalesce(dependencies.Plan_${{ parameters.stage }}.outputs['Plan_${{ parameters.stage }}.planstep.planChanged'], 'true'), 'true'))
其中Plan_${{ parameters.stage }}
为作业名称,planstep
为设置输出变量的步骤名称。
您可以像这样运行地形计划
terraform plan -detailed-exitcode
如果退出代码== 2,则表示存在更改。
来源