【问题标题】:How can I use different private docker agents based on parameter in Jenkins declarative pipeline?如何根据 Jenkins 声明性管道中的参数使用不同的私有 docker 代理?
【发布时间】: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 文件或不同集的顺序步骤。

【问题讨论】:

标签: docker jenkins jenkins-pipeline


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多