【问题标题】:Jenkins withCredentials secret not working with shared libraryJenkins withCredentials 秘密不适用于共享库
【发布时间】:2020-09-19 07:01:21
【问题描述】:

我开始为 jenkins 共享库开发解决方案,但在使用 withCredentials 插件获取秘密时遇到奇怪的异常。在詹金斯管道中使用它们时,我对用户名密码或机密的凭据没有任何问题。但是在为共享库实现时,它给了我一个我还无法解决的错误。

代码

def scanProject(String[] inputs) {
        script.echo "inside scanProject.."
        try {

                    String version= ''
                    String projectName = '' 
                    String environment = ''
                    
                    this.script.withCredentials([string(credentialsId: 'sonarqube.test.service', variable: 'pass')]) {
    
                         this.script.sh "echo {this.script.env.pass}"
                    }


                } catch(error) {
                ...

这个 sonarqube.test.service 是一个秘密文本

错误

inside constructor..
[Pipeline] echo
inside scanProject..
[Pipeline] echo
Exception happened during SonarQube scanning. Find the message below:
[Pipeline] echo
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)

【问题讨论】:

  • 你试过 this.script.sh "echo $pass" 吗?
  • 试过..但没用。我已经更新了对我有用的东西。谢谢

标签: jenkins jenkins-pipeline shared-libraries jenkins-groovy


【解决方案1】:

对我来说,以下方式有效

this.script.withCredentials([script.string(credentialsId: 'sonarqube.test.service', variable: 'pass')]) {

       this.script.sh "/root/sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner -Dsonar.login=${this.script.pass} -Dsonar.projectName="+projectName+" ..
                    
                    
}

【讨论】:

    【解决方案2】:

    这行得通,我实际使用它。尽管如此,在这种情况下,如果我必须在 bat 或 sh 脚本中使用变量和凭据,我还没有找到解决安全问题的方法。请记住这一点。

    使用 Groovy 字符串插值将秘密传递给“sh”,它 是不安全的。受影响的参数使用了以下变量: [通过] 见 https://jenkins.io/redirect/groovy-string-interpolation了解详情。

    version = '4.0.0.1744'
    this.script.withCredentials([script.string(credentialsId: 'sonarqube.test.service', variable: 'pass')]) {
    
           this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=${this.script.pass} -Dsonar.projectName="+projectName+" ..              
              
    }
    

    同样的问题会影响到:

       this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=" + this.script.pass + " -Dsonar.projectName="+projectName+" ..
    

    这些变通办法也不起作用:

       this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=\${this.script.pass} -Dsonar.projectName="+projectName+" ..
       this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=\$this.script.pass -Dsonar.projectName="+projectName+" ..
       this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=" + '${this.script.pass}' + " -Dsonar.projectName="+projectName+" ..
       this.script.sh "/root/sonar-scanner-${version}-linux/bin/sonar-scanner -Dsonar.login=" + '$this.script.pass' + " -Dsonar.projectName="+projectName+" ..
    

    在这种情况下,sh 脚本使用变量名 this.script.pass 而不是变量的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多