Как повторно использовать учетные данные Jenkins, не маскируя ПАРОЛЬ в withCredentials.usernamePassword? - PullRequest
1 голос
/ 20 апреля 2019

Фон

  • Я использую скриптовые конвейеры и общие библиотеки.

Вся наша реализация находится в каталоге src, где я повторно использую ссылку в конвейерах:

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

     // use of steps.env.GITHUB_PASSWORD
  }
}
  • Мне нужно сделать 2 вызова API для Github Enterprise сте же учетные данные, которые установлены как учетные данные UsernamePassword. Хотя первый вызов работает должным образом, второй вызов завершается неудачно, поскольку значение env.GITHUB_PASSWORD равно mask Details

Как описано в https://wiki.jenkins.io/display/JENKINS/Credentials+Binding+Plugin,, проблема может быть связана с тем, как привязка учетных данных маскируется при использовании более одного раза.То есть, как только мы используем $ {env.PASSWORD} один раз, он замаскирует все использования одного и того же значения.

Detail

Я использую curl для и мне нужно сгенерироватьURL

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

Ответом на этот вызов является другой URL-адрес API, который я создал еще одним URL-адресом с " teamMembersApi ".Итак, второй вызов ...

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 Ответ

1 голос
/ 21 апреля 2019

Вы можете использовать блок 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 для шага sh, она должна вернуть ноль. Пример: def output = sh('command'), output будет null

...