我希望能够同时运行同一个 Jenkins 工作的几个构建。
示例:
- 构建 [*jenkins_job_1*]:使用参数'A' 调用 ant 脚本
- 构建 [*jenkins_job_1*]:使用参数'B' 调用 ant 脚本
- 按需重复
- 每个工作实例都可以同时运行,而不是通过队列。
我想这么做的原因是避免创建几乎相同的多个工作,这些工作都需要进行维护。
是否有一种方法来实现这一点,或者另一个解决方案(例如——从基础工作动态创建工作并在完成后删除它)?
我希望能够同时运行同一个 Jenkins 工作的几个构建。
示例:
我想这么做的原因是避免创建几乎相同的多个工作,这些工作都需要进行维护。
是否有一种方法来实现这一点,或者另一个解决方案(例如——从基础工作动态创建工作并在完成后删除它)?
Jenkins有一个复选框:“必要时执行并发构建”。
如果您选择了这个选项,它将为作业启动多个构建。
这可以与“此构建具有参数”复选框一起使用。
您仍然需要触发构建并传递您的A
或B
参数。 您可以使用另一个作业来触发它们,或者您可以通过脚本手动完成。
您可以在创建作业时选择构建多配置项目(矩阵构建)。然后,在作业的配置下,您可以定义配置矩阵,以便为不同的构建指定一个或多个参数(轴)。关于同时运行,您应该能够运行与执行器数量相同的并行构建(使用适当的标签)。
不幸的是,Jenkins Wiki缺少此设置的文档。有几个之前的SO问题,这里和这里可能提供一些指导。有一篇“最近”的博客文章介绍了如何设置多配置作业以在各种平台上执行构建。
您可以使用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 stashName
和concurrentUnstash stashName
,并且并发实例将没有冲突。def statsDir = concurrentSafeName('stats')
然后每个实例将使用唯一的文件名来存储其输出。
您可以创建并配置构建参数。勾选此构建具有参数
复选框,并在构建的配置中添加所需的参数。然后,您可以使用不同的参数同时启动构建。
顺带一提:Jenkins中的“批量生成器”可能会将其推入队列中,但也有一个此批次生成具有参数
复选框。
我有一个相当大的构建队列,我执行了以下步骤在Jenkins中并行运行作业,以减少等待队列中的作业数量