You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GitLab Runner将任务分发至指定服务器?求更优方案

不用Docker时的GitLab Runner部署优化方案

针对你目前每台服务器单独部署Runner的方案,这里提供几个更高效的优化方向,核心思路是减少Runner维护成本、简化部署流程:

一、复用单台CI Runner + SSH远程执行(推荐)

不用在每台业务服务器上安装Runner,只在一台专门的CI服务器上部署一个Runner(用shell executor),通过SSH免密登录到各目标服务器执行部署命令。

具体操作步骤:

  1. 配置SSH免密登录:
    在CI服务器的GitLab Runner用户下生成SSH密钥对:

    su gitlab-runner
    ssh-keygen -t ed25519 -C "ci-deploy" # 一路回车,不要设密码
    

    将公钥~/.ssh/id_ed25519.pub的内容,添加到各目标服务器部署用户的~/.ssh/authorized_keys文件中,并确保文件权限为600。

  2. 在GitLab中配置服务器变量:
    进入项目的「Settings → CI/CD → Variables」,添加目标服务器的地址变量,比如:

    • SERVER_17=192.168.x.17(设为受保护+掩码)
    • SERVER_23=192.168.x.23(同理)
  3. 编写.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中写重复代码:

  1. 在项目根目录创建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"
  1. 在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:05:11