You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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}"
      }
    }
    // 后续部署等阶段...
  }
}

二、自由风格项目实现方案

  1. 新建/编辑自由风格项目,进入「参数化构建过程」,添加「Active Choice Parameter」。
  2. 设置参数名称、描述,选择单选/多选类型。
  3. 在「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
  • 凭据安全:务必通过Jenkins凭据库存储Artifactory的用户名/密码或API密钥,禁止硬编码。
  • 错误处理:可在脚本中添加try-catch块,捕获API请求异常,返回友好提示。
  • 版本排序:示例中加入了语义化版本排序逻辑,可根据需求调整或移除。

内容的提问来源于stack exchange,提问作者michael l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:22:47