利用Jenkins+Gitlab搭建持續整合(CI)環境

yuanmei1986發表於2016-04-19

這次實習的任務之一就是搭建一個持續整合(Continuous Integration)環境。

我們選擇Jenkins作為持續整合工具,其優點是提供web GUI配置介面,方便配置,還可以安裝很多第三方外掛(plugin)進行定製與擴充套件,功能強大。

其次選擇Gitlab作為git server。Gitlab的功能和Github差不多,但是是開源的,可以用來搭建私有git server,也提供非常強大的web GUI,比如開發者互相review原始碼的時候就會很方便。

本文首先介紹整個系統的結構,然後再一一敘述各個元件的安裝及使用方法。

1.系統概覽

系統結構如下圖所示:

figure_1

系統的工作流程大概分為以下幾步:

1> 開發者將新版本push到git server (Gitlab)。

2> Gitlab隨後觸發jenkins master結點進行一次build。(通過web hook或者定時檢測)

3> jenkins master結點將這個build任務分配給若干個註冊的slave結點中的一個,這個slave結點根據一個事先設定好的指令碼進行build。這個指令碼可以做的事情很多,比如編譯,測試,生成測試報告等等。這些原本需要手動完成的任務都可以交給jenkins來做。

4> 我們在build中要進行編譯,這裡使用了分散式編譯器distcc來加快編譯速度。

notes

jenkins的工作原理是先將原始碼從gitlab中拷貝一份到本地,然後根據設定的指令碼進行build。我們可以看出,整個系統的關鍵就是那個build指令碼,用來告訴jenkins在一次整合中需要執行的任務。

2.Jenkins的安裝與配置

1> 安裝Jenkins

首先說如何安裝jenkins,一定要安裝最新版本才不會出各種奇怪的問題,參考官網wiki,Installing Jenkins on Ubuntu上的指示,

$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins

即可以得到最新版的jenkins。

Jenkins安裝完畢後,可以通過瀏覽器訪問其Dashboard,例如192.168.16.183:8080,IP地址即為Jenkins所在機器的IP地址。

2> Jenkins外掛安裝

Jenkins其實沒有什麼需要特別配置的,由於這次任務中需要利用Jenkins與git,gitlab協作,所以需要安裝一些外掛。在主皮膚上點選Manage Jenkins -> Manage Plugins。

由於公司使用代理連線外網,首先需要為Jenkins外掛安裝配置proxy。點選Advanced標籤即進入proxy設定頁面。

Aailable標籤下就是可以安裝的外掛。

要讓Jenkins可以自動build git repo中的程式碼,需要安裝GIT Client Plugin和GIT Plugin。

要想Jenkins可以收到Gitlab發來的hook從而自動build,需要安裝 Gitlab Hook Plugin。

要讓Jenkins可以在build完成之後根據TAP(test anything protocol)檔案生成graph,需要安裝 TAP Plugin。

3> Jenkins Job

我們嘗試新建一個Jenkins Job,必須填的內容不是很多,而且每一項後面都有意一個問號,點選後會有關於這項的一些提示。

(1)首先是Project name;

(2)然後在Source Code Management 中選擇Git,我們只需要提供Repository URL即可,這個URL可以是Jenkins機器上的一個本地repo,例如/home/woody/repo;也可以是一個遠端機器上的repo,例如Gitlab上通過ssh連線的repo: git@192.168.16.194:user/test_gitlab_repo.git

注意,我們需要在Jenkins機器上設定Git username 和 email,不然後面會build不成功。

(3)下面需要在Build中選擇Add build step,這裡以最熟悉的shell為例,選擇Execute shell。Jenkins的工作原理很簡單,就是從剛才的Repository URL裡clone到當前的一個workspace中並切換到最新的branch然後執行Execute shell中的command,如果每條command都返回0則build成功,否則則算失敗。 所以我們的shell command可以是簡單的編譯指令例如:

#!/bin/sh
make

(這需要你的git repo中有一個makfile)

也可以執行repo中的另一個指令碼,例如

#!/bin/sh
perl test.pl

甚至可以什麼都不做,或者是隻輸入一些字元。

(4)接下來我們需要設定一個觸發選項,在Build Triggers中,Jenkins提供三個選擇

Build after other projects are built 顧名思義

Build periodically 週期性地build

Poll SCM 週期性的檢測SCM(如Git)中是否有新的提交,如果有則build

選擇後面兩項我們都需要在Schedule中設定週期,點選後面的問號可以檢視的設定週期的語法。

到這一步結束後我們就可以Save配置了,可以在皮膚中點選Build Now看看是否可以正常工作。在下面的Build History中有該Job的所有build歷史,點選任意一條進去後可以進行檢視,特別說明可以在Console Output中看到執行這次build時控制檯的輸出資訊。

(5)如果安裝了TAP Plugin,我們還可以配置Job在build完成後根據TAP result生成一副Graph例如下圖:

figure_2

這幅圖顯示了每次build中成功與失敗次數的走勢。

想要得到這張圖的話,需要在Configure的Post-build Action中選擇Add post-build action -> Publish TAP result。 然後在test result 中輸入你的TAP result檔案的路徑,例如tap.tap指的就是當前檔案下的tap.tap檔案。也就是說在你的Execute Shell中,你需要在編譯完成後根據結果自己生成一個TAP檔案,TAP的語法可以參考Jenkins TAP Plugin的說明。

4> 搭建Jenkins Master - Slaves 架構

我們在配置Jenkins時,有一個# of executors 選項,這項代表了Jenkins可以同時處理的Job的數量。

Jenkins還支援將Job分給Slave處理的功能。這就需要我們為Jenkins配置一些Slaves。

在Dashboard中點選 Mamage Jenkins -> Manage Nodes -> New Node

然後輸入Node name 並選擇Dumb Slave 點選OK後進入配置頁面。需要填的內容如下圖所示:

figure_3

# of executors指的是該slave上允許同時處理的job數量; 其他選項也都顧名思義, 我們這裡選擇用SSH的方式進行連線,Host即為Slave的IP地址。

Slave上不需要安裝Jenkins,只需要安裝java環境和git即可:

$ sudo aptitude install default-jre
$ sudo aptitude install git

還需要為slave的jenkins使用者配置git user.name & user.email

這裡需要說明一個地方,Jenkins在工作時是利用一個名為jenkins的使用者登入機器的。

在master節點上,安裝Jenkins時自動為系統新增了一個名為jenkins的使用者,由於slave機器上不需要安裝jenkins,所以我們需要在slave機器上手動新增一個名為jenkins的使用者。而且Jenkins master只能通過不用輸入密碼的SSH方式連線slave,需要在master上用jenkins使用者生成一對ssh金鑰,並把公鑰加入slave機器上jenkins使用者的使用者目錄裡.ssh/authorized_keys中。

注意,沒有密碼的使用者在ubuntu下可能切換不成功,我們用下面的方法:

$ sudo su jenkins
$ bash

3.Gitlab的安裝與配置

Gitlab的功能和Github差不多,都是作為git server。

Gitlab是開源的,我們可以利用Gitlab搭建自己私有的git server。

我們可以在bitnami上下載Gitlab

公司有現成的Gitlab,所以我沒有嘗試Gitlab的安裝,看上去成功安裝並不容易。

為了測試,還是在虛擬機器環境下配置了Gitlab,直接下載了Virtual Machine映象,由於映象是Vmware的,還需要將其轉為Virtual Box映象,方法參見http://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide

在虛擬機器上跑起來後,發現是一個沒有GUI的ubuntu。。。系統使用者名稱和密碼都是bitnami。

我們還可以通過訪問其IP地址登入Gitlab,初始使用者名稱為user,密碼為bitnami,看上去和github很象。


由於在這次任務中Jenkins需要從Gitlab中獲取檔案並build,所以我們需要在Gitlab的工程中設定一些東西。

首先是settings -> Deploy Keys, 這裡需要加入Jenkins所在機器jenkins使用者的公鑰。

如果Jenkins中使用slave,還需要將slave的公鑰加入deloy keys中。 因為slave的工作原理是收到master的指示直接clone repository。

然後是一個叫Web Hooks的東東。還記得我們在Jenkins中安裝過Gitlab Hook Plugin麼,如果設定了Web Hooks,Gitlab就會在每次push上來後傳送一條訊息到指定的地址(即hook的地址),Jenkins Gitlab Hook Plugin收到訊息後立即build。

不過我按照Gitlab Hook Plugin的說明設定裡hooks後並沒有什麼作用,可能是那個外掛的bug吧。。

後來大哥告訴我一個巧妙的辦法,就是將Jenkins Job裡的build now連線作為hook地址,例如http://192.168.16.183:8080/job/test_gitlab/build?delay=0sec

這樣每次Gitlab收到push後就會促使Jenkins立即build。

4.distcc的安裝與配置

distcc是一個分散式的編譯器,他可以將編譯任務分配給多個其他機器上的destccd-daemon,從而加速編譯過程。

1> 安裝

ubuntu下distcc很容易安裝

$ sudo aptitude install distcc

2> 配置

distcc分為前端和守護程式,前端的用法和gcc差不多,用來編譯原始碼檔案。

守護程式即distcc-daemon,需要一些配置。

守護程式的配置檔案在 /etc/default/distcc 中,

$ sudo vim /etc/default/distcc

STARTDISTCC="true"                 //這項允許distccd啟動

ALLOWEDNETS=“192.168.16.0/24”  //這項指出裡允許那些IP的distcc連線上來, /24指的是子網掩碼前24位為1,後面為0,即代表192.168.16.0 ~ 192.168.16.255
LISTENER=“192.168.16.183”      //這項應該填本機的IP地址,即需要監聽的IP地址

ZEROCONF = “false”             //這項指出不開啟zeroconf,我們先講不開啟zeroconf,後面再討論使用它的情況

這樣一個distccd就配置完成了。

通過以下命令可以開啟和停止distccd

$ sudo service distcc start
$ sudo service distcc stop

在進行編譯前,因為distccd都沒有開啟zeroconf,所以distcc無法知道有哪些host可供使用,所以這裡需要在環境變數中加入,例如

export DISTCC_HOSTS="192.168.16.183 192.168.16.198"

使用下面的命令可以檢視hosts是否配置成功。

$ distcc --show-hosts

然後就可以使用distcc進行分散式編譯,例如編譯linux kernel,

$ make CC=distcc

下面講當我們為distccd開啟ZEROCONF時即配置

ZEROCONF=“true”

這就說明distcc可以不需要手動配置hosts地址即可以發現可用的hosts,具體原理不是很清楚,反正用命令

$ distcc --show-hosts

可以看到distccd的地址。

但是這裡貌似對IPv6的解析上有一個bug,百度裡一下說需要關閉avahi的IPv6

編輯 /etc/avahi/avahi-daemon.conf

修改以下內容

use-ipv6=no

即可。

然後還需要在呼叫distcc的使用者的環境變數中加入

export DISTCC_HOSTS="+zeroconf"

我們還可以在呼叫distcc的使用者中用以下命令檢視編譯的進度

$ distccmom-text 5

相關文章