最近在阿里云服务器上部署GitLab Runner的经历让我深刻体会到,即使是看似简单的工具安装,也可能隐藏着各种意想不到的坑。作为一名长期从事DevOps实践的工程师,我想把这次在Alibaba Cloud Linux 3系统上安装GitLab Runner的全过程记录下来,特别是那些官方文档没有明确说明的细节和陷阱。
这次部署的核心目标是:在同一台阿里云服务器上同时运行GitLab和GitLab Runner,构建一个轻量级的CI/CD环境。听起来很简单的任务,却让我遇到了yum源404、SSH模式权限问题、新版Token注册限制等一系列挑战。最终发现,对于这种单机部署场景,Shell模式才是最稳定高效的解决方案。
首先确认我的服务器环境:
注意:Alibaba Cloud Linux 3虽然基于CentOS/RHEL 8,但有自己的发行版标识符"alinux",这会导致一些兼容性问题。
按照官方文档,安装GitLab Runner应该是简单的两步:
但实际执行时:
bash复制curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
却遇到了404错误。这是因为安装脚本无法识别"alinux"这个发行版标识。
经过多次尝试,发现需要强制指定系统类型和版本:
bash复制# 强制指定为RHEL/CentOS 8环境
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo os=el dist=8 bash
# 安装GitLab Runner
sudo yum install gitlab-runner -y
# 验证安装
gitlab-runner --version
这里的关键点是:
os=el:表示Enterprise Linux(RHEL/CentOS系列)dist=8:指定主版本号为8安装完成后,Runner服务会自动启动,可以通过以下命令检查状态:
bash复制sudo systemctl status gitlab-runner
在GitLab项目中获取Runner注册Token:
最初尝试使用以下命令注册:
bash复制sudo gitlab-runner register \
--non-interactive \
--url "http://your-gitlab-instance" \
--token "glrt-xxxxxx" \
--executor "ssh" \
--tag-list "build,test" \
--run-untagged "true" \
--ssh-user "root" \
--ssh-password "your-password"
结果遇到了两个主要问题:
对于同一台服务器部署的场景,推荐使用Shell模式:
bash复制sudo gitlab-runner register \
--non-interactive \
--url "http://your-gitlab-instance" \
--token "glrt-xxxxxx" \
--executor "shell" \
--description "shell-runner-on-alinux3"
注册完成后,还需要进行以下关键配置:
在GitLab网页端:
在服务器上:
bash复制# 重启Runner服务使配置生效
sudo systemctl restart gitlab-runner
# 检查状态
sudo gitlab-runner verify
默认情况下,gitlab-runner服务会以gitlab-runner用户身份执行任务。这可能导致:
解决方法有两种:
bash复制# 编辑服务配置文件
sudo vim /etc/systemd/system/gitlab-runner.service
# 修改User和Group
[Service]
User=root
Group=root
# 重新加载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart gitlab-runner
bash复制# 编辑sudoers文件
sudo visudo
# 添加以下内容
gitlab-runner ALL=(ALL) NOPASSWD: ALL
注意:方案一更简单但安全性较低,生产环境建议使用方案二并限制权限范围。
确保gitlab-runner用户有权限访问你的项目目录:
bash复制# 查看当前用户和组
ls -ld /path/to/your/project
# 如果需要,更改目录所有者
sudo chown -R gitlab-runner:gitlab-runner /path/to/your/project
在项目根目录创建.gitlab-ci.yml文件:
yaml复制stages:
- test
- build
before_script:
- whoami
- pwd
test-job:
stage: test
script:
- echo "Running tests..."
- uname -a
- cat /etc/os-release
build-job:
stage: build
script:
- echo "Building application..."
- mvn clean package || echo "Build completed"
only:
- master
如果流水线没有自动触发:
bash复制sudo journalctl -u gitlab-runner -f
如果作业卡在Pending状态:
bash复制sudo gitlab-runner run
默认配置可能导致资源耗尽,建议调整:
bash复制# 编辑Runner配置文件
sudo vim /etc/gitlab-runner/config.toml
# 添加以下限制
concurrent = 2
check_interval = 1
[[runners]]
executor = "shell"
output_limit = 10240 # 日志输出限制(KB)
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
限制Runner网络访问:
bash复制# 使用firewalld限制出站连接
sudo firewall-cmd --permanent --new-zone=gitlab-runner
sudo firewall-cmd --permanent --zone=gitlab-runner --add-service=http
sudo firewall-cmd --permanent --zone=gitlab-runner --add-service=https
sudo firewall-cmd --permanent --zone=gitlab-runner --change-interface=eth0
sudo firewall-cmd --reload
定期清理构建缓存:
bash复制# 设置定时任务
(crontab -l 2>/dev/null; echo "0 3 * * * find /home/gitlab-runner/builds -mtime +7 -exec rm -rf {} +") | crontab -
虽然Shell模式简单,但在某些场景下可能需要Docker:
bash复制# 先安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 注册时指定docker executor
sudo gitlab-runner register \
--non-interactive \
--url "http://your-gitlab-instance" \
--token "glrt-xxxxxx" \
--executor "docker" \
--docker-image "alpine:latest" \
--description "docker-runner-on-alinux3"
在.gitlab-ci.yml中添加缓存和制品配置:
yaml复制cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .m2/repository
- target/
build-job:
stage: build
script:
- mvn package
artifacts:
paths:
- target/*.jar
expire_in: 1 week
对于大型项目,可以配置多个Runner分担负载:
bash复制# 注册第二个Runner
sudo gitlab-runner register \
--non-interactive \
--url "http://your-gitlab-instance" \
--token "glrt-xxxxxx" \
--executor "shell" \
--description "shell-runner-2" \
--tag-list "deploy" \
--config "/etc/gitlab-runner/config-2.toml"
bash复制# 查看活跃Runner
sudo gitlab-runner list
# 停止特定Runner
sudo gitlab-runner stop --name shell-runner-on-alinux3
# 删除Runner
sudo gitlab-runner unregister --name shell-runner-on-alinux3
配置日志轮转:
bash复制# 创建日志轮转配置
sudo tee /etc/logrotate.d/gitlab-runner <<EOF
/var/log/gitlab-runner/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
EOF
使用系统工具监控Runner资源使用:
bash复制# 实时监控
watch -n 1 "ps aux | grep gitlab-runner | grep -v grep"
# 资源使用统计
sudo dstat -cmdn --top-cpu --top-mem
经过这一系列配置和优化,现在我的GitLab Runner已经在Alibaba Cloud Linux 3上稳定运行了数周,每天处理数十个构建任务。这次经历让我深刻认识到,即使是成熟的工具链,在实际部署时也可能遇到各种环境特定的问题。关键是要理解工具的工作原理,掌握排查问题的方法,而不是简单地照搬文档。