【问题标题】:How can I organize variant building of a parametrized job in Jenkins?如何在 Jenkins 中组织参数化作业的变体构建?
【发布时间】:2017-07-20 02:48:54
【问题描述】:

我有一个参数化作业,它需要一个名称、一个 SVN 存储库和一个共享目录。我需要使用大约 20 组这些参数定期调用这项工作。目前我刚刚创建了 20 个工作,每个工作都称为主要工作。

这是一个非常繁琐的配置,并且会混淆 Jenkins 的主视图。

有没有更好的方法来解决这个问题?我愿意重组工作或使用插件“隐藏”它们。


有关工作的更多详细信息: 我实际上有两种主要工作:

  • 送货作业。我们将应用程序部署到大约 20 个不同的共享目录。这些作业配置为每晚运行一次。 (定期触发构建)
  • 计算作业。这个基于 svn 存储库计算数据并将其存储在共享目录中。这些作业配置为每 15 分钟运行一次。
  • 作业可以并且应该并行运行

我需要/想要什么:

  • 有时需要开发人员手动启动一个(或几个)配置
  • 类似矩阵配置插件的东西可以解决我的问题。如果可以以某种方式将我的参数设置为一个轴,我会很高兴
  • Multijob 将是我的问题的另一个解决方案,不幸的是这个“错误”阻止了我:JENKINS-39678

【问题讨论】:

  • 您在进行部署吗? :) 只有你在运行这 20 种组合吗?您能否制作 1 到 20 个 bash 函数(取决于有多少参数有意义)通过 API 触发(一个)主要 jenkins 作业?
  • 还有什么应该触发不同的工作?它们是手动运行、cron 等运行的吗?
  • 我添加了一些附加信息。 @burnettk 这可能行得通,我担心这会将配置深埋在工作中,并且很难调用一个特定的配置。
  • @Morfic 构建直接从 jenkins 触发:定期触发
  • 根据您能做什么或不能做什么,想到的最简单的想法是保留当前配置,但 change the All view with a custom one 仅显示您的主要工作。或者,您可以用multi-job(或类似管道)替换所有作业,为每个当前作业创建一个阶段。不幸的是,我没有看到执行单个阶段的方法...如果您发现这些方法有任何问题,请查看并告诉我们。

标签: jenkins


【解决方案1】:

不允许发表评论,但@Absurd-Mind,听起来你一开始只想建立一个适合所有人的工作,现在就炸了。当您有大约 20 种不同的设置时,请尝试找到更大的共同基础或将它们完全拆分。

此外,我们也有这样的工作.... 旧的 shell 脚本废话,我的一位同事围绕它构建了一个 multijob 管道,可以并行运行强>。在 MultiJob Phase 下,您可以将 Job 执行设置为并行。

但是要小心,如果它包含像 bower 这样的构建工具,那么你就不能轻易擦除缓存,因为它们共享一个。

【讨论】:

  • 主要作业有大约 100 行 bash 脚本以及多个下游作业。这是共同的部分。 20 个作业之间的区别在于三个字符串:'name'、'svnRepo'、'path'。我看不出如何将这些字符串之一移动到主要工作中。完全拆分它们会重复很多配置,而且似乎不可行。你下半场是指multijob插件吗?
  • 是的,我做到了。好吧,其实差别不大。也许ultijob插件有帮助。我们也只是用不同的参数多次调用另一个作业。
【解决方案2】:

您可以使用 Pipeline 插件并编写 groovy 代码来执行此操作。您可以添加一堆复选框输入参数,为您想要的每组参数添加一个,然后使用该组参数有条件地执行另一个作业。

node: {
   stage ('set1') {
      if(env.build_set1) {
         build job: 'main_job', parameters: [[$class: 'StringParameterValue', name: 'name', value: 'Name1'], [$class: 'StringParameterValue', name: 'directory', value: 'dir1']]
      }
   }

   stage ('set2') {
      if(env.build_set2) {
         build job: 'main_job', parameters: [[$class: 'StringParameterValue', name: 'name', value: 'Name2'], [$class: 'StringParameterValue', name: 'directory', value: 'dir2']]
      }
   }
}

此示例按顺序运行,但您也可以make these jobs run in parallel

【讨论】:

  • 我对这个解决方案有一些担忧:1)我将我的工作配置埋在管道深处,这将变得难以理解/维护 2)参数和“如果”只是松散耦合,检测错误将变得困难 3)很难识别失败的工作 4)重新启动失败的阶段变得不方便(此时我只需要按下重建按钮) 5)错误的处理将变得笨拙(尝试/catch around every stage): stage1 不应该停止 stage2;使用矩阵配置插件会更好,但是管道没有意义......
  • 我理解#1,它的代码,你必须深入研究配置,尽管你可以重构所有作业都在对象列表的顶部声明,并且丑陋的东西进入一个带有错误处理的循环.不知道为什么很难识别失败的工作,因为每个阶段的状态和日志输出都清楚地显示。至于#4,您可以在每个阶段之前使用checkpoint,这样您就可以通过单击按钮再次运行该特定阶段......不幸的是,它似乎是only available in the enterprise version
  • 我不知道您可以有并行阶段。仍然无法在某个特定阶段启动管道是一件很糟糕的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多