如何使用GitLab Runner将任务分发至指定服务器?求更优方案
不用Docker时的GitLab Runner部署优化方案
针对你目前每台服务器单独部署Runner的方案,这里提供几个更高效的优化方向,核心思路是减少Runner维护成本、简化部署流程:
一、复用单台CI Runner + SSH远程执行(推荐)
不用在每台业务服务器上安装Runner,只在一台专门的CI服务器上部署一个Runner(用shell executor),通过SSH免密登录到各目标服务器执行部署命令。
具体操作步骤:
配置SSH免密登录:
在CI服务器的GitLab Runner用户下生成SSH密钥对:su gitlab-runner ssh-keygen -t ed25519 -C "ci-deploy" # 一路回车,不要设密码将公钥
~/.ssh/id_ed25519.pub的内容,添加到各目标服务器部署用户的~/.ssh/authorized_keys文件中,并确保文件权限为600。在GitLab中配置服务器变量:
进入项目的「Settings → CI/CD → Variables」,添加目标服务器的地址变量,比如:SERVER_17=192.168.x.17(设为受保护+掩码)SERVER_23=192.168.x.23(同理)
编写
.gitlab-ci.yml执行远程部署:stages: - deploy deploy-to-server-17: stage: deploy tags: - ci-shared-runner # 指向CI服务器上的共用Runner script: # 远程拉取代码、安装依赖、重启服务 - ssh deploy@$SERVER_17 "cd /var/www/app17 && git pull origin main && npm install --production && systemctl restart app17.service" only: - main # 指定触发分支 deploy-to-server-23: stage: deploy tags: - ci-shared-runner script: - ssh deploy@$SERVER_23 "cd /var/www/app23 && git pull origin main && pip install -r requirements.txt && systemctl restart app23.service" only: - main
优势:
- 仅维护1个Runner,不用在业务服务器上安装/更新Runner,降低维护成本
- 所有CI逻辑集中管理,方便统一调整部署流程
- 业务服务器无需额外运行Runner进程,减少资源占用
二、使用GitLab Runner的SSH Executor
如果希望保留「标签对应服务器」的映射逻辑,但不想在业务服务器装Runner,可以在CI服务器上创建多个Runner实例,每个实例用ssh executor对应一台目标服务器,并添加专属标签。
配置示例(/etc/gitlab-runner/config.toml):
[[runners]] name = "Deploy Runner for Server 17" url = "https://your-gitlab.com/" token = "your-runner-token-17" executor = "ssh" [runners.ssh] user = "deploy" host = "192.168.x.17" port = "22" identity_file = "/home/gitlab-runner/.ssh/id_ed25519" [runners.tags] tags = ["server-17"] [[runners]] name = "Deploy Runner for Server 23" url = "https://your-gitlab.com/" token = "your-runner-token-23" executor = "ssh" [runners.ssh] user = "deploy" host = "192.168.x.23" port = "22" identity_file = "/home/gitlab-runner/.ssh/id_ed25519" [runners.tags] tags = ["server-23"]
优势:
- 业务服务器无需安装Runner,仅需开放SSH服务
- 官方原生支持的远程执行方式,比手动写SSH命令更稳定
- 标签映射逻辑和你现有习惯一致,切换成本低
三、统一部署脚本复用
不管用哪种方案,都可以将部署逻辑抽离成独立脚本,避免在.gitlab-ci.yml中写重复代码:
- 在项目根目录创建
deploy.sh脚本:
#!/bin/bash SERVER=$1 APP_PATH=$2 ssh deploy@$SERVER "cd $APP_PATH && git pull origin main && ./install-deps.sh && systemctl restart $(basename $APP_PATH).service"
- 在
.gitlab-ci.yml中调用:
deploy-to-17: stage: deploy tags: - ci-shared-runner script: - chmod +x deploy.sh - ./deploy.sh $SERVER_17 /var/www/app17 only: - main
安全注意事项
- SSH密钥文件权限必须设为
600,禁止其他用户读取 - GitLab中的服务器地址、敏感命令等变量要设为受保护和掩码,防止泄露
- 目标服务器的部署用户应限制权限,仅授予部署所需的最小权限(如禁止sudo,或仅允许重启指定服务)
内容的提问来源于stack exchange,提问作者Harry Z. Huang
相关产品推荐
相关产品推荐

