gitee 和 GitHub 的 webhook 的使用,實現伺服器程式碼的自動更新。

Mr_Chung發表於2019-09-23

使用背景

測試伺服器下,我個人覺得每一次commit之後,都要去pull一下,確實是一件比較煩的事情。

於是為了更加便捷的同步服務程式碼,webhook無法就是你的最佳選擇。

每次 push 程式碼後,都會給遠端 HTTP URL 傳送一個 POST 請求。

配置問題

1、倉庫地址使用ssh例如:git@gitee.com:xxxxx/project.git

2、在gitee或者github上的對應的專案新增你的部署公鑰

3、在gitee或者github上的對應的專案新增WebHook對應的url和訪問祕鑰

程式碼示例(PHP)

<?php

//訪問祕鑰
$keySecret = '^!@KVzPZ^DaRNA7R53353%7aEAfsfdOptH7b%0i5';

//需要更新的專案目錄
$wwwRoot = [
    '/www/wwwroot/test1',
    '/www/wwwroot/test2',
];

//儲存執行指令碼的日誌
$logFile = 'log/layuimini-githook.log';

//git執行命令
$gitCommand = 'git pull';

// 判斷是否開啟祕鑰認證(已實現gitee和github)
if (isset($keySecret) && !empty($keySecret)) {
    list($headers, $gitType) = [[], null];
    foreach ($_SERVER as $key => $value) {
        'HTTP_' == substr($key, 0, 5) && $headers[str_replace('_', '-', substr($key, 5))] = $value;
        if (empty($gitType) && strpos($key, 'GITEE') !== false) {
            $gitType = 'GITEE';
        }
        if (empty($gitType) && strpos($key, 'GITHUB') !== false) {
            $gitType = 'GITHUB';
        }
    }
    if ($gitType == 'GITEE') {
        if (!isset($headers['X-GITEE-TOKEN']) || $headers['X-GITEE-TOKEN'] != $keySecret) {
            die('GITEE - 請求失敗,祕鑰有誤');
        }
    } elseif ($gitType == 'GITHUB') {
        $json_content = file_get_contents('php://input');
        $signature = "sha1=" . hash_hmac('sha1', $json_content, $keySecret);
        if ($signature != $headers['X-HUB-SIGNATURE']) {
            die('GITHUB - 請求失敗,祕鑰有誤');
        }
    } else {
        die('請求錯誤,未知git型別');
    }
}

!is_array($wwwRoot) && $wwwRoot = [$wwwRoot];
foreach ($wwwRoot as $vo) {
    $shell = sprintf("cd %s && git pull 2>&1", $vo);
    $output = shell_exec($shell);
    $log = sprintf("[%s] %s \n", date('Y-m-d H:i:s', time()) . ' - ' . $vo, $output);
    echo $log;
    file_put_contents($logFile, $log, FILE_APPEND);
}

許可權問題

由於使用webhook出發回撥訪問的時候是,執行的是php-fpm的執行使用者,例如我的是www,可使用ps -ef,檢視對應程式的執行使用者。

修改專案目錄許可權chown -R www:www 專案路徑

公鑰問題

如果提示下方這兩點,就是公鑰問題

[2019-09-21 14:03:27] Could not create directory '/home/www/.ssh'.
Host key verification failed.
fatal: Could not read from remote repository.
[2019-09-21 14:11:00] Host key verification failed.
fatal: Could not read from remote repository.

1、使用php-fpm執行使用者www進行登入

2、進入\home\www目錄下執行ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

3、把id_rsa.pub內的公鑰資訊拷貝出來,在gitee或者github上的對應的專案新增你的部署公鑰

備註資訊

建議自動更新只使用在測試伺服器上。

相關文章