#jenkins #groovy #interpolation #credentials
Вопрос:
Я пытаюсь применить лучшие практики к своим конвейерам Дженкинса, поэтому я пытаюсь применить рекомендацию о том, что интерполяция строк Groovy никогда не должна использоваться с учетными данными
Сначала я выполняю в своем конвейере, как рекомендовано в документации Дженкинса — интерполяция чувствительных переменных, поэтому я использую одинарные кавычки в своем сценарии:
withCredentials([usernamePassword(credentialsId: 'my-docker-user', passwordVariable: 'docker_pwd', usernameVariable: 'docker_usr')]) {
dcheckScriptResult = sh label: 'Retrieving image', script: ''' docker login -u $docker_usr -p $docker_pwd $dockerRegistry ''', returnStatus: true
echo "dcheckScriptResult = $dcheckScriptResult"
}
Но в результате я получаю:
04:59:04 docker login -u **** -p ****
04:59:04 Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password
Теперь я пытаюсь, так как это считается неправильным (двойные кавычки):
dcheckScriptResult = sh label: 'Retrieving image', script: """ docker login -u $docker_usr -p $docker_pwd $dockerRegistry """, returnStatus: true
echo "dcheckScriptResult = $dcheckScriptResult"
И это работает…но с предупреждением об использовании заводной интерполяции:
05:11:54 Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
05:11:54 Affected argument(s) used the following variable(s): [docker_pwd, docker_usr]
05:11:54 See https://jenkins.io/redirect/groovy-string-interpolation for details.
05:11:54 docker login -u **** -p **** myrepository.mycompany
05:11:54 WARNING! Your password will be stored unencrypted in /home/ccloud/.docker/config.json.
05:11:54 Configure a credential helper to remove this warning. See
05:11:54 https://docs.docker.com/engine/reference/commandline/login/#credentials-store
05:11:54
05:11:54 Login Succeeded
Есть идеи, чего мне не хватает?
Комментарии:
1. Я пропустил сообщение об ошибке. Разница в первой по сравнению со второй захваченной командой docker заключается в отсутствии адреса реестра. Я думаю, что вам нужно просто сделать
dockerRegistry
доступным в качестве переменной среды.2. спасибо за идею @daggett, это была проблема
dockerRegistry
, из-за которой отсутствовала переменная. Я решил эту проблему, убрав ее из одинарных кавычек, как это:dcheckScriptResult = sh label: 'Retrieving image', script: ''' echo $docker_pwd | docker login -u $docker_user --password-stdin ''' dockerRegistry , returnStatus: true