利用 webhook 实现 Git 自动部署 Laravel 代码

我们把项目放在github或者coding等代码仓库,每次本地开发好push后可能还要进入项目部署目录pull一遍,很麻烦,利用webhook可以很好地将这两步操作变为一步,本地push代码,服务器接收到请求自动进入项目目录pull,完成。

整个过程分为以下几步:

  1. 在github或coding(我是用coding)添加部署服务器的公钥。

    $ ssh-keygen -t rsa -C "example@email.com"  //一路回车
    $ cat ~/.ssh/id_rsa.pub  //复制内容添加到coding个人账户ssh公钥列表
  2. 新建一个仓库,部署服务器生成部署公钥并添加到项目公钥设置。

    //部署公钥是为单个项目设置,
    //以Nginx为例,sudo -Hu www是切换到www用户生成部署公钥
    //如果是apache,应该是sudo -Hu apache(-Hu是指切换用户和对应HOME环境变量)
    //如果出错,可能是不存在/home/www目录,可以新建,记得chown -R www:www /home/www
    $ sudo -Hu www ssh-keygen -t rsa  //一路回车
    $ cat /home/www/.ssh/id_rsa.pub  //复制添加到coding项目部署公钥
  3. 添加hook。

    <?php
    // routes/web.php
    Route::post('/deploy', function () {
    $path = base_path();
    $token = 'token';
    $json = json_decode(file_get_contents('php://input'), true);
    
    if (empty($json['token']) || $json['token'] !== $token) {
        exit('error request');
    }
    
    $cmd = "cd $path && git pull";
    shell_exec($cmd);
    });

    在coding项目设置,新建一个webhook,url为http://test.com/deploy(假设你的项目地址为test.com),填写token,在laravel的VerifyCsrfToken中间件中排除/deploy这条路由,勾选push后保存,将本地代码推送到coding仓库。

  4. 第一次拉取代码,完成测试。

    # 第一次还是要进入项目目录手动pull一次
    $ sudo -Hu www git config --global credential.helper store # 永久保存,后续免输密码
    $ sudo -Hu www git config --global user.name "phpbest" 
    $ sudo -Hu www git config --global user.email "example@email.com" # 邮箱请与conding上一致
    $ sudo -Hu www git clone url  # url为仓库地址
    $ composer install
    $ cp .env.example .env
    $ php artisan key:generate

    如果以上没问题,那么coding项目设置webhook那里就显示状态绿灯,在本地改动推送测试一下,看服务器有没有自动pull。

解释一直用sudo -Hu www操作的原因,因为webhook通知/deploy更新代码,这时候是用nginx的www用户来操作,否则就会出现权限问题。

原文地址:phpbest.cn

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

其实,你还可以做得更多

  • 检查git拉取到的文件,如果composer.lock有变化则运行 composer install
  • 检查git拉取到的文件,如果database/migrations/有变化则运行 php artisan migrate
6年前 评论

其实,你还可以做得更多

  • 检查git拉取到的文件,如果composer.lock有变化则运行 composer install
  • 检查git拉取到的文件,如果database/migrations/有变化则运行 php artisan migrate
6年前 评论

@XiaohuiLam 有具体的写法吗?大神

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!