每次手动打包部署到深夜,你是否也曾仰望星空思考:为啥不让Jenkins这个贴心小助手来干活?
想象一下这个场景:你刚刚把代码推送到Git仓库,Jenkins就像被按下了启动按钮,立刻开始工作:拉取最新代码、解决依赖关系、运行测试、打包部署,一气呵成。而你,只需要悠闲地品着咖啡,等待构建结果的通知。
别被这些术语吓到,其实超简单!想象一下你做饭(代码开发):
买菜 (Coding): 吭哧吭哧写代码。洗切配 (Building): 得把代码“处理”成能跑的程序(编译、打包)。尝味道 (Testing): 自己先尝尝咸淡(单元测试、简单功能测试)。上桌 (Deployment): 端给客人(部署到测试/生产环境)。传统手工模式:你一个人吭哧吭哧干完1234步。累了不说,步骤4万一失手(比如烫到手),整盘菜撒一地… 完犊子!客人饿肚子,你也崩溃。
CI/CD 自动化流水线模式:这是你开了个“自动化厨房”!
CI (持续集成):只要你买好菜放进口袋(代码提交到仓库,比如GitHub)! 自动洗切配(自动构建)自动尝咸淡(自动运行测试)核心目标:快速发现“菜”本身的问题!!!酸了?糊了?咸了?马上告诉你! CD (持续交付/持续部署):CI验证合格的“预制菜”,可以: 自动打包好,随时能上桌(持续交付 - 准备好部署包)。或者,直接自动端上指定餐桌(持续部署 - 自动部署到测试/生产环境)。核心目标:让“好菜”能又快又好地送到“客人”面前!Jenkins就是那个帮你搭建和管理这个“自动化厨房”的超级管家!你只管提交代码(买菜),它帮你搞定后面所有流水线操作,还能随时报告“菜”的质量!稳不稳?
如果说Jenkins本身是超级管家的基础人格,那么插件就是为它装备的各种专业技能。Jenkins的强大,很大程度上源于其丰富的插件生态系统。
插件就像是Jenkins的“应用商店”,让你可以根据需要扩展功能。无论是与GitHub集成、部署到Kubernetes,还是发送漂亮的构建通知,都有对应的插件可以帮你实现。
Jenkins官方插件库中提供了上千款插件,这些都是全球开发者贡献的智慧结晶。有了它们,你的Jenkins才能真正做到“无所不能”。
在CentOS或其他系统上部署Jenkins时,以下插件堪称必备神器:
Git Plugin:与Git仓库集成的基石,支持代码拉取和推送。Maven Integration Plugin:如果你做Java开发,这个插件负责Maven项目的构建和依赖管理。Pipeline Plugin:定义和管理Jenkins流水线的核心,支持复杂的自动化构建流程。Docker Pipeline Plugin:在Jenkins中执行Docker命令的利器,便于容器化应用的构建和部署。JUnit Plugin:发布和查看JUnit测试报告,让你一目了然测试情况。Email Extension Plugin:替换Jenkins自带的邮件功能,提供更强大的邮件通知能力。HTML Publisher Plugin:发布构建结果的HTML报告,比如测试覆盖率报告等。在Jenkins的世界里,自由风格软件项目(Freestyle project)是最灵活、最易上手的一种。它可以用于任何类型的项目,配置简单直观,非常适合初学者入门。
Jenkins的安装非常简便,这里以最常见的War包方式为例:
下载Jenkins:访问Jenkins官网,下载最新的War文件。运行Jenkins:在命令行中切换到War文件所在目录,执行:
java -jar jenkins.war
如果需要修改端口,可以使用:
java -jar jenkins.war --httpPort=8081。
对于Docker爱好者,安装更简单,只需一条命令:
docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11
初始设置:首次访问Jenkins(通常是http://localhost:8080),会进入初始化设置向导,按照提示解锁Jenkins、安装推荐插件并创建管理员用户即可。
现在让我们开始创建第一个自由风格项目:
在Jenkins主页面,点击左侧菜单的**“新建任务”**。输入任务名称,例如
“My-First-Freestyle-Project”。选择**“构建一个自由风格的软件项目”**。点击**“确定”**进入配置页面。
命名技巧:任务名称应有明确含义,便于后续识别和管理。注意创建后不要轻易更改名称,因为很多内部文件都是以任务名称命名的。
在通用配置部分,设置一些项目的基本信息:
项目描述:简要描述项目的用途,例如“这是一个示例前端项目,用于演示Jenkins构建流程”。丢弃旧的构建:防止构建历史占用过多磁盘空间的重要设置。建议保持构建的天数为7天,最大个数为10-20个。参数化构建:如果需要根据不同参数执行不同构建流程,可以在这里定义参数。例如,定义部署环境参数(开发/测试/生产)。这是自动化构建的关键——告诉Jenkins从哪里获取代码:
选择Git(如果你使用其他版本控制系统,如SVN,请选择对应选项)。在Repository URL中输入你的代码仓库地址。配置认证信息:如果使用SSH认证,需要添加SSH私钥;如果使用HTTP认证,需要添加用户名和密码。构建触发器决定何时启动自动构建,常见的触发器有:
定时构建:像cronjob一样按计划执行,例如每15分钟一次:
H/15 * * * *轮询SCM:定期检查代码仓库是否有变更,有变更则构建。GitLab webhook:当代码推送到GitLab时,自动触发构建。
这是构建过程的核心部分,可以添加多个构建步骤。对于自由风格项目,最常见的构建步骤是执行Shell脚本或Windows批处理命令。
示例Shell脚本:
echo "开始构建..."
# 显示构建信息
echo "当前工作目录:$(pwd)"
echo "构建编号:$BUILD_NUMBER"
# 安装依赖
npm install
# 运行测试
npm test
# 构建项目
npm run build
echo "构建完成!"
注意:Jenkins执行Shell脚本时,默认工作目录是Jenkins主目录/workspaces/以job名称命名的文件夹。
构建完成后,我们通常需要做一些后续工作:
归档制品:将构建产物(如JAR、WAR文件)保存起来。发布JUnit测试结果报告:如果项目有单元测试,可以生成测试报告。邮件通知:将构建结果通知相关人员。触发其他项目:构建成功后自动触发下游任务。自由风格任务上手快,但配置复杂流水线时,界面操作就有点力不从心且不易维护了。Jenkins Pipeline(流水线)是更强大、更灵活、也更推荐的方式!核心思想:用代码(Groovy DSL)定义你的整个构建、测试、部署流程!
创建一个名为
Jenkinsfile的文件,放在项目根目录,内容如下:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
}
}
这个Pipeline定义了三个阶段:构建、测试和交付,清晰明了。
下面是一个更复杂的示例,展示了多环境构建和条件判断:
// 假设你已向Jenkins添加了一个名为'ecdc-pipeline'的库
@Library('ecdc-pipeline')
import ecdcpipeline.BuildNode
import ecdcpipeline.PipelineBuilder
// 构建一个映射,描述流水线将在哪些构建节点上运行
def buildNodes = [
'centos-debug': BuildNode.getDefaultBuildNode('centos7'),
'centos-release': BuildNode.getDefaultBuildNode('centos7'),
'ubuntu': new BuildNode('essdmscdm/ubuntu18.04-build-node:1.1.0', 'bash -e')
]
// 实例化一个PipelineBuilder对象来生成构建器
def pipelineBuilder = new PipelineBuilder(this, buildNodes)
echo pipelineBuilder.project
echo pipelineBuilder.branch
// 为每个构建节点创建构建器,使用参数化流水线。
def builders = pipelineBuilder.createBuilders { container ->
stage('First Stage') {
echo 'In first stage'
// 在Jenkins构建节点上运行的shell脚本(不在容器内)。
sh 'hostname'
// 在容器上运行的shell脚本。
container.sh 'pwd'
}
// 该参数有一个'name'字段,可用于条件阶段。
if (container.name == 'centos-release') {
stage('Release Stage') {
echo 'This stage is only run on centos-release'
container.sh 'ls -la'
}
}
stage('Another Stage') {
// 可以使用三个引号来编写多行脚本。
container.sh """
cd code
pwd
ls -la
cd ..
mkdir build
cd build
echo TEST > test.txt
"""
container.copyFrom('/home/jenkins/build/test.txt', '.')
sh """
ls -la
cat test.txt
"""
}
}
// 在协调器节点上检出代码,并并行启动构建器。
parallel builders
这个示例展示了如何在多个容器环境中并行执行构建,并根据条件执行特定阶段。
当Jenkins现有的功能无法满足你的特殊需求时,别担心,你可以自己开发插件!Jenkins提供了完善的插件开发框架。
打开命令提示符,找到你想要存储新Jenkins插件的目录,然后运行以下命令:
mvn -U archetype:generate -Dfilter=io.jenkins.archetypes:
选择
hello-world原型(在本教程中编号为4),然后按照提示输入插件信息:
Choose archetype:
1: remote -> io.jenkins.archetypes:empty-plugin
...
4: remote -> io.jenkins.archetypes:hello-world-plugin
Choose a number: 4
Define value for property 'artifactId': demo
这会创建一个工作插件的基本结构,你可以在此基础上进行开发。
让我们创建一个在构建日志中记录问候语的功能,并添加适当的数据结构。
首先,创建一个实现Action接口的类:
package io.jenkins.plugins.sample;
import hudson.model.Action;
public class HelloWorldAction implements Action {
private String name;
public HelloWorldAction(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String getIconFileName() {
return "document.png";
}
@Override
public String getDisplayName() {
return "Greeting";
}
@Override
public String getUrlName() {
return "greeting";
}
}
然后,我们需要在构建步骤中创建该类的实例:
@Override
public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
run.addAction(new HelloWorldAction(name));
if (useFrench) {
listener.getLogger().println("Bonjour, " + name + "!");
} else {
listener.getLogger().println("Hello, " + name + "!");
}
}
接下来,创建一个视图来显示存储的构建信息。在
src/main/resources/io/jenkins/plugins/sample/HelloWorldAction/目录创建名为
index.jelly的文件:
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:st="jelly:stapler">
<l:layout title="Greeting">
<l:main-panel>
<h1>
Name: ${it.name}
</h1>
</l:main-panel>
</l:layout>
</j:jelly>
这样,你就成功创建并扩展了一个Jenkins插件!
在实际使用Jenkins过程中,遵循一些最佳实践可以让你少走很多弯路。
通过这篇教程,我们深入探索了Jenkins的构建插件支持——从自由风格项目的简单易用,到Pipeline as Code的强大灵活,再到自定义插件开发的无限可能。
记住,Jenkins的真正力量在于它的可扩展性和灵活性。无论你是刚开始接触CI/CD的新手,还是寻求优化复杂工作流程的老手,Jenkins的插件生态系统都能为你提供所需的工具。
现在,是时候告别手动打包的苦役,让Jenkins这位忠实的构建管家为你效劳了。当你再次看到代码提交触发自动构建、测试、部署的全过程时,你会发现:原来高效的软件开发,可以如此优雅!
不要让明天的代码,还在今天手动部署。赶快行动起来,打造属于你自己的自动化构建流水线吧!
| 插件名称 | 主要用途 | 适用场景 |
| Git Plugin | 与Git仓库集成 | 所有需要从Git拉取代码的项目 |
| Pipeline Plugin | 定义和管理流水线 | 复杂构建流程,需要版本化的构建脚本 |
| Docker Pipeline Plugin | 执行Docker命令 | 容器化应用的构建和部署 |
| JUnit Plugin | 发布测试报告 | 需要可视化测试结果的Java项目 |
| HTML Publisher Plugin | 发布HTML报告 | 展示测试覆盖率、API文档等 |
| Email Extension Plugin | 增强邮件通知 | 需要定制化构建通知的团队 |