Jenkins-单个构建的并行运行实例

| 我希望能够同时运行同一詹金斯工作的多个版本。 例: 构建[* jenkins_job_1 *]:使用参数\'A \'调用一个蚂蚁脚本 构建[* jenkins_job_1 *]:使用参数\'B \'调用一个蚂蚁脚本 根据需要重复 作业的每个实例同时运行,而不是通过队列运行。 我这样做的原因是避免必须创建几乎相同的几个作业,而所有这些作业都需要维护。 有没有办法做到这一点,或者有其他解决方案(例如,从基本作业中动态创建一个作业,并在完成后将其删除)?     
已邀请:
        詹金斯(Jenkins)有一个复选框:“必要时执行并发构建” 如果选中此选项,它将为一个作业启动多个构建。 可以与“此构建已参数化”复选框一起使用。 您仍然会触发构建,将
A
B
作为参数传递。您可以使用其他作业来触发它们,也可以通过脚本手动执行。     
        创建作业时,可以选择“构建多配置项目”(矩阵构建)。然后,在作业的配置下,您可以定义配置矩阵,该矩阵可让您为不同的版本指定一个或多个参数(轴)。关于同时运行,您应该能够运行与执行者一样多的同时构建(带有适当的标签)。 不幸的是,Jenkins Wiki缺少有关此设置的文档。在此处和此处,有几个以前的SO问题可能会提供一些指导。有一篇“最近的”博客文章,介绍了设置多配置作业以在各种平台上执行构建。     
        Jenkins Job DSL插件是更新(更好)的解决方案。 我们一直在成功使用它。现在,我们的工作配置是一次性的...我们可以从一些常规文件和几个模板工作中建立大量的复杂工作。这很棒。 我更喜欢它而不是矩阵构建,矩阵构建复杂且难以理解。     
        使用Jenkins管道DSL可以阻止您这样做。 我们具有并行运行的同一管道,以便为公开Web服务,为多个外部应用程序提供数据库,通过多个工作队列接收数据以及具有GUI前端的应用程序的组合负载建模。该业务为我们提供了我们的应用程序必须满足的非功能性要求(NFR),即使在繁忙的时候也能保证其响应能力。 管道的不同实例使用不同的参数运行。第一个实例可能是“ 2”,第二个实例“ 3”和第三个实例“ 4”,为需要在特定时间范围内进行处理的大型数据队列建模。根据我们要测试的负载组合,可以添加更多内容。 其他答案已经讨论了并发构建的复选框,但是我想提到另一个问题:资源争用。 如果您的管道在管道阶段之间使用临时文件或隐藏文件,则实例最终可能会从彼此的脚下拉起地毯。例如,您可能最终试图在一个并发实例中删除文件,而在另一个实例中尝试读取同一文件。我们使用以下代码来确保每个并发实例的存储和临时文件名是唯一的:
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 stashName
concurrentUnstash stashName
,并发实例将没有冲突。 例如,如果两个管道都需要存储统计信息,我们可以对文件名执行以下操作:
def statsDir = concurrentSafeName(\'stats\')
然后每个实例将使用唯一的文件名来存储其输出。     
        您可以创建一个构建并使用参数对其进行配置。单击“ 9”复选框,然后在构建的配置中添加所需的参数。然后,您可以使用不同的参数触发同时进行的构建。 旁注:詹金斯(Jenkins)中的\“ Bulk Builder \”可能会将其推入队列,但是还有一个
This bulk build is parameterized
复选框。     

要回复问题请先登录注册