原理介紹
- 配置gitlab當push動作的時候,訪問服務器上的一個鏈接比如www.xxxxxx.com/hook.php
- hook.php里面寫着一行代碼,會讓服務器git pull相應項目的代碼到web目錄。
- pull結束,代碼就在web目錄了,我們只要重新訪問網站就可以了。
核心就是push的時候,gitlab會調用服務器上的腳本,服務器上的腳本就會從git重新拉取項目文件。同時還需要加入安全性的設計。
配置ssh秘鑰
首先查看nginx和php的默認執行用戶,分別查看對應的文件nginx.conf和php-fpm.conf即可,一般是www用戶,以www用戶為例。
修改/etc/passwd文件,使www用戶具有可登錄權限,如下:
將上圖內容修改為:
當自動化部署完成后,要該回到原來的配置,因為www用戶默認是不允許登錄服務器的。
按以下步驟操作:
- 執行 su www 命令切換為www用戶。
- 執行 ssh-keygen 命令(有確認項,有的輸入yes,沒有就回車),將生成的公鑰(位置在/home/www目錄下 cat /home/www/.ssh/id_rsa.pub),添加到gitlab中的項目

注意:
1. 這里一定要是www用戶的秘鑰!
2. 進入到項目根目錄所在目錄,cd /home/wwwroot/ ,更改項目目錄web所屬用戶和用戶組,執行命令
chown -R www:www web web是你自己的項目文件
服務器腳本
cd 你自己的項目路徑 這個文件可以有多個,看你有幾個項目,配合下面的php文件使用
編寫hook.sh 內容如下(這是簡單版本):
cd 你自己的項目路徑 這個文件可以有多個,看你有幾個項目,配合下面的php文件使用
使用www用戶進行測試,執行 bash hook.sh 命令,測試能否進行拉取代碼。如果成功,下一步就是通過鈎子執行此腳本。
PHP執行腳本
php通過exec函數執行腳本代碼hook.php。需要調用exec函數,如果發現不成功,有可能php.ini配置中禁用了exec函數,重新開啟即可。具體操作可自行百度。
hook.php:
<?php
//作為接口傳輸的時候認證的密鑰
$valid_token = 'shfdksjdakjshdfjknvkja';
$client_token = $_GET['token'];
$project = $_GET['project']; //多個項目
$client_ip = $_SERVER['REMOTE_ADDR'];
$fs = fopen('./auto_hook.log', 'a');
fwrite($fs, '============================開始==============================='.PHP_EOL);
fwrite($fs, '時間:'.date("Y-m-d H:i:s", time()).',請求來自:['. $client_ip.']'.PHP_EOL);
if ($client_token !== $valid_token) {
fwrite($fs, "TKOEN 錯誤-- [{$client_token}]".PHP_EOL);
fclose($fs);
exit(0);
}
$json = file_get_contents("php://input");
$data = json_decode($json, true);
fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
//這里也可以執行自定義的腳本文件updata.sh,腳本內容可以自定義
switch ($project) {
case 'web':
$res = exec("/home/www/hook.sh", $result);
break;
}
fwrite($fs, 'Data:'. print_r($result, true).PHP_EOL);
fwrite($fs, '============================結束==============================='.PHP_EOL);
fclose($fs);
var_dump($result);
接下來通過瀏覽器訪問測試:http://www.xxxxx.com/webhook.php?token=shfdksjdakjshdfjknvkja&project=web
訪問后,如果能返回git執行的信息,就表示成功了。接下來就是配置gitlab的webhooks。
為支持多個項目 配置了project參數,可以部署多個項目。只需要在gitlab鈎子中配置時,使用不同的project參數。
觸發事件自己選擇
部署完成后,修改/etc/passwd文件,將www用戶修改為nologin即可!
