1. 为什么需要自建GitLab与Runner
在团队协作开发中,代码版本控制是核心需求。虽然市面上有各种托管服务,但企业级开发往往需要更灵活的部署方案。自建GitLab服务器配合专用Runner,能实现以下优势:
- 代码完全自主掌控,避免第三方平台的安全风险
- 定制化CI/CD流程,适配企业特有的开发规范
- 硬件资源按需配置,特别适合大型项目构建
- 内网部署保障传输速度,减少对外网依赖
我经历过从托管服务迁移到自建环境的过程,实测构建速度提升3倍以上,特别适合中大型技术团队。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境规划
2.1 硬件配置建议
根据团队规模选择服务器配置(以20人团队为例):
| 组件 | 开发环境配置 | 生产环境配置 |
|---|---|---|
| CPU | 4核 | 8核 |
| 内存 | 8GB | 16GB |
| 存储 | 100GB SSD | 500GB SSD |
| 网络带宽 | 100Mbps | 1Gbps |
注意:Runner服务器建议与GitLab分开部署,避免构建任务影响主服务性能
2.2 软件依赖准备
- 操作系统:Ubuntu 20.04 LTS(长期支持版更稳定)
- 数据库:PostgreSQL 12+(GitLab官方推荐)
- 缓存服务:Redis 6+
- 容器运行时:Docker 20.10+(用于Runner执行环境)
3. GitLab服务部署实战
3.1 安装方式选择
推荐使用官方Omnibus包安装,相比源码编译更易维护:
bash复制# 添加GitLab仓库
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
# 安装社区版(企业版需许可证)
sudo EXTERNAL_URL="https://gitlab.yourdomain.com" apt-get install gitlab-ce
关键参数说明:
EXTERNAL_URL:必须设置为最终访问的域名- 首次安装后需等待约5分钟完成初始化
3.2 关键配置调整
修改/etc/gitlab/gitlab.rb配置文件:
ruby复制# 邮件服务配置(以SMTP为例)
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 587
# 性能优化配置
unicorn['worker_timeout'] = 60
sidekiq['concurrency'] = 10
执行重载命令:
bash复制sudo gitlab-ctl reconfigure
3.3 管理员初始化
- 首次访问WEB界面会提示设置root密码
- 建议立即配置:
- 关闭公开注册
- 设置强制双因素认证
- 创建项目组结构
4. Runner部署与集成
4.1 Runner类型选择
| 类型 | 适用场景 | 优缺点 |
|---|---|---|
| Shell | 简单任务 | 无隔离,易冲突 |
| Docker | 标准构建环境 | 需要容器管理权限 |
| Kubernetes | 动态伸缩环境 | 架构复杂 |
4.2 Docker Runner安装示例
bash复制# 注册Runner
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \
--url "https://gitlab.yourdomain.com" \
--registration-token "PROJECT_REGISTRATION_TOKEN" \
--description "docker-runner" \
--tag-list "docker,aws" \
--run-untagged="true" \
--locked="false"
关键参数说明:
--docker-image:指定默认构建镜像--tag-list:给Runner打标签便于任务分配
4.3 高级配置技巧
在config.toml中添加优化配置:
toml复制[[runners]]
limit = 10 # 并行任务数
[runners.docker]
shm_size = "256m" # 共享内存大小
volumes = ["/cache"] # 缓存目录
5. CI/CD流水线设计
5.1 基础.gitlab-ci.yml模板
yaml复制stages:
- build
- test
- deploy
variables:
DOCKER_DRIVER: overlay2
build_job:
stage: build
script:
- docker build -t app-image .
- docker save app-image > app.tar
artifacts:
paths:
- app.tar
expire_in: 1 week
test_job:
stage: test
script:
- docker load < app.tar
- docker run app-image npm test
5.2 典型问题解决方案
问题1:构建缓存失效
- 现象:每次构建都重新下载依赖
- 解决:添加缓存配置
yaml复制cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .cache/
问题2:Docker登录失败
- 现象:推送镜像时报认证错误
- 解决:使用CI变量存储凭证
bash复制# 预先设置变量
echo -n "$DOCKER_AUTH" | docker login -u $DOCKER_USER --password-stdin
6. 安全加固方案
6.1 网络层防护
- 使用Nginx反向代理配置HTTPS
- 限制SSH访问IP白名单
- 启用防火墙规则:
bash复制sudo ufw allow 22/tcp sudo ufw allow 443/tcp sudo ufw enable
6.2 系统层防护
- 定期执行:
bash复制sudo apt update && sudo apt upgrade -y sudo gitlab-ctl upgrade - 启用自动备份:
ruby复制# /etc/gitlab/gitlab.rb gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 # 保留7天
6.3 监控方案
推荐Prometheus+Granfana监控组合:
- 启用GitLab内置Prometheus
ruby复制prometheus['enable'] = true - 配置Granfana数据源
ini复制[gitlab] url = http://localhost:9090
7. 性能调优实战
7.1 数据库优化
sql复制-- PostgreSQL调优
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
7.2 Ruby工作器配置
ruby复制# /etc/gitlab/gitlab.rb
unicorn['worker_processes'] = 4
sidekiq['max_concurrency'] = 20
7.3 大型仓库处理
- 启用Git仓库压缩:
bash复制
git gc --aggressive - 配置Git LFS管理大文件
8. 灾备与迁移
8.1 备份方案
bash复制# 手动备份
sudo gitlab-rake gitlab:backup:create
# 自动备份(每日2点)
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
8.2 迁移步骤
- 在原服务器执行备份
- 将备份文件拷贝到新服务器
- 恢复备份:
bash复制sudo gitlab-ctl stop sudo gitlab-rake gitlab:backup:restore BACKUP=timestamp
9. 踩坑经验分享
-
内存泄漏问题:某次Sidekiq进程内存持续增长,最终发现是自定义脚本未关闭数据库连接。解决方案:
ruby复制ActiveRecord::Base.connection_pool.with_connection do # 业务代码 end -
Docker缓存失效:CI中多次构建相同镜像时,添加
--cache-from参数:bash复制docker build --cache-from=$CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . -
Runner离线处理:通过健康检查脚本自动重启异常Runner:
bash复制# crontab -e */5 * * * * /usr/bin/docker ps | grep gitlab-runner || systemctl restart docker
