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

流水线实践规范(落地版)#

  1. 统一版本规范:主版本.次版本.BUILD_NUMBER
  2. 构建环境容器化:固定JDK/Node/Docker版本
  3. 日志与报告必须归档:archiveArtifacts + junit
  4. 质量门禁强制:Lint、单测、覆盖率阈值
  5. 制品不可变:同版本禁止覆盖
  6. 失败即停止:任一阶段失败终止流水线
  7. 最小权限:制品库账号仅有上传权限
  8. 缓存加速:Maven/Node缓存目录显式配置
  9. 元数据记录:提交ID、构建号、依赖清单
  10. 可复现构建:同代码同依赖产生同制品

练习#

1) 按示例一创建Jenkins任务,替换为你自己的Git仓库,上传制品到Nexus。
2) 将示例二的制品上传改为Harbor镜像(基于Dockerfile构建并推送)。
3) 在示例三增加质量门禁(如测试覆盖率阈值),低于阈值则流水线失败。