Jenkins共享库中withCredentials使用Secret文本报错求助
我一眼就看出问题所在了——你在共享库的方法里调用withCredentials时,没有正确通过script对象来引用流水线内置的string()步骤,导致Jenkins误以为你在调用共享库类自己的方法,自然找不到对应的签名。
先复现下你的报错核心:
No signature of method: com.example.sonarqube.SonarQubeScan.string() is applicable for argument types: (java.util.LinkedHashMap) values: [[credentialsId:sonarqube.test.service, variable:pass]] Possible solutions: toString(), toString(), print(java.io.PrintWriter), print(java.lang.Object), find(), sprintf(java.lang.String, java.lang.Object)
直接给你修复后的代码:
def scanProject(String[] inputs) { script.echo "inside scanProject.." try { String version= '' String projectName = '' String environment = '' // 关键:必须通过script对象调用string步骤 this.script.withCredentials([this.script.string(credentialsId: 'sonarqube.test.service', variable: 'pass')]) { // 另外这里的变量引用也要改,用${}取变量值 this.script.sh "echo ${this.script.env.pass}" } } catch(error) { script.echo "Exception happened during SonarQube scanning. Find the message below:" script.echo error.toString() } }
还要确认共享库类的script对象注入是否正确:
你的共享库类需要确保已经拿到了流水线的script实例,比如通过构造方法注入:
class SonarQubeScan implements Serializable { def script SonarQubeScan(def script) { this.script = script } def scanProject(String[] inputs) { // 上面的方法逻辑 } }
在流水线里调用时,要把当前的this(也就是流水线script对象)传进去:
@Library('your-shared-library') _ def sonarScanner = new com.example.sonarqube.SonarQubeScan(this) sonarScanner.scanProject(inputs)
为什么会出现这个问题?
Jenkins的所有流水线步骤(比如withCredentials、string、sh)都是绑定在流水线的Script上下文对象上的。当你在共享库类里直接写string(...)时,JVM会在你的SonarQubeScan类里找这个方法,而不是去调用Jenkins的内置步骤。必须通过注入的script对象来间接调用,才能让Jenkins识别这是流水线的内置操作。
内容的提问来源于stack exchange,提问作者Reese

