詹金斯的规则和食谱构建工作

xto*_*ofl 10 groovy continuous-integration makefile jenkins

目前,我们正在为jenkins中的CI构建添加groovy 管道脚本.有些东西可以并行化,有些依赖于其他构建步骤的输出.

parallel "does_not_depend_on_X": { upfront_tests(); },
"depends_on_x": { produce_x(); integration_tests(); publish_test_results()}
Run Code Online (Sandbox Code Playgroud)

嘿! 我认识到了! make用规则和食谱解决了这个问题!

all: upfront_tests test_results x

test_results: x
    integration_tests > test_results

x: x_inputs
    produce_x $*

upfront_test_results:
    upfront_tests
Run Code Online (Sandbox Code Playgroud)

有没有办法用jenkins和groovy实现这种有向无环图排序/并行化?

man*_*uti 1

我必须说这是一个非常有趣的问题,值得集思广益。AFAIK 没有办法使用该语法。Jenkins 支持两种定义管道的方法:脚本化管道(使用 Groovy 的命令式风格)和声明式管道(一种更结构化的方式),尽管老实说我不认为后者是真正的声明式(您仍然需要定义要做什么以及如何做)这样做),但由于其简化的语法,可能有助于构建图形编辑器。两者都记录在这里,我不知道有任何其他方式来编写它们。

然而,需要注意的一件事是,Make(以及一般的构建工具)和 Jenkins 是非常不同的工具,并且适用于非常不同的场景。Make 是一个构建程序(主要是 C 或 C++ 程序)的工具,而 Jenkins 是一个功能齐全的CI 自动化引擎,可用于实现复杂的持续交付流程,从 SCM 签出开始,到应用程序启动并运行结束(通常已经通过了一组测试)在环境上。如果构建工具依赖于有向无环图,那么 Jenkins 管道本质上代表了跨阶段的线性工作流程。所以在某种程度上,让 Jenkins 扩展 Make 的想法是没有意义的。即使在构建工具中,它们也往往会改变它们的使用方式。例如,Maven 和 Gradle 没有 Ant 或 Make 所具有的依赖项或先决条件目标的概念。他们仍然知道按什么顺序运行任务,但用户不必明确指定它们。

另一件事是我们必须回到过去才能看到 Makefile 规则背后的想法。它们是一种告诉 Make 根据已修改的源文件来编译哪些文件的方法,目的是避免在大型项目中进行完整构建。从根本上来说,Make 中的依赖项只是一个用于检查上次修改时间的源文件。在 Jenkins 中,除了从源文​​件生成目标文件的步骤之外,不存在这个概念。

现在你可能会说 Jenkins 仍然可以使用依赖关系的概念作为执行当前步骤之前要完成的任何先决步骤集,而不仅仅是检查上次修改时间的源文件。换句话说,我们可以将声明式管道写为:

pipeline {
   agent any 

   stages {              
       stage(name='Test', depends='Build'){
           steps {
               sh 'make check'
               junit 'reports/**/*.xml' 
           }
       }
       stage('Build') {
           steps { 
               sh 'make' 
           }
       }
       stage(name='Deploy', depends='Test') {
           steps {
               sh 'make publish'
           }
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

尽管从理论上讲,这将使语法更具声明性(因为代码中的阶段顺序不再重要),但它实际上是一个无用的功能,因为顺序足以表示阶段的顺序。