利用 webhook 實現 Git 自動部署 Laravel 程式碼

lukedever發表於2018-08-16

我們把專案放在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 協議》,轉載必須註明作者和本文連結

相關文章