CentOS环境下GitLab的自动化运维实践
小樊
35
2025-11-17 20:07:53
CentOS环境下GitLab自动化运维实践
一 环境准备与安装
- 系统准备:建议使用 CentOS 7/8/Stream,内存至少 4GB(生产建议 8GB+),磁盘 50GB+;安装常用工具并开启 firewalld。
- 安装依赖与邮件服务:
sudo yum update -y
sudo yum install -y curl openssh-server policycoreutils-python perl git nodejs rsync cronie postfix
sudo systemctl enable --now sshd postfix
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
- 添加仓库并安装 GitLab CE:
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL=“http://your_gitlab_server_ip_or_domain” yum install -y gitlab-ce
sudo gitlab-ctl reconfigure && sudo gitlab-ctl start
- 访问验证:浏览器打开 http://your_gitlab_server_ip_or_domain,首次登录设置管理员密码。
- 可选容器化部署(便于迁移与回滚):
mkdir -p /data/gitlab/{config,logs,data}
docker run -d --hostname gitlab.local -p 8443:443 -p 8081:80 -p 2222:22 \
–name gitlab --restart always \
-v /data/gitlab/config:/etc/gitlab \
-v /data/gitlab/logs:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
访问 http://gitlab.local:8081 完成初始化。
二 自动化安装与配置
- 使用 Ansible 编排安装与初始化(示例 Playbook):
- hosts: gitlab_servers
become: yes
vars:
gitlab_external_url: “http://gitlab.example.com”
tasks:
- name: Install dependencies
yum: name={{ item }} state=present
loop: [curl, openssh-server, policycoreutils-python, postfix]
- name: Enable services
systemd: name={{ item }} enabled=yes state=started
loop: [sshd, postfix]
- name: Add GitLab CE repo and install
shell: |
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash
yum install -y gitlab-ce
args: { creates: /usr/bin/gitlab-ctl }
- name: Configure external_url
lineinfile:
path: /etc/gitlab/gitlab.rb
regexp: '^external_url ’
line: “external_url ‘{{ gitlab_external_url }}’”
backup: yes
- name: Reconfigure and start
command: gitlab-ctl reconfigure
- 说明:也可将防火墙放行、用户与目录权限、时区等纳入 Playbook,实现一键交付与重复部署。
三 CI/CD 流水线设计与 Runner 部署
- 安装 GitLab Runner(CentOS):
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
sudo yum install -y gitlab-runner
sudo systemctl enable --now gitlab-runner
- 注册 Runner(在项目 Settings → CI/CD → Runners 获取 URL 与 Registration token):
sudo gitlab-runner register --url <GitLab_URL> --registration-token \
–executor shell --description “centos-runner” --tag-list “shell,centos” --run-untagged true --locked false
- 多 Runner 与隔离:按用途拆分 Runner(如 build/test/deploy),使用 tags 与 executor(shell、docker、kubernetes)隔离环境与权限。
- 基础 .gitlab-ci.yml 示例(Maven 项目):
stages:
- build
- test
- deploy
variables:
MAVEN_OPTS: “-Dmaven.repo.local=.m2/repository”
cache:
paths:
- .m2/repository/
- target/
build_job:
stage: build
script:
- mvn clean package -DskipTests
artifacts:
paths:
- target/*.jar
test_job:
stage: test
script:
- mvn test
artifacts:
reports:
junit: target/surefire-reports/TEST-*.xml
deploy_job:
stage: deploy
script:
- scp target/*.jar user@prod-server:/opt/app/
- ssh user@prod-server “systemctl restart myapp || true”
only:
- main
- 说明:通过 only/except/rules 控制触发分支;使用 artifacts 与 reports 传递产物与测试报告;为生产部署设置 保护分支 与 手动确认 更安全。
四 自动化部署与交付策略
- SSH 免密部署:在 Runner 主机生成密钥并分发到目标机,保证 CI 任务可安全推送与重启服务。
ssh-keygen -t rsa -b 2048 -N “” -f ~/.ssh/id_rsa
ssh-copy-id user@prod-server
- 零停机部署实践:
- 蓝绿发布:准备两套环境(blue/green),通过负载均衡切换流量,出现问题可快速回滚。
- 金丝雀发布:先对少量实例发布新版本,观察后再全量切换。
- 滚动更新:分批替换实例,保持服务可用。
- 产物与回滚:将可运行包与版本元数据存入制品库(如 Nexus/对象存储),回滚时按版本号快速部署历史产物。
- 安全建议:生产部署使用 受限用户、最小权限 与 部署清单脚本;通过 Secrets 管理凭据,避免明文出现在仓库中。
五 备份恢复与高可用
- 备份与恢复:
- 手动备份:
sudo gitlab-rake gitlab:backup:create STRATEGY=copy
- 定时备份(示例每日 2 点):
echo ‘0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1’ | sudo tee /etc/cron.d/gitlab-backup
- 恢复(注意版本一致):
sudo gitlab-ctl stop unicorn && sudo gitlab-ctl stop sidekiq
sudo gitlab-rake gitlab:backup:restore BACKUP=timestamp_of_backup
sudo gitlab-ctl start
- 高可用与扩展:
- 单实例瓶颈与风险较高,生产建议部署 多节点高可用(Pacemaker/Keepalived + 共享存储/数据库),或使用官方推荐的 Geo 多地域 架构。
- 简单对外高可用可用 Nginx 做反向代理与故障转移:
upstream gitlab { server 192.168.0.11:80; server 192.168.0.12:80 backup; }
server { listen 80; server_name gitlab.example.com; location / { proxy_pass http://gitlab; } }
- 监控与告警:启用 Prometheus/Grafana 监控组件,结合 告警规则 与 日志审计 提升可观测性与稳定性。