如何基于Jenkins声明式管道中的参数使用不同的私有docker代理?

资料夹

我正在尝试根据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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Jenkins 声明式管道中循环参数值

如何使用Jenkins声明式管道运行特权Docker容器

SCM的Docker / Dockerfile代理的Jenkins声明式管道

如何在Jenkins声明式管道中检查密码参数是否为空?

在 Docker 代理上使用 Jenkins 管道文件参数

Jenkins动态声明式管道参数

Jenkins声明式管道Docker注册中心

如何从Jenkins声明性管道中的text参数检索所有行?

如何从一个私有注册表中提取Docker映像并将其推送到Jenkins管道中的另一个不同的私有注册表中

是否可以在Jenkins声明式管道中按分支设置代理

在我的Jenkins声明式管道中的多个代理上运行相同的任务

如何在声明式管道中使用NodeLabel参数插件

如何在 Jenkins 管道中的所有代理上构建?

Jenkins 声明式管道中的并行项

在Jenkins声明式管道中使用waitForQualityGate

Jenkins将Docker代理与环境声明管道一起使用

Jenkins 2.8管道循环使用不同的参数多次触发同一作业

存储库中没有Jenkins文件的Jenkins声明式管道

如何使用Jenkins声明式语法登录Docker?

如何在声明管道中使用不同的部署密钥签出git子模块

Jenkins,如何在 Jenkins 声明式管道中运行 XmlParser/读取 XML

在另一个Jenkins声明式管道阶段中,如何使用mvn软件包生成的Jar?

如何从 Jenkins 声明性管道中的 URL 填充 Jenkins 构建参数值

如何使用不同的变量声明变量

如何强制管道中的不同阶段在同一个 Jenkins 代理上运行?

声明式Jenkins管道使用现有的Kubernetes Pod模板

Jenkins:如何使用jenkins管道多个参数

如何在Jenkins声明式管道中检测哪个并行阶段失败?

对sqlalchemy中的同一声明式库使用不同的架构