【问题标题】:How to invoke Jenkins credentials in a jenkins scripted pipeline (not declarative)如何在詹金斯脚本管道中调用詹金斯凭据(非声明性)
【发布时间】:2018-11-22 01:16:54
【问题描述】:

我正在尝试使用 jenkins 脚本化管道来调用配置文件提供程序插件以及从 jenkins 获取用户名和密码的凭据,但以下似乎不起作用。

    node {
      
       def mvnHome
       def mvnSettings
       
       stage('Prepare') {
          mvnHome = tool 'maven-3.5.4'
       }

       stage('Checkout') {
          checkout scm
       }
       
stage('Deploy'){
def usernameLocal, passwordLocal, usr, psw
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xyz', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME']]) {
    usernameLocal = env.USERNAME
    passwordLocal = env.PASSWORD
  }
  configFileProvider(
        [configFile(fileId: '*********', variable: 'MAVEN_SETTINGS', replaceTokens: true)])
	    {
	     usr="${usernameLocal}"
	     psw="${passwordLocal}"
	     sh "echo $usr"
             sh "'${mvnHome}/bin/mvn' -s $MAVEN_SETTINGS deploy -Dserver.username="${usernameLocal}" -Dserver.password="${passwordLocal}""
        }
}
}

其中 server.username 和 server.password 被定义为 settings.xml 服务器部分下用户名和密码的属性。

看起来我发现了这个问题,它与这里使用的 withCredentials 无关,而是与配置文件提供程序插件有关。所以我能够正确打印凭据用户名,但不知何故,配置文件提供程序无法替换 settings.xml 中的变量值。

所以我不再收到任何错误,只是部署没有通过 401 未经授权,因为我的 settings.xml 中的以下内容永远不会得到正确的值:-

        <server>
          <id>snapshot</id>
          <username>${server.username}</username>
          <password>${server.password}</password>
        </server>

您能告诉我如何解决这个问题吗?

【问题讨论】:

  • 也许加上你收到的错误
  • 我提供了所有可能有用的详细信息,包括错误消息。简而言之,我想从 Jenkins 调用凭据以在脚本化管道中检索用户名和密码(出于某种原因)并将它们作为参数传递给配置文件提供程序 mvn 命令。
  • 好的,之前的问题已经解决,我现在已经更新了帖子。您现在可以看一下并帮助我解决问题吗?
  • 感谢马克的及时回复。是的,密码使用特殊字符。但是我怎么知道配置文件提供程序 sh 脚本是否甚至用我在该脚本中传递的值替换了 settings.xml 用户名和密码。?
  • 尝试 sh "echo '${mvnHome}/bin/mvn' -s $MAVEN_SETTINGS deploy -Dserver.username="${usernameLocal}" -Dserver.password="${passwordLocal}""

标签: jenkins jenkins-plugins jenkins-pipeline


【解决方案1】:

withCredentials 创建的变量是 Groovy 变量而不是环境变量。请尝试以下操作:

stage('Deploy'){    
  withCredentials([usernamePassword(credentialsId:'xyz', passwordVariable: 'Password', usernameVariable: 'Username')]) {
    configFileProvider([configFile(fileId: 'abcde', variable:'MAVEN_SETTINGS')]) {  
        sh "'${mvnHome}/bin/mvn' -s $MAVEN_SETTINGS deploy -Dserver.username=${Username} -Dserver.password=${Password}" 
    }   
  }     
}

【讨论】:

  • 那也行不通。最奇怪的错误是:- sh 行中的“意外”,这意味着您在处理 withCredentials 时只能使用“”(单引号)。
【解决方案2】:

好的,我找到了解决方案,在withCredentials 块下声明configFileProvider 整个部分并通过:

-Dserver.username='${usernameLocal}' -Dserver.password='${passwordLocal}'

(请注意单引号)。这样,这些值也会被替换并在日志中作为屏蔽输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2020-03-30
    • 1970-01-01
    • 2019-01-09
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多