1. 为什么需要自建GitLab CI/CD服务器?
当团队规模超过5人时,每次代码提交后的手动构建和部署就会成为效率瓶颈。我们团队曾经历过这样的困境:前端提交了样式修改,后端改了API接口,测试环境需要人工协调部署顺序,经常出现"我本地是好的"这类经典甩锅场景。自建GitLab CI/CD的核心价值在于用自动化流程替代这些重复劳动。
选择GitLab而非Jenkins等工具的主要原因有三点:
- 原生集成:GitLab本身提供代码托管,与CI/CD流水线无缝衔接
- 配置即代码:.gitlab-ci.yml文件版本化存储,变更可追溯
- 资源利用率:相比云托管方案,自建服务器长期使用成本更低
重要提示:生产环境建议使用独立物理服务器或高配云主机,2核4G是最低配置。我们曾尝试在1核2G的测试机上运行,并发构建时频繁出现OOM(内存不足)崩溃。
2. 服务器基础环境准备
2.1 Ubuntu系统选择与优化
我们选择Ubuntu 22.04 LTS作为基础系统,长期支持版本能获得稳定更新。安装时注意:
- 分区方案:建议单独挂载/var目录,GitLab默认将数据存储于此
- 交换空间:物理内存的1.5倍(8G内存配12G swap)
- 时区设置:
timedatectl set-timezone Asia/Shanghai
系统基础优化命令:
bash复制# 禁用不必要的服务
sudo systemctl disable --now apparmor
# 调整文件描述符限制
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
# 内核参数优化
cat <<EOF | sudo tee -a /etc/sysctl.conf
vm.swappiness = 10
net.core.somaxconn = 1024
EOF
sudo sysctl -p
2.2 依赖组件安装
GitLab需要这些基础组件:
bash复制sudo apt update && sudo apt install -y \
ca-certificates \
curl \
openssh-server \
postfix \
tzdata \
perl \
docker.io
特别提醒:Postfix用于邮件通知,如果已有邮件服务器可跳过安装,但必须配置SMTP中继。我们曾因未配置邮件服务导致流水线失败通知无法送达,耽误了故障处理。
3. GitLab核心服务部署
3.1 官方仓库配置
添加GitLab官方源:
bash复制curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
企业版需要替换为gitlab-ee,并配置许可证文件。社区版(CE)对中小团队完全够用,我们50人团队使用CE版三年未遇到功能限制。
3.2 安装与初始配置
执行安装命令(替换yourdomain为实际域名):
bash复制sudo EXTERNAL_URL="http://yourdomain" apt install gitlab-ce
安装完成后关键目录说明:
- /etc/gitlab:配置文件目录
- /var/opt/gitlab:应用数据目录
- /var/log/gitlab:日志目录
首次登录需要重置root密码:
bash复制sudo gitlab-rake "gitlab:password:reset[root]"
3.3 关键安全配置
修改/etc/gitlab/gitlab.rb核心参数:
ruby复制external_url 'https://gitlab.example.com' # 必须HTTPS
letsencrypt['enable'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 修改默认SSH端口
配置生效命令:
bash复制sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
血泪教训:曾因直接使用HTTP导致中间人攻击,代码被篡改。务必启用HTTPS!
4. Runner服务部署与对接
4.1 安装GitLab Runner
添加官方源并安装:
bash复制curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner
4.2 注册Runner到GitLab
获取注册Token(管理员登录后):
- 顶部菜单Admin → Overview → Runners → "Register an instance runner"
执行注册命令:
bash复制sudo gitlab-runner register \
--url "https://gitlab.example.com" \
--registration-token "PROJECT_REGISTRATION_TOKEN" \
--executor "docker" \
--docker-image alpine:latest \
--description "docker-runner" \
--tag-list "docker,aws" \
--run-untagged="true" \
--locked="false"
4.3 配置优化建议
修改/etc/gitlab-runner/config.toml关键参数:
toml复制concurrent = 4
check_interval = 0
[[runners]]
executor = "docker"
[runners.docker]
privileged = true
volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
重启服务使配置生效:
bash复制sudo gitlab-runner restart
5. 典型CI/CD流水线配置
5.1 基础.gitlab-ci.yml示例
前端项目模板:
yaml复制stages:
- install
- build
- test
- deploy
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
install_dependencies:
stage: install
image: node:16
script:
- npm install
only:
- merge_requests
- master
build_project:
stage: build
image: node:16
script:
- npm run build
artifacts:
paths:
- dist/
5.2 高级功能实现
跨项目触发:
yaml复制trigger_backend:
stage: deploy
trigger:
project: group/backend
branch: master
手动审批部署:
yaml复制production_deploy:
stage: deploy
script:
- ./deploy.sh prod
when: manual
only:
- master
5.3 排错技巧
常见问题排查命令:
bash复制# 查看Runner日志
sudo gitlab-runner --debug run
# 检查GitLab服务状态
sudo gitlab-ctl status
# 重置Redis缓存
sudo gitlab-rake cache:clear
我们遇到过最棘手的缓存问题:Runner的docker executor缓存未及时清理,导致构建使用旧依赖。解决方案是在job中添加强制清理:
yaml复制before_script:
- docker system prune -f
6. 生产环境维护要点
6.1 备份策略
每日全量备份命令:
bash复制sudo gitlab-backup create
备份文件默认存储在/var/opt/gitlab/backups,建议添加异地备份:
bash复制sudo crontab -e
# 每天2点执行备份并同步到OSS
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create && aws s3 sync /var/opt/gitlab/backups s3://your-bucket
6.2 监控方案
Prometheus监控指标端点:
- http://gitlab.example.com/-/metrics
- http://gitlab.example.com:9090/metrics (Runner指标)
关键监控项:
- gitlab_rails_redis_operations_per_second
- gitlab_sidekiq_jobs_processed_total
- gitlab_runner_errors_total
6.3 升级指南
小版本升级(如15.9→15.10):
bash复制sudo apt update
sudo apt install gitlab-ce
sudo gitlab-ctl reconfigure
大版本升级(如15.x→16.x)需要按官方升级路径逐步进行,我们曾跳过中间版本直接升级导致数据库迁移失败。
7. 安全加固措施
7.1 网络层防护
建议配置:
- 防火墙只开放80,443,2222端口
- 使用云安全组限制访问IP段
- Nginx配置WAF规则
7.2 账户安全
强制措施:
ruby复制gitlab_rails['password_authentication_enabled_for_web'] = true
gitlab_rails['password_authentication_enabled_for_git'] = true
gitlab_rails['gitlab_signup_enabled'] = false
gitlab_rails['require_two_factor_authentication'] = true
7.3 数据加密
敏感信息加密方案:
yaml复制# 在CI变量中设置
variables:
KMS_ENCRYPTED_PASSWORD: "kms:xxxxxx"
解密脚本示例:
bash复制aws kms decrypt --ciphertext-blob fileb://<(echo "$KMS_ENCRYPTED_PASSWORD" | base64 -d) --output text --query Plaintext | base64 -d
这套配置在我们金融项目中成功通过等保三级认证,关键是在CI/CD管道中绝不出现明文密码。
