1. DevOps工具链部署概述
在现代化软件开发流程中,持续集成与持续交付(CI/CD)已成为不可或缺的环节。作为DevOps工具链中的两大核心组件,GitLab和Jenkins的协同部署能够为开发团队提供完整的代码管理、自动化构建和部署能力。GitLab作为一体化的DevOps平台,提供了从代码托管到CI/CD的全套解决方案;而Jenkins作为老牌的自动化服务器,则在构建流程的灵活性和插件生态方面具有独特优势。
在实际生产环境中,我们通常会遇到以下典型需求场景:
- 开发团队需要将代码变更自动触发构建和测试流程
- 运维团队需要可靠的方式将构建产物部署到不同环境
- 项目管理者需要实时了解构建状态和部署进度
- 安全团队需要对整个流程进行权限控制和审计
2. 环境准备与基础安装
2.1 系统要求与依赖检查
在开始安装前,我们需要确保系统满足以下最低要求:
硬件要求:
- CPU:至少4核(推荐8核)
- 内存:8GB(推荐16GB)
- 磁盘空间:50GB可用空间(SSD推荐)
软件依赖:
- 操作系统:Rocky Linux 9.5/Ubuntu 22.04 LTS/CentOS Stream 9
- Java:OpenJDK 11+(Jenkins依赖)
- Ruby:2.7+(GitLab依赖)
- PostgreSQL:12+(GitLab可选)
- Redis:6.0+(GitLab可选)
提示:对于生产环境,建议将GitLab和Jenkins部署在独立的服务器上,以避免资源竞争和单点故障问题。
2.2 GitLab安装与配置
2.2.1 通过官方仓库安装GitLab
对于Rocky Linux 9.5系统,安装步骤如下:
# 添加GitLab官方仓库 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash # 安装GitLab企业版(社区版将gitlab-ee替换为gitlab-ce) sudo EXTERNAL_URL="https://gitlab.yourdomain.com" dnf install -y gitlab-ee # 首次配置(此过程可能需要较长时间) sudo gitlab-ctl reconfigure安装完成后,访问配置的EXTERNAL_URL,系统会提示设置管理员(root)密码。首次登录后,建议立即进行以下安全配置:
- 修改默认管理员密码
- 配置SMTP邮件服务
- 设置HTTPS证书(可通过Let's Encrypt自动获取)
- 配置备份策略
2.2.2 Docker方式部署GitLab
对于希望快速体验或资源有限的环境,可以使用Docker部署:
docker run --detach \ --hostname gitlab.yourdomain.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ee:latest2.3 Jenkins安装与配置
2.3.1 通过官方仓库安装Jenkins
对于Rocky Linux 9.5系统:
# 添加Jenkins仓库 sudo wget -O /etc/yum.repos.d/jenkins.repo \ https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key # 安装OpenJDK和Jenkins sudo dnf install -y java-11-openjdk jenkins # 启动并设置开机自启 sudo systemctl enable --now jenkins # 查看初始管理员密码 sudo cat /var/lib/jenkins/secrets/initialAdminPassword访问http://your-server-ip:8080,输入初始密码完成安装向导。建议选择"安装推荐插件"选项,这会包含GitLab插件在内的常用插件。
2.3.2 Docker方式部署Jenkins
使用Docker部署Jenkins的推荐命令:
docker run --name jenkins -d \ -p 8080:8080 -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ jenkins/jenkins:lts-jdk113. GitLab与Jenkins集成配置
3.1 GitLab插件安装与配置
在Jenkins中安装GitLab插件:
- 登录Jenkins管理界面
- 导航到"Manage Jenkins" > "Manage Plugins"
- 在"Available"选项卡中搜索"GitLab Plugin"
- 勾选并安装(同时会自动安装依赖插件)
安装完成后需要进行系统级配置:
- 导航到"Manage Jenkins" > "Configure System"
- 找到"GitLab"部分
- 添加GitLab服务器连接:
- Name: GitLab-Production
- GitLab host URL: https://gitlab.yourdomain.com
- Credentials: 添加GitLab API令牌(需先在GitLab中生成)
3.2 项目级集成配置
3.2.1 GitLab项目配置
在GitLab项目中设置CI/CD集成:
- 进入项目设置 > "Integrations"
- 添加Jenkins服务:
- Jenkins server URL: http://jenkins.yourdomain.com
- Project name: 对应Jenkins中的项目名称
- Username/Password: Jenkins认证信息
3.2.2 Jenkins项目配置
创建新的Jenkins项目时:
- 选择"Freestyle project"或"Pipeline"类型
- 在源码管理部分选择Git,配置仓库URL和认证方式
- 在构建触发器部分勾选"Build when a change is pushed to GitLab"
- 配置高级选项:
- Secret token: 用于验证Webhook请求
- Allowed branches: 指定触发构建的分支
3.3 Webhook配置与测试
GitLab通过Webhook通知Jenkins代码变更:
- 在GitLab项目设置中进入"Webhooks"
- 添加新的Webhook:
- URL: http://jenkins.yourdomain.com/project/
- Secret Token: 与Jenkins配置中一致
- Trigger: 选择Push events和Merge Request events
- 测试Webhook连接,确保返回状态码为200
4. 高级配置与优化
4.1 安全加固配置
4.1.1 GitLab安全配置
强制使用HTTPS:
# /etc/gitlab/gitlab.rb external_url 'https://gitlab.yourdomain.com' nginx['redirect_http_to_https'] = true配置SSH密钥认证:
# 生成SSH密钥对 ssh-keygen -t ed25519 -C "your_email@example.com" # 将公钥添加到GitLab账户 cat ~/.ssh/id_ed25519.pub | pbcopy设置项目访问权限:
- 私有项目默认权限
- 分支保护规则
- 合并请求批准规则
4.1.2 Jenkins安全配置
启用矩阵权限控制:
- 管理 > 全局安全配置
- 选择"Project-based Matrix Authorization Strategy"
- 为不同角色分配细粒度权限
配置CSRF防护:
- 管理 > 全局安全配置
- 勾选"Prevent Cross Site Request Forgery exploits"
- 使用Crumb Issuer
4.2 性能优化
4.2.1 GitLab性能调优
调整Sidekiq并发数:
# /etc/gitlab/gitlab.rb sidekiq['max_concurrency'] = 20配置缓存:
gitlab_rails['redis_cache_instance'] = 'redis://localhost:6379/10'定期执行Housekeeping:
git gc --aggressive --prune=now
4.2.2 Jenkins性能优化
调整JVM参数:
# /etc/sysconfig/jenkins JAVA_OPTS="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=512m"配置构建代理:
- 设置永久性代理节点
- 使用Docker动态代理
定期清理构建历史:
- 安装"Discard Old Build"插件
- 配置项目级保留策略
4.3 备份与恢复
4.3.1 GitLab备份策略
创建手动备份:
sudo gitlab-backup create配置自动备份:
# /etc/gitlab/gitlab.rb gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 # 保留7天备份恢复流程:
sudo gitlab-ctl stop unicorn sudo gitlab-ctl stop sidekiq sudo gitlab-backup restore BACKUP=timestamp sudo gitlab-ctl reconfigure sudo gitlab-ctl restart
4.3.2 Jenkins备份策略
使用ThinBackup插件:
- 配置定期完整备份
- 设置备份保留策略
手动备份关键目录:
- /var/lib/jenkins/jobs/
- /var/lib/jenkins/config.xml
- /var/lib/jenkins/plugins/
恢复流程:
- 停止Jenkins服务
- 替换备份文件
- 重启服务
5. 常见问题排查
5.1 认证问题
问题现象:Login failed. Check API token or GitLab version
解决方案:
- 确认GitLab API令牌具有足够权限(至少需要api范围)
- 检查Jenkins中配置的GitLab版本是否与实际匹配
- 验证网络连接是否通畅,特别是HTTPS证书是否受信
5.2 Webhook问题
问题现象:Webhook测试返回403错误
排查步骤:
- 检查Jenkins的CSRF防护配置
- 验证Secret Token是否匹配
- 检查Jenkins匿名用户是否有Job的读取权限
5.3 构建触发问题
问题现象:代码推送未触发Jenkins构建
排查步骤:
- 检查GitLab项目的Webhook日志
- 验证Jenkins项目的构建触发器配置
- 检查分支过滤规则是否匹配
5.4 性能问题
问题现象:构建队列积压或响应缓慢
优化建议:
- 增加Jenkins执行器数量
- 配置构建代理节点
- 优化构建脚本,减少不必要的步骤
5.5 插件兼容性问题
问题现象:groovy.lang.MissingPropertyException
解决方案:
- 检查插件版本是否兼容
- 更新相关插件到最新稳定版
- 检查Pipeline脚本语法
6. 最佳实践与经验分享
在实际生产环境中部署GitLab和Jenkins集成时,我们总结了以下经验:
权限管理:遵循最小权限原则,为不同角色配置精确的访问控制。GitLab和Jenkins的权限系统要同步考虑。
网络配置:确保GitLab和Jenkins服务器之间的网络延迟低(<5ms),特别是当处理大型仓库时。
构建策略:
- 为特性分支启用快速反馈构建(只运行单元测试)
- 为主分支配置完整构建流程(包含集成测试和代码质量扫描)
- 使用标签触发生产环境部署
监控告警:
- 配置Prometheus监控关键指标
- 设置构建失败告警
- 跟踪构建时长趋势
灾备方案:
- 定期测试备份恢复流程
- 考虑多活部署方案
- 文档化应急操作流程
扩展性考虑:
- 使用Jenkins Shared Libraries共享通用逻辑
- 开发自定义GitLab模板
- 考虑GitLab CI/CD与Jenkins的混合使用策略
维护窗口:
- 安排定期的维护时段
- 提前通知团队系统升级计划
- 在低峰期执行资源密集型操作