【发布时间】:2019-03-20 18:03:08
【问题描述】:
我正在尝试根据 Jenkins 管道中的 a 参数从私有容器注册表中选择不同的 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"
}
}
看来agent{docker{}}的docker登录阶段无法访问/解析环境变量。
有没有不涉及代码重复的解决方法?我使用多分支管道管理更改,因此理想情况下不希望在同一个文件中有单独的 Prod 和测试 groovy 文件或不同集的顺序步骤。
【问题讨论】:
-
我相信
env映射始终是null在agent块中(实际上谷歌产生issues.jenkins-ci.org/browse/JENKINS-43911)。我相信params地图也是如此,但我想我在某处的文档中看到了一个示例,暗示它可能有效。另请查看:stackoverflow.com/questions/46630168/… -
感谢@MattSchuchard Jenkins 问题对阅读很有帮助。显然试图做一些不可能在这里做的事情。
标签: docker jenkins jenkins-pipeline