天天看點

GitLab 實作代碼自動部署

在當下使用 GIT 來管理代碼已經是一種非常流行的方式了。使用 GIT 可以很友善的給代碼建立分支,撤銷不需要的送出,與他人合作共同編寫代碼。

GitLab 是基于 GIT 實作的現代化的開發者協作平台,它将 issues, code review, CI 和 CD 整合到獨立的網站UI,彌補了 GIT 在可視化操作方面的不足。

本文目的

本文的目的是配置實作在 GitLab 平台上的代碼自動部署。想要達到的效果是這樣子的,當用戶端向 GitLab 伺服器的特定分支(如:prod)送出代碼時,GitLab 伺服器會發送通知給線上代碼伺服器,代碼伺服器收到通知之後再拉取 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 粘貼并儲存即可
需要注意的地方

通過以上三步,現在已經能夠實作代碼自動部署了。

如果完成了以上步驟之後,還不能實作代碼自動部署,最可能出現問題的是賬号的權限問題了。有兩個地方可能出現權限的問題。

  1. GitLab 賬号的權限
    自動部署所綁定的賬号需要有權限通路該項目。
               
  2. 代碼伺服器端執行腳本的使用者的權限
    首先,該使用者需要有權限對項目目錄進行讀寫;  
    然後是,該使用者的秘鑰資訊綁定的是正确的 GitLab 賬号  
               

(完)