Как создать ввод Jenkins, который не блокируется, и основан на предыдущем выводе команды - PullRequest
0 голосов
/ 08 октября 2018

У меня есть 2 проблемы, которые являются частью одной и той же проблемы.Я запускаю terraform внутри JenkinsFile, все это происходит в док-контейнере, который выполняется на определенном узле.У меня есть несколько различных сред с ec2_plugin, которые помечены как «environment_ec2».Это сделано так, поскольку мы используем ansible, и я хочу иметь возможность выполнять ansible локально в VPC.

1) Как создать вход и этап, которые выполняются только в том случае, если предыдущая команда возвращает определенныйoutput?

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

Я хочу запустить только input и terraform, если результат команды ниже == 2.

terraform plan -detailed-exitcode

Поскольку все это должно выполняться на экземпляре ec2, и все это должно использовать этот контейнер, я не уверен, как я могу сделать этот ввод вне узла, как это рекомендовано.Поскольку, если входные данные находятся достаточно долго, этот экземпляр может выйти из строя, а остальная часть кода будет запущена в новом экземпляре / рабочей области, и информация, которая мне нужна из репозитория git и плана terraform, не будет представлена.Репозиторий git, который я извлекаю, содержит конфигурации terraform, конфигурации ansible и некоторую конфигурацию для SSH, так что terraform и ansible могут извлекать свои модули / роли из частных репозиториев git.'Create.tfplan', который мне нужно будет использовать, если в terraform есть изменения, также нужно будет передать.

Просто очень запутался, как я могу получить хороший ввод, получайте этот ввод, только если мне действительно нужнозапустить терраформ применить, и как я могу сделать это без блокировки.

1 Ответ

0 голосов
/ 08 октября 2018

Я должен был принять это из моей работы в процессе, которая основана на декларативном конвейере, но я надеюсь, что он все еще в основном работает ..

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

Строительные блоки:

  • не выделяйте исполнителя, пока ввод ожидает (в течение нескольких часов ..)
  • , чтобы сохранить содержимое рабочей области (вы можете указать, какие файлы копировать) и отменить удаление позжена агенте, который продолжает сборку

Визуализация может быть немного испорчена, когда некоторые сборки имеют этап Apply , а некоторые - нет.Вот почему я использую декларативные конвейеры, которые позволяют красиво / явно пропустить этапы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...