18.4.5 流水线示例与实践规范
本节以“构建→测试→制品管理”为主线给出可执行的流水线示例与实践规范,覆盖后端、前端与多模块项目,并补充安装准备、排错方法与练习。
流水线原理草图(从提交到制品库)
安装与准备(示例环境)
- Jenkins控制器与构建节点建议容器化,统一工具链版本
- 依赖:Git、JDK、Maven/Node、Docker、SonarQube(可选)、Nexus/Harbor
1) 使用Docker快速安装Jenkins(控制器)
# 1. 拉取镜像并启动
docker run -d --name jenkins \
-p 8080:8080 -p 50000:50000 \
-v /opt/jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
# 2. 获取初始密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
2) 构建节点基础工具安装(Linux)
# JDK + Git + Maven
yum -y install java-11-openjdk git maven
# Node.js(前端构建)
curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
yum -y install nodejs
# Docker(用于构建镜像)
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
示例一:后端服务流水线(Maven + 单测 + 制品入库)#
Jenkinsfile(Declarative Pipeline)
pipeline {
agent { label 'linux' }
environment {
MVN_OPTS = "-Dmaven.repo.local=${WORKSPACE}/.m2"
NEXUS_URL = "http://nexus.example.com:8081"
NEXUS_REPO = "maven-releases"
VERSION = "1.0.${BUILD_NUMBER}"
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh 'mvn -v'
sh "mvn clean package -DskipTests=false -Drevision=${VERSION}"
}
}
stage('UnitTest') {
steps {
sh 'mvn test'
junit 'target/surefire-reports/*.xml'
}
}
stage('Publish') {
steps {
sh """
mvn deploy \
-DskipTests=true \
-Drevision=${VERSION} \
-Dnexus.url=${NEXUS_URL} \
-Dnexus.repo=${NEXUS_REPO}
"""
}
}
}
post {
success { echo "Build ${VERSION} success" }
failure { echo "Build failed, check test report and logs" }
}
}
制品上传验证
# 通过Nexus REST检查制品是否上传
curl -u admin:admin123 \
"http://nexus.example.com:8081/service/rest/v1/search?name=demo-service"
示例二:前端应用流水线(Node + Lint + E2E + 制品归档)#
Jenkinsfile
pipeline {
agent { label 'linux' }
environment {
NODE_ENV = "production"
VERSION = "2.0.${BUILD_NUMBER}"
}
stages {
stage('Checkout') {
steps { checkout scm }
}
stage('Install') {
steps {
sh 'node -v && npm -v'
sh 'npm ci'
}
}
stage('Lint & Test') {
steps {
sh 'npm run lint'
sh 'npm run test:unit'
}
}
stage('Build') {
steps {
sh 'npm run build'
sh 'tar -czf dist.tar.gz dist/'
}
}
stage('Archive') {
steps {
archiveArtifacts artifacts: 'dist.tar.gz', fingerprint: true
}
}
}
}
示例三:多模块项目流水线(并行构建)#
Jenkinsfile
pipeline {
agent { label 'linux' }
environment {
VERSION = "3.1.${BUILD_NUMBER}"
}
stages {
stage('Checkout') { steps { checkout scm } }
stage('Parallel Build') {
parallel {
stage('module-a') {
steps { sh "mvn -pl module-a -am package -Drevision=${VERSION}" }
}
stage('module-b') {
steps { sh "mvn -pl module-b -am package -Drevision=${VERSION}" }
}
}
}
stage('Report') {
steps {
sh "ls -l module-*/target/"
archiveArtifacts artifacts: 'module-*/target/*.jar', fingerprint: true
}
}
}
}
关键命令解释与常用参数#
# Maven构建并使用自定义版本号
mvn clean package -Drevision=1.0.123
# -Drevision: 统一版本号,便于制品追溯
# 归档制品
tar -czf dist.tar.gz dist/
# -c创建 -z压缩 -f指定文件名
# Jenkins构建号变量
echo "BUILD_NUMBER=${BUILD_NUMBER}"
排错与故障定位#
1) 构建失败:依赖下载慢或失败
- 现象:mvn下载超时
- 处理:配置企业镜像仓库
cat ~/.m2/settings.xml
# 确认mirror配置指向公司Nexus
2) 单元测试失败
- 现象:Jenkins标红
- 处理:查看测试报告
ls target/surefire-reports/
grep -R "FAIL" target/surefire-reports/
3) 制品未入库
- 现象:Nexus搜索不到
- 处理:检查deploy日志与权限
grep -R "Uploading" -n target/maven-status/
curl -I http://nexus.example.com:8081
4) 并行阶段死锁或资源不足
- 现象:任务排队
- 处理:检查节点资源
df -h
free -m
docker info
流水线实践规范(落地版)#
- 统一版本规范:
主版本.次版本.BUILD_NUMBER - 构建环境容器化:固定JDK/Node/Docker版本
- 日志与报告必须归档:
archiveArtifacts+junit - 质量门禁强制:Lint、单测、覆盖率阈值
- 制品不可变:同版本禁止覆盖
- 失败即停止:任一阶段失败终止流水线
- 最小权限:制品库账号仅有上传权限
- 缓存加速:Maven/Node缓存目录显式配置
- 元数据记录:提交ID、构建号、依赖清单
- 可复现构建:同代码同依赖产生同制品
练习#
1) 按示例一创建Jenkins任务,替换为你自己的Git仓库,上传制品到Nexus。
2) 将示例二的制品上传改为Harbor镜像(基于Dockerfile构建并推送)。
3) 在示例三增加质量门禁(如测试覆盖率阈值),低于阈值则流水线失败。