1. 程式人生 > >GitLab 實現代碼自動部署(轉載自https://segmentfault.com/a/1190000011561808)

GitLab 實現代碼自動部署(轉載自https://segmentfault.com/a/1190000011561808)

use name 無密碼登錄 row 內容 app mage 請求 XML

在當下使用 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_rsaid_rsa.pub

然後將 id_rsa.pub 的內容添加到 GitLab 賬號:

在 GitLab 賬號的 profile setting > SSH keys 粘貼並保存即可

需要註意的地方

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

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

  1. GitLab 賬號的權限

    自動部署所綁定的賬號需要有權限訪問該項目。
  2. 代碼服務器端執行腳本的用戶的權限

    首先,該用戶需要有權限對項目目錄進行讀寫;  
    然後是,該用戶的秘鑰信息綁定的是正確的 GitLab 賬號  
    

GitLab 實現代碼自動部署(轉載自https://segmentfault.com/a/1190000011561808)