GitLab 實現代碼自動部署(轉載自https://segmentfault.com/a/1190000011561808)
在當下使用 GIT 來管理代碼已經是一種非常流行的方式了。使用 GIT 可以很方便的給代碼創建分支,撤銷不需要的提交,與他人合作共同編寫代碼。
GitLab 是基於 GIT 實現的現代化的開發者協作平臺,它將 issues, code review, CI 和 CD 整合到獨立的網站UI,彌補了 GIT 在可視化操作方面的不足。
本文目的
本文的目的是配置實現在 GitLab 平臺上的代碼自動部署。想要達到的效果是這樣子的,當客戶端向 GitLab 服務器的特定分支(如:prod)提交代碼時,GitLab 服務器會發送通知給線上代碼服務器,代碼服務器收到通知之後再拉取 GitLab 服務器上該分支的最新代碼。
效果圖如下:
有了 GitLab ,只需要三步就可以實現以上描述的效果了。
步驟一、準備兩個腳本
在代碼服務器端準備好一份處理 GitLab 服務器通知的腳本和一份拉取代碼的腳本。
GitLab 服務器所發出來的通知,其實就是向代碼服務器發出一個 http 請求,請求中包含了本次提交中的相關信息,如所提交的分支、誰提交的、本次更新的代碼等等信息。
所以在代碼服務器中添加一個腳本,專門處理該請求即可。
可以參考一下的 PHP 代碼:
<?php
// 處理 GitLab 請求的腳本
$rowData = file_get_contents(‘php://input‘, ‘r‘);;
$rowData = json_decode($rowData,true);
$output = ‘‘;
$type = $_GET[‘type‘];
// 只拉取 prod 分支的代碼到服務器
if($rowData[‘ref‘] == ‘refs/heads/prod‘){
if(‘ims‘ == $type){
// 觸發拉取代碼的腳本
exec(‘./post-ims‘,$output);
}
logg($type." output:".json_encode($output));
}
logg($type.‘:‘.$rowData[‘user_name‘]." commit to branch:".$rowData[‘ref‘]);
function logg($data){
$text = ‘[‘.date(‘Y-m-d H:i:s‘).‘] ‘.$data."\n";
file_put_contents(‘./log/gitlab‘.date(‘ym‘).‘.log‘,$text,FILE_APPEND);
}
還有一個就是處理拉取 GitLab 服務器更新到代碼服務器的腳本。該腳本可以很簡單,只需要將當前工作目錄切換到項目的工作目錄,然後執行拉取代碼的命令即可。
參考以下 shell 腳本:
#!/bin/bash
# 拉取代碼的腳本
cd /www/ims/
git pull origin prod
步驟二、配置 webhooks
在項目中配置 webhooks(Web 鉤子) 其實就是在項目中註冊一個觸發器,當項目中的某個事件發生時,該觸發器就會被觸發。在 GitLab 中的觸發器就是一個 http 請求,即一個 http 鏈接。
在 GitLab 中,要達到我們上面預設的效果,我們需要設置項目的推送事件的 webhook。一個能訪問到我們步驟一添加的 PHP 腳本的鏈接。
配置所在的路徑是:
項目主頁 > setting > webhooks
在該頁面添加一個推送事件的觸發器即可,類似這樣子的 URL:
http://example.com/gitlab.php?type=ims
保存之後,可以測試下該鏈接是否正確。它會模擬發送一個推送請求的數據,格式和正常的推送的一樣。在代碼服務器端就可以根據這個來調試了。
步驟三、添加秘鑰
既然是代碼自動部署,那當然是完全不需要人為參與的啦,這將包括不需要人為輸入密碼。
GitLab 提供了讓每個賬號使用秘鑰登錄的功能,配置了賬號秘鑰之後就可以無密碼登錄賬號了。代碼自動部署正是需要這樣子的功能了。
首先要在代碼服務器端生成秘鑰:
使用命令
ssh-keygen
,連續按三次回車即可生成一對無密碼保護的秘鑰,它們的名稱分別是id_rsa
和id_rsa.pub
然後將 id_rsa.pub
的內容添加到 GitLab 賬號:
在 GitLab 賬號的 profile setting > SSH keys 粘貼並保存即可
需要註意的地方
通過以上三步,現在已經能夠實現代碼自動部署了。
如果完成了以上步驟之後,還不能實現代碼自動部署,最可能出現問題的是賬號的權限問題了。有兩個地方可能出現權限的問題。
-
GitLab 賬號的權限
自動部署所綁定的賬號需要有權限訪問該項目。
-
代碼服務器端執行腳本的用戶的權限
首先,該用戶需要有權限對項目目錄進行讀寫; 然後是,該用戶的秘鑰信息綁定的是正確的 GitLab 賬號
GitLab 實現代碼自動部署(轉載自https://segmentfault.com/a/1190000011561808)