54

我有一个相当复杂的 Jenkins 工作,它构建、单元测试和打包一个 Web 应用程序。根据情况,一旦这项工作完成,我想做不同的事情。我还没有找到一种可重用/可维护的方法来做到这一点。真的是这样还​​是我错过了什么?

完成复杂的工作后,我希望拥有的选项:

  1. 没做什么

  2. 开始我的低风险更改构建管道:

    • 将我的 WAR 文件复制到我的工件存储库
    • 部署到生产
  3. 启动我的高风险更改构建管道:

    • 将我的 WAR 文件复制到我的工件存储库
    • 部署到测试
    • 运行验收测试
    • 部署到生产

我还没有找到一个简单的方法来做到这一点。最简单但不易维护的方法是制作三个独立的作业,每个作业都会启动下游构建。这种方法让我害怕有几个原因,包括必须在三个地方而不是一个地方进行更改。此外,许多下游工作也几乎相同。唯一的区别是他们调用了哪些下游作业。工作的激增似乎会导致无法维护的混乱。

我已经研究过使用几种方法将其保留为一项工作,但到目前为止还没有一种方法有效:

  1. 使这项工作成为一个多配置项目(https://wiki.jenkins-ci.org/display/JENKINS/Building+a+matrix+project)。这提供了一种使用参数注入作业的方法。我还没有找到使“构建其他项目”步骤响应参数的方法。

  2. 使用 Parameterized-Trigger 插件 ( https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin )。该插件允许您根据某些触发器触发下游作业。不过,触发器似乎过于严格。它们都基于构建的状态,而不是任意变量。我没有看到此处提供的任何适用于我的用例的选项。

  3. 使用灵活发布插件 ( https://wiki.jenkins-ci.org/display/JENKINS/Flexible+Publish+Plugin )。这个插件与参数化触发器插件有相反的问题。它有许多可以检查的有用条件,但看起来它不能开始构建另一个项目。它的行动仅限于发布类型的活动。

  4. 使用灵活发布 + 任何构建步骤插件 ( https://wiki.jenkins-ci.org/display/JENKINS/Any+Build+Step+Plugin )。Any Build Step 插件允许对 Flexible Publish 插件进行任何构建操作。虽然激活此插件后提供了更多操作,但这些操作不包括“构建其他项目”。

真的没有简单的方法来做到这一点吗?我很惊讶我没有找到它,更惊讶的是我还没有真正看到其他人试图这样做?我在做一些不寻常的事情吗?我有什么明显的遗漏吗?

4

6 回答 6

32

如果我理解正确,您应该可以按照以下步骤执行此操作:

  1. 第一个构建步骤:
    1. 做正常的工作。在您的情况下:Web 应用程序的构建、单元测试和打包
    2. 根据结果​​,让它创建一个具有特定名称的文件。
    3. 这意味着如果您希望之后运行低风险更改,请创建一个文件 low-risk.prop
  2. 第二构建步骤:
    1. 在其他项目上创建触发器/调用构建从 Parameterized-Trigger 插件步骤。
    2. 在Projects to build字段中输入您的低风险工作的名称
    3. 点击:添加参数
    4. 选择:属性文件中的参数
    5. 在“使用来自文件的属性”字段中输入low-risk.prop
    6. 启用如果缺少任何文件则不触发
  3. 第三构建步骤:
    1. 检查是否存在 low-risk.prop 文件
    2. 删除文件

对高风险工作做同样的事情

现在您应该具有以下设置:

  • 如果在第一个构建步骤中出现名为 low-risk.prop 的文件,则将启动低风险作业
  • 如果在第一个构建步骤中出现名为 high-risk.prop 的文件,则将启动高风险作业
  • 如果没有 .prop 文件,则没有任何反应

这就是您想要实现的目标。不是吗?

于 2013-06-05T16:25:23.027 回答
8

你看过条件构建插件吗?( https://wiki.jenkins.io/display/JENKINS/Conditional+BuildStep+Plugin )

我认为它可以做你正在寻找的东西。

于 2012-10-31T18:50:27.320 回答
4

如果你想要一个有条件的后期构建步骤,有一个插件:
https ://wiki.jenkins-ci.org/display/JENKINS/Post+build+task

它将在控制台日志中搜索您指定的 RegEx,如果找到,将执行自定义脚本。您可以配置相当复杂的标准,并且您可以配置多组标准,每组标准执行不同的后期构建任务。

它没有为您提供通常的“构建步骤”操作,因此您必须在那里编写自己的脚本。您可以使用 jenkins 支持的标准方式(例如使用 curl)触发具有不同参数的相同作业或具有某些参数的另一个作业的执行

另一种选择是 Jenkins 文本查找器插件:
https ://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin

这是一个构建后步骤,如果在控制台文本(甚至工作区中的某些文件)中找到 RegEx,则允许强制将构建标记为“不稳定”。因此,在您的构建步骤中,根据您的条件,将唯一行回显到控制台日志中,然后对该行执行 RegEx。然后,您可以使用“触发参数化 buids”并将条件设置为“不稳定”。这有一个额外的好处,可以在视觉上标记不同的构建(用黄色球),但是这种方法只有 1 个条件选项,并且从您的 OP 看来,您需要 2 个。

尝试结合使用以下 2 种方法:

于 2012-11-03T15:10:31.097 回答
1

您使用 Ant 进行构建吗?

如果是这样,可以通过一组环境变量在 ant 中进行条件构建,您的构建脚本可以使用这些环境变量来有条件地构建。在 Jenkins 中,您的构建将构建所有项目,但您的实际构建将决定它是构建还是短路。

于 2012-10-26T17:24:39.827 回答
1

我认为做到这一点的方法是添加一个中间作业,您将其放入构建后步骤并将下游作业可能需要的所有参数传递给它,然后在该作业中为真正的下游作业放置条件构建。

于 2013-09-18T02:17:10.573 回答
0

我发现的最简单的方法是远程触发其他作业,以便您可以使用Conditional Build Plugin或任何其他插件有条件地构建其他作业。

于 2015-11-24T07:52:32.537 回答