logo 个人代码分享
Git 工作流

Git 工作流与自动发布

通过 Git webhook 实现代码推送后自动部署,简化发布流程。

自动化部署流程

现代 Web 开发中,自动化部署是提升效率的关键环节。通过配置 Git webhook,可以实现代码推送到远程仓库后自动触发服务器部署,无需手动操作。

流程概述

典型的自动化部署流程如下:

  1. 开发者在本地完成代码修改
  2. 将代码推送到远程仓库(如 CNB)
  3. 远程仓库触发 webhook 事件
  4. 服务器接收 webhook 请求并执行部署脚本
  5. 部署脚本拉取最新代码并更新站点

Git 分支策略

对于小型静态站点,推荐使用简化的分支策略:

  • main 分支:主分支,存放源码,推送后触发云端构建
  • dist 分支:发布分支,存放构建产物,服务器拉取该分支部署
  • feature 分支:功能分支,用于开发新功能

分支工作流示例

# 创建功能分支
git checkout -b feature/new-article

# 在功能分支上开发
# ... 编辑文件 ...

# 提交更改
git add .
git commit -m "feat: 添加新文章"

# 切换到主分支并合并
git checkout main
git merge feature/new-article

# 推送到远程仓库(触发 CNB 自动构建)
git push origin main

Webhook 配置

以宝塔面板为例,配置 webhook 的步骤:

  1. 登录宝塔面板
  2. 进入「软件商店」→「宝塔插件」
  3. 安装「Webhook」插件
  4. 添加新的 webhook,填写执行脚本

Webhook 执行脚本

服务器 webhook 拉取的是构建产物分支(dist),而非源码:

#!/usr/bin/env bash
set -euo pipefail

# 进入站点目录
cd /www/wwwroot/hefei.space

# 拉取 dist 分支产物(已由 CNB 构建完成)
git fetch origin dist
git reset --hard origin/dist

部署脚本详解

部署脚本的关键命令说明:

git fetch vs git pull

git fetch 只下载远程仓库的更新,不会自动合并。而 git pull 会下载并自动合并。在部署场景中,推荐使用 git fetch + git reset 的组合,因为:

  • 可以避免合并冲突
  • 确保服务器代码与远程仓库完全一致
  • 执行速度更快

git reset --hard

git reset --hard origin/dist 会将本地分支重置为远程仓库的状态,丢弃所有本地修改。这在部署场景中是安全的,因为服务器上的代码不应该有本地修改。

安全注意事项

  • Webhook 密钥:配置 webhook 密钥,防止未授权的部署请求
  • 权限控制:确保部署脚本以最小权限运行
  • 日志记录:记录部署日志,便于排查问题
  • 回滚机制:保留历史版本,便于快速回滚

常见问题

部署失败怎么办?

如果部署失败,可以手动执行部署脚本并查看错误信息:

# 手动执行部署
cd /www/wwwroot/hefei.space
bash server/webhook-deploy.sh

# 查看 Git 状态
git status
git log --oneline -5

如何回滚到指定版本?

如果需要回滚到指定版本,可以使用以下命令:

# 查看提交历史
git log --oneline -10

# 回滚到指定提交
git reset --hard <commit-hash>

# 强制推送(谨慎使用)
git push -f origin dist