问题:如何创建没有阻塞的 Jenkins 输入,并且基于之前的命令输出

我有 2 个问题,它们都是同一个问题的一部分。我在 JenkinsFile 中运行 terraform,这一切都发生在运行在特定节点上的 docker 容器上。我有几个带有 ec2_plugin 的不同环境,它们被标记为“environment_ec2”。因为我们使用 ansible,所以它是这样做的,我希望能够在 VPC 中本地执行 ansible。

1)如何创建仅在前一个命令返回特定输出时才执行的输入和阶段?

2)我怎样才能使这个非阻塞?

node('cicd_ec2') {
    stage('Prepare Environment'){
        cleanWs()
        checkout scm
    }

    withAWSParameterStore(credentialsId: 'jenkin_cicd', naming: 'relative', path: '/secrets/cicd/', recursive: true, regionName: 'us-east-1') {
        docker.image('jseiser/jenkins_devops:0.7').inside {
            stage('Configure Git Access') {
                sh 'mkdir -p ~/.ssh'
                sh 'mv config ~/.ssh/config'
                sh 'chmod 600 ~/.ssh/config'
                sh "echo '$BITBUCKET_CLOUD' > ~/.ssh/bitbucket_rsa"
                sh 'chmod 600 ~/.ssh/bitbucket_rsa'
                sh "echo '$CICD_CODE_COMMIT_KEY' > ~/.ssh/codecommit_rsa"
                sh 'chmod 600 ~/.ssh/codecommit_rsa'
                sh "echo '$IDAUTO_CICD_MGMT_PEM' > ~/.ssh/idauto-cicd-mgmt.pem"
                sh 'chmod 600 ~/.ssh/idauto-cicd-mgmt.pem'
                sh 'ssh-keyscan -t rsa bitbucket.org  >> ~/.ssh/known_hosts'
                sh 'ssh-keyscan -t rsa git-codecommit.us-east-1.amazonaws.com  >> ~/.ssh/known_hosts'
            }

            stage('Terraform'){
                sh './init-ci.sh'
                sh 'terraform validate'
                sh 'terraform plan -detailed-exitcode -out=create.tfplan'
            }

            input 'Deploy stack?'

            stage ('Terraform Apply') {
                sh 'terraform apply -no-color create.tfplan'
            }

            stage('Ansible'){
                sh 'ansible-galaxy -vvv install -r requirements.yml'
                sh 'ansible-playbook -i ~/ vpn.yml'
            }
        }
    }
}

如果以下命令的结果是 u003du003d 2,我只想运行输入并应用 terraform。

terraform plan -detailed-exitcode

由于这一切都必须在 ec2 实例上运行,并且都必须使用此容器,因此我不确定如何在节点之外执行此输入,就像它推荐的那样。因为如果输入的时间足够长,这个实例可能会关闭,其余代码将在新的实例/工作空间上运行,而我需要从 git repo 和 terraform 计划中获取的信息将不存在。我签出的 git 存储库包含 terraform 配置、ansible 配置和一些 SSH 配置,以便 terraform 和 ansible 能够从私有 git 存储库中提取它们的模块/角色。如果 terraform 发生更改,我需要使用的“create.tfplan”也需要传递。

只是真的很困惑如何获得良好的输入,只有在我真的需要运行 terraform apply 时才能获得该输入,以及如何使其成为非阻塞的。

解答

我不得不从我正在进行的基于声明性管道的工作中采用它,但我希望它仍然主要工作..

def tfPlanExitCode

node {
  stage('Checkout') {
    checkout scm
  }
  stage('Plan') {
    tfPlanExitCode = sh('terraform plan -out=create.tfplan -detailed-exitcode', [returnStatus: true])
    stash 'workspace'
  }
}

if (tfPlanExitCode == "2") {
  input('Deploy stack?')

  stage('Apply') {
    node {
      unstash 'workspace'
      sh 'terraform apply -no-color create.tfplan'
    }
  }
}

构建块是:

  • input 等待时不分配执行程序(几个小时..)

  • 存储您的工作区内容(您可以选择指定要复制的文件)并稍后在继续构建的代理上取消存储

当一些构建有 Apply 阶段而一些没有时,可视化可能有点搞砸了。这就是我使用声明性管道的原因,它允许很好/明确地跳过阶段。

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐