Git 钩子自动化部署完全指南:掌握 post-receive 触发机制与生产实践

Git 钩子自动化部署完全指南:掌握 post-receive 触发机制与生产实践


一、核心机制剖析

1.1 触发三要素

要素说明
文件名约定必须严格命名为post-receive(大小写敏感)
路径规范仅生效于裸仓库的hooks/目录(路径示例:/repo/project.git/hooks/
执行权限必须赋予可执行权限:chmod +x post-receive

1.2 触发时序图

开发者 裸仓库 钩子引擎 post-receive 部署系统 应用服务 git push origin main 完成所有引用更新 标准输入传递变更数据 执行checkout/构建/重启 文件实时生效 开发者 裸仓库 钩子引擎 post-receive 部署系统 应用服务

二、配置全流程详解

2.1 目录结构规范

/repo/
├── project.git/          # 裸仓库
│   ├── objects/
│   └── hooks/
│       └── post-receive  # 核心钩子
/deploy/
└── production/           # 工作目录
    ├── index.html
    └── static/

2.2 权限控制矩阵

对象裸仓库工作目录Web服务
git 用户读写读写-
www-data-执行
开发团队只读--

2.3 标准脚本模板

#!/bin/sh
DEPLOY_PATH="/deploy/production"
LOG_FILE="/var/log/git_deploy.log"

# 记录完整输入数据
echo "[$(date)] 触发日志" >> $LOG_FILE
cat - | tee -a $LOG_FILE

# 处理主分支变更
while read oldrev newrev ref
do
  if [ "$ref" = "refs/heads/main" ]; then
    echo "正在部署main分支..." | tee -a $LOG_FILE
    GIT_WORK_TREE=$DEPLOY_PATH git checkout -f 2>&1 | tee -a $LOG_FILE
    systemctl reload nginx | tee -a $LOG_FILE
  fi
done

三、高阶调试技巧

3.1 手动触发测试

# 模拟分支更新(在裸仓库执行)
echo "0000000 1111111 refs/heads/main" | hooks/post-receive

# 强制重置环境
GIT_WORK_TREE=/deploy/production git reset --hard HEAD

3.2 智能日志追踪

# 记录全量上下文
exec > >(tee -a /var/log/git_deploy.log) 2>&1
echo "===== 部署开始 [$(date +%Y-%m-%dT%H:%M:%S)] ====="

# 关键操作记录
set -x  # 开启执行追踪
GIT_WORK_TREE=$DEPLOY_PATH git checkout -f
set +x

四、生产级部署方案

4.1 多环境分流策略

case "$ref" in
  "refs/heads/main")
    DEPLOY_ENV="/deploy/prod"
    ;;
  "refs/heads/staging")
    DEPLOY_ENV="/deploy/stage"
    ;;
  "refs/heads/dev")
    DEPLOY_ENV="/deploy/dev"
    ;;
esac

GIT_WORK_TREE=$DEPLOY_ENV git checkout -f

4.2 安全回滚机制

# 保留最近5个版本
DEPLOY_PATH="/deploy/prod"
BACKUP_DIR="/backup/prod/$(date +%Y%m%d%H%M%S)"
cp -r $DEPLOY_PATH $BACKUP_DIR
find /backup/prod -maxdepth 1 -mtime +5 -exec rm -rf {} \;

五、故障应急手册

5.1 常见问题速查

现象快速检测命令解决方案
钩子未触发ls -l hooks/post-receive检查文件权限与路径
文件检出失败ls -ld /deploy/production验证目录所有权
环境变量失效echo $GIT_WORK_TREE使用绝对路径声明变量
部分文件未更新git log -1 --stat检查提交内容,强制重置

5.2 监控指标配置

# 部署成功率监控
部署次数=$(grep -c "触发日志" /var/log/git_deploy.log)
失败次数=$(grep -c "ERROR" /var/log/git_deploy.log)
成功率=$(( ($部署次数 - $失败次数) * 100 / $部署次数 ))

# 文件完整性校验
find /deploy/prod -type f -exec md5sum {} + > /tmp/prod_checksum
diff /tmp/prod_checksum /tmp/expected_checksum

六、性能优化建议

  1. 增量部署:结合git diff-tree识别变更文件

    changed_files=$(git diff-tree --no-commit-id --name-only -r $newrev)
    
  2. 并行处理:使用&后台执行耗时操作

    (npm install --production > npm.log 2>&1 &)
    
  3. 缓存加速:建立node_modules缓存目录

    ln -s /cache/node_modules /deploy/prod/node_modules
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值