php項目使用git的webhooks實現自動部署

前言

在項目開發中使用git進行程式碼的管理,每次完成更改上傳程式碼後,還需要登錄伺服器將程式碼拉取下來.現在git伺服器(gitee/gitlab/github)都會有Webhooks功能,以實現在向git倉庫推送/合併等時機讓伺服器自動拉取新程式碼.

流程說明

使用Webhooks後,整個上傳部署流程如下:

使用webhook流程

伺服器端操作

webhook腳本創建

關於推送的post數據格式,參考碼雲的《WebHook 推送數據格式說明》.根據這個參數格式編寫php的腳本文件如下:

    <?php
    /**
      *git webhook 自動部署腳本
      */
    //接收post參數
    $requestBody = file_get_contents("php://input");
    if (empty($requestBody)) {
        exit('data null');
    }
    $content = json_decode($requestBody, true);
    
    //驗證密碼,驗證碼雲上配置的webhook密碼
    //if (empty($content['password']) || $content['password'] != 'password') //{
    //	exit('password error');
    //}
    
    $path = "/var/www/test/"; //項目存放物理路徑
    //判斷master分支上是否有提交
    if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
        $res = shell_exec("cd {$path} && git pull origin master 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;
        $x = file_put_contents("git_webhook_log.txt", $res_log, FILE_APPEND);//追加寫入日誌文件
        if ($x) {
        	echo 'true-';
        } else {
        	echo 'false-';
        }
    }
    echo 'done';

伺服器用戶設置

由於是通過url請求php編寫的腳本執行操作,所以打開nginx.conf文件查看執行用戶,默認為www,也可在任意php文件中添加程式碼: echo system("whoami");,然後訪問文件查看php運行用戶.
確定用戶後,打開/etc/passwd文件查看該用戶的資訊,如下:

    www:x:1000:1000::/var/www:/bin/bash

其格式和具體含義如下:

用戶名:口令:用戶標識號:組標識號:注釋性描述:主目錄:登錄Shell

其中要注意”主目錄”這一項,若後續操作提示該目錄不存在或錯誤,打開此文件修改.
接著依次執行下面三條命令:

    su - www //切換到www用戶
    ssh-keygen -t rsa -C "[email protected]" //以郵箱為名創建rsa密鑰
    cat /var/www/.ssh/id_rsa.pub //查看rsa公鑰並複製,.ssh所在目錄即上面所提"主目錄"

git倉庫操作

配置部署公鑰

在碼雲上打開項目倉庫,依次點擊[管理]=>[部署公鑰管理]=>[添加公鑰].將上面複製的id_rsa.pub公鑰添加進來.完成後在伺服器上執行命令:

    ssh -T [email protected]

首次使用會提示the authenticity of host 'gitee.com...需要輸入yes確認並添加主機到本機SSH可信列表.若返回 Hi XXX! You’ve successfully authenticated, but Gitee.com does not provide shell access. 內容,則證明添加成功.添加成功後,當前賬戶www就可以使用SSH協議對倉庫進行克隆/拉取等操作了.

添加webhook

在碼雲上打開項目倉庫,依次點擊[管理]=>[WebHooks]=>[添加],填寫webhook的php腳本地址,如有需要填寫webhook密碼/密鑰(密鑰需要再添加驗簽),如下圖

碼雲webhook添加

到此,完成配置,之後的push操作可在碼雲[WebHooks 管理]中查看自動部署請求記錄資訊.也可查看伺服器中的git_webhook_log.txt部署日誌(php腳本中寫入,不需要可注釋掉).


個人網站地址: //www.zhuyilong.我愛你/tech/php_git_webhook.html