如何用Bitbucket的JSON文件动态填充Jenkins流水线选择框?
实现Jenkins流水线动态加载Bitbucket分支的JSON文件选择框
核心思路
通过Bitbucket API拉取指定分支下的所有JSON文件路径,将其整理为选项后传入Jenkins流水线的input步骤,实现交互式选择。
步骤1:准备Bitbucket认证凭证
在Jenkins中添加字符串凭证,存储Bitbucket的个人访问令牌(PAT),要求该令牌拥有目标仓库的读权限。
步骤2:流水线示例脚本(Bitbucket Cloud)
pipeline { agent any environment { // 替换为你的Bitbucket工作区、仓库名 BITBUCKET_WORKSPACE = "your-workspace" BITBUCKET_REPO = "your-repo-name" // 从Jenkins凭证中获取PAT(替换为你的凭证ID) BITBUCKET_PAT = credentials('bitbucket-pat-credential-id') TARGET_BRANCH = "develop" } stages { stage('获取JSON文件列表') { steps { script { // 调用Bitbucket Cloud API获取分支下所有文件(递归) def apiUrl = "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_WORKSPACE}/${BITBUCKET_REPO}/src/${TARGET_BRANCH}/?format=json&pagelen=100" def response = sh( script: "curl -s -u '${BITBUCKET_PAT}:' '${apiUrl}'", returnStdout: true ) // 解析JSON,过滤出后缀为.json的文件路径 def files = new groovy.json.JsonSlurper().parseText(response).values def jsonFiles = files.findAll { it.type == 'file' && it.path.endsWith('.json') }.collect { it.path } // 无JSON文件时终止流水线 if (jsonFiles.isEmpty()) { error("develop分支下未找到任何JSON文件") } // 存储文件列表到环境变量 env.JSON_FILE_OPTIONS = jsonFiles.join('\n') } } } stage('选择目标JSON文件') { steps { script { // 生成选择框供执行者选择 def selectedFile = input( message: '请选择要处理的JSON文件', parameters: [ choice( name: 'TARGET_JSON_FILE', choices: env.JSON_FILE_OPTIONS, description: 'develop分支下的JSON文件列表' ) ] ) // 保存选中的文件路径到环境变量 env.SELECTED_JSON_FILE = selectedFile } } } stage('处理选中的JSON文件') { steps { echo "开始处理文件: ${env.SELECTED_JSON_FILE}" // 示例:拉取选中的JSON文件到Jenkins工作区 sh "curl -s -u '${BITBUCKET_PAT}:' 'https://api.bitbucket.org/2.0/repositories/${BITBUCKET_WORKSPACE}/${BITBUCKET_REPO}/src/${TARGET_BRANCH}/${env.SELECTED_JSON_FILE}' > ./selected-file.json" sh "cat ./selected-file.json" // 此处添加你的业务处理逻辑 } } } }
针对Bitbucket Server(数据中心/服务器)的调整
如果使用Bitbucket Server,API端点不同,替换获取JSON文件列表阶段的代码:
script { def apiUrl = "http://your-bitbucket-server/rest/api/1.0/projects/${BITBUCKET_PROJECT}/repos/${BITBUCKET_REPO}/files?at=${TARGET_BRANCH}&recursive=true" def response = sh( script: "curl -s -u '${BITBUCKET_USER}:${BITBUCKET_PAT}' '${apiUrl}'", returnStdout: true ) def files = new groovy.json.JsonSlurper().parseText(response).values def jsonFiles = files.findAll { it.type == 'FILE' && it.path.endsWith('.json') }.collect { it.path } if (jsonFiles.isEmpty()) { error("develop分支下未找到任何JSON文件") } env.JSON_FILE_OPTIONS = jsonFiles.join('\n') }
需替换为你的Bitbucket Server地址、项目键、用户名及凭证,确保API权限正确。
关键注意事项
- 分页处理:若JSON文件超过100个,需添加分页循环逻辑(示例中
pagelen=100为单页最大数量)。 - 网络权限:确保Jenkins服务器能访问Bitbucket API端点。
- 分支校验:可添加前置步骤验证develop分支是否存在,避免无效请求。
内容的提问来源于stack exchange,提问作者Mori Kuldip
相关产品推荐
相关产品推荐

