如何实现推送代码到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
相关产品推荐
相关产品推荐

