如何创建没有阻塞的 Jenkins 输入,并且基于之前的命令输出
问题:如何创建没有阻塞的 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 阶段而一些没有时,可视化可能有点搞砸了。这就是我使用声明性管道的原因,它允许很好/明确地跳过阶段。
更多推荐
所有评论(0)