1. 项目概述
在当今的软件开发领域,持续集成和持续交付(CI/CD)已经成为团队协作和高效交付的标准实践。作为一名长期从事DevOps工作的工程师,我将在本文详细记录在Ubuntu 22.04 LTS系统上搭建GitLab和Jenkins实现完整CI/CD管道的全过程。
这个配置方案特别适合中小型技术团队,它结合了GitLab出色的代码管理能力和Jenkins强大的自动化构建特性。通过实际项目验证,这套系统能够将代码提交到生产环境部署的时间从原来的数小时缩短到15分钟以内,同时显著降低了人为错误的发生率。
2. 环境准备与工具选型
2.1 系统要求与初始配置
Ubuntu 22.04 LTS作为长期支持版本,提供了稳定的基础环境。以下是推荐的最低硬件配置:
- CPU: 4核及以上
- 内存: 8GB及以上
- 存储: 50GB SSD及以上
首先更新系统并安装基础工具包:
sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget vim net-tools提示:生产环境建议使用独立服务器或云主机,避免在开发机上直接部署。如果资源有限,可以适当降低配置,但性能会受到影响。
2.2 GitLab与Jenkins的版本选择
经过多个项目实践,我推荐以下版本组合:
- GitLab: 社区版(CE) 15.x 或更高
- Jenkins: LTS 2.346.x 或更高
这两个版本在Ubuntu 22.04上经过充分测试,具有最佳兼容性。GitLab提供完整的代码管理功能,而Jenkins则专注于构建和部署流程的自动化。
3. GitLab安装与配置
3.1 安装GitLab CE
执行以下命令安装GitLab:
sudo apt install -y ca-certificates curl openssh-server postfix curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt install -y gitlab-ce安装完成后进行初始配置:
sudo gitlab-ctl reconfigure3.2 基础安全设置
首次访问GitLab需要设置root密码,访问地址为:
http://your-server-ip关键安全配置项:
- 修改默认SSH端口(非22)
- 启用双因素认证
- 配置备份策略
- 设置项目默认可见性为私有
注意:生产环境务必配置HTTPS,可以使用Let's Encrypt免费证书:
sudo gitlab-ctl reconfigure sudo gitlab-ctl renew-letsencrypt3.3 项目仓库创建与权限管理
创建新项目时,建议采用以下命名规范:
[团队代号]-[项目类型]-[功能描述] 例如:dev-core-api, qa-automation-tests权限管理最佳实践:
- 开发人员:Developer权限
- 技术负责人:Maintainer权限
- 非技术人员:Reporter权限
4. Jenkins安装与配置
4.1 Jenkins安装与初始化
安装Java环境(Jenkins依赖):
sudo apt install -y openjdk-11-jdk添加Jenkins仓库并安装:
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \ /usr/share/keyrings/jenkins-keyring.asc > /dev/null echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list > /dev/null sudo apt update sudo apt install -y jenkins获取初始管理员密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword4.2 关键插件安装
必须安装的插件列表:
- GitLab Plugin
- Pipeline
- Blue Ocean
- Docker Pipeline
- Credentials Binding
安装完成后重启Jenkins:
sudo systemctl restart jenkins4.3 系统配置优化
调整Jenkins系统配置以提高性能:
- 修改
/etc/default/jenkins中的JAVA_OPTS:
JAVA_OPTS="-Djava.awt.headless=true -Xms1024m -Xmx2048m"- 配置执行器数量(根据CPU核心数调整)
- 设置合理的构建保留策略
5. GitLab与Jenkins集成
5.1 API访问配置
在GitLab中创建API访问令牌:
- 用户设置 → Access Tokens
- 勾选api、read_user、read_repository权限
- 记录生成的token
在Jenkins中配置GitLab连接:
- 系统管理 → 系统配置
- 找到GitLab配置部分
- 输入GitLab URL和API token
5.2 Webhook配置实现自动触发
在GitLab项目中设置Webhook:
- 项目设置 → Webhooks
- 输入Jenkins的GitLab插件URL:
http://jenkins-server/gitlab/build_now- 触发事件选择"Push events"和"Merge request events"
测试Webhook连通性,确保Jenkins能接收GitLab的事件通知。
6. CI/CD流水线设计
6.1 基础Pipeline脚本示例
以下是一个典型的Jenkinsfile示例,包含构建、测试、部署三个阶段:
pipeline { agent any stages { stage('Build') { steps { sh 'mvn clean package' archiveArtifacts artifacts: 'target/*.jar', fingerprint: true } } stage('Test') { steps { sh 'mvn test' junit 'target/surefire-reports/*.xml' } } stage('Deploy') { when { branch 'main' } steps { sh 'scp target/*.jar user@production:/opt/app' sh 'ssh user@production "systemctl restart app-service"' } } } }6.2 多环境部署策略
成熟的CI/CD流程应该包含多个环境:
- DEV:开发环境,每次提交都部署
- QA:测试环境,通过代码审查后部署
- STAGING:预生产环境,模拟生产配置
- PROD:生产环境,手动触发部署
实现方法:
environment { DEPLOY_ENV = "${env.BRANCH_NAME == 'main' ? 'prod' : 'dev'}" }6.3 容器化部署方案
对于现代应用,推荐使用Docker进行部署。更新部署阶段如下:
stage('Deploy') { steps { script { docker.build("my-app:${env.BUILD_ID}").push() sshagent(['production-ssh']) { sh """ ssh user@production " docker pull my-app:${env.BUILD_ID} docker stop running-app || true docker rm running-app || true docker run -d --name running-app -p 8080:8080 my-app:${env.BUILD_ID} " """ } } } }7. 高级配置与优化
7.1 构建缓存与依赖管理
对于Java项目,可以缓存Maven依赖:
stage('Build') { steps { sh 'mvn -Dmaven.repo.local=/tmp/m2repo clean package' } post { success { stash includes: '/tmp/m2repo/**', name: 'm2repo' } } }在后续构建中恢复缓存:
stage('Restore Cache') { steps { unstash 'm2repo' } }7.2 并行测试执行
加快测试阶段执行速度:
stage('Test') { parallel { stage('Unit Tests') { steps { sh 'mvn test' } } stage('Integration Tests') { steps { sh 'mvn integration-test' } } } post { always { junit 'target/**/TEST-*.xml' } } }7.3 安全扫描集成
在流水线中添加安全扫描阶段:
stage('Security Scan') { steps { sh 'mvn org.owasp:dependency-check-maven:check' dependencyCheckPublisher pattern: '**/dependency-check-report.xml' } }8. 监控与维护
8.1 构建监控看板
配置Jenkins监控看板:
- 安装Monitoring插件
- 设置构建成功率、构建时长等关键指标
- 配置异常构建的邮件/IM通知
8.2 定期备份策略
GitLab备份:
sudo gitlab-rake gitlab:backup:createJenkins备份:
- 安装ThinBackup插件
- 配置每日全量备份
- 备份文件存储到远程服务器
8.3 性能调优建议
常见性能问题解决方案:
- 构建队列过长:增加执行器或使用Jenkins Agent
- 内存不足:调整JVM参数,增加swap空间
- 磁盘IO瓶颈:使用SSD或分布式存储
9. 常见问题排查
9.1 GitLab Webhook失败
检查步骤:
- 确认Jenkins的GitLab插件已正确安装
- 检查网络连通性(防火墙、安全组)
- 验证API token是否有足够权限
- 查看Jenkins和GitLab的日志文件
9.2 Jenkins构建卡住
可能原因:
- 执行器被占用
- 资源不足(内存、CPU)
- 死锁或僵尸进程
解决方案:
sudo systemctl restart jenkins9.3 部署失败回滚方案
实现自动化回滚:
stage('Rollback') { when { expression { currentBuild.result == 'FAILURE' } } steps { sshagent(['production-ssh']) { sh """ ssh user@production " docker stop running-app || true docker rm running-app || true docker run -d --name running-app -p 8080:8080 my-app:${env.PREVIOUS_SUCCESSFUL_BUILD} " """ } } }10. 实际项目经验分享
在最近的一个微服务项目中,我们采用了这套CI/CD方案,实现了以下改进:
- 构建时间从45分钟缩短到8分钟
- 部署频率从每周1次提升到每天多次
- 生产环境故障率降低70%
关键优化点:
- 使用Docker构建缓存
- 实现测试的并行执行
- 配置多级部署流水线
特别提醒:在实施过程中,一定要逐步推进,先从非关键业务开始试点,验证流程稳定后再推广到核心系统。同时,完善的文档和团队培训同样重要,确保所有成员都能正确使用这套系统。