#jenkins #jenkins-pipeline #jenkins-groovy #jenkins-declarative-pipeline
#Дженкинс #дженкинс-конвейер #дженкинс-заводной #дженкинс-декларативный-конвейер
Вопрос:
В декларативных конвейерах Jenkins довольно легко установить переменную среды в качестве результата команды bash следующим образом.
Например, значения USERNAME
, UID
и GID
устанавливаются как результат их соответствующих команд bash.
pipeline {
agent {
node {
label 'master'
customWorkspace "some/path"
}
}
environment {
USERNAME = sh(script:"whoami", returnStdout: true).trim()
UID = sh(script:"id -u", returnStdout: true).trim()
GID = sh(script:"id -g", returnStdout: true).trim()
}
Как мне сделать то же самое при использовании конвейеров со сценариями Дженкинса?
Например, допустим, у меня есть следующий node
блок, что мне поместить внутрь withEnv
, чтобы добиться того же результата? Цель состоит в том USERNAME
, UID
чтобы и GID
содержать имя пользователя, uid и gid пользователя на моем external-test-server
узле.
node('external-test-server') {
stage("Test") {
withEnv([
// Note that the following does not work and is meant to illustrate what my objective is
'USERNAME=${sh(script:"whoami", returnStdout: true).trim()}',
'UID=${sh(script:"id -u", returnStdout: true).trim()}',
'GID=${sh(script:"id -g", returnStdout: true).trim()}'
]) {
dir("../some_path") {
sh "pwd"
}
}
}
}
Редактировать:
Я также должен быть уверен, что переменные среды в node('external-test-server')
должны переопределять ранее установленные переменные среды вне узла.
Ответ №1:
Ваш withEnv
блок не работает из-за отсутствия кавычек, как указано ниже, должно работать
node {
//initiated some values to make sure withEnv block overrides these
env.USERNAME = "testUser"
env.UID = "99"
env.GID = "99"
stage("Test") {
withEnv([
// This should now work
"USERNAME=${sh(script:"whoami", returnStdout: true).trim()}",
"UID=${sh(script:"id -u", returnStdout: true).trim()}",
"GID=${sh(script:"id -g", returnStdout: true).trim()}"
]) {
dir("myNewPath") {
println USERNAME
println UID
println GID
}
}
}
}
Комментарии:
1. В моем случае в моем конвейере уже
USERNAME
установлена переменная среды, иnode('external-test-server')
я хочуUSERNAME
, чтобы переменная среды переопределяла «внешнюю»USERNAME
переменную среды. Я попробовал ваше предложение об использованииenv.USERNAME
в моем узле; однако, похоже, оно не переопределяет исходнуюUSERNAME
переменную среды.2. Я понимаю, что вы имеете в виду, позвольте мне отредактировать мой ответ, в этом случае, я полагаю, это всего лишь вопрос кавычек