不允许使用静态方法org.codehaus.groovy.runtime.DefaultGroovyMethods编写java.io.File java.lang.String

0g0grzrc  于 8个月前  发布在  Java
关注(0)|答案(2)|浏览(83)

我正在尝试使用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"
          }
      }
    }
  }
}
jmp7cifd

jmp7cifd1#

一般情况下,我们选择在Groovy沙箱中执行管道,因为考虑到安全性,Groovy沙箱在某些方面有限制。像使用new关键字,使用静态方法。
但您需要Jenkins admin在 jenkins > *Manage jenkins * > In-process Script Approval 中将限制添加到白名单
为了写文件,Jenkins管道提供了替代的writeFile,它没有这样的限制。

writeFile file: '<file path>',  text: """
    vault_token              =  "${vault_token}"
    """
j1dl9f46

j1dl9f462#

作为yong already pointed out,在没有管理员控制的环境中,实现这一点并避免最终限制的正确方法是使用writeFile
即:

writeFile file: 'tmp/query.sql', text: "SELECT * FROM table"

这样做的好处是,从完全受管理的环境迁移到受限制的环境将是无痛的。子文件夹,如示例中的'tmp',将自动创建,代码本身非常冗长

相关问题