完整 Git 自动化部署流程(Ubuntu 服务器)
1. 服务器环境准备
# 1.1 登录服务器(使用更安全的密钥登录)
ssh -i ~/.ssh/deploy_key root@your_server_ip
# 1.2 创建git用户并加入www-data组(设置更安全的shell)
adduser –disabled-password –gecos “” git
usermod -aG www-data git
chsh -s /usr/bin/git-shell git
# 1.3 安装必要软件(添加错误检查)
apt update || { echo “更新包列表失败”; exit 1; }
apt install -y git nginx || { echo “安装软件失败”; exit 1; }
2. 创建裸仓库和部署目录
# 2.1 创建裸仓库(添加更严格的权限设置)
mkdir -p /www/wwwroot/demo.carpadmin.com || { echo “创建目录失败”; exit 1; }
cd /www/wwwroot/demo.carpadmin.com || { echo “进入目录失败”; exit 1; }
git init –bare –shared=group
git config –local receive.denyNonFastForwards true
# 2.2 创建部署目录(优化权限设置)
mkdir -p /www/wwwroot/demo.carpadmin.com/public || { echo “创建部署目录失败”; exit 1; }
chown -R git:www-data /www/wwwroot/demo.carpadmin.com || { echo “设置所有者失败”; exit 1; }
chmod -R 750 /www/wwwroot/demo.carpadmin.com
chmod -R 775 /www/wwwroot/demo.carpadmin.com/public
3. 配置部署钩子
# 3.1 创建post-receive钩子
cat > /www/wwwroot/demo.carpadmin.com/hooks/post-receive << EOF
#!/bin/bash
TARGET=”/www/wwwroot/demo.carpadmin.com/public”
GIT_DIR=”/www/wwwroot/demo.carpadmin.com”
BRANCH=”main”
while read oldrev newrev ref
do
if [[ $ref = refs/heads/$BRANCH ]];
then
echo “正在部署 $BRANCH 分支…”
git –work-tree=$TARGET –git-dir=$GIT_DIR checkout -f $BRANCH
# 可选:安装Python依赖
# cd $TARGET && pip install -r requirements.txt
echo “部署完成 at $(date)” >> /var/log/git_deploy.log
fi
done
EOF
# 3.2 设置权限(添加验证步骤)
chmod +x /www/wwwroot/demo.carpadmin.com/hooks/post-receive || { echo “设置钩子权限失败”; exit 1; }
chown -R git:git /www/wwwroot/demo.carpadmin.com || { echo “设置仓库权限失败”; exit 1; }
# 验证钩子文件权限
[ -x “/www/wwwroot/demo.carpadmin.com/hooks/post-receive” ] || { echo “钩子文件不可执行”; exit 1; }
4. 本地开发机配置
# 4.1 生成SSH密钥(如果尚未生成)
ssh-keygen -t ed25519 -C “your_email@example.com”
# 4.2 添加远程仓库
git remote add production ssh://git@your_server_ip:/www/wwwroot/demo.carpadmin.com
# 4.3 测试连接(添加详细输出)
echo “测试SSH连接到Git服务器…”
ssh -T git@your_server_ip || { echo “SSH连接测试失败”; exit 1; }
echo “SSH连接测试成功”
5. 首次推送代码
# 5.1 添加文件并提交
git add .
git commit -m “Initial commit”
# 5.2 推送到服务器
git push -u production main
# 5.3 如果分支名不同
git push production local_branch:remote_branch –force-with-lease
6. Web服务器配置(Nginx示例)
cat > /etc/nginx/sites-available/demo.conf << EOF
server {
listen 80;
server_name demo.carpadmin.com;
root /www/wwwroot/demo.carpadmin.com/public;
location / {
try_files $uri $uri/ /index.html;
}
# FastAPI 后端代理示例
location /api {
proxy_pass http://127.0.0.1:8000;
}
}
EOF
# 启用配置(添加验证步骤)
ln -sf /etc/nginx/sites-available/demo.conf /etc/nginx/sites-enabled/ || { echo “创建符号链接失败”; exit 1; }
nginx -t || { echo “Nginx配置测试失败”; exit 1; }
systemctl restart nginx || { echo “重启Nginx失败”; exit 1; }
echo “Nginx配置已成功加载”
7. 权限问题排查清单
问题现象 解决方案
推送时报权限错误 chown -R git:www-data /www/wwwroot/demo.carpadmin.com
无法自动部署 检查钩子文件权限 chmod +x hooks/post-receive
Web服务器无法访问文件 chmod -R 775 public 并检查Nginx用户组
无法删除旧文件 确保部署目录没有其他进程占用
8. 高级功能扩展
多环境部署:在钩子中识别不同分支部署到不同目录
自动构建:添加构建命令(如 npm install && npm run build)
回滚机制:通过 Git tag 实现版本回滚
通知提醒:部署完成后发送邮件/钉钉通知
9. 日常维护命令
# 查看部署日志
tail -f /var/log/git_deploy.log
# 清理旧部署
git gc –prune=now
# 检查仓库状态
git –git-dir=/www/wwwroot/demo.carpadmin.com status
流程图解
图表
代码
按照这个流程操作后,你的代码将实现:
安全推送:通过SSH加密传输
自动同步:推送后立即更新生产环境
权限隔离:Git用户管理代码,Web用户运行服务
完整追溯:保留所有Git历史记录
















暂无评论内容