利用webhook实现git自动部署laravel代码

@luke  August 16, 2018

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

整个过程分为以下几步:

  • 在github或coding(我是用coding)添加部署服务器的公钥。
$ ssh-keygen -t rsa -C "example@email.com"  //一路回车
$ cat ~/.ssh/id_rsa.pub  //复制内容添加到coding个人账户ssh公钥列表
  • 新建一个仓库,部署服务器生成部署公钥并添加到项目公钥设置。
//部署公钥是为单个项目设置,
//以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项目部署公钥
  • 添加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仓库。

  • 第一次拉取代码,完成测试。
# 第一次还是要进入项目目录手动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用户来操作,否则就会出现权限问题。


添加新评论

  1. 狗子

    牛逼

    Reply