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

问题描述 投票:17回答:5

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

例:

  1. Build [* jenkins_job_1 *]:调用参数'A'的ant脚本
  2. Build [* jenkins_job_1 *]:调用参数'B'的ant脚本
  3. 必要时重复
  4. 作业的每个实例同时运行,而不是通过队列运行。

我想这样做的原因是为了避免必须创建几个几乎完全相同的工作,所有工作都需要维护。

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

jenkins
5个回答
31
投票

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

如果你检查这个,那么它将为一个工作启动多个构建。

这适用于“此构建已参数化”复选框。

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


9
投票

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

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


4
投票

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

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

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


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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.