GitHub和WebHooks自動部署PHP項目

前言

在項目開發中,都會遇到兩個過程,一個是版本控制,另外一個是代碼發佈php

版本控制目前有兩種途徑,一個是git,另外一個是svn。我用的是git,在這裏就不介紹git和svn的差別了。vue

而代碼發佈,在最初的時候,用的都是ftp直接將代碼拉倒服務器上(由於這是我本身的項目),這樣子不只費事,還容易出事。nginx

下面就引入GitHub和WebHooks達到自動部署。git

使用

在咱們完成開發並測試經過以後,將代碼提交到git上,git就自動調用hook將代碼pull到服務器上。github

原理

步驟

建立項目的用戶

在當git訪問服務器上的webhook腳本時,主要任務就是執行git pull將代碼更新到服務器上,這時是以nginx的運行用戶(ps -ef | grep nginx 可查看)去執行這個命令的,因此運行nginx的用戶要擁有對項目讀寫的權限。web

建立ssh-key並配置到github

上面提到的用戶,須要給它配置ssh-key,配置ssh-key是爲了可以方便在拉取代碼pull的時候,能夠不用輸入賬號密碼,在當webHooks腳本執行的時候,用的是nginx的用戶,因此應該要以nginx的運行用戶去建立一個ssh-key。 能夠本身建立一個新的用戶,用這個用戶去運行nginx(下面介紹),而後將項目的分給這個用戶(下面介紹)。shell

建立webHooks並部署項目

這一步是爲了在項目push到master版本的時候,由webHooks完成自動部署。json

  1. 在gitHub上爲須要自動部署的項目新建一個WebHools瀏覽器

    Setting -> WehHooks -> Add web 服務器

    在建立的時候須要輸入密碼。

  2. 填寫webhook基本信息

    • webhook請求的接口

      前面有說過了,這個接口其實是執行git pull將代碼更新到服務器項目中,下面是php版本代碼。

      <?php
      // 本地倉庫路徑 既項目路徑
      $local = '/data/web/testWebHooks';
      
      // 若是倉庫目錄不存在,返回錯誤
      if (!is_dir($local)) {
          header('HTTP/1.1 500 Internal Server Error');
          die('Local directory is missing');
      }
      
      //若是請求體內容爲空,返回錯誤
      if (!isset($_POST['payload'])) {
          header('HTTP/1.1 400 Bad Request');
          die('HTTP HEADER or POST is missing.');
      }
      
      // 上圖中第2步的Content Type是application/x-www-form-urlencoded,所應用post接受
      $payload = json_decode($_POST['payload'], true);
      
      // 簽名
      if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE']) || !$_SERVER['HTTP_X_HUB_SIGNATURE']) {
      	header('HTTP/1.1 403 Bad Request');
          die('Permission denied.' . json_encode($_SERVER));
      }
      $signature = $_SERVER['X-Hub-Signature'];
      
      list($algo, $hash) = explode('=', $signature, 2);
      //計算簽名
      $secret = '******';	// 上圖中第三部填寫的密碼
      $payloadHash = hash_hmac($algo, $payload, $secret);
      if ($hash !== $payloadHash){
          header('HTTP/1.1 403 Bad Request');
          die($signature . ' ' . $_SERVER['X-Hub-Signature']);
      }
      複製代碼

      這是一個php腳本,主要有兩個功能,一個是校驗,另外一個是更新代碼。校驗是爲了防止你的腳本被別人一直請求,第二個就是從git上拉取代碼並更新。

      若是你的項目是vue或者是其餘須要編譯的項目,能夠在更新代碼以後執行編譯過程。

      在git上填寫信息以後,會自動去請求這個接口進行測試,http返回200表示成功。具體的請求記錄在提交信息下方的Recent Deliveries

      注意

      1.確保PHP正常執行系統命令。寫一個PHP文件,內容:

      <?php shell_exec('ls -la')
      複製代碼

      在經過瀏覽器訪問這個文件,可以輸出目錄結構說明PHP能夠運行系統命令。

測試提交代碼到git並完成自動部署

當咱們經過git push提交代碼以後,能夠在github的webhook頁面最下面看到webhook的執行記錄。若是提示成功了,能夠去刷新頁面查看是否有更新成功。

相關文章
相關標籤/搜索