Gitee Webhook 實現自動拉取代碼並編譯代碼


Webhook,顧名思義就是鈎子,簡而言之,可以在特定情況下觸發特定的操作。例如在遠程git倉庫中進行了push、tag等操作時,自動在遠程server端自動拉取、編譯代碼。

以下是一個push代碼到遠程倉庫后,自動拉取代碼進行編譯后,將生成的Webassembly相關的文件(.js,.wasm)和版本號push到遠程倉庫中的demo。

二、demo實現

1. 倉庫設置(以gitee為例)

首先,需要擁有項目的管理者權限,點擊項目首頁上方的管理,然后點擊左側菜單下方的WebHooks,進入到以下截圖的設置頁面。

 
WebHooks設置界面.png

 

在上面的的界面中,我已經添加了一個Webhook,觸發類型為push,同時還有一個密碼。
當你push代碼到遠程倉庫時,會往這里設置的URL發送一個攜帶着設置好密碼的POST請求。當然你也可以勾選其他的操作類型。

 
Webhook添加界面.png

2. PHP代碼實現

  • hooks.php
 <?php // 本地倉庫路徑 $local = '/data/wwwroot/default/hooks/laserbox'; // 安全驗證字符串,為空則不驗證 $token = '123456'; // payload為字符串,需要經過解析 $payload = file_get_contents('php://input'); if (!$payload) { header('HTTP/1.1 400 Bad Request'); die('HTTP HEADER or POST is missing.'); } $content = json_decode($payload, true); // 如果啟用驗證,並且驗證失敗,返回錯誤 if ($token && $content['password'] != $token) { header('HTTP/1.1 403 Permission Denied'); die('Permission denied.'); } //最后會執行一個腳本編譯代碼,然后再push代碼到遠程 //所以會重復觸發WebHooks,因此此處判斷是否是本地的推送 if($content['commits'][0]['author']['name'] == 'handsomeTaoTao'){ header('HTTP/1.1 403 Permission Denied'); die('self push.'); } /* * 這里有幾點需要注意: * * 1.確保PHP正常執行系統命令。寫一個PHP文件,內容: * `<?php echo shell_exec('ls -la')` * 在通過瀏覽器訪問這個文件,能夠輸出目錄結構說明PHP可以運行系統命令。 * * 2、PHP一般使用www-data或者nginx用戶運行,PHP通過腳本執行系統命令也是用這個用戶, * 在通過瀏覽器訪問這個文件,能夠輸出目錄結構說明PHP可以運行系統命令。 * * 2、PHP一般使用www-data或者nginx用戶運行,PHP通過腳本執行系統命令也是用這個用戶, * 所以必須確保在該用戶家目錄(一般是/home/www-data或/home/nginx)下有.ssh目錄和 * 一些授權文件,以及git配置文件,如下: * ``` * + .ssh * - authorized_keys * - config * - id_rsa * - id_rsa.pub * - known_hosts * - .gitconfig * ``` * * 3.在執行的命令后面加上2>&1可以輸出詳細信息,確定錯誤位置 * * 4.git目錄權限問題。比如: * `fatal: Unable to create '/data/www/html/awaimai/.git/index.lock': Permission denied` * 那就是PHP用戶沒有寫權限,需要給目錄授予權限: * `` * sudo chown -R :www-data /data/www/html/awaimai` * sudo chmod -R g+w /data/www/html/awaimai * ``` * * 5.SSH認證問題。如果是通過SSH認證,有可能提示錯誤: * `Could not create directory '/.ssh'.` * 或者 * `Host key verification failed.` * */ // shell_exec函數默認是禁止的,無法使用的話需要進php.ini修改相關配置 //執行shell時,沒有sudo仿佛會執行不成功,只執行一小段,加了sudo之后執行成功,可以為運行php的用戶添加sudo權限,參考資料有相關問題 echo shell_exec("cd {$local} && sudo sh ./autoCompiled.sh"); die("done " . date('Y-m-d H:i:s', time())); 

  • autoCompiled.sh
#!/bin/sh
source /data/git/emsdk/emsdk_env.sh  // 載入命令,否則在命令行中無法使用emcc等編譯用的命令
cd  /data/git/Webassembly-Lib/Demo/  // 進入到執行命令的目錄中
git pull
rm -f src/version.h
git rev-list HEAD | sort > config.git-hash
LOCALVER=`wc -l config.git-hash | awk '{print $1}'`
if [ $LOCALVER \> 1 ] ; then
    VER=`git rev-list origin/master | sort | join config.git-hash - | wc -l | awk '{print $1}'`
    if [ $VER != $LOCALVER ] ; then
        VER="$VER+$(($LOCALVER-$VER))"
    fi
    if git status | grep -q "modified:" ; then
        VER="${VER}M"
    fi
    VER="$VER $(git rev-list HEAD -n 1 | cut -c 1-7)"
    GIT_VERSION=r$VER
else
    GIT_VERSION=
    VER="x"
fi
rm -f config.git-hash

cat version.h.template | sed "s/\$FULL_VERSION/$GIT_VERSION/g" > src/version.h


# 編譯和提交代碼
make
git add .
git commit -m 'Auto Compiled By handsomeTaoTao' 
git push

三、結束語

目前這個demo還只是實現了比較簡單的功能,可以進一步優化功能,例如在瀏覽器訪問該地址時顯示上一次編譯是否成功的信息,失敗的話則顯示錯誤信息,這樣子可以方便調試。


參考資料
stackoverflow: php-sudo-in-shell-exec
Gitee 配置文檔
Github、GitLab、Gitee使用Webhooks實現代碼自動部署



作者:hejingtao
鏈接:https://www.jianshu.com/p/0496a89c58e5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM