如何在 Jenkisfile 中进行用户输入以进行 terraform apply?

How to do user input in Jenkisfile to carry on with terraform apply?

我正在 运行使用 Jenkinsfile 进行 Jenkins 管道作业。主要目的是运行 terraform <plan|apply>,根据选择参数到select要么planapply,像这样:

stages {
  stage('tf_run') {
    steps { 
      sh '''#!/usr/bin/env bash
        terragrunt ${Action} --terragrunt-source "/var/temp/tf_modules//${tfm}"
      '''
    }
  }
}

其中 Action 是选择参数变量,它对 计划 都很好,但对 apply 因为它要求确认是否继续,工作立即下降。我可以在这里做什么,以便用户可以键入 yes/no(或列表中的 select),然后可以将其传递给 terraform apply?

我卡在中间了,如果有人能给我指明正确的方向,我将不胜感激。感谢您提供的任何帮助。

-S

您可以在 Jenkins 作业中使用 terraform apply -auto-approve

See Docs

提示:当用户选择参数计划时,您可以在 Jenkins stage() 中添加条件,这样不会自动添加 -auto-approve 选项,否则命令将附加 -auto-approve 选项。

stage(plan&apply){
  if ${USER_INPUT} == "plan"{
    terraform plan
  }
  else{
   terraform apply -auto-approve
  }
}

注意:以上 Jenkins 代码可能与正确的答案不匹配,但可以作为示例。

为了适应用例,Jenkins 管道将分为三个步骤:

  • 生成计划文件
  • 查询用户输入以批准计划
  • 如果获得批准,应用计划文件

假设:您声称 plan 的管道是成功的,这对我来说意味着 Actiontfm 是环境变量(即 env.Action),否则sh 步骤方法的字符串参数无效。鉴于该假设:

(答案现已根据要求进行修改,以证明 tfm 作为管道参数并且不再位于 env 对象中)

parameters {
  string(name: 'tfm', description: 'Terraform module to act upon.')
}

stages {
  stage('TF Plan') {
    steps {
      // execute plan and capture plan output 
      sh(
         label:  'Terraform Plan',
         script: "terragrunt plan -out=plan.tfplan -no-color --terragrunt-source '/var/temp/tf_modules//${params.tfm}'"
      )
    }
  }
  stage('TF Apply') {
    // only execute stage if apply is desired
    when { expression { return env.Action == 'apply' } }
    steps {
      // query for user approval of plan
      input(message: 'Click "proceed" to approve the above Terraform Plan')
      // apply the plan if approved
      sh(
         label:  'Terraform Apply',
         script: 'terraform apply -auto-approve -input=false -no-color plan.tfplan'
      )
    }
  }
}

您可能还想将 env.TF_IN_AUTOMATION = true 的等效项添加到 environment 指令。这在管道中执行 Terraform 时很有用。

如果您也将管道 agent 修改为例如将 Terraform CLI 映像 运行 作为容器,那么计划输出文件也需要在各个阶段之间保存。