我正在尝试使用Jenkins创建保险库部署。这是a link到我的回购。
当运行脚本时,
“不允许使用静态方法org.codehaus.groovy.runtime.DefaultGroovyMethods编写java.io.File java. lang. String。管理员可以决定是否批准或拒绝此签名。
我得到这个问题后,添加一个阶段“生成变量”.如果我在代码中删除这个阶段,其他阶段可以工作,但它们不能完成任务。这是因为它需要获取用于Vault部署的令牌,并且需要从.tfvars文件中获取令牌。
在GitHub上共享我的变量不是一个好主意,这就是为什么我试图通过Jenkins创建vault.tfvars,并在运行管道作业之前提供任何令牌。
有人知道怎么解决吗?如果有不清楚的地方,请随时提出问题!
如果我找到了这个问题的解决方案,我会在这里与我的GitHub链接分享。谢谢
下面是我的代码Jenkinsfile.groovy
node('master') {
properties([parameters([
string(defaultValue: 'plan', description: 'Please provide what action you want? (plan,apply,destroy)', name: 'terraformPlan', trim: true),
string(defaultValue: 'default_token_add_here', description: 'Please provide a token for vault', name: 'vault_token', trim: true)
]
)])
checkout scm
stage('Generate Vars') {
def file = new File("${WORKSPACE}/vaultDeployment/vault.tfvars")
file.write """
vault_token = "${vault_token}"
"""
}
stage("Terraform init") {
dir("${workspace}/vaultDeployment/") {
sh 'ls'
sh 'pwd'
sh "terraform init"
}
stage("Terraform Plan/Apply/Destroy"){
if (params.terraformPlan.toLowerCase() == 'plan') {
dir("${workspace}/vaultDeployment/") {
sh "terraform plan -var-file=variables.tfvars"
}
}
if (params.terraformPlan.toLowerCase() == 'apply') {
dir("${workspace}/vaultDeployment/") {
sh "terraform apply --auto-approve"
}
}
if (params.terraformPlan.toLowerCase() == 'destroy') {
dir("${workspace}/vaultDeployment/") {
sh "terraform destroy --auto-approve"
}
}
}
}
}
2条答案
按热度按时间jmp7cifd1#
一般情况下,我们选择在Groovy沙箱中执行管道,因为考虑到安全性,Groovy沙箱在某些方面有限制。像使用
new
关键字,使用静态方法。但您需要Jenkins admin在 jenkins > *Manage jenkins * > In-process Script Approval 中将限制添加到白名单
为了写文件,Jenkins管道提供了替代的
writeFile
,它没有这样的限制。j1dl9f462#
作为yong already pointed out,在没有管理员控制的环境中,实现这一点并避免最终限制的正确方法是使用writeFile
即:
这样做的好处是,从完全受管理的环境迁移到受限制的环境将是无痛的。子文件夹,如示例中的'tmp',将自动创建,代码本身非常冗长