简单说,Pipeline(流水线) 就是把一件复杂工作,拆成一步接一步自动执行的流程,不用人手动一步步点,这就叫 "流水线"。放到软件开发 / IT 里,就是:
写代码 → 编译 → 测试 → 打包 → 部署上线
全程自动跑,不用人工干预,也叫 CI/CD 流水线。
二、Pipeline 核心特点
自动化:触发后从头到尾自动跑
顺序执行:一步一步来,上一步失败就停
可重复:每次跑流程都一样,稳定可靠
可视化:能看到哪一步成功、哪一步报错
三、常见场景
Jenkins Pipeline:最经典的自动化构建部署流水线
GitLab CI/CD Pipeline:代码提交后自动构建、测试、发布
数据 Pipeline:数据采集 → 清洗 → 计算 → 入库
AI Pipeline:数据处理 → 训练 → 评估 → 上线

准备环境:
jenkins主从节点,如果需要配置请看博主之前的文档
安装插件
bash
• Maven插件 Maven Integration plugin
• 发布插件 Deploy to container Plugin
需要安装插件如下:
=======================================================
安装插件
Deploy to container ---支持自动化代码部署到tomcat容器
GIT server ---拉取代码必备,几乎所有项目都用 Git
Generic Webhook Trigger ----支持代码仓库触发构建(GitLab/GitHub/Gitee 通用)
gitlab ----gitlab插件 链接公司私有仓库
Role-Based Authorization Strategy ---rbac插件权限控制
Pipeline ---流水线插件,在安装推荐插件时已经安装
Pipeline: Stage View ----流水线阶段展示,必装。
Maven Integration -----jenkins利用Maven编译,打包所需插件
Publish Over SSH ------通过ssh连接将打包的war包拷贝到后端服务器
ssh ---插件包含(SSH Agent/SSH Pipeline Steps/SSH2 Easy)
Credentials Binding ----密钥、账号密码注入流水线,安全刚需,安装推荐插件已经安装了
Email Extension Plugin -----安装邮件插件
Extended Choice Parameter -----用于高级参数化(如下拉多选),可选,适配复杂场景
NodeJS ----前端打包工具
docker ----docker插件
Docker Pipeline ------流水线里构建、推送 Docker 镜像
Blue Ocean -----现代化流水线界面,排查问题更方便
SonarQube Scanner -----代码质量 / 漏洞扫描
kubernetes -----在 K8s 里动态创建 Jenkins Agent,弹性构建
kubernetes CLI -----流水线里执行 kubectl 命令发布应用
安装过程:
系统管理--->插件管理---->可选插件--->过滤Deploy to container---->勾选--->直接安装
git仓库配置
git仓库使用gitee,在gitee创建一个仓库用于存放前后端代码。由于只有三台虚拟机,我将使用从节点用于上传代码到gitee仓库
1.gitee创建仓库----略
2.准备代码--代码后面展示
3.将代码提交到gitee仓库
bash
1.提交前端代码
[root@jenkins-slave ~]# mkdir frontend-demo
[root@jenkins-slave ~]# cd frontend-demo/
[root@jenkins-slave frontend-demo]# git init
Initialized empty Git repository in /root/frontend-demo/.git/
[root@jenkins-slave frontend-demo]# touch README.md
[root@jenkins-slave frontend-demo]# git add README.md
[root@jenkins-slave frontend-demo]# git commit -m "first commit"
[master (root-commit) 61d272e] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
[root@jenkins-slave frontend-demo]# git remote add origin https://gitee.com/testpm/frontend-demo.git
[root@jenkins-slave frontend-demo]# git push -u origin "master"
Username for 'https://gitee.com': xxxxx
Password for 'https://xxxxx@gitee.com':
Counting objects: 3, done.
Writing objects: 100% (3/3), 206 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag d34da889
To https://gitee.com/testpm/frontend-demo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[root@jenkins-slave frontend-demo]# cd ..
[root@jenkins-slave ~]# ls
anaconda-ks.cfg apache-maven-3.9.14-bin.tar frontend-demo jdk-21.0.9_linux-x64_bin.tar my-jenkins-demo node-v12.18.4-linux-x64.tar.xz
[root@jenkins-slave ~]# cp -r my-jenkins-demo/frontend/* frontend-demo/
[root@jenkins-slave ~]# cd frontend-demo/
[root@jenkins-slave frontend-demo]# git add -A
[root@jenkins-slave frontend-demo]# git commit -m "two commit"
[master 9d23810] two commit
9 files changed, 724 insertions(+)
create mode 100644 Dockerfile
create mode 100644 nginx.conf
create mode 100644 package.json
create mode 100644 src/App.vue
create mode 100644 src/main.js
create mode 100644 src/router/index.js
create mode 100644 src/store/index.js
create mode 100644 src/views/Home.vue
create mode 100644 src/views/Users.vue
[root@jenkins-slave frontend-demo]# git push -u origin master
Username for 'https://gitee.com': xxxxx
Password for 'https://xxxxx@gitee.com':
Counting objects: 16, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (15/15), 8.40 KiB | 0 bytes/s, done.
Total 15 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag 9843e8ae
To https://gitee.com/testpm/frontend-demo.git
61d272e..9d23810 master -> master
Branch master set up to track remote branch master from origin.
[root@jenkins-slave frontend-demo]#
2.提交后端代码到仓库
[root@jenkins-slave ~]# mkdir backend-demo
[root@jenkins-slave ~]# cd backend-demo/
[root@jenkins-slave backend-demo]# git init
Initialized empty Git repository in /root/backend-demo/.git/
[root@jenkins-slave backend-demo]# touch README.md
[root@jenkins-slave backend-demo]# git add README.md
[root@jenkins-slave backend-demo]# git commit -m "first commit"
[master (root-commit) a85939a] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
[root@jenkins-slave backend-demo]# git remote add origin https://gitee.com/testpm/backend-demo.git
[root@jenkins-slave backend-demo]# git push -u origin "master"
Username for 'https://gitee.com': xxxxxx
Password for 'https://xxxxxxx@gitee.com':
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag ee4c819d
To https://gitee.com/testpm/backend-demo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[root@jenkins-slave backend-demo]# cp -r /root/my-jenkins-demo/backend/* .
[root@jenkins-slave backend-demo]# ls
Dockerfile pom.xml README.md src
[root@jenkins-slave backend-demo]# git add -A
[root@jenkins-slave backend-demo]# git commit -m "two commit"
[master 0897867] two commit
13 files changed, 461 insertions(+)
create mode 100644 Dockerfile
create mode 100644 pom.xml
create mode 100644 src/main/java/com/example/demo/DemoApplication.java
create mode 100644 src/main/java/com/example/demo/controller/HelloController.java
create mode 100644 src/main/java/com/example/demo/controller/UserController.java
create mode 100644 src/main/java/com/example/demo/entity/User.java
create mode 100644 src/main/java/com/example/demo/repository/UserRepository.java
create mode 100644 src/main/java/com/example/demo/service/UserService.java
create mode 100644 src/main/resources/application.yml
create mode 100644 src/main/resources/data.sql
create mode 100644 src/main/resources/schema.sql
create mode 100644 src/test/java/com/example/demo/DemoApplicationTests.java
create mode 100644 src/test/java/com/example/demo/controller/HelloControllerTest.java
[root@jenkins-slave backend-demo]# git push -u origin "master"
Username for 'https://gitee.com': xxxxxx
Password for 'https://xxxxxx@gitee.com':
Counting objects: 33, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (32/32), 6.53 KiB | 0 bytes/s, done.
Total 32 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag b941df87
To https://gitee.com/testpm/backend-demo.git
a85939a..0897867 master -> master
Branch master set up to track remote branch master from origin.
[root@jenkins-slave backend-demo]#
4.jenkins添加git/ssh/harbor凭据
主从节点均添加连接仓库的凭据
注意:主节点jenkins运行时候如果使用root用户,那么最好是用root用户去获取代码,添加root的凭据
Manage Jenkins → Manage Credentials → System → Global credentials → Add Credentials
首先先添加git仓库的凭据,使用jenkins用户去获取代码
ini
[root@jenkins ~]# su - jenkins
2.将jenkins用户的公钥添加到git仓库中
[jenkins@jenkins ~]$ cat .ssh/id_rsa.pub

bash
3.私钥用于在jenkins中添加凭据
[jenkins@jenkins ~]$ cat .ssh/id_rsa




从节点相同操作
bash
[root@jenkins-slave ~]# su - jenkins
Last login: Wed Apr 8 10:33:52 CST 2026 from 172.20.10.2 on pts/1
[jenkins@jenkins-slave ~]$ ssh-keygen #生成公钥和私钥
[jenkins@jenkins-slave ~]$ cat .ssh/id_rsa.pub #公钥添加到git仓库
[jenkins@jenkins-slave ~]$ cat .ssh/id_rsa #私钥添加到jenkins的全局凭据
以上操作都做完之后需要在主从节点的机器上使用对应的用户将Git的SSH主机密钥添加到已知主机(known_hosts)文件中
bash
步骤:
1.登录到Jenkins服务器(注意:如果是主从架构,这里是指执行Git操作的那台机器,通常是主节点,但如果流水线任务被分配到了从节点,则需要在从节点上操作)。
2.确定Jenkins进程运行的用户。通常为jenkins用户,也可能是其他用户(如root)。可以通过查看Jenkins进程或查看Jenkins系统配置确定。
3.切换到该用户。例如,如果用户是jenkins,则执行:
# su - jenkins
使用ssh-keyscan命令获取Gitee的SSH主机密钥并添加到~/.ssh/known_hosts:
# ssh-keyscan -H gitee.com >> ~/.ssh/known_hosts
如果~/.ssh目录不存在,可以先创建并设置权限:
# mkdir -p ~/.ssh
# chmod 700 ~/.ssh
4.验证是否添加成功:
# ssh -T git@gitee.com
正常情况下会返回类似"You've successfully authenticated, but Gitee.com does not provide shell access."的提示,这说明主机密钥已正确添加。
添加前后端服务器的凭据
bash
与本项目相关的所有前后端服务器配置免密
[root@jenkins ~]# su - jenkins
[jenkins@jenkins ~]$ ssh-copy-id 172.20.10.3
私钥用于配置凭据
[jenkins@jenkins ~]$ cat .ssh/id_rsa
5.创建前后端流水线


agent节点选择器
作用:指定流水线执行的节点(服务器),决定流水线在哪个设备上运行,是声明式流水线的基础配置,不可省略。
核心参数及用法(3种常用场景):
重点记住:
bash
agent any 或 agent { label 'xxx' }
groovy
pipeline {
// 场景1:任意可用节点(最常用,推荐新手使用)
agent any
// 场景2:指定具体节点(根据节点标签匹配,需在Jenkins中提前配置节点标签)
// agent {
// node {
// label 'build-node' // 节点标签,Jenkins中节点的标识
// customWorkspace '/opt/jenkins/workspace/demo' // 可选:指定当前流水线的工作空间
// }
// }
// 场景3:无节点(仅适用于不需要执行Shell命令、纯逻辑判断的场景,极少用)
// agent none
}
Stages & Stage(必选):阶段配置
作用:Stages是所有Stage的容器,Stage是流水线的具体流程步骤,二者配合实现流程的拆分与可视化,缺一不可。
核心参数及用法:
groovy
pipeline {
agent {
node {
label 'jenkins-slave'
customWorkspace '/home/jenkins/data'
}
}
stages { // 必选:所有Stage的顶层容器,只能有一个
// 第一个Stage:拉取代码(stage名称可自定义,建议清晰易懂)
stage('代码拉取') {
// 可选:当前Stage的局部配置(仅对当前Stage生效)
options {
timeout(time: 5, unit: 'MINUTES') // 局部超时:当前阶段执行超过5分钟自动终止
}
// 必选:当前Stage的具体操作
steps {
git url: 'https://gitee.com/xxx/demo-service.git',
branch: 'dev',
credentialsId: 'git-ssh',
}
}
// 第二个Stage:项目构建
stage('项目构建') {
steps {
sh 'mvn clean package'
}
}
}
}
参数说明:
-
stages:顶层容器,只能在pipeline根节点下配置,内部可包含1个或多个stage,执行顺序为自上而下。
-
stage('阶段名称'):定义单个阶段,括号内的名称用于Jenkins界面显示,建议简洁明了(如"代码拉取""构建""部署")。
-
options(可选):当前stage的局部配置,优先级高于全局options,常用参数为timeout(超时时间)。
-
steps(必选):当前stage的核心操作,包含1个或多个执行指令(如git、sh、echo),是stage的必选内容。
易错点:每个stage必须包含steps块,否则会报语法错误;stages容器只能有一个,不能嵌套多个stages。
第二个必须掌握:Git 凭据使用(拉代码必学)
Git 账号、SSH 凭据,声明式标准写法:
- HTTP / 账号密码凭据
groovy
git url: 'https://gitee.com/xxx/demo.git',
branch: 'main',
credentialsId: 'git-http'
-
SSH 凭据(最常用、最安全)
git url: 'git@gitee.com:xxx/demo.git',
branch: 'main',
credentialsId: 'git-ssh'
✅ 关键:
credentialsId 填 Jenkins 里创建的凭据 ID,代码里永远不写密码
2.3 Steps(必选):核心操作指令
作用:Steps是stage的核心,包含具体的执行指令,是流水线的最小执行单元,所有实际操作(拉取代码、执行命令、输出日志)都在这里定义。
常用指令及参数详解(企业高频使用):
groovy
pipeline {
agent any
stages {
stage('常用操作演示') {
steps {
// 1. echo:输出日志(调试/通知用)
// 参数:日志内容(字符串)
echo '开始执行常用操作演示,当前时间:${new Date()}'
// 2. sh:执行Shell命令(最常用,适用于Linux/Mac节点)
// 参数:Shell命令字符串,支持多命令(用&&连接)
sh 'ls -l' // 查看当前目录文件
sh 'cd target && ls -l' // 切换目录并查看文件(&&表示前一个命令成功才执行后一个)
// 3. git:拉取Git代码
// 核心参数:
// url:Git仓库地址(http/ssh均可)
// branch:分支名称(如dev、main)
// credentialsId:可选,Git仓库登录凭据ID(避免明文密码)
git url: 'https://gitee.com/xxx/demo-service.git', branch: 'dev', credentialsId: 'git-login'
// 4. archiveArtifacts:归档构建产物(如jar包、前端dist包)
// 核心参数:
// artifacts:需要归档的文件路径(支持通配符,如target/*.jar)
// allowEmptyArchive:可选,默认false,设为true允许空归档(避免无产物时流水线失败)
archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true
// 5. cleanWs:清理工作空间(避免残留文件占用磁盘)
// 无核心参数,直接调用即可
cleanWs()
// 6. sleep:等待指定时间(单位:秒)
// 参数:等待时间(整数),适用于需要等待的场景(如服务启动)
sleep 10 // 等待10秒
// 7. timeout:单个步骤超时控制(局部超时,仅对当前步骤生效)
// 核心参数:time(时间)、unit(单位:SECONDS/MINUTES/HOURS)
timeout(time: 1, unit: 'MINUTES') {
sh 'curl http://test-api/health' // 接口健康检查,超时1分钟终止
}
// 8. retry:步骤失败后重试
// 核心参数:重试次数(整数),可选delay(延迟时间,单位:秒)
retry(3, delay: 5) {
sh 'mvn dependency:resolve' // 依赖下载失败,重试3次,每次间隔5秒
}
}
}
}
}
易错点:sh指令仅适用于Linux/Mac节点,Windows节点需使用bat指令(如bat 'dir');git指令的credentialsId需提前在Jenkins中配置凭据。
bash
pipeline {
tools {
maven 'maven'
jdk 'java'
nodejs 'node'
}
environment {
NPM_CONFIG_REGISTRY = 'https://registry.npmmirror.com/'
}
agent {
node {
label 'jenkins-slave'
customWorkspace '/home/jenkins/data'
}
}
stages {
stage('获取代码') {
options {
timeout(time: 5, unit: 'MINUTES')
}
steps {
git url: 'git@gitee.com:testpm/frontend-demo.git',
branch: 'master',
credentialsId: 'jenkins-slave-git'
}
}
stage('安装依赖') {
steps {
echo '显示当前所在目录'
sh 'pwd'
echo '清理旧依赖...'
sh 'rm -rf node_modules package-lock.json'
sh 'npm cache clean --force'
echo '安装依赖...'
sh 'npm install --legacy-peer-deps'
}
}
stage('编译构建') {
steps {
timeout(time: 15, unit: 'MINUTES') {
sh 'npm run build'
echo '构建完成,dist目录内容:'
sh 'ls -la dist/'
}
}
}
}
}
未完待续...