1. 概述

本文将通过一个持续交付(Continuous Delivery)的示例来展示 Jenkins 中 Pipeline 的使用。

我们会构建一个简单但非常实用的流水线流程,包括以下几个阶段:

  • 编译
  • 静态分析(与编译并行执行)
  • 单元测试
  • 集成测试(与单元测试并行执行)
  • 部署

这些步骤将帮助我们理解 Jenkins 2 中 Pipeline 的强大之处。

2. Jenkins 安装配置

首先,我们需要从 Jenkins 官网 下载最新稳定版本(本文写作时为 2.73.3)。

进入下载目录后,使用如下命令启动 Jenkins:

java -jar jenkins.war

⚠️ 注意:Jenkins 启动后需要先完成管理员用户的初始化设置。

使用系统生成的初始密码解锁 Jenkins,然后填写管理员用户信息,并安装推荐插件。

jenkins 1-1

此时 Jenkins 已安装完成,准备就绪。

jenkins2

所有 Jenkins 版本可在 这里 找到。

3. Pipeline 简介

Jenkins 2 引入了 Pipeline(流水线)这一重要特性,它非常适合用于定义项目的持续集成/持续交付(CI/CD)流程。

Pipeline 的本质是用代码定义 Jenkins 构建步骤,从而实现软件自动化构建、测试和部署。

它基于一种领域特定语言(DSL),支持两种语法风格:

  • 声明式 Pipeline(Declarative)
  • 脚本式 Pipeline(Scripted)

在本文中,我们将使用 Scripted Pipeline,它基于 Groovy,采用命令式编程风格。

✅ 要使用 Pipeline,首先需要安装 Pipeline 插件。

✅ 可选安装 Pipeline Stage View 插件,这样可以在构建运行时看到各个阶段的可视化视图。

4. 示例项目

我们以一个简单的 Spring Boot 应用为例,演示如何构建一个完整的流水线。

该流水线将包括如下流程:

  • 克隆代码
  • 构建项目
  • 执行多种测试
  • 启动应用

我们还需要安装以下插件来支持分析和测试报告:

  • Checkstyle:用于静态代码检查
  • Static Analysis Collector:聚合分析结果并生成趋势图
  • JUnit:用于解析单元测试报告

此外,我们还需要在 pom.xml 中添加如下插件配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.17</version>
</plugin>

5. 创建 Pipeline 脚本

首先,在 Jenkins 中新建一个任务,选择 Pipeline 类型:

jenkins3

填写任务描述、触发器等信息:

jenkins4

点击 Pipeline 标签页,选择 Pipeline script 并勾选 Use Groovy Sandbox

以下是一个适用于 Unix 系统的完整 Pipeline 脚本:

node {
    stage 'Clone the project'
    git 'https://github.com/eugenp/tutorials.git'
  
    dir('spring-jenkins-pipeline') {
        stage("Compilation and Analysis") {
            parallel 'Compilation': {
                sh "./mvnw clean install -DskipTests"
            }, 'Static Analysis': {
                stage("Checkstyle") {
                    sh "./mvnw checkstyle:checkstyle"
                    
                    step([$class: 'CheckStylePublisher',
                      canRunOnFailed: true,
                      defaultEncoding: '',
                      healthy: '100',
                      pattern: '**/target/checkstyle-result.xml',
                      unHealthy: '90',
                      useStableBuildAsReference: true
                    ])
                }
            }
        }
        
        stage("Tests and Deployment") {
            parallel 'Unit tests': {
                stage("Runing unit tests") {
                    try {
                        sh "./mvnw test -Punit"
                    } catch(err) {
                        step([$class: 'JUnitResultArchiver', testResults: 
                          '**/target/surefire-reports/TEST-*UnitTest.xml'])
                        throw err
                    }
                   step([$class: 'JUnitResultArchiver', testResults: 
                     '**/target/surefire-reports/TEST-*UnitTest.xml'])
                }
            }, 'Integration tests': {
                stage("Runing integration tests") {
                    try {
                        sh "./mvnw test -Pintegration"
                    } catch(err) {
                        step([$class: 'JUnitResultArchiver', testResults: 
                          '**/target/surefire-reports/TEST-' 
                            + '*IntegrationTest.xml'])
                        throw err
                    }
                    step([$class: 'JUnitResultArchiver', testResults: 
                      '**/target/surefire-reports/TEST-' 
                        + '*IntegrationTest.xml'])
                }
            }
            
            stage("Staging") {
                sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid " 
                  + "|| kill -KILL \$pid"
                withEnv(['JENKINS_NODE_COOKIE=dontkill']) {
                    sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &'
                }   
            }
        }
    }
}

脚本说明

  1. 克隆代码:从 GitHub 克隆项目并进入子目录 spring-jenkins-pipeline
  2. 并行编译与静态分析:使用 parallel 并行执行编译和 Checkstyle 检查
  3. 并行执行测试
    • 单元测试
    • 集成测试
    • 使用 try/catch 处理失败并归档测试报告
  4. 部署阶段
    • 停止已有服务(端口 8989)
    • 使用 nohup 启动 Spring Boot 应用
    • 设置 JENKINS_NODE_COOKIE 防止 Jenkins 自动关闭进程

⚠️ 并行执行是 Jenkins 的一大优势,可以显著提升流水线执行效率,特别是在测试阶段。

6. 查看分析与测试报告

保存脚本后,点击 Build Now 开始执行流水线。

查看构建概览:

jenkins5

点击构建号进入详情页,可以看到各阶段执行情况:

jenkins6

点击阶段日志可以查看详细输出。

Checkstyle 分析报告

点击左侧菜单的 Build History 中的某次构建,然后点击 Checkstyle Warnings,可以看到静态分析结果:

jenkins7

点击 Details 可以查看每条警告的详细信息。

测试报告

点击 Test Result 查看完整的测试报告:

jenkins8

可以查看每个测试类的执行时间、状态等信息。

7. 小结

本文我们通过一个 Spring Boot 项目,演示了如何使用 Jenkins Pipeline 构建一个完整的持续交付流程,包括:

  • 代码克隆
  • 并行编译与静态分析
  • 单元测试与集成测试
  • 应用部署
  • 测试与分析报告展示

Pipeline 的灵活性和可编程性,使其成为 Jenkins 2 的核心功能之一。如果你正在构建 CI/CD 流水线,Pipeline 是非常值得投入学习的。

完整源码可在 GitHub 获取:spring-jenkins-pipeline


原始标题:Intro to Jenkins 2 and the Power of Pipelines