如何将Jenkins多流水线构建历史从旧分支迁移至新分支?
Jenkins 多流水线构建历史从旧分支迁移至新分支的解决方案
由于你的场景是同一Jenkins服务器、同一任务下的分支迁移,且依赖CurrentBuild.number生成包,直接修改Jenkins的构建元数据是最直接的方案,以下是两种可行方法:
方法一:直接修改Jenkins文件系统中的构建记录
Jenkins的构建历史存储在文件系统中,你可以直接修改相关文件来迁移分支关联:
- 先停止Jenkins服务,防止操作过程中出现数据写入冲突
- 定位到目标任务的存储目录:
$JENKINS_HOME/jobs/<你的任务名>/builds- 每个编号文件夹(如
1/、2/)对应一次构建,进入目标构建的文件夹,编辑build.xml:- 找到与分支相关的节点(比如
<actions>下的hudson.plugins.git.util.BuildData),将旧分支名替换为新分支名
- 找到与分支相关的节点(比如
- 如果任务目录下存在
branches/文件夹,复制或重命名其中的旧分支文件夹为新分支名,同步内部的构建关联记录
- 每个编号文件夹(如
- 修改
$JENKINS_HOME/jobs/<你的任务名>/nextBuildNumber文件,将数值设置为旧分支最后一次构建的编号+1,确保新分支构建编号延续 - 重启Jenkins,验证新分支的构建历史是否正常显示
方法二:通过Jenkins脚本控制台批量修改
使用Groovy脚本在Jenkins脚本控制台(http://<你的Jenkins地址>/script)批量修改构建的分支关联:
// 替换为你的任务名称、旧分支名、新分支名 def jobName = "你的任务名" def oldBranch = "旧分支名" def newBranch = "新分支名" def job = Jenkins.instance.getItem(jobName) if (!job) { println "任务不存在" return } // 遍历所有构建,修改分支关联 job.getBuilds().each { build -> def buildData = build.getAction(hudson.plugins.git.util.BuildData.class) if (buildData != null) { def branches = buildData.getLastBuiltRevision().getBranches() branches.each { branch -> if (branch.getName() == oldBranch) { branch.setName(newBranch) println "修改构建 ${build.number} 的分支为 ${newBranch}" build.save() } } } } // 更新下一个构建编号,延续旧分支的序列 job.nextBuildNumber = job.getLastBuild().number + 1 job.save() println "已更新下一个构建编号为 ${job.nextBuildNumber}"
注意事项
- 操作前务必备份
$JENKINS_HOME目录,避免数据损坏 - 若使用流水线任务,需确认构建记录中与Jenkinsfile相关的分支标识也已同步修改
- 建议先在测试环境验证方案,再应用到生产环境
内容的提问来源于stack exchange,提问作者Solid Snake
相关产品推荐
相关产品推荐

