ubuntu Gitlab 利用webhook实现push时项目自动部署

本文详细介绍了如何在生产环境中利用GitLab进行自动部署的过程。包括为www-data用户生成SSH公钥,通过GitLab的普通用户权限设置,以及使用git-webhook-handler.php脚本来实现代码推送后的自动更新。此方法提高了部署效率,减少了手动操作,适用于LAMP环境下的持续集成与持续部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:已经安装git

本次服务环境是 lamp apache运行用户是www-data

  1. 在gitlab创建一个普通用户,加入到目标项目里的成员里,只需要有pull权限即可
  2. 在生产服务器上为www-data用户生成 SSH 公钥,路径一般在在apache的根目录,把生成的公钥 id_rsa.pub 复制粘贴到Git服务器上第一步里的普通用户的ssh公钥里
    sudo -u www ssh-keygen
  3. 首次从git服务器上抓取资源用clone,指定目录需要为空:
    sudo -u www-data git clone git@xxx:xxx/xxx.git
    4.先cd到项目根目录,后续再抓取直接pull ; 模拟www-data用户身份执行:
    sudo -u www-data git pull
    5.网站根目录下放置 git-webhook-handler.php 自动部署文件,然后Git服务器的对应项目的 webhooks 配置上该文件的网址(Push events),需启用php的shell_exec函数。
    在这里插入图片描述
    自动部署文件 git-webhook-handler.php 代码如下:
 <?php
    //git webhook 自动部署脚本
    //项目存放物理路径
    $path = "/home/www/ceshi/";
    
    $requestBody = file_get_contents("php://input");
    $token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
    if ($token != "cc17c30cd111c7215fc8f51f8790e0e1") {
        //$res_log .= "token is error".PHP_EOL;
        //file_put_contents("git-webhook-ceshi.txt", date("Y-m-d H:i:s"), FILE_APPEND);//追加写入
        //file_put_contents("git-webhook-ceshi.txt", $res_log, FILE_APPEND);//追加写入
        
         die();
    
    }
    if (empty($requestBody)) {
        die('send fail');
    }
    $content = json_decode($requestBody, true);
    //若是主分支且提交数大于0
    if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
        $res = shell_exec("cd {$path} && git pull 2>&1");//以www用户运行
        $res_log = '-------------------------'.PHP_EOL;
        $res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;
        $res_log .= $res.PHP_EOL;
        file_put_contents("git-webhook-ceshi.txt", $res_log, FILE_APPEND);//追加写入
    }

http://www.piaoyi.org/linux/Gitlab-GitHub-webhook-push-auto-deployment.html

<think>我们正在讨论微信小程序后端如何实现自动部署。根据引用[1]和[2],我们可以知道微信小程序后端开发完成后,需要经过测试和部署。而自动部署可以大大提高效率。 自动部署的核心是使用CI/CD(持续集成/持续部署)工具,例如Jenkins、GitHub Actions、GitLab CI等。以下是实现自动部署的步骤: 1. **版本控制**:将后端代码托管在Git仓库(如GitHub、GitLab等)中。 2. **编写部署脚本**:根据项目使用的技术栈(如Django、SpringBoot等)编写部署脚本,包括安装依赖、构建项目、启动服务等步骤。 3. **配置CI/CD工具**:在CI/CD工具中配置自动化流程,使得当代码推送到特定分支(如main或master)自动触发部署。 以GitHub Actions为例,我们可以这样配置: 步骤1:在项目根目录创建`.github/workflows/deploy.yml`文件。 步骤2:编写部署流程,例如部署一个Python Django项目: ```yaml name: Deploy to Production on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: '3.8' - name: Install dependencies run: | pip install -r requirements.txt - name: Run migrations env: DB_HOST: ${{ secrets.DB_HOST }} DB_USER: ${{ secrets.DB_USER }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} DB_NAME: ${{ secrets.DB_NAME }} run: python manage.py migrate - name: Restart service via SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_IP }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /path/to/project git pull origin main sudo systemctl restart gunicorn sudo systemctl restart nginx ``` 注意:这里使用了SSH Action来连接服务器并执行部署命令。同,敏感信息(如数据库密码、服务器IP等)都存储在GitHub仓库的Secrets中。 步骤3:将上述配置文件推送到main分支,GitHub Actions就会自动运行。 另外,引用[2]提到了微信云托管,它也是一种自动部署的解决方案。微信云托管支持容器化部署,可以通过Dockerfile和云开发平台实现自动部署。步骤包括: 1. 将项目容器化(编写Dockerfile)。 2. 将镜像推送到微信云托管的镜像仓库。 3. 配置服务,设置自动构建和部署。 具体操作可以参考微信云托管的文档。 总结:微信小程序后端实现自动部署,可以通过配置CI/CD工具(如GitHub Actions)来自动完成代码拉取、安装依赖、数据库迁移和重启服务等步骤,也可以使用微信云托管等云服务提供的自动部署功能。 相关问题: 1. 如何配置微信云托管实现自动部署? 2. 使用GitHub Actions部署如何保证安全性? 3. 自动部署中如何处理数据库迁移?</think>### 微信小程序后端自动部署指南 实现自动部署可显著提升迭代效率,结合引用[1][2][3]的实践,以下是完整方案: --- #### 一、自动部署核心流程 ```mermaid graph LR A[代码仓库] --> B(CI/CD工具) B --> C{部署环境} C -->|生产环境| D[云服务器] C -->|测试环境| E[微信云托管] D --> F[Nginx+SSL] ``` --- #### 二、具体实现步骤 ##### 1. 基础架构配置(以 GitHub Actions 为例) **`.github/workflows/deploy.yml` 配置示例:** ```yaml name: Auto-Deploy on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: { python-version: '3.10' } - name: Install dependencies run: pip install -r requirements.txt - name: Deploy to Server uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SERVER_IP }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} script: | cd /opt/app git pull origin main systemctl restart gunicorn nginx -t && systemctl reload nginx ``` ##### 2. 关键配置说明 - **敏感信息管理**: 所有服务器IP、SSH密钥等通过 GitHub Secrets 存储(仓库 Settings → Secrets) - **微信云托管集成**(引用[2]): ```yaml - name: Deploy to Weixin Cloud run: | wxcloud deploy --env=${{ secrets.WX_ENV_ID }} --service=backend ``` ##### 3. 数据库自动化迁移 ```python # 在CI脚本中添加迁移命令 - name: DB Migration run: | python manage.py migrate env: DB_HOST: ${{ secrets.DB_HOST }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} ``` --- #### 三、多环境部署策略 | 环境 | 触发条件 | 部署目标 | |------------|------------------|-------------------| | **测试环境** | `git push dev/*` | 微信云托管[^2] | | **预发布** | Pull Request | 隔离服务器 | | **生产环境** | `git tag v*` | 负载均衡集群 | --- #### 四、验证与监控 1. **自动化测试集成** ```yaml - name: Run Tests run: pytest --cov=app tests/ ``` 2. **健康检查配置** ```nginx location /health { proxy_pass http://localhost:8000/health; access_log off; # 避免日志污染 } ``` 3. **监控告警**: - 配置 Prometheus + Grafana 监控接口响应间 - 关键错误通过 Webhook 推送企业微信[^4] --- #### 五、优化建议 1. **容器化部署**(提升一致性): ```dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["gunicorn", "core.wsgi", "-b", "0.0.0.0:8000"] ``` 2. **蓝绿发布**: - 通过Nginx upstream切换流量 - 实现零停机更新 3. **自动回滚机制**: ```bash # 检测错误率>5%自动回滚 if [ $(curl -s metrics/api/error_rate) -gt 5 ]; then git revert HEAD ./deploy.sh fi ``` > **实践提示**: > - 首次部署前需手动完成[服务器初始化](https://github.com/actions/setup-python) > - 微信云托管需预先配置服务名称和环境ID[^2] > - 测试环境可用内网穿透临调试[^3] --- #### 六、常见问题解决 | 问题 | 解决方案 | |--------------------------|-----------------------------------| | SSH连接超 | 检查安全组22端口 & 密钥权限 (chmod 600) | | 数据库迁移失败 | CI脚本中增加 `--fake-initial` 参数 | | 微信云托管部署卡顿 | 检查 `wxcloud` CLI版本 & 容器资源限制 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值