如何在Jenkins脚本化管道中调用Jenkins凭证(非声明性)

时间:2018-11-22 01:16:55

标签: jenkins jenkins-plugins jenkins-pipeline

我正在尝试使用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>

请问如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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}" 
    }   
  }     
}

答案 1 :(得分:0)

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

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

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