跳转至

Jenkins 传统构建 与 Pipeline构建的区别


2024-07-30 by dongnan

简介

在 Jenkins 中,传统构建和 Pipeline 是两种不同的工作流配置方式,各有优缺点和适用场景。以下是它们之间的主要区别....

目标

  • 使用 Docker 部署一个 Jenkins 服务器。
  • 使用 Pipeline 方式构建 Java项目。

环境描述

  • OS: Ubuntu Server 20.04 LTS
  • Docker: 19.03.15
  • Docker-compose: 1.29.2
  • Jenkins: 2.452.2 LTS

部署 Jenkins

如果你需要 Docker-in-Docker (DinD) 模式运行 Jenkins ,请参考这篇文章

编排文件

$ cat /root/soft/jenkins/docker-compose.yml

version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    environment:
      - TZ=Asia/Chongqing
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
    restart: always

volumes:
  jenkins_home:
    driver: local

创建容器

$ docker-compose up -d

容器日志

$ docker-compose logs --tail 10

Attaching to jenkins
jenkins    | *************************************************************
jenkins    | 
jenkins    | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins    | Please use the following password to proceed to installation:
jenkins    | 
jenkins    | add2e7b956d34xxxx5161185ab74fb8e
jenkins    | 
jenkins    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
jenkins    | 
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    | *************************************************************
jenkins    |

注意:日志中包括 Jenkins 的初始密码,首次登录 jenkins 控制台时需要使用这个密码。

安装选项

插件选择默认

创建用户后,Jenkins安装完毕

创建 Pipeline 项目

有请 ChatGPT 给我们举个 Pipeline 例子

Pipeline 插件

首先在 Jenkins 管理界面,进入 Manage Jenkins -> Manage Plugins -> Available 标签页,搜索并安装以下插件:

  • Pipeline
  • Git
  • mvn

其中,Pipeline 插件是必须的,Git 插件用于下载仓库代码,mvn 插件则用于编译 java 项目的工具。

创建一个新的 Pipeline 项目

  1. 在 Jenkins 首页,点击 New Item
  2. 输入项目名称并选择 Pipeline 类型,然后点击 OK。
  3. 在项目配置页面,滚动到 Pipeline 部分。

编写 Pipeline 脚本

在 Pipeline 部分,选择 Pipeline script 选项并粘贴以下示例脚本:

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git 'https://github.com/your-repository.git'
            }
        }

        stage('Build') {
            steps {
                // 假设你使用 Maven 构建项目
                sh 'mvn clean install'
            }
        }

        stage('Test') {
            steps {
                // 运行测试
                sh 'mvn test'
            }
        }

        stage('Deploy') {
            steps {
                // 部署步骤,例如拷贝文件到服务器或运行部署脚本
                sh 'echo "Deploying..."'
            }
        }
    }

    post {
        always {
            // 无论构建结果如何,总是执行的步骤,例如清理工作目录
            cleanWs()
        }
        success {
            // 构建成功时执行的步骤,例如发送通知
            echo 'Build succeeded!'
        }
        failure {
            // 构建失败时执行的步骤,例如发送通知
            echo 'Build failed!'
        }
    }
}

Pipeline 主要元素

  • pipeline:Pipeline 的顶级指令。
  • agent:指定执行 Pipeline 的节点。any 表示任意可用节点。
  • environment:定义环境变量。
  • stages:定义 Pipeline 的阶段。
  • stage:定义单个阶段。每个阶段包含一系列步骤。
  • steps:在每个阶段内执行的具体操作。
  • post:定义在 Pipeline 结束后执行的操作。always、success、failure 等条件块。

保存并运行 Pipeline

保存配置,然后在项目页面点击 Build Now 按钮运行 Pipeline。你将会在 Jenkins 的控制台输出中看到每个阶段的执行结果。

通过上述步骤,你已经在 Jenkins 中成功创建了一个简单的 Pipeline。

传统构建与Pipeline构建的区别

在 Jenkins 中,传统构建和 Pipeline 是两种不同的工作流配置方式,各有优缺点和适用场景。以下是它们之间的主要区别:

配置方式

传统构建

  • 配置界面:传统构建是通过 Jenkins 的图形用户界面(GUI)进行配置的。用户在创建一个新项目时,通过填写一系列表单来定义构建步骤、触发器和其他设置。
  • 复杂度:对于简单的项目,配置较为直观和简单。但随着项目变得复杂,配置界面会变得繁琐和难以维护。

Pipeline

  • 脚本化:Pipeline 是通过编写脚本来定义整个构建过程的。Jenkins Pipeline 脚本使用一种称为 Groovy 的脚本语言来描述构建、测试和部署的各个步骤。
  • 版本控制:Pipeline 脚本可以存储在代码库中,与项目代码一起版本控制,这使得构建配置更加透明和易于审查。

灵活性和可维护性

传统构建

  • 灵活性较低:传统构建的步骤是通过插件和预定义的构建操作来实现的,灵活性较低。对于复杂的构建逻辑,可能需要安装大量插件,且不同插件之间的兼容性问题也可能增加维护难度。
  • 可维护性差:配置存储在 Jenkins 本地,难以版本控制和共享,尤其是对于团队协作来说。

Pipeline

  • 高度灵活:Pipeline 提供了更高的灵活性,用户可以编写任意复杂的脚本来实现构建、测试和部署的流程。支持条件逻辑、并行执行等高级功能。
  • 可维护性好:Pipeline 脚本可以存储在代码库中,与项目代码一起版本控制,方便团队协作和变更审查。

扩展性和复用性

传统构建

  • 扩展性有限:传统构建的扩展性主要依赖于插件,定制化程度较低。无法方便地复用构建步骤,除非通过手动复制配置。
  • 复用性差:难以在多个项目间复用构建逻辑,需要在每个项目中单独配置。

Pipeline

  • 高扩展性:Pipeline 脚本可以通过函数和共享库(Jenkins Shared Libraries)来实现构建逻辑的复用和扩展,适用于大规模、复杂项目。
  • 复用性强:可以在多个项目间共享和复用Pipeline脚本,提高配置的一致性和可维护性。

可视化和调试

传统构建

  • 可视化界面:传统构建在 Jenkins 界面中有良好的可视化展示,适合简单的流水线展示和操作。
  • 调试较难:由于配置通过 GUI 进行,调试构建问题时,往往需要依赖日志,难以快速定位问题。

Pipeline

  • 可视化:虽然 Pipeline 主要通过脚本配置,但 Jenkins 提供了丰富的可视化工具,如 Blue Ocean 插件,可以直观地展示 Pipeline 执行情况。
  • 调试方便:Pipeline 脚本可以方便地添加调试信息,且支持条件和循环,使得调试和问题定位更为灵活。

自动化和 DevOps 集成

传统构建

  • 自动化程度较低:传统构建虽然可以实现基本的自动化,但在复杂的 DevOps 流水线中,可能显得不够灵活和全面。
  • DevOps 集成有限:对于复杂的 CI/CD 流程和 DevOps 实践,传统构建方式的灵活性和可扩展性可能不足。

Pipeline

  • 高度自动化:Pipeline 设计旨在实现端到端的自动化,从代码提交到生产部署,提供了一整套解决方案。
  • 全面的 DevOps 集成:Pipeline 与现代 DevOps 实践高度契合,可以轻松集成各种工具和服务,实现复杂的 CI/CD 流程。

总结

  • 传统构建 适合简单项目和快速原型开发,但在灵活性、可维护性和复杂项目的自动化方面存在局限性。
  • Pipeline 提供了高度灵活、可维护和可扩展的构建配置方式,适合现代 DevOps 实践和复杂项目的 CI/CD 流程。

选择哪种方式,取决于项目的复杂性、团队的需求和对自动化程度的要求。对于大多数现代项目,Pipeline 通常是更推荐的选择。

参考文档

  • chatGPT
  • https://www.jenkins.io/doc/book/installing/docker/
  • https://www.jenkins.io/zh/doc/pipeline/tour/hello-world/
  • https://groovy-lang.org/single-page-documentation.html
回到页面顶部