就灵活性而言,Jenkins 是一款非常出色的 CI 工具。
每个简单的事情都可以用十种不同的方式来完成,包括并行化构建。
本文将采用 Jenkins 中的并行阶段指令,并将其灵活性扩展至所需的地方。
我们将通过在管道的定义中引入一些命令逻辑来实现这一点。
一些基础
在开始并行化和所有这些复杂工作之前,让我们先打下一些非常基本但非常重要的基础。
本质上,Jenkins 是一种非常精细的脚本运行方式。它有大量插件,您基本上可以运行受运行作业的 agent 所支持的任何语言,并且您拥有丰富的 DSL 来构建作业,以运行脚本。
然而,真正改变游戏规则的是 2016 年引入的管道插件,它允许灵活执行作业。
突然之间,您可以使用舒适的声明式 DSL 定义作业,将单个作业分解为多个阶段,甚至在不同的 agent上运行每个阶段。
因此,Jenkins 管道的引入最终成为了作业并行化的一个促成因素。事实上,在某个时候,“并行”指令被引入了 Jenkins 管道。
“并行”指令通过包装要与之并行运行的阶段,允许并行运行多个阶段,如下例所示。
Jenkinsfile
pipeline {
agent any
stages {
stage(“Compile & Build Binary”) {
parallel {
stage(“Build X”) {
sh(‘cd /path/to/proj-1 && make && make publish’)
}
stage(“Build Y”) {
sh(‘cd /path/to/proj-2 && make && make publish’)
}
}
}
}
}
上述示例通过简单地将我们想要并行化的阶段包装在“并行”范围内,展示了多个项目的并行构建。
如果您想在使用 Jenkins 和其他 CI 系统并行化构建方面拥有更坚实的基础,您可以点击此处查看这篇深入研究并行指令基础知识的文章。
那么,这篇文章是关于什么的呢?
我们将使用一些命令式逻辑在 Jenkins 中扩展并行化,也就是说我们将使用声明式 Jenkinsfile 来允许 Jenkins 并行构建,并在缺少并行阶段指令的地方引入更多功能。
那么,哪里缺乏并行阶段功能呢?
当涉及到动态决定哪些阶段应并行运行时,最缺乏此功能。Jenkins 并行构建可基于静态信息和决策,声明式方法运行良好。但是当需要动态决策时,需要一种新方法来实现更高级的 Jenkins 并行构建。
示例如下:
假设我们有一个包含多个 C++ 项目的 Git 仓库,我们的目标是并行化所有项目的构建。
- 每周都会向其中添加新项目,并且每天都会修改现有项目。
- 对于每个项目,仓库的结构是在其根目录中都有一个目录。
- 每个项目中都有一个用于构建该项目的 Makefile。
- 在该仓库的根目录中还有一个 Jenkinsfile,其中定义了仓库的 Jenkins 管道