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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容