groovy Jenkins/格鲁维:如何从类构造函数调用withCredentials()?

ahy6op9u  于 2023-01-20  发布在  Jenkins
关注(0)|答案(2)|浏览(163)
    • 如何从Groovy类构造函数调用withCredentials()?**

为什么会这样:

@Library('my-sandbox-libs@dev') sandbox_lib

pipeline {
  agent any

  stages {
    stage( "1" ) {
      steps {
        script {
          try {
            def my_obj = new org.obj.Obj()
          }
          catch(Exception e) {
            echo "Jenkinsfile: ${e.toString()}"
            throw e
          }
        }
      }
    }
  }
}
// src/org/obj/Obj.groovy
package org.obj

public class Obj {
  def secret_
  Obj() {
    withCredentials([string(credentialsId: 'test_secret_text', variable: 'val')]) {
      this.secret_ = val
    }
  }
}

...生成此错误:

Jenkinsfile: groovy.lang.MissingMethodException: No signature of method: org.obj.Obj.string() is applicable for argument types: (java.util.LinkedHashMap) values: [[credentialsId:test_secret_text, variable:val]]
Possible solutions: toString(), toString(), print(java.io.PrintWriter), print(java.lang.Object), find(), split(groovy.lang.Closure)

    • 更新:**根据@daggett的回答,尝试了以下操作:

一个三个三个一个
...生成错误Posting build status of FAILED to bitbucket.company.comhudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.obj.Obj.string() is applicable for argument types: (java.util.LinkedHashMap) values: [[credentialsId:test_secret_text, variable:val]] Possible solutions: toString(), toString(), print(java.io.PrintWriter), print(java.lang.Object), find(), split(groovy.lang.Closure)
然而,下面的例子--只是一个实验--运行良好:

// src/org/obj/Obj.groovy
package org.obj

public class Obj {
  def secret_
  Obj(pipeline) {
    pipeline.echo "hello world"
  }
}

注意:我还尝试了public class Obj implements Serializable {...},但没有改变注意到的错误。
我仍然很难构建Jenkins/Groovy语言的心理模型,但对我来说,这似乎是因为withCredentials()有一些"特殊"的地方,阻止了从类构造函数调用它。
如果这是相关的,我有Jenkins版本2.190.3,它有Groovy版本2.4.12。

0tdrvxhp

0tdrvxhp1#

这应有助于:https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-steps
最简单的方法-将pipeline作为参数传递到构造函数

public class Obj {
  def secret_
  Obj(pipeline) {
     pipeline.withCredentials(...
  }

这样称呼它

...
 steps {
        script {
            def my_obj = new org.obj.Obj(this)
qvk1mo1f

qvk1mo1f2#

我通过以下操作解决了这个问题:
在/vars中创建一个将执行withCredential的文件。
文件名,例如:/vars/dockerCommands.groovy(我之前称之为docker.groovy,但是Docker已经是一个现有的步骤,所以我建议更改它,这样就不会冲突。)

.
.
.
def login(String cred, String reg) {
  withCredentials([
    usernamePassword(credentialsId: cred ,usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASSWORD')
    ]){
      docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} ${reg}" 
  }
}
.
.

在课堂上我要求这一步。

.
.
public void login(String cred, String reg) {
  this.steps.dockerCommands.login(cred, reg)
}
.
.

注意,steps是一个私有变量,它等价于你的pipeline变量。我在类的构造函数方法中创建了它。

相关问题