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

如何实现推送代码到Gitlab仓库后自动更新生产服务器的项目?

自动部署可行方案

方案1:使用Gitlab CI(推荐,配置简单易维护)

  • 首先在生产服务器上配置一个仅用于部署的低权限用户,为该用户生成SSH密钥,把公钥添加到Gitlab对应项目的「部署密钥」中,开通代码拉取权限。
  • 在Gitlab项目根目录新建.gitlab-ci.yml文件,写入部署任务配置示例:
stages:
  - deploy

deploy_prod:
  stage: deploy
  only:
    - main # 仅推送到生产分支时触发部署,可自行修改分支名
  script:
    - ssh 部署用户名@生产服务器IP "cd /你的项目部署目录 && git pull origin main"
  • 打开Gitlab项目设置的「CI/CD」-「运行器(Runner)」页面,绑定可用Runner即可,同网络下可以直接在Gitlab服务器或者生产服务器上安装Runner,连通性无额外要求。
  • 该方案优势为仅代码推送时才会触发部署,无无效定时任务资源消耗,git pull本身为增量拉取逻辑,仅传输变更文件不会全量克隆。

方案2:使用Gitlab项目Webhook

  • 在生产服务器部署极简的HTTP接收服务,可以用Python Flask、Go轻量服务甚至nc监听实现,服务收到合法请求后自动执行本地git pull命令即可。
  • 打开Gitlab对应项目的设置-「Webhook」页面,新增Webhook,触发条件选择「推送事件」,URL填写生产服务器的HTTP服务地址,配置签名校验规则,避免恶意请求触发部署。

方案3:自定义Gitlab post-receive钩子(适合无需CI功能的场景)

  • 进入Gitlab服务器对应项目的仓库存储目录,默认路径为/var/opt/gitlab/git-data/repositories/<你的用户名>/<项目名>.git,进入hooks子目录。
  • 新建post-receive文件并授予执行权限,写入判断逻辑示例:
#!/bin/bash
while read oldrev newrev refname
do
    # 仅当推送到生产分支时触发部署,可自行修改分支名
    if [[ $refname = "refs/heads/main" ]]; then
        ssh 部署用户名@生产服务器IP "cd /你的项目部署目录 && git pull origin main"
    fi
done
  • 提前为Gitlab运行用户(默认为git)配置SSH密钥,把公钥添加到生产服务器部署用户的authorized_keys文件中,实现免密登录。

通用注意事项

  • 所有方案均使用git pull执行部署操作,本身为增量同步逻辑,只会传输差异文件,不会产生全量克隆的资源消耗。
  • 部署使用的SSH用户不要授予root权限,仅开放项目部署目录的读写权限即可,降低安全风险。
  • 如果部署前需要执行依赖安装、服务重启等操作,直接把对应命令追加到git pull命令后即可。

内容的提问来源于stack exchange,提问作者Fabrice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:03