首页 > 解决方案 > Jenkins Active Choices 参数与 Docker 以获取 Azure 标记

问题描述

对于部署作业,我想设置一个 Jenkins 作业,该作业接收来自特定 Azure 存储库的所有现有标记,并使它们可用于在 Active Choices 参数中进行选择。

我尝试了几件事,但没有任何效果。在下面的代码中,您可以看到我尝试过的最后一个代码。我想拉一个 Docker 容器,其中包含我们的 Azure CLI 和我们的配置,之后我想访问容器并启动一个 Azure 命令(它还没有在代码中,因为它在这一步之前失败了)。我得到的错误是:

groovy.lang.MissingMethodException:没有方法 Script1.sh() 的签名适用于参数类型:(Java.lang.String) 值:“docker login -u... 等等”

def dockerImage = 'ourRegistry/deploy/azure'
def output = []
try {    
          sh 'docker login -u="our_robot_user" -p="TOKEN" ourRegistry && docker pull ${dockerImage}'
          dockerRun = docker.image(dockerImage).withRun('--env-file=azure.env')
          dockerRun.inside("-u user") {
                output.push("INSIDE")
                //res = sh(returnStdout: true, script: 'az acr repository show-tags --name xx --subscription "xx" --repository "xx"')
                //output.push(res)
    }
    } catch (error) {
          output.push(error)
    }
return output

甚至可以在 Active Choices 参数中运行它吗?或者我可以导入特定的库来让它工作吗?或者,还有更好的方法?

标签: azuredockerjenkinsgroovy

解决方案


通过遵循下面提到的过程。

仅供参考,这是通过使用“选择参数”来实现的,如下面的屏幕截图所示。

在此处输入图像描述

以下 Jenkins 流水线脚本工作的先决条件是

  1. 将 Azure CLI 安装在运行管道的节点中(即,在本例中的 Jenkins master 中)
  2. 在运行管道的节点中使用“jq”命令行 JSON 处理器(即,在本例中的 Jenkins master 中)
  3. 按照此处的说明将 Azure 服务主体添加到 Jenkins 凭据 -> https://docs.microsoft.com/en-us/azure/jenkins/execute-cli-jenkins-pipeline#add-azure-service-principal-to-jenkins -凭据

请在下面找到 Jenkins 管道脚本。

#!groovy
import groovy.transform.Field
import org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript
def props = []
@Field
def newParams = []
node {
    try {
        regenerateJob = (params.RegenerateJob == null) ? true : params.RegenerateJob
    }
    catch (MissingPropertyException e) {
        regenerateJob = true
    }
    stage('test'){
        withCredentials([azureServicePrincipal('JENKINSSERVICEPRINCIPALCREDENTIALID')]) {
            def shtagsoutput = sh (returnStdout: true, script: '''az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID > /dev/null
            az account set -s $AZURE_SUBSCRIPTION_ID > /dev/null
            shtagsoutputtemp=$(az acr repository show-tags --name "AZURECONTAINERREGISTRYNAME" --subscription $AZURE_SUBSCRIPTION_ID --repository "AZURECONTAINERREGISTRYREPOSITORYNAME" | jq '.[]')
            shtagsoutputtempfinal=$(echo $shtagsoutputtemp | sed 's/"//g')
            echo "${shtagsoutputtempfinal}"''').split(' ')
        shtagsoutputfinal = [shtagsoutput].flatten()
        newParams += [$class: 'ChoiceParameterDefinition', name: 'Phase', choices: shtagsoutputfinal]
        newParams += [$class: 'BooleanParameterDefinition', name: 'RegenerateJob', defaultValue: false]
        props += [$class: 'ParametersDefinitionProperty', parameterDefinitions: newParams]
        properties(properties: props)
        }
    }
}

请注意,创建此 Jenkins 作业时,它没有参数。但是在第一次构建之后,Jenkins 作业会重新生成并使用其新参数进行选择。

干杯!!

问候,克里希纳


推荐阅读