Git Webhook自動部署項目

爲何用 Webhook ?僅想向測試服自動拉取代碼,不須要構建、測試,簡單就好。

搜了網上的 Webhook 代碼,有的既用到了php,又用到了shell,感受太複雜,本身才疏學淺看不懂,因而就想本身寫一個簡單的,能用就行。php

代碼

直接上代碼nginx

// webhook-dev/index.php

$token = 'XXX'; // 密鑰

if (isset($_SERVER['HTTP_X_GITLAB_TOKEN']) && $_SERVER['HTTP_X_GITLAB_TOKEN'] != $token){
    die('token 不正確');
}

parse_str($_SERVER['QUERY_STRING'], $query);
if (!isset($query['project'])){
    die('請指明項目');
}

$branch = isset($query['branch']) ? $query['branch'] : 'dev';
$command = "cd ../{$query['project']} && git pull origin {$branch}";

echo shell_exec($command);

如何使用

把 webhook 單獨做爲一個項目,經過參數能夠拉取不一樣的項目、分支、標籤。git

  1. webhook-dev 項目 與 其餘項目在同級目錄
  2. 指定拉取項目和分支,query 參數以下web

    • project 項目名
    • branch 分支或標籤,默認 dev

經過 nginx 單獨爲 webhook-dev 配置域名或者ip端口,eg:webhook.vm.com。如要拉取項目(目錄名) 爲hello,分支爲 dev,則連接爲shell

http(s)://webhook.vm.com?project=project1&branch=dev

特別注意權限問題,因爲 web 訪問的用戶和用戶組爲 www ,必定要確保 www 用戶擁有拉取的項目中 .git 目錄的權限。 gitlab

經過 postman 訪問連接,Headers 中設置 X-Gitlab-Token 爲本身的密鑰,與代碼中保持一致。出現如下相似的 git 信息,則視爲部署成功。post

Updating abc123..abc123
Fast-forward
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

接下來進入 gitlab 項目下 Settings->Integrations頁面,把剛纔獲得的連接填入 URL 框中,Secret Token 填入本身的密鑰。測試

嘗試本地提交一下代碼,你會發現已經自動經過 Webhook 拉取到測試服了。code

PS

git 地址使用 Https 會要求輸入密碼,執行如下代碼。而後手動在測試服拉取,輸入密碼後會被記錄。以後就能夠用 Webhook 自動拉取。token

git config --global credential.helper store
相關文章
相關標籤/搜索