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 项目
- 在 Jenkins 首页,点击
New Item
。 - 输入项目名称并选择
Pipeline
类型,然后点击 OK。 - 在项目配置页面,滚动到
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