Как я могу использовать различные частные агенты докера, основанные на параметре в декларативном конвейере Jenkins?
Я пытаюсь выбрать другой агент Docker из реестра частных контейнеров на основе параметра в конвейере Jenkins. Для моего примера, скажем, у меня есть "credsProd" и "credsTest", сохраненные в хранилище учетных данных. Моя попытка заключается в следующем:
pipeline {
parameters {
choice(
name: 'registrySelection',
choices: ['TEST', 'PROD'],
description: 'Is this a deployment to STAGING or PRODUCTION environment?'
)
}
environment {
URL_VAR = "${env.registrySelection == "PROD" ? "urlProd.azure.io" : "urlTest.azure.io"}"
CREDS_VAR = "${env.registrySelection == "PROD" ? "credsProd" : "credsTest"}"
}
agent {
docker {
image "${env.URL_VAR}/image:tag"
registryUrl "https://${env.URL_VAR}"
registryCredentialsId "${env.CREDS_VAR}"
}
}
stages{
stage('test'){
steps{
echo "${env.URL_VAR}"
echo "${env.CREDS_VAR}"
}
}
}
}
Я получаю ошибку:Error response from daemon: Get https://null/v2/: dial tcp: lookup null on
Если я жестко кодирую registryUrl, я получаю похожую проблему с registryCredentialsId:
agent {
docker {
image "${env.URL_VAR}/image:tag"
registryUrl "https://urlTest.azure.io"
registryCredentialsId "${env.CREDS_VAR}"
}
}
ERROR: Could not find credentials matching null
Это успешно, если я жестко закодировал оба RegistryUrl и registryCredentialsId.
agent {
docker {
image "${env.URL_VAR}/image:tag"
registryUrl "https://urlTest.azure.io"
registryCredentialsId "credsTest"
}
}
Похоже, что этап входа в докер agent{docker{}}
невозможно получить доступ / разрешить переменные окружения.
Есть ли способ обойти это, не включая дублирование кода? Я управляю изменениями с помощью многоотраслевого конвейера, поэтому в идеале не нужно иметь отдельные файлы Prod и test groovy или разные наборы последовательных шагов в одном файле.
1 ответ
Попробуйте запустить конвейерный сценарий перед декларативным:
URL_VAR = null
CREDS_VAR = null
node('master') {
stage('Choose') {
URL_VAR = params.registrySelection == "PROD" ? "urlProd.azure.io" : "urlTest.azure.io"
CREDS_VAR = params.registrySelection == "PROD" ? "credsProd" : "credsTest"
}
}
pipeline {
agent {
docker {
image "${URL_VAR}/image:tag"
registryUrl "https://${URL_VAR}"
registryCredentialsId "${CREDS_VAR}"
}
}
...
Кроме того, вы можете определить два этапа (с жестко запрограммированными URL-адресами и кредитами), но запустить только один из них, используя when
в обоих.