我正在尝试根据Jenkins管道中的参数从私有容器注册表中选择其他docker代理。对于我的示例,假设我在凭据存储中保存了“ 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"
}
}
看来docker登录阶段agent{docker{}}
无法访问/解析环境变量。
有没有一种方法可以解决此问题而不涉及代码重复?我使用多分支管道来管理更改,因此理想情况下,我不想有单独的Prod和groovy文件,也不想在同一文件中使用不同的集顺序步骤。
尝试在声明式之前运行脚本化管道:
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和creds),但只运行其中一个,when
在两个阶段中都使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句