我有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时才能获取该输入,以及如何使其不阻塞。
答案 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'
}
}
}
基本要素是:
当某些版本具有 Apply 阶段而某些版本没有 Apply 阶段时,可视化可能会有点混乱。这就是为什么我使用声明性管道,可以很好/明确地跳过阶段。