首页 > 解决方案 > 迁移多分支管道而不重建所有分支

问题描述

我继承了一个真正古老的 Jenkins 服务器,它需要从操作系统上进行重建,而我正处于迁移我们构建的地步。然而,有一个多分支管道,特别是具有数十个功能/错误修复/等分支和构建需要大量时间和资源。当我最初在测试集群上设置它的多分支管道时,所有分支的初始构建都垄断了所有资源几个小时,直到我杀死它们。

我想要发生的是所有分支最初都导入但直到分支有另一个推送或 PR时才构建。目前我已经应用了定义的“抑制自动 SCM 触发”策略,但是一旦我删除它,Jenkins 就会尝试构建所有分支。

我认为可能是一个可行的解决方案是将每个分支的状态设置为“未构建”以外的状态,然后删除抑制策略。

我遇到了下面的 Groovy 脚本,该脚本将更改特定构建的结果,但似乎需要实际上有以前的构建来更改其状态。

import com.cloudbees.groovy.cps.NonCPS
import jenkins.model.*
import hudson.model.Result

@NonCPS
def getProject(projectName) {
    // CloudBees folder plugin is supported, you can use natural paths:
    // in a postbuild action use `manager.hudson`
    // in the script web console use `Jenkins.instance`
    def project = jenkins.model.Jenkins.instance.getItemByFullName(projectName)
    if (!project) {error("Project not found: $projectName")}
    return project
}

project = getProject('foo/bar')
build = project.getBuildByNumber(2443)
// build = project.getBuild(project, '2443')

build.@result = hudson.model.Result.SUCCESS
// build.@result = hudson.model.Result.NOT_BUILT
// build.@result = hudson.model.Result.UNSTABLE
// build.@result = hudson.model.Result.FAILURE
// build.@result = hudson.model.Result.ABORTED

来源:https ://stackoverflow.com/a/45708131/1064767

有没有办法改变项目本身的状态,或者有办法创建一个具有特定状态的“虚拟”构建?

标签: jenkinsjenkins-pipelinejenkins-groovy

解决方案


注意:如果您只想要工作而不关心构建历史,那么Job Import 插件可能更适合您的用例。

我在最后一天的大部分时间都在挖掘 Jenkins 源代码并打扰社区,但似乎没有一个好的方法来模拟这样的构建结果。但是,从技术上讲,可以简单地克隆全部或部分内容,/var/jenkins_home/jobs从而将整个作业配置和历史记录全部提取出来。之后,您只需要重新启动 Jenkins,它就会识别新的配置。

虽然 Jenkins 社区中的一些人会正确地尝试警告您不要像这样克隆数据,但如果您在没有其他选择的情况下陷入困境,它可以在遵循以下警告的情况下工作:

  1. 首先在测试服务器上执行此操作。我不能保证我的经验是普遍的,结果可能会因您的特定构建和插件而有很大差异。
  2. 您的旧版本可能会引用您可能未在新服务器上安装的插件,或不同版本的插件。根据我的经验,詹金斯提出了关于这些的“旧数据”通知,并安装缺少的插件并重新启动修复了这些。也可以选择简单地丢弃数据。

推荐阅读