如何用Active Choice插件实现Jenkins选择参数动态加载Artifacts版本
实现Jenkins选择参数从Artifactory API实时加载版本选项
前置准备
- 安装Jenkins的Active Choice Parameter插件,同时建议安装Credentials Binding插件用于安全存储Artifactory的访问凭据,避免硬编码敏感信息。
- 确保Jenkins服务器/构建节点能正常访问你的Artifactory实例API地址。
一、流水线(Jenkinsfile)实现方案
直接在Jenkinsfile中定义activeChoice参数,通过Groovy脚本调用Artifactory API并解析版本列表,每次触发流水线时都会实时拉取最新版本:
pipeline { agent any parameters { activeChoice( choiceType: 'SINGLE_SELECT', // 可选SINGLE_SELECT/MULTI_SELECT description: '选择要部署的制品版本(实时从Artifactory获取)', name: 'ARTIFACT_VERSION', script: { script(''' // 导入JSON解析工具 import groovy.json.JsonSlurper import hudson.util.Secret // 从Jenkins凭据库获取Artifactory访问凭据(提前创建凭据,ID设为artifactory_access) def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials( com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class, Jenkins.instance, null, null ).find { it.id == 'artifactory_access' } def authHeader = "Basic " + "${creds.username}:${Secret.toString(creds.password)}".bytes.encodeBase64().toString() // 替换为你的Artifactory API地址,这里以查询特定制品的所有版本为例 // 若查询仓库目录下的版本文件夹,可改用/api/storage/{repo}/{path}?list&deep=1 def apiUrl = "https://your-artifactory-domain/artifactory/api/search/versions?g=com.your.group&a=your-artifact&repos=your-repo" def conn = new URL(apiUrl).openConnection() conn.setRequestProperty("Authorization", authHeader) conn.setRequestMethod("GET") // 处理API响应,提取版本号 def responseText = conn.content.text def jsonData = new JsonSlurper().parseText(responseText) def versionList = jsonData.versions.collect { it.version }.unique().sort { a, b -> // 按语义化版本排序,可选 def aParts = a.split(/\./).collect { it.toInteger() } def bParts = b.split(/\./).collect { it.toInteger() } aParts <=> bParts } // 若API请求失败,返回默认选项 return versionList ?: ["无可用版本"] ''') } ) } stages { stage('验证参数') { steps { echo "选择的版本: ${params.ARTIFACT_VERSION}" } } // 后续部署等阶段... } }
二、自由风格项目实现方案
- 新建/编辑自由风格项目,进入「参数化构建过程」,添加「Active Choice Parameter」。
- 设置参数名称、描述,选择单选/多选类型。
- 在「Script」区域填入Groovy脚本(逻辑和流水线版本类似,可简化凭据获取:若已绑定凭据到环境变量,直接用
${ARTIFACTORY_USER}和${ARTIFACTORY_PWD}):
import groovy.json.JsonSlurper def authHeader = "Basic " + "${ARTIFACTORY_USER}:${ARTIFACTORY_PWD}".bytes.encodeBase64().toString() def apiUrl = "https://your-artifactory-domain/artifactory/api/storage/your-repo/your-artifact-path?list&deep=1" def conn = new URL(apiUrl).openConnection() conn.setRequestProperty("Authorization", authHeader) def json = new JsonSlurper().parse(conn.content) // 提取目录中的版本号(假设版本是子目录名) def versions = json.children.findAll { it.folder }.collect { it.uri.replace('/', '') }.unique().sort() return versions ?: ["无可用版本"]
关键注意事项
- API路径适配:根据你的Artifactory制品存储结构选择对应API:
- 查询Maven制品版本:用
/api/search/versions?g={groupId}&a={artifactId}&repos={repo} - 查询仓库目录下的版本文件夹:用
/api/storage/{repo}/{path}?list&deep=1
- 查询Maven制品版本:用
- 凭据安全:务必通过Jenkins凭据库存储Artifactory的用户名/密码或API密钥,禁止硬编码。
- 错误处理:可在脚本中添加try-catch块,捕获API请求异常,返回友好提示。
- 版本排序:示例中加入了语义化版本排序逻辑,可根据需求调整或移除。
内容的提问来源于stack exchange,提问作者michael l
相关产品推荐
相关产品推荐

