azure - 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 参数中运行它吗?或者我可以导入特定的库来让它工作吗?或者,还有更好的方法?
解决方案
通过遵循下面提到的过程。
仅供参考,这是通过使用“选择参数”来实现的,如下面的屏幕截图所示。
以下 Jenkins 流水线脚本工作的先决条件是
- 将 Azure CLI 安装在运行管道的节点中(即,在本例中的 Jenkins master 中)
- 在运行管道的节点中使用“jq”命令行 JSON 处理器(即,在本例中的 Jenkins master 中)
- 按照此处的说明将 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 作业会重新生成并使用其新参数进行选择。
干杯!!
问候,克里希纳
推荐阅读
- javascript - 词频函数,如果有超过1个最常用的词如何返回?
- r - ggplot2中标签中的数字格式?
- asp.net-mvc - 如何集成谷歌分析以计算访问者对我的特定项目
- python - Django 使用日期时间对象设置 models.DateField()
- python - 错误:buildozer 中的“aidl 无法执行”
- git - 为什么每次我尝试在 Git 中切换分支时,“local-change-overwrite”错误中都会包含 .gitignore 文件?
- python - 如何使用 python 从网站获取所有 url 的列表?
- reactjs - GatsbyJS 背景图片使用 ACF & WordPress
- ruby-on-rails - 在Rails中使用Bootstrap格式化复选框形成erb?
- .net-core - .Net Framework 中等效的 HashCode