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

时间:2019-04-21 17:21:32

标签: jenkins groovy jenkins-pipeline jenkins-groovy hashicorp-vault

我正在尝试使用Jenkins创建保管库部署。这是我的仓库中的a link

运行脚本时,我得到

  

“不允许使用staticMethod的脚本org.codehaus.groovy.runtime.DefaultGroovyMethods编写java.io.File java.lang.String。管理员可以决定是否批准或拒绝此签名。”问题。

添加“ Generate Vars”阶段后出现此问题。 如果我在代码中删除此阶段,则其他阶段也可以工作,但它们无法完成工作。这是因为它需要获取用于保管库部署的令牌,并且需要从.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 个答案:

答案 0 :(得分:1)

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

但是您需要Jenkins管理员将限制添加到jenkins > Manage jenkins > In-process Script Approval的白名单中

要写入文件,詹金斯管道供应替代writeFile不受此限制。

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

答案 1 :(得分:0)

@yong已经指出了实现此目标并避免在不受管理员控制的环境中最终受到限制的正确方法是使用writeFile

即:

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

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