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

时间:2011-05-27 13:58:01

标签: jenkins

我希望能够同时运行同一个Jenkins作业的多个版本。

示例:

  1. 构建[* jenkins_job_1 *]:使用参数“A”
  2. 调用ant脚本
  3. 构建[* jenkins_job_1 *]:使用参数“B”
  4. 调用ant脚本
  5. 根据需要重复
  6. 作业的每个实例同时运行,而不是通过队列运行。
  7. 我想这样做的原因是为了避免创建几个几乎完全相同的工作,所有工作都需要维护。

    有没有办法做到这一点,或者可能是另一种解决方案(即 - 从基础作业动态创建作业并在完成后将其删除)?

5 个答案:

答案 0 :(得分:31)

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

如果你检查一下,那么它将为作业开始多个构建。

这适用于“此版本已参数化”复选框。

您仍会触发构建,并将AB作为参数传递。您可以使用其他作业来触发它们,也可以通过脚本手动执行。

答案 1 :(得分:9)

您可以在创建作业时选择构建多配置项目(Matrix构建)。然后,在作业的配置下,您可以定义配置矩阵,它允许您为不同的构建指定一个或多个参数(轴)。关于同时运行,您应该能够运行与执行程序一样多的同时构建(具有适当的标签)。

不幸的是,Jenkins wiki缺少有关此设置的文档。之前的几个SO问题herehere可能会提供一些指导。有一个关于设置多配置作业以在各种平台上执行构建的“最近”blog post

答案 2 :(得分:4)

更新(更好)的解决方案是Jenkins Job DSL Plugin

我们一直在使用它取得了巨大的成功。我们的工作配置现在是一次性的......我们可以从一些常规文件和几个模板工作中设置大量复杂的工作。太棒了。

我比矩阵构建更喜欢它,这很复杂,也很难理解。

答案 3 :(得分:1)

没有什么能阻止你使用Jenkins pipeline DSL

我们有相同的管道并行运行,以便为公开Web服务的应用程序建模组合负载,为多个外部应用程序提供数据库,通过多个工作队列接收数据并具有GUI前端。该业务为我们提供了非功能性需求(NFR),我们的应用程序必须满足这些要求即使在繁忙时期也能保证其响应能力。

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

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

如果您的管道在管道阶段之间使用临时文件或stashes文件,那么实例最终可能会从其他管道中拉出地毯。脚。例如,在尝试读取另一个文件时,最终可以删除一个并发实例中的文件。我们使用以下代码来确保每个并发实例的存储和临时文件名是唯一的:

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')

然后实例将使用唯一的文件名来存储它们的输出。

答案 4 :(得分:0)

您可以创建构建并使用参数对其进行配置。单击This build is parameterized复选框,然后在构建配置中添加所需的参数。然后,您可以使用不同的参数触发同步构建。

旁注:Jenkins中的“Bulk Builder”可能会将其推入队列,但还有一个This bulk build is parameterized复选框。