网站部署

如何从 GitHub 上自动拉取代码到服务器

更新于 2026-09-24

通过配置 Webhook 和 Shell 脚本,可以在 Git 有最新提交时,只把指定文件同步到服务器。

当远程 Git 仓库有新提交时,只更新特定文件(例如 dist/ 目录,或 public/index.html),不必每次手工把整个项目传上去。

一、准备条件

  • 已有 Git 仓库(GitHub、Gitee 等)
  • 宝塔服务器已安装 Git、Node.js,PM2 可选
  • 项目已用 git clone 初始化为 Git 仓库

二、创建自动拉取脚本(只同步指定文件)

假设项目路径为 /www/wwwroot/zzf.net.cn,只想把仓库中的 dist/ 更新到这个目录。

1、拉完整仓库到缓存目录

bash

mkdir -p /www/git-temp
cd /www/git-temp
git clone https://github.com/zhenfeng95/mysite.git

2、创建部署脚本 /www/deploy/deploy.sh

bash

#!/bin/bash

# 1. 进入临时目录
cd /www/git-temp/mysite || exit

# 2. 拉取最新代码
echo "Pulling latest code from GitHub..."
git reset --hard HEAD
git clean -df
git pull origin main

# 3. 拷贝指定文件(只同步 dist 目录)
cp -r dist/* /www/wwwroot/zzf.net.cn/dist/

echo "Deploy finished at $(date)"

保存后赋权:

bash

chmod +x /www/deploy/deploy.sh

如果只想更新特定文件(例如 config/ 目录或 index.html),可以在 deploy.sh 里改用下面的命令:

bash

git checkout origin/main -- config/
git checkout origin/main -- index.html

三、创建 Webhook 接收服务(Node 示例)

安装依赖:

bash

mkdir -p /www/webhook && cd /www/webhook
npm init -y
npm install express body-parser

创建 index.js:

js

const express = require('express')
const bodyParser = require('body-parser')
const { exec } = require('child_process')

const app = express()
app.use(bodyParser.json())

app.post('/webhook', (req, res) => {
  console.log('Git 推送事件已接收')
  exec('sh /www/deploy/deploy.sh', (err, stdout, stderr) => {
    if (err) {
      console.error('执行失败', stderr)
      return res.status(500).send('error')
    }
    console.log('部署成功', stdout)
    res.send('部署成功')
  })
})

app.listen(4000, '0.0.0.0', () => {
  console.log('Webhook 服务已运行,端口 4000')
})

在阿里云后台安全组的入方向放开 4000 端口,否则 GitHub 或 Gitee 访问不到这个地址。

启动服务(建议用 PM2 保活):

bash

npm install -g pm2
pm2 start index.js --name webhook

四、在 GitHub / Gitee 中配置 Webhook

前往仓库设置:

  1. 找到具体项目,进入 Settings > Webhooks > Add webhook
  2. Payload URL:http://你的服务器公网 IP:4000/webhook(需要公网能访问)
  3. Content type:application/json
  4. Secret:可选,用于校验请求是否来自仓库
  5. 事件类型:只选 push
  6. 保存