如何通过Jenkins API存储并跨作业检索构建动态数据?
嘿,这个需求我之前刚好折腾过,给你几个实用的方案,从你提到的archiveArtifacts延伸,还有更贴合你API调用需求的方式:
方案1:基于archiveArtifacts+自定义JSON文件实现
这是你思路的具体落地,操作简单直接,完全符合Jenkins原生生态:
- 存储数据:在构建流水线里,把动态数据写入一个JSON文件,再用
archiveArtifacts归档到当前构建的资源目录。示例Pipeline代码:
// 假设你从测试步骤拿到了覆盖率数值 def coverageValue = 50.24 // 写入JSON文件 writeFile file: 'build-metrics.json', text: """{"code-coverage":"${coverageValue}"}""" // 归档文件,开启指纹便于追踪 archiveArtifacts artifacts: 'build-metrics.json', fingerprint: true
每个构建都会独立保存这个文件,不会互相覆盖。
- 检索数据:
- 在另一个Pipeline作业中获取:用
copyArtifacts拉取目标构建的归档文件,再读取解析:
// 拉取myjob第123次构建的metrics文件 copyArtifacts projectName: 'myjob', selector: specific('123'), filter: 'build-metrics.json' // 解析JSON并使用数据 def buildMetrics = readJSON file: 'build-metrics.json' echo "目标构建的代码覆盖率:${buildMetrics['code-coverage']}"- 通过API直接获取:直接请求构建的归档文件URL即可拿到原始JSON:
http://localhost:8080/job/myjob/123/artifact/build-metrics.json
如果想要你描述的/api/json?code-coverage这种简洁格式,可以写个Groovy脚本扩展Jenkins API,自定义端点来返回指定字段。
- 在另一个Pipeline作业中获取:用
方案2:用构建描述/自定义参数实现(更贴合API检索)
如果想要更接近你设想的API请求方式,还可以把数据存在构建的元数据里:
- 存储数据:
def coverageValue = 50.24 // 方式A:写入构建描述(支持简单HTML格式化) currentBuild.description = """<strong>code-coverage:</strong> ${coverageValue}""" // 方式B:设置自定义构建参数(需提前在作业配置中添加字符串参数CODE_COVERAGE) currentBuild.buildVariables.put('CODE_COVERAGE', coverageValue.toString()) - 检索数据:通过Jenkins原生API直接获取:
- 获取构建描述:
http://localhost:8080/job/myjob/123/api/json?tree=description - 获取构建参数:
http://localhost:8080/job/myjob/123/api/json?tree=actions[parameters[name,value]]
要是想定制成/api/json?code-coverage的格式,也可以通过Jenkins的脚本控制台或者插件自定义API路由,解析请求参数后返回对应数据。
- 获取构建描述:
方案3:专用插件实现(进阶持久化)
如果数据需要跨作业共享、长期存储,或者有更复杂的检索需求,可以用专门的插件:
Pipeline Utility Steps:就是我们前面用到readJSON/writeFile的插件,还支持更多数据格式的读写和处理;Build Data Storage:可以把构建数据存储到外部数据库,提供更灵活的查询API;Promoted Builds Plugin:如果需要标记特定构建的关键数据,这个插件也能帮你把数据关联到构建的晋升状态中。
内容的提问来源于stack exchange,提问作者satyajit
相关产品推荐
相关产品推荐

