Gitee Webhook 實(shí)現(xiàn)自動(dòng)拉取代碼并編譯代碼

一漠趁、Webhook 介紹與作用簡(jiǎn)介

Webhook亡容,顧名思義就是鉤子叭莫,簡(jiǎn)而言之,可以在特定情況下觸發(fā)特定的操作经宏。例如在遠(yuǎn)程git倉(cāng)庫(kù)中進(jìn)行了push犀暑、tag等操作時(shí),自動(dòng)在遠(yuǎn)程server端自動(dòng)拉取烁兰、編譯代碼耐亏。
以下是一個(gè)push代碼到遠(yuǎn)程倉(cāng)庫(kù)后,自動(dòng)拉取代碼進(jìn)行編譯后沪斟,將生成的Webassembly相關(guān)的文件(.js广辰,.wasm)和版本號(hào)push到遠(yuǎn)程倉(cāng)庫(kù)中的demo。

二主之、demo實(shí)現(xiàn)

1. 倉(cāng)庫(kù)設(shè)置(以gitee為例)

首先择吊,需要擁有項(xiàng)目的管理者權(quán)限,點(diǎn)擊項(xiàng)目首頁(yè)上方的管理槽奕,然后點(diǎn)擊左側(cè)菜單下方的WebHooks几睛,進(jìn)入到以下截圖的設(shè)置頁(yè)面。

WebHooks設(shè)置界面.png

在上面的的界面中粤攒,我已經(jīng)添加了一個(gè)Webhook所森,觸發(fā)類型為push,同時(shí)還有一個(gè)密碼琼讽。
當(dāng)你push代碼到遠(yuǎn)程倉(cāng)庫(kù)時(shí),會(huì)往這里設(shè)置的URL發(fā)送一個(gè)攜帶著設(shè)置好密碼的POST請(qǐng)求洪唐。當(dāng)然你也可以勾選其他的操作類型钻蹬。

Webhook添加界面.png

2. PHP代碼實(shí)現(xiàn)

  • hooks.php
 <?php

// 本地倉(cāng)庫(kù)路徑
$local = '/data/wwwroot/default/hooks/laserbox';

// 安全驗(yàn)證字符串,為空則不驗(yàn)證
$token = '123456';

//  payload為字符串凭需,需要經(jīng)過解析
$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);

// 如果啟用驗(yàn)證问欠,并且驗(yàn)證失敗,返回錯(cuò)誤
if ($token && $content['password'] != $token) {
    header('HTTP/1.1 403 Permission Denied');
    die('Permission denied.');
}

//最后會(huì)執(zhí)行一個(gè)腳本編譯代碼粒蜈,然后再push代碼到遠(yuǎn)程
//所以會(huì)重復(fù)觸發(fā)WebHooks顺献,因此此處判斷是否是本地的推送
if($content['commits'][0]['author']['name'] == 'handsomeTaoTao'){
        header('HTTP/1.1 403 Permission Denied');
        die('self push.');
}

/*
 * 這里有幾點(diǎn)需要注意:
 *
 * 1.確保PHP正常執(zhí)行系統(tǒng)命令。寫一個(gè)PHP文件枯怖,內(nèi)容:
 * `<?php echo shell_exec('ls -la')`
 * 在通過瀏覽器訪問這個(gè)文件注整,能夠輸出目錄結(jié)構(gòu)說明PHP可以運(yùn)行系統(tǒng)命令。
 *
 * 2、PHP一般使用www-data或者nginx用戶運(yùn)行肿轨,PHP通過腳本執(zhí)行系統(tǒng)命令也是用這個(gè)用戶寿冕,
 * 在通過瀏覽器訪問這個(gè)文件,能夠輸出目錄結(jié)構(gòu)說明PHP可以運(yùn)行系統(tǒng)命令椒袍。
 *
 * 2驼唱、PHP一般使用www-data或者nginx用戶運(yùn)行,PHP通過腳本執(zhí)行系統(tǒng)命令也是用這個(gè)用戶驹暑,
 * 所以必須確保在該用戶家目錄(一般是/home/www-data或/home/nginx)下有.ssh目錄和
 * 一些授權(quán)文件玫恳,以及git配置文件,如下:
 * ```
 * + .ssh
 *   - authorized_keys
 *   - config
 *   - id_rsa
 *   - id_rsa.pub
 *   - known_hosts
 * - .gitconfig
 * ```
 *
 * 3.在執(zhí)行的命令后面加上2>&1可以輸出詳細(xì)信息优俘,確定錯(cuò)誤位置
 *
 * 4.git目錄權(quán)限問題京办。比如:
 * `fatal: Unable to create '/data/www/html/awaimai/.git/index.lock': Permission denied`
 * 那就是PHP用戶沒有寫權(quán)限,需要給目錄授予權(quán)限:
 * ``
 * sudo chown -R :www-data /data/www/html/awaimai`
 * sudo chmod -R g+w /data/www/html/awaimai
 * ```
 *
 * 5.SSH認(rèn)證問題兼吓。如果是通過SSH認(rèn)證臂港,有可能提示錯(cuò)誤:
 * `Could not create directory '/.ssh'.`
 * 或者
 * `Host key verification failed.`
 *
 */

// shell_exec函數(shù)默認(rèn)是禁止的,無(wú)法使用的話需要進(jìn)php.ini修改相關(guān)配置
//執(zhí)行shell時(shí)视搏,沒有sudo仿佛會(huì)執(zhí)行不成功审孽,只執(zhí)行一小段,加了sudo之后執(zhí)行成功浑娜,可以為運(yùn)行php的用戶添加sudo權(quán)限佑力,參考資料有相關(guān)問題
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  // 載入命令,否則在命令行中無(wú)法使用emcc等編譯用的命令
cd  /data/git/Webassembly-Lib/Demo/  // 進(jìn)入到執(zhí)行命令的目錄中
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

三筋遭、結(jié)束語(yǔ)

目前這個(gè)demo還只是實(shí)現(xiàn)了比較簡(jiǎn)單的功能打颤,可以進(jìn)一步優(yōu)化功能,例如在瀏覽器訪問該地址時(shí)顯示上一次編譯是否成功的信息漓滔,失敗的話則顯示錯(cuò)誤信息编饺,這樣子可以方便調(diào)試。


參考資料
stackoverflow: php-sudo-in-shell-exec
Gitee 配置文檔
Github响驴、GitLab透且、Gitee使用Webhooks實(shí)現(xiàn)代碼自動(dòng)部署

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市豁鲤,隨后出現(xiàn)的幾起案子秽誊,更是在濱河造成了極大的恐慌,老刑警劉巖琳骡,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锅论,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡楣号,警方通過查閱死者的電腦和手機(jī)最易,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門怒坯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘纱,你說我怎么就攤上這事敬肚。” “怎么了束析?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵艳馒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我员寇,道長(zhǎng)弄慰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任蝶锋,我火速辦了婚禮陆爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扳缕。我一直安慰自己慌闭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布躯舔。 她就那樣靜靜地躺著驴剔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粥庄。 梳的紋絲不亂的頭發(fā)上丧失,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音惜互,去河邊找鬼布讹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛训堆,可吹牛的內(nèi)容都是我干的描验。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坑鱼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膘流!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姑躲,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睡扬,失蹤者是張志新(化名)和其女友劉穎盟蚣,沒想到半個(gè)月后黍析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屎开,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年阐枣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔼两,死狀恐怖甩鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情额划,我是刑警寧澤妙啃,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站俊戳,受9級(jí)特大地震影響揖赴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抑胎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一燥滑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阿逃,春花似錦铭拧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至淡喜,卻和暖如春秕磷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炼团。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工澎嚣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘟芝。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓易桃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锌俱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晤郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容