Скрытие пароля в сценарии сценария Jenkins
Я пытаюсь замаскировать пароль в моей сборке Jenkins.
Я пробовал плагин mask-passwords.
Однако это, похоже, не работает с моим сценарием сценария Jenkins, потому что, если я определяю пароль PASSWD1
а затем я использую его в скрипте вроде этого ${PASSWD1}
, я получаю:
No such DSL method '$' found among steps [addToClasspath, ansiColor, ansiblePlaybook, ....]
Если я использую env.PASSWD1
, тогда его значение будет определено как null
.
Итак, как мне замаскировать пароль в сценарии сценария Jenkins?
Ответы
Ответ 1
Самый простой способ - использовать плагин Credentials.
Там вы можете определить различные типы учетных данных, будь то один пароль ("секретный текст") или файл или комбинация имени пользователя и пароля. Кроме того, другие плагины могут вносить другие типы учетных данных.
Когда вы создаете учетные данные (используя ссылку Credentials на главной странице Jenkins), убедитесь, что вы установили "ID". В приведенном ниже примере я назвал его my-pass
. Если вы не установите его, он все равно будет работать, Дженкинс вместо этого предоставит вам непрозрачный UUID.
В любом случае вы можете легко сгенерировать требуемый синтаксис с помощью генератора фрагментов.
withCredentials([string(credentialsId: 'my-pass', variable: 'PW1')]) {
echo "My password is '${PW1}'!"
}
Это сделает пароль доступным в данной переменной только внутри этого блока. Если вы попытаетесь распечатать пароль, как я здесь, он будет замаскирован.
Ответ 2
Изучив эту проблему, https://issues.jenkins-ci.org/browse/JENKINS-27392, вы должны быть в состоянии сделать следующее:
node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
echo env['SECRET'];
}
}
Однако, если вы посмотрите на последние комментарии в этой проблеме, это не сработает, похоже на ошибку. Однако, если вы знаете секрет и случайно распечатываете int в журналах, он скрыт, например:
node {
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: '123ADS', var: 'SECRET']]]) {
echo "123ADS";
}
}
Это дает:
[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] wrap
[Pipeline] {
[Pipeline] echo
********
[Pipeline] }
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Что касается ошибки, которую вы получаете, No such DSL method '$' found among steps...
, я просто догадываюсь, но вы, вероятно, используете ${VAR}
непосредственно в сценарии конвейера, ${...}
имеет значение только внутри струн в groovy.
EDIT: Или вы можете использовать Credentails Plugin
и конвейер с withCredentials
:
// Credential d389273c-03a0-45af-a847-166092b77bda is set to a string secret in Jenkins config.
node {
withCredentials([string(credentialsId: 'd389273c-03a0-45af-a847-166092b77bda', variable: 'SECRET')]) {
bat """
if ["${SECRET}"] == ["123ASD"] echo "Equal!"
""";
}
}
Это приводит к:
[Pipeline] node
Running on master in workspace/pl
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] bat
[pl] Running batch script
workspace/pl>if ["****"] == ["****"] echo "Equal!"
"Equal!"
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Обратите внимание, что этот плагин привязывает переменную непосредственно к закрытию, а не к среде, как к другой, например, я могу напрямую использовать переменную SECRET
.