Jenkins 流水线 Pipeline 声明式语法基础 入门----上

简单说,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 凭据,声明式标准写法:

  1. HTTP / 账号密码凭据
groovy 复制代码
git url: 'https://gitee.com/xxx/demo.git',
    branch: 'main',
    credentialsId: 'git-http'
  1. 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/'
                }
            }
        }
    }
}

未完待续...

相关推荐
七七powerful2 小时前
Nginx 日志切割完全指南:从原理到生产实战
运维·nginx
黑蛋同志2 小时前
KVM虚拟化热迁移
运维·虚拟化·kvm
爱学习的小囧2 小时前
ESXi CPU 使用率高怎么排查?esxtop 一键定位占用高的虚拟机与进程
java·linux·运维·服务器·网络·虚拟化
Fanfanaas2 小时前
Linux 进程篇 (四)
linux·运维·服务器·开发语言·c++·学习
终端行者2 小时前
Jenkins流水线Pipeline声明式语法基础入门----下
运维·jenkins·cicd
lifewange2 小时前
Jenkins Windows MSI 安装包完整安装教程
windows·servlet·jenkins
文慧的科技江湖2 小时前
光伏管理系统产品需求文档(PRD) -【详细功能需求及研发核心字段清单】
运维·开源·慧知重卡开源充电桩平台·慧知开源充电桩平台·开源充电桩平台·光伏开源管理系统
Jacob程序员2 小时前
Linux 下启动达梦数据库 Manager 图形化客户端
linux·运维·服务器