【问题标题】:Best way to configure jenkins job running on different slaves配置在不同从站上运行的詹金斯作业的最佳方法
【发布时间】:2015-04-22 18:36:00
【问题描述】:

我想在 4 个不同的从站(windows、linux、solaris、Mac)上运行 Jenkins 作业。我不想做 4 份不同的工作,而是想做一份工作。我可以使用 Node 参数在不同的从站上执行。我的工作运行一个脚本,该脚本使用 Jenkins 从属工作区和其他一些脚本。我的脚本位于每个从站的不同文件夹中,而其他所需的脚本位于不同的文件夹中。所以现在我为每个从站创建了 4 个不同的作业,并硬编码了 Jenkins 工作区和其他所需的脚本路径。

有什么方法可以让我将所有路径放在一些类似 JSON 的结构中,并根据从站选择这些路径吗?这样我就只有一份工作了。

请建议,提前谢谢!

【问题讨论】:

  • 一份工作的动机是什么?拥有四个名为my-job-windows、my-job-solaris 等的独立作业似乎是个好主意,特别是如果作业仅在一个平台上失败,这样可以更清楚地看到发生了什么。
  • 我有 4 个不同的项目,每个项目有 6 个不同的工作。如果我创建单独的工作,那么我将不得不创建 96 个工作:)
  • 您可以查看矩阵作业wiki.jenkins-ci.org/display/JENKINS/Matrix+Project+Plugin,甚至可以使用作业 dsl wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin 以编程方式编写您的作业

标签: jenkins continuous-integration


【解决方案1】:

我的想法是使用例如“执行系统 ​​Groovy 脚本”来获取从属值,然后使用 if 语句分配正确的路径并创建在环境变量中可见的参数:

import hudson.model.Computer
import hudson.model.StringParameterValue
import hudson.model.ParametersAction

//get slave name
def slaveName = Computer.currentComputer().getNode().name
def path

//choose path
if(slaveName.equals("slave01")){
  path = "C:"
}
if(slaveName.equals("slave02")){
  path = "/root"
}
if(slaveName.equals("slave03")){
  path = "D:"
}

//pass path as env. variable
build.addAction(new ParametersAction(new StringParameterValue('path', path)))

那么你可以在命令中使用变量路径: echo %path% 或使用Conditional BuildStep Plugin为每个操作系统设置可分离的步骤,并控制每个步骤的执行时间

【讨论】:

  • 我想我会尝试一下,看起来对我很有帮助。根据从站,它将选择所有路径,更新/添加/删除所需路径也更容易。我可以添加任意数量的路径,对吧?
  • 知道为什么这对我不起作用吗? def slaveName = Computer.currentComputer().getNode(),给出 NullPointerException。
  • 你把这段代码放在哪里了?我怀疑在詹金斯脚本控制台? (詹金斯/脚本网站)。此脚本应作为“执行系统 ​​Groovy 脚本”中作业的一部分执行
  • 我正在使用 scriptler 插件,我使用上面的代码创建了一个脚本并使用相同的插件在作业中执行它,仍然无法获得正在运行的作业节点。
【解决方案2】:

Jenkins 旨在从版本控制系统(Subversion、Git 等)中检出文件并运行任务。您应该将脚本置于某种形式的版本控制中,并让 Jenkins 在构建过程中检查工作区中的文件,而不是尝试在单独的从属服务器上管理单独的文件。

【讨论】:

  • 是的,我也打算这样做,但即使我把它放在一些版本控制中,也不能解决我的问题。我想避免硬编码脚本。
  • 恐怕我不明白你的问题,也许你可以澄清这个问题。如果脚本文件在版本控制中,那么“硬编码脚本”从何而来?
  • 我在脚本文件中有一些路径是硬编码的。例如,我的脚本是 demo.py,这个脚本运行几个其他脚本,这些脚本位于每个从站的不同文件夹中。因此,现在我在脚本文件中对其进行硬编码。
  • 为什么不把所有的脚本都放到版本控制中呢?
  • 以后如果我需要对我的脚本进行任何更改,我将不得不为所有的奴隶做这件事。维护这些脚本会很困难。
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多