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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:22:02