12

我在 Jenkins 中的构建管道分为三个工作:

  1. 构建代码
  2. 将代码部署到环境
  3. 运行自动化功能测试

我已对其进行设置,以便可以发生并发构建,并且如果#2 或#3 当前正在为另一个构建运行,则构建管道将阻止构建进入#2。

我想要做的是设置Jenkins在有多个构建等待并且#2和#3完成时处理,只有最新的构建进入#2和#3。

有没有办法做到这一点?如果你有《持续交付》这本书,我想做的就是实现第 1 页的内容。第 118 页 119

4

3 回答 3

14

应该尝试其中一种,在Advanced Project Options下:

  • 在构建上游项目时阻止构建
    (应确保它不会导致第 2 步和第 3 步卡在队列中)

  • 在构建下游项目时阻止构建
    (我知道这听起来与您的要求相反,
    但实际结果是您将更改累积到单个构建周期,
    防止额外运行)

如果这导致不需要的构建堆积,
请查看以下链接,这些链接应该可以帮助您
清空队列或终止正在运行的作业:

干杯

于 2012-10-11T11:53:29.453 回答
0

“阻止上游”或“阻止下游”的问题是你总是阻止一些可能正在工作的东西。

如果你使用“git”,你可以按照这些思路做一些事情——这恰好是我正在做的事情......

我使用了一个跟踪分支,它指向任何步骤的最近完成的构建作业,命名如下<branch>-latest-<step>:因此,如果您基于 master 运行“构建”步骤,您将获得master-latest-build. 将此分支移至构建脚本的末尾非常容易,只需运行:git branch -f <name> HEAD,然后推送。

然后我让下游作业从该跟踪分支触发。这样,所有作业都是松散耦合的,并且无论上游作业产生什么,都会做正确的事情,而与上游作业当前正在做什么无关。

如果除此之外,您还标记了您的构建,您的下游作业可以检索该标签并将其重新用作构建名称,以便您轻松关联各种运行。

如果管道的步骤长度相差很大,这将非常有效 - 特别是当您的下游步骤比上游步骤花费的时间长得多时,这在我的世界中是常态,因为下游测试包括一整套性能和集成测试。 .

于 2016-04-04T20:38:11.223 回答
0

Workflow 插件可让您将整个管道编写为一个脚本。在这种情况下,该stage步骤可用于控制访问:

stage 'build'
// any number of builds get here
stage name: 'deployAndTest', concurrency: 1
// only the last to build successfully enters here

(出于可视化目的,JENKINS-29892deploy可以让您在和test阶段之间标记边界。)

于 2015-09-16T01:59:16.407 回答