使用Docker的Jenkins Active Choices参数获得Azure标签

时间:2019-01-17 09:50:30

标签: azure docker jenkins groovy

对于部署作业,我想设置一个jenkins作业,该作业从特定的Azure库中接收所有现有标签,并使其可以在Active Choice参数中进行选择。

我尝试了几件事,但没有任何效果。在下面的代码中,您可以看到我尝试使用的最后一个代码。我想拉一个其中包含我们的azure cli和我们的配置的docker容器,此后,我想访问该容器并启动一个azure命令(尚不在代码中,但它会更早失败)。我得到的错误是

groovy.lang.MissingMethodException: No signature of method Script1.sh() is applicable for argument types: (Java.lang.String) values: "docker login -u... and so on"
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

是否甚至可以在主动选择参数中运行它?还是可以导入特定的库来使它正常工作?还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

我已经成功复制了完整的方案(即“设置一个Jenkins作业,该作业从特定的Azure容器注册表存储库中接收所有现有标签,并在我们构建作业时将其用作参数进行选择”的要求)按照以下提到的过程进行操作。

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

enter image description here

以下Jenkins管道脚本正常运行的前提条件是

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

请在下面找到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作业,并使用其新参数进行选择。

干杯!

关于, 克里希纳