如何在不使用withCredentials.usernamePassword屏蔽PASSWORD的情况下重用Jenkins凭据?

时间:2019-04-20 17:06:10

标签: jenkins jenkins-pipeline credentials

背景

  • 我正在使用脚本化管道和共享库。

我们所有的实现都在src目录下,我在管道中重用了引用:

def static myFunction(steps, context) {
  steps.withCredentials([steps.usernamePassword(
      credentialsId: 'credentialsId',
      usernameVariable: 'GITHUB_USERNAME',
      passwordVariable: 'GITHUB_PASSWORD')]) {

     // use of steps.env.GITHUB_PASSWORD
  }
}
  • 我需要使用相同的凭据(设置为UsernamePassword凭据)对Github Enterprise进行2次API调用 尽管第一个呼叫按预期运行,但第二个呼叫失败,因为 env.GITHUB_PASSWORD 值被 masked 详细信息

https://wiki.jenkins.io/display/JENKINS/Credentials+Binding+Plugin中所述,该问题可能与凭据绑定多次使用时如何屏蔽凭据绑定有关。也就是说,一旦我们使用$ {env.PASSWORD}一次,它将屏蔽所有具有相同值的使用。

详细信息

我正在使用curl to并且需要生成URL

def teamMembersApi = sh(curl -H 'Authorization: token ${env.PASSWORD}' ${githubRepoApi}")

此调用的响应是另一个API URL,我使用“ teamMembersApi ”创建了另一个URL。因此,拨打第二个电话...

def teamMembers = sh("curl -H 'Authorization: token ${env.PASSWORD}' ${teamMembersApi}")

此时, $ {env.PASSWORD} 的值被屏蔽,因此,第二次调用由于凭据无效而失败

问题

据我了解,这是由于通过任何会导致“ toString()”将使其无法在字符串中重用的方法访问时,“屏蔽”值的结果。

  • 即使有资格被屏蔽,我如何重用相同的凭据?

验证

  • 我尝试使用2个 steps.withCredentials
  • 我尝试使用 httpRequest 步骤不引用变量

使用httpRequest,我得到了 MalformedURLException ,其中包含格式明确的URL ...我确定该URL为String格式并具有协议...

java.net.MalformedURLException: no protocol: https://github.company.com/org/repo

1 个答案:

答案 0 :(得分:1)

您可以随时使用 computed: { prettyAmount: function () { return this.amount + ' ' + this.currency.toUpperCase() } } <div>{{prettyAmount}}</div> 块内的username/password。但 请记住,withCredentials只能在username/password块内生存。

我在下面的代码中两次使用相同的withCredentials,效果很好。

username/password

代码中的另一个问题,如果您没有为步骤node('docker') { withCredentials([steps.usernamePassword( credentialsId: 'ba2e4f46-56f1-4467-ae97-17b356d7f854', usernameVariable: 'JENKINS_USERNAME', passwordVariable: 'JENKINS_PASSWORD')]) { def log = sh( returnStdout: true, script: "curl -u ${env.JENKINS_USERNAME}:${env.JENKINS_PASSWORD} -k ${env.BUILD_URL}" + 'consoleText').trim() def pipelineSteps = sh( returnStdout: true, script: "curl -u ${env.JENKINS_USERNAME}:${env.JENKINS_PASSWORD} -k ${env.BUILD_URL}" + 'flowGraphTable').trim() echo '\n## build log ##\n' + log echo '\n## pipelineSteps ##\n' + pipelineSteps } echo "JENKINS_USERNAME: ${env.JENKINS_USERNAME}" // print JENKINS_USERNAME: null // because JENKINS_USERNAME's lifecycle is limited inside withCredentials blok. } 指定选项returnStdout: true,则它应该返回null。示例:shdef output = sh('command')将是output