Jenkins - 同时运行单个构建的实例
Posted
技术标签:
【中文标题】Jenkins - 同时运行单个构建的实例【英文标题】:Jenkins - Running instances of single build concurrently 【发布时间】:2011-05-27 13:58:00 【问题描述】:我希望能够同时运行同一个 Jenkins 作业的多个构建。
例子:
-
构建 [*jenkins_job_1*]:调用带有参数“A”的 ant 脚本
构建 [*jenkins_job_1*]:调用带有参数“B”的 ant 脚本
必要时重复
作业的每个实例同时运行,而不是通过队列。
我想这样做的原因是为了避免创建几个几乎相同的工作,所有这些工作都需要维护。
有没有办法做到这一点,或者可能有另一种解决方案(即,从基础作业动态创建作业并在完成后将其删除)?
【问题讨论】:
【参考方案1】:Jenkins 有一个复选框:“Execute concurrent builds if necessary”
如果您选中此项,那么它将为一个作业启动多个构建。
这适用于“此构建已参数化”复选框。
您仍然会触发构建,将A
或B
作为参数传递。您可以使用其他作业来触发它们,也可以通过脚本手动执行。
【讨论】:
在 2.204.2 版本中,取消标记为“不允许并发构建”的复选框 我喜欢他们改变事物的名称。【参考方案2】:您可以在创建作业时选择构建多配置项目(矩阵构建)。然后,在作业的配置下,您可以定义配置矩阵,它允许您为不同的构建指定一个或多个参数(轴)。关于同时运行,您应该能够同时运行尽可能多的执行程序(带有适当的标签)。
不幸的是,Jenkins wiki 缺少有关此设置的文档。之前有几个 SO 问题,here 和 here,可能会提供一些指导。有一个“最近的”blog post 关于设置多配置作业以在各种平台上执行构建。
【讨论】:
上述博文很有帮助【参考方案3】:更新(更好)的解决方案是Jenkins Job DSL Plugin。
我们一直在使用它并取得了巨大的成功。我们的作业配置现在是一次性的……我们可以从一些 groovy 文件和几个模板作业中设置大量复杂的作业。太好了。
比起复杂且难以理解的矩阵构建,我更喜欢它。
【讨论】:
您能否说明如何在 Job DSL 中实现“必要时执行并发构建”?【参考方案4】:没有什么能阻止你使用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 stashName
和concurrentUnstash stashName
,并发实例不会冲突。
如果两个管道都需要存储统计信息,我们可以对文件名执行以下操作:
def statsDir = concurrentSafeName('stats')
然后每个实例将使用唯一的文件名来存储它们的输出。
【讨论】:
【参考方案5】:您可以创建构建并使用参数对其进行配置。单击This build is parameterized
复选框并在构建的配置中添加所需的参数。然后,您可以使用不同的参数启动同时构建。
旁注:Jenkins 中的“批量生成器”可能会将其推入队列,但也有一个 This bulk build is parameterized
复选框。
【讨论】:
我之前试过这个,但我无法让它们同时运行。回去后,我注意到了一个我以前没有看到的“必要时执行并发构建”选项。后来它起作用了。 @qpi: 在勾选“Execute concurrent builds if necessary”复选框后,它应该可以正常工作 这将为作业的每个运行构建创建不同的工作空间..或者该作业将只有一个工作空间。如果同时运行并发构建,请告诉我如何管理工作区。【参考方案6】:我有一个相当大的构建队列,我执行了以下步骤来运行作业 在 jenkins 中并行以减少队列中等待的作业数量
-
对于每个作业,您需要导航以配置并选中说明
“如有必要,执行并发构建”
导航到管理 -> 配置系统 -> 查找“# of executors”并设置 no
您想要的并行执行器数量(在我的情况下,它设置为 0,我将其更新为 2)
【讨论】:
以上是关于Jenkins - 同时运行单个构建的实例的主要内容,如果未能解决你的问题,请参考以下文章