我有一个jenkinsfile正在运行,并且能够使用terraform自动部署一些基础架构。不幸的是,在添加带有git源的terraform模块后,它停止工作并出现以下错误:
+ terraform init -input=false -upgrade
Upgrading modules...
- module.logstash
Updating source "git::https://bitbucket.org/*****"
Error downloading modules: Error loading modules: error downloading 'https://bitbucket.org/*****': /usr/bin/git exited with 128: Cloning into '.terraform/modules/34024e811e7ce0e58ceae615c545a1f8'...
fatal: could not read Username for 'https://bitbucket.org': No such device or address
script returned exit code 1
上面的网址在事实发生之后被混淆了。以下是简化的模块语法:
module "logstash" {
source = "git::https://bitbucket.org/******"
...
}
下面是Jenkins文件:
pipeline {
agent {
label 'linux'
}
triggers {
pollSCM('*/5 * * * *')
}
stages {
stage ('init') {
steps {
sh 'terraform init -input=false -upgrade'
}
}
stage('validate') {
steps {
sh 'terraform validate -var-file="production.tfvars"'
}
}
stage('deploy') {
when {
branch 'master'
}
steps {
sh 'terraform apply -auto-approve -input=false -var-file=production.tfvars'
}
}
}
}
我认为这是terraform内部使用git检出模块的问题,但Jenkins尚未在管道作业本身中配置git客户端。最好是,我能够以某种方式将多分支管道作业所使用的凭据传递到作业本身并配置git,但我对此却一无所知。任何帮助,将不胜感激。
答案 0 :(得分:0)
因此,我发现了一个非理想的解决方案,要求您在Jenkinsfile中指定凭据,而不是自动使用作业使用的凭据进行检出。
withCredentials([usernamePassword(credentialsId: 'bitbucketcreds', passwordVariable: 'GIT_PASS', usernameVariable: 'GIT_USER')]) {
sh "git config --global credential.helper '!f() { sleep 1; echo \"username=${env.GIT_USER}\\npassword=${env.GIT_PASS}\"; }; f'"
sh 'terraform init -input=false -upgrade'
sh 'git config --global --remove-section credential'
}
诀窍是使用withCredentials
块将凭据加载到环境变量中,然后使用this question的答案为git设置凭据帮助程序以读取这些凭据。然后,您可以运行terraform init
,它将拉下您的模块。最后,它将清除修改过的git设置,以期避免污染其他构建。请注意,对于大多数人来说,这里的--global
配置可能不是一个好主意,但由于我们在Jenkins代理商中的怪癖,对我来说是必需的。
如果有人有更流畅的方法,我会对听到它很感兴趣。