脚本不允许使用 staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods 写入 java.io.File java.lang.String

Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods write java.io.File java.lang.String

我正在尝试使用 Jenkins 创建保管库部署。这是我的回购协议 a link

当 运行 我得到的脚本

"Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods write java.io.File java.lang.String. Administrators can decide whether to approve or reject this signature." issue.

我在添加阶段 "Generate Vars" 后遇到了这个问题。 如果我在代码中删除这个阶段,其他阶段可以工作,但它们不会完成工作。这是因为它需要获取用于保管库部署的令牌,并且需要从 .tfvars 文件中获取它。

在 GitHub 上共享我的变量不是一个好主意,这就是为什么我试图通过 Jenkins 创建 vault.tfvars 并在 运行 管道作业之前提供任何令牌。

有谁知道如何解决这个问题??? 如有不明白的地方欢迎提问!

如果我找到这个问题的解决方案,我会在这里与 link 分享到我的 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"
          }
      }
    }
  }
}

一般我们选择管道在Groovy沙箱中执行,出于安​​全考虑,沙箱在某些方面有限制。就像使用 new 关键字一样,使用静态方法。

但是你需要 Jenkins 管理员在 jenkins > Manage jenkins > In-process Script Approval

中将限制添加到白名单

要写入文件,Jenkins 管道供应备选方案 writeFile 没有此类限制。

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

@yong 已经指出了在我们没有管理员控制的环境中实现这一点并避免最终限制的正确方法是使用 writeFile

即:

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

这样做的好处是从完全托管的环境迁移到受限的环境会很轻松。 子文件夹,如示例中的 'tmp',将自动创建并且代码本身非常冗长