Jenkins 基于 GitLab 分支与 Tag 的自动化打包发布实践
Jenkins 自动化打包的核心目标,是让代码从 GitLab 分支或 Tag 进入一条可重复、可追踪、可回滚的构建流程。
这篇文章从 Freestyle 操作升级为 Jenkinsfile / Pipeline 思路,整理分支构建、Tag 构建、参数化构建、制品归档和发布注意事项。
CI/CD 系列文章
本文属于 Jenkins + GitLab + SonarQube CI/CD 系列,相关内容可以继续阅读:
- Git 提交规范实践:Conventional Commits、Commitizen 与 CHANGELOG 自动生成
- GitLab Docker 部署与 Personal Access Token 配置指南
- Jenkins 安装部署与 JDK、Maven、Agent 构建环境配置
- GitLab Webhook 触发 Jenkins Pipeline:Push、Tag 与 Merge Request 自动构建
- Jenkins 基于 GitLab 分支与 Tag 的自动化打包发布实践
- Jenkins 集成 SonarQube:代码扫描、质量门禁与 Pipeline 实践
- SonarQube Docker 部署与 Java 项目静态代码分析指南
- SonarQube for IDE 使用指南:IntelliJ 安装、Connected Mode 与规则同步
- SonarQube LTA 升级与数据库迁移指南:从旧版本到 8.9/9.9/2025 LTA
分支构建与 Tag 构建
| 类型 | 适用场景 |
|---|---|
| 分支构建 | 开发、测试、集成环境 |
| Tag 构建 | 正式发布、可回滚版本 |
| 参数化构建 | 手动选择分支、Tag、环境 |
建议:
- 测试环境可以按分支构建。
- 生产发布优先按 Tag 构建。
- 每次发布保留构建日志和制品。
Jenkinsfile 示例
pipeline {
agent any
tools {
jdk 'jdk17'
maven 'maven-3.9'
}
parameters {
string(name: 'GIT_REF', defaultValue: 'main', description: '分支或 Tag')
}
stages {
stage('Checkout') {
steps {
checkout scm
sh 'git checkout ${GIT_REF}'
}
}
stage('Build') {
steps {
sh 'mvn -B clean package -DskipTests'
}
}
stage('Archive') {
steps {
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
}
}
使用 Git Tag 发布
创建 Tag:
git tag -a v1.2.0 -m "release v1.2.0"
git push origin v1.2.0
Jenkins 可以通过 Tag Webhook 触发,也可以手动选择 Tag 构建。
Maven 构建参数
常见命令:
mvn -B clean package -DskipTests
如果是生产发布,不建议默认跳过测试。更推荐:
mvn -B clean verify
根据团队情况区分:
- 快速测试环境:可跳过部分慢测试。
- 生产发布:应执行单元测试、质量扫描和必要集成测试。
制品归档
Jenkins 中要归档:
- JAR / WAR。
- 构建日志。
- 测试报告。
- SonarQube 扫描结果链接。
- 版本号和 Git Commit ID。
示例:
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
junit 'target/surefire-reports/*.xml'
发布注意事项
- 不要从未打 Tag 的临时代码发布生产。
- 构建参数要记录在 Jenkins Build 中。
- 发布制品要能追溯 Git Commit。
- 密码、Token、服务器密钥必须使用 Jenkins Credentials。
- 发布失败要有回滚方案。
常见问题
1. 拉不到 Tag
检查 Git refspec 是否包含 tags。
git fetch --tags
2. 构建版本号不一致
建议将 Tag 或 Commit ID 写入制品元数据,例如 build-info.properties。
3. 同一个 Job 被重复触发
检查 GitLab Webhook 事件是否同时勾选 Push 和 Tag,并在 Jenkins 中增加触发条件过滤。
参考资料
License:
CC BY 4.0