当前位置: 首页 > 面试题库 >

通过groovy作业复制Jenkins Multijob作业及其所有下游作业

鱼征
2023-03-14
问题内容

我正在尝试编写一个Jenkins作业(例如CopyJob),该作业将复制另一个作业(在此作业中使用Multijob插件),并且还将其所有下游作业复制到新作业中。想法是要有一个Multijob作为模板,以便可以将其复制到新的Multijobs中(例如,用于特定的分支或功能)。

看到:

MultiJob_Template
   |
   +-- Sub1_Template
   +-- Sub2_Template
   +-- Sub3_Template

CopyJob (Parameters: NewSuffix)

当手动触发“ CopyJob”时,它将使用新的SubJobs创建一个新的MultiJob:

MultiJob_BranchXYZ
   |
   +-- Sub1_BranchXYZ
   +-- Sub2_BranchXYZ
   +-- Sub3_BranchXYZ

到目前为止,我已经成功复制了Multijob和Copying
Subjobs,但是我找不到找到使新的Multijob真正依赖于新的Subjobs的方法。到目前为止,我的代码(用于CopyJob groovy脚本)是:

import jenkins.model.*
import com.tikal.jenkins.plugins.multijob.*

def templateJobName = "MultiJob_Template"

// Retrieve parameters 
def newSfx = build.buildVariableResolver.resolve("NewSuffix")
def templateJob = Jenkins.instance.getJob(templateJobName)

// copy Multijob
def newJob = Jenkins.instance.copy(templateJob, 'Multijob_' + newSfx)
newJob.save()

// copy all downstreamjobs
def subs = newJob.getDownstreamProjects()
for (s in subs) {
  def oldSubJob = Jenkins.instance.getJob(s.getDisplayName())
  def newSubJob = Jenkins.instance.copy(oldSubJob, s.getDisplayName().replaceFirst(/Template/, newSfx))
  newSubJob.save()

  // how to update the MultiJob_newSfx DownstreamJoblist to use the newSubJob?
  // ????
}

问题答案:

我实际上设法自己解决了。也许还有其他方法,但是最好逐步浏览构建器列表,然后逐步浏览MultiJob模板的PhaseJobs列表。

MultiJob插件本身的代码为该解决方案提供了帮助。

import jenkins.model.*
import com.tikal.jenkins.plugins.multijob.*

def jenkinsInstance = jenkins.model.Jenkins.instance 
def templateJobName = "Multijob_Template"

// Retrieve parameters
def newSfx = build.buildVariableResolver.resolve("NewSuffix")

// create new MultiJob
def templateJob = Jenkins.instance.getJob(templateJobName)
def newJob = Jenkins.instance.copy(templateJob, 'Multijob_' + newSfx)
newJob.save()

// get MultiJob BuildPhases and clone each PhaseJob
def builders = newJob.getBuilders()
builders.each { builder ->
    builder.getPhaseJobs().each() { pj ->
      println "cloning phasejob: " + pj.getJobName()

      def subTemplate = Jenkins.instance.getJob(pj.getJobName())
      def newSubJob = Jenkins.instance.copy(subTemplate, pj.getJobName().replaceFirst(/Template/, newSfx))
      newSubJob.save()
      pj.setJobName(newSubJob.getDisplayName())
    }
}

// update dependencies
jenkinsInstance.rebuildDependencyGraph()


 类似资料:
  • 问题内容: 我正在使用詹金斯。 詹金斯(Jenkins)有上游工作:A 詹金斯(Jenkins)有下游工作:B A的控制台日志输出为: B的控制台日志输出为: 我想要得到的是: 有什么办法,我可以在作业A的控制台日志中获取作业B的控制台输出,然后确定作业“ A”是否成功(使用日志解析/ grep表示故障/错误等关键字)。 问题答案: 不确定您要达到的目标,但是看起来有些人为。查看以下方法是否满足您

  • 我不太确定该怎么写,但我有一个名为的工作,它使用CloudConvert将上传的文件(例如PDF)转换为JPG。 单独使用,效果很好。我可以上传一个文件,它将被保存到S3,然后CloudConvert获取S3文件,转换它并上传它。完美。 有人知道我可以尝试什么吗?我甚至不确定从哪里开始调试它。

  • Jenkins场景详细信息: ====================== -Jenkins中构建执行器的数量(在主/从上):3 -UpStream作业:USJobs,此作业可以在任何构建执行器上运行 -DownStream作业:DSJobs USJob在构建步骤中有这个:回声“生日快乐詹姆斯”,完成这项工作需要5秒钟 DSJob在构建步骤中有这个:回显“詹姆斯邦德死了”,完成这项工作 需要5秒钟

  • 问题内容: 我要完成的工作是从分支中签出代码,将其合并到分支,构建,运行测试,如果测试成功则推送到分支。 测试应在需要的单独工作中运行。 我当前的设置如下: Job 从中检出,将其合并并构建 作业会在“ 后期制作”步骤中 触发作业(需要预先创建) 如果成功,则在 发布构建操作中推送到分支 __ 我尝试使用 Copy Artifact Plugin, 但是问题在于,在 Post构建步骤中 触发时,我

  • 问题内容: 我有一个名为 buildall 的管道作业,如下所示: 该 buildall 作业有25个参数。我想将所有 buildall 的参数传递给 job1 。有没有一种简单的方法可以代替手动指定每个参数呢? 在此问题中:向下游作业传递管道参数是一个子问题,但从未得到回答: 甚至更好的是,有没有一种麻烦的方法可以将所有管道参数传递给下游作业。 我有同样的问题。 问题答案: 以下似乎有效(尽管我

  • 问题内容: 我正在使用Jenkins DSL插件自动为git项目的所有分支创建构建作业。DSL插件由Web挂钩触发,以便在创建新分支后立即运行。每个分支生成的生成作业也被配置为由Web挂钩触发。 当前设置的问题是,仅在第二次提交后才执行构建。第一次提交将触发Jenkins DSL插件来创建相应的Jenkins作业,然后第二次提交将触发新创建的作业。 有什么方法可以通过DSL插件创建Jenkins作