如何基于先前的命令输出创建没有阻塞的詹金斯输入

时间:2018-10-08 17:08:56

标签: jenkins terraform

我有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'
            }
        }
    }
}

如果以下命令的结果为== 2,我只想运行输入并进行terraform apply。

terraform plan -detailed-exitcode

由于所有这些都必须在ec2实例上运行,并且都必须使用此容器,所以我不确定如何在节点外部(如推荐的那样)进行此输入。由于如果输入的时间足够长,此实例可能会崩溃,其余代码将在新的实例/工作区上运行,并且我从git repo和terraform计划中获得的信息将不存在。我签出的git repo包含terraform配置,ansible配置以及SSH的一些配置,以便terraform和ansible能够从私有git repos提取其模块/角色。我需要使用IF terraform进行更改的'create.tfplan'也将需要传递。

真的很困惑我如何才能获得良好的输入,仅在我确实需要运行terraform apply时才能获取该输入,以及如何使其不阻塞。

1 个答案:

答案 0 :(得分:1)

我不得不从基于声明式管道的在制品中采用此方法,但我希望它仍然可以正常工作。

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 阶段而某些版本没有 Apply 阶段时,可视化可能会有点混乱。这就是为什么我使用声明性管道,可以很好/明确地跳过阶段。