Jenkins CICD 进阶 - Pipeline 流水线
什么是 Jenkins Pipeline
Jenkins Pipeline 是使用代码(而非 GUI 配置)来定义整个 CI/CD 流水线的方式。流水线配置以 Jenkinsfile 文件形式存储在项目代码仓库中,实现了"配置即代码"(Configuration as Code)。
Jenkins 2.x 之后版本原生支持 Pipeline。当前 LTS 版本推荐使用 Java 17 或 Java 21。
Pipeline vs 自由风格项目
| 对比项 | 自由风格项目 | Pipeline |
|---|---|---|
| 配置方式 | GUI 界面操作 | 代码文件(Jenkinsfile) |
| 版本管理 | 无法追踪变更 | 跟随 Git 提交历史 |
| 复用性 | 低,每个项目重新配置 | 高,模板化复用 |
| 可视化 | 简单的阶段视图 | Blue Ocean / Stage View |
| 跨平台 | 困难 | 支持 agent 标签分发 |
| 复杂流程 | 难以实现 | 支持并行、条件、循环 |
| 调试 | 查看构建日志 | 单阶段重试、日志隔离 |
核心概念
Pipeline(流水线)
├── Agent(代理/节点) ── 在哪里执行
├── Stage(阶段) ── 执行什么阶段
│ └── Step(步骤) ── 具体做什么
├── Post(后置处理) ── 完成后做什么
└── Environment(环境变量)── 运行时参数
text
| 概念 | 说明 |
|---|---|
| Node | 节点,执行流水线的机器环境(Java/Node/Python) |
| Stage | 阶段,如 Build / Test / Deploy |
| Step | 步骤,如安装依赖、构建制品 |
| Agent | 定义执行器,any 表示任意可用节点 |
| Tools | 自动安装并配置工具(如 Node.js) |
Jenkinsfile 语法
Declarative Pipeline 基本结构
// Jenkinsfile (Declarative Pipeline)
pipeline {
agent any // 在任意节点执行
tools {
nodejs 'NodeJS-18' // 使用全局配置的 Node.js 18
}
stages {
stage('Checkout') { // 阶段:获取代码
steps {
git branch: 'main',
credentialsId: 'deploy-key',
url: 'git@github.com:team/frontend-vue.git'
}
}
stage('Install') { // 阶段:安装依赖
steps {
sh 'npm install'
}
}
stage('Build') { // 阶段:构建
steps {
sh 'npm run build'
}
}
stage('Test') { // 阶段:测试
steps {
sh 'npm run test'
}
}
stage('Deploy') { // 阶段:部署
steps {
sh 'ls -la dist/'
// 部署到服务器
// sh 'scp -r dist/* user@server:/var/www/html/'
}
}
}
post {
always {
echo 'Pipeline finished.'
cleanWs() // 清理工作空间
}
success {
echo 'Build succeeded!'
}
failure {
echo 'Build failed!'
}
}
}
groovy
使用 Docker Agent
pipeline {
agent {
docker {
image 'node:18-alpine'
args '-p 3000:3000'
}
}
stages {
stage('Install & Build') {
steps {
sh 'npm ci'
sh 'npm run build'
}
}
}
}
groovy
使用 Tools 指令
tools 指令可以自动安装并配置指定工具到 PATH:
pipeline {
agent any
tools {
nodejs 'NodeJS-18' // 需在 Jenkins 全局工具配置中预先定义
}
stages {
stage('Build') {
steps {
sh 'node --version' // 可直接使用
sh 'npm --version'
}
}
}
}
groovy
在 Jenkins 全局工具配置(Manage Jenkins → Tools)中添加 NodeJS 安装器,指定版本号即可。
环境变量与参数
pipeline {
agent any
environment {
APP_NAME = 'frontend-vue'
DEPLOY_PATH = '/var/www/html'
}
parameters {
string(name: 'BRANCH', defaultValue: 'main', description: '构建分支')
choice(name: 'ENV', choices: ['staging', 'production'], description: '部署环境')
}
stages {
stage('Checkout') {
steps {
git branch: params.BRANCH,
url: 'git@github.com:team/frontend-vue.git'
}
}
stage('Deploy') {
steps {
echo "Deploying ${env.APP_NAME} to ${params.ENV}"
echo "Deploy path: ${env.DEPLOY_PATH}"
}
}
}
}
groovy
并行执行
pipeline {
agent any
stages {
stage('Parallel Tests') {
parallel {
stage('Unit Tests') {
steps {
sh 'npm run test:unit'
}
}
stage('E2E Tests') {
steps {
sh 'npm run test:e2e'
}
}
stage('Lint') {
steps {
sh 'npm run lint'
}
}
}
}
}
}
groovy
安装 Pipeline 相关插件
在 Jenkins 管理界面安装以下插件:
| 插件 | 用途 |
|---|---|
| Pipeline | Pipeline 核心功能 |
| Pipeline: Stage View | 阶段视图 |
| Blue Ocean | 现代化 Pipeline 可视化界面 |
| Build Step | 构建步骤支持 |
| Input Step | 交互式输入步骤 |
| Stage Step | 阶段步骤支持 |
| NodeJS Plugin | Node.js 工具支持 |
安装路径:Manage Jenkins → Plugins → Available plugins → 搜索 pipeline
创建 Pipeline 的两种方式
方式一:Blue Ocean(推荐)
Blue Ocean 提供了现代化的 Pipeline 创建和可视化界面:
- 首页点击 Open Blue Ocean
- 点击 New Pipeline
- 选择代码仓库类型(Git)
- 输入仓库地址和凭据
- Jenkins 自动扫描
Jenkinsfile并创建流水线
Blue Ocean 的优势:
- 阶段可视化,每个阶段独立显示
- 点击阶段查看详细日志
- 单阶段可重试
- 构建状态图标直观(太阳 = 健康,云朵 = 不稳定)
方式二:经典 UI
- New Item → Pipeline
- 在 Pipeline 配置中选择:
- Pipeline script:直接粘贴脚本(适合调试)
- Pipeline script from SCM:从仓库读取 Jenkinsfile(推荐生产使用)
- 配置仓库地址、分支、凭据
- 保存并构建
流水线语法生成器
Jenkins 内置了语法生成工具,帮助快速生成 Pipeline 代码片段。
打开方式
- 创建一个 Pipeline 项目
- 保存后,左侧菜单出现 Pipeline Syntax
- 进入语法生成器页面
片段生成器(Snippet Generator)
选择需要的步骤,填写参数,点击 Generate Pipeline Script 即可生成代码:
// 示例:生成 git checkout 步骤
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
userRemoteConfigs: [[
credentialsId: 'deploy-key',
url: 'git@github.com:team/frontend-vue.git'
]]
])
groovy
Declarative Directive Generator
用于生成 agent、tools、environment 等指令:
// 示例:生成 tools 指令
tools {
nodejs 'NodeJS-18'
}
groovy
构建触发机制
三种触发方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| cron | 定时触发 | 定时构建、夜间构建 |
| pollSCM | 定时轮询代码变更 | 防火墙限制 Webhook 时使用 |
| upstream | 由其他项目触发 | 多项目联动 |
配置触发器
pipeline {
agent any
triggers {
// 定时:每天凌晨 2 点构建
cron('0 2 * * *')
// 轮询 SCM:每分钟检查代码变更
pollSCM('H/1 * * * *')
// 上游项目触发
upstream(upstreamProjects: 'project-a, project-b',
threshold: hudson.model.Result.SUCCESS)
}
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
}
}
groovy
pollSCM比 Webhook 更稳定可靠,不受防火墙限制。推荐在生产环境配置轮询。
多分支流水线触发器
在项目配置中:
- 找到 Scan Multibranch Pipeline Triggers
- 勾选 Periodically if not otherwise run
- 设置间隔(如
1 minute)
实战:Vue 项目完整 Pipeline
// Jenkinsfile
pipeline {
agent any
tools {
nodejs 'NodeJS-18'
}
environment {
REGISTRY = '192.168.31.77:10090'
IMAGE_NAME = 'frontend-vue'
DEPLOY_SERVER = 'user@production-server'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh 'npm ci'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm run test'
}
}
stage('Docker Build & Push') {
steps {
sh """
docker build -t ${REGISTRY}/library/${IMAGE_NAME}:${BUILD_NUMBER} .
docker tag ${REGISTRY}/library/${IMAGE_NAME}:${BUILD_NUMBER} ${REGISTRY}/library/${IMAGE_NAME}:latest
docker push ${REGISTRY}/library/${IMAGE_NAME}:${BUILD_NUMBER}
docker push ${REGISTRY}/library/${IMAGE_NAME}:latest
"""
}
}
stage('Deploy') {
steps {
sh """
ssh ${DEPLOY_SERVER} "
docker pull ${REGISTRY}/library/${IMAGE_NAME}:latest
docker stop ${IMAGE_NAME} || true
docker rm ${IMAGE_NAME} || true
docker run -d --name ${IMAGE_NAME} -p 80:80 ${REGISTRY}/library/${IMAGE_NAME}:latest
"
"""
}
}
}
post {
always {
cleanWs()
}
failure {
echo "Build ${env.BUILD_NUMBER} failed!"
// 可集成钉钉/企业微信通知
}
success {
echo "Build ${env.BUILD_NUMBER} succeeded!"
}
}
}
groovy
Pipeline 学习建议
从 GUI 过渡到 Jenkinsfile
- 先创建一个经典 Pipeline 项目
- 在 GUI 中直接编写和调试 Script
- 调试通过后,将 Script 复制为
Jenkinsfile提交到仓库 - 切换为 Pipeline script from SCM 模式
借助 AI 辅助编写
可以借助 AI 工具快速生成基础 Jenkinsfile:
提示词示例:
"帮我写一个 Vue 项目的 Jenkinsfile,包含获取代码、安装依赖、
构建、测试、部署到 Docker 的完整流程,使用 Node 18 环境"
text
AI 生成后,结合片段生成器进行验证和调整。
常用内置变量
| 变量 | 说明 |
|---|---|
env.BUILD_NUMBER | 当前构建号 |
env.BUILD_ID | 构建 ID |
env.JENKINS_URL | Jenkins 服务器地址 |
env.WORKSPACE | 工作空间路径 |
env.BRANCH_NAME | 当前分支名 |
env.GIT_COMMIT | 当前 Git Commit |
params.* | 自定义参数 |
小结
| 场景 | 推荐方案 |
|---|---|
| 个人项目/小团队 | 自由风格项目,GUI 配置 |
| 多分支团队项目 | Pipeline + Jenkinsfile |
| 复杂 CI/CD 流程 | Pipeline + Shared Libraries |
| 学习 Pipeline | 经典 UI 直接编写 Script,调试通过后迁移到 Jenkinsfile |
Pipeline 是现代 CI/CD 的核心,掌握它有助于理解 GitHub Actions、GitLab CI 等工具的设计理念,核心思想一通百通。
参考资源
↑