Jenkins - 同时运行单个构建的实例

24

我希望能够同时运行同一个 Jenkins 工作的几个构建。

示例:

  1. 构建 [*jenkins_job_1*]:使用参数'A' 调用 ant 脚本
  2. 构建 [*jenkins_job_1*]:使用参数'B' 调用 ant 脚本
  3. 按需重复
  4. 每个工作实例都可以同时运行,而不是通过队列。

我想这么做的原因是避免创建几乎相同的多个工作,这些工作都需要进行维护。

是否有一种方法来实现这一点,或者另一个解决方案(例如——从基础工作动态创建工作并在完成后删除它)?

6个回答

38

Jenkins有一个复选框:“必要时执行并发构建”。

如果您选择了这个选项,它将为作业启动多个构建。

这可以与“此构建具有参数”复选框一起使用。

您仍然需要触发构建并传递您的AB参数。 您可以使用另一个作业来触发它们,或者您可以通过脚本手动完成。


1
在版本2.204.2中,_取消勾选_标记为“不允许并发构建”的复选框。 - JellicleCat
我喜欢它们改变事物的名称。 - docwhat

10

您可以在创建作业时选择构建多配置项目(矩阵构建)。然后,在作业的配置下,您可以定义配置矩阵,以便为不同的构建指定一个或多个参数(轴)。关于同时运行,您应该能够运行与执行器数量相同的并行构建(使用适当的标签)。

不幸的是,Jenkins Wiki缺少此设置的文档。有几个之前的SO问题,这里这里可能提供一些指导。有一篇“最近”的博客文章介绍了如何设置多配置作业以在各种平台上执行构建。


上面提到的博客文章很有帮助。 - Ripon Al Wasim

4
一个更新(并更好)的解决方案是Jenkins Job DSL插件。我们一直在使用它并取得了巨大的成功。我们的工作配置现在是可以被丢弃的...只需要从几个Groovy文件和一些模板工作中设置一堆复杂的工作。这很棒。我喜欢它比复杂且难以理解的矩阵构建更多。

请问如何在Job DSL中实现“必要时执行并发构建”? - David Schumann

1

您可以使用Jenkins pipeline DSL来实现此操作。

我们有相同的流水线并行运行,以模拟应用程序的组合负载,该应用程序公开 Web 服务,为多个外部应用程序提供数据库,通过多个工作队列接收数据,并具有 GUI 前端。业务部门向我们提供非功能性要求(NFR),我们的应用程序必须满足这些要求,以确保其响应能力在繁忙时期也不受影响。

流水线的不同实例是使用不同参数运行的。第一个实例可能是WS_Load,第二个是GUI_Load,第三个是Daily_Update_Load,模拟需要在一定时间范围内处理的大型数据队列。根据我们想要测试的负载组合,可以添加更多实例。

其他答案已经谈到了并发构建的复选框,但我想提到另一个问题:资源争用。

如果你的流水线在流水线阶段之间使用临时文件或stash文件,那么实例最终可能会相互影响。例如,当另一个实例期望找到同一stash的预覆盖版本时,你可能会在一个并发实例中覆盖一个文件。我们使用以下代码来确保每个并发实例的stash和临时文件名都是唯一的:
    def concurrentStash(stashName, String includes) {
        /* make a stash unique to this pipeline and build
           that can be unstashed using concurrentUnstash() */
        echo "Safe stashing $includes in ${concurrentSafeName(stashName)}..."
        stash name: concurrentSafeName(stashName), includes: includes
    }
  
    def concurrentSafeName(name) {
        /* make a name or name component unique to this pipeline and build
         * guards against contention caused by two or more builds from the same
         * Jenkinsfile trying to:
         *   - read/write/delete the same file
         *   - stash/unstash under the same name
         */
        "${name}-${BUILD_NUMBER}-${JOB_NAME}"
    }
  
    def concurrentUnstash(stashName) {
        echo "Safe unstashing ${concurrentSafeName(stashName)}..."
        unstash name: concurrentSafeName(stashName)
    }

我们可以使用concurrentStash stashNameconcurrentUnstash stashName,并且并发实例将没有冲突。
例如,如果两个流水线都需要存储统计信息,我们可以为文件名做如下设置:
def statsDir = concurrentSafeName('stats')

然后每个实例将使用唯一的文件名来存储其输出。


0

您可以创建并配置构建参数。勾选此构建具有参数复选框,并在构建的配置中添加所需的参数。然后,您可以使用不同的参数同时启动构建。

顺带一提:Jenkins中的“批量生成器”可能会将其推入队列中,但也有一个此批次生成具有参数复选框。


3
之前我尝试过同时运行它们,但没成功。后来回头看到了一个之前没注意到的“必要时执行并发构建”的选项,然后就成功了。 - qpi
1
@qpi:在勾选“必要时执行并发构建”复选框后,它应该按照您的要求工作。 - Ripon Al Wasim
这会为每个作业的运行构建创建不同的工作空间吗?还是该作业只有一个工作空间。请告诉我在同时运行并发构建的情况下如何管理工作空间。 - thinkingmonster

0

我有一个相当大的构建队列,我执行了以下步骤在Jenkins中并行运行作业,以减少等待队列中的作业数量

  1. 对于每个作业,您需要导航到配置并选择复选框,指示“必要时执行并发构建”
  2. 导航到管理 -> 配置系统 -> 查找“执行器数量”,并设置您想要的并行执行器数量(在我的情况下,它设置为0,我将其更新为2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接