完整 Git 自动化部署流程(Ubuntu 服务器)

完整 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历史记录

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
绝对不能喝奶茶了的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容