四、jenkins+gerrit+Git 搭建CI系統

一、CI工做流程

當開發人員將本地Git倉庫中的代碼更新後,執行commit和push操做;該動做會生成一個事件,並觸發Jenkins進行構建。若是開發人員在代碼中加入和Junit或者testng測試用例,也會在構建過程當中執行;構建完成後,jenkins會將構建的結果以Gerrit投票的方式傳到Gerrit服務器上。項目Owner登陸Gerrit Web UI,進行Code Review時會看到Jenkins構建的結果並進行code review。只有當構建成功,而且code review經過時,項目owner纔會將代碼合到主分支上,若是說jenkins上構建失敗,則表示代碼確定有問題,Owner不用Code Review,直接通知開發檢查代碼並從新提交。html

二、CI工做環境

Gerrit + Jenkins(安裝Gerrit Trigger插件) +Gitjava

Gerrit服務器:10.10.10.206git

Jenkins服務器:10.10.10.202express

兩臺服務器都安裝了Gitapache

三、CI配置

Gerrit上的配置

一、安裝Label Verified api

初次安裝Gerrit時,在交互安裝過程當中,系統會問你是否安裝Label Verified ,默認是不安裝的。若是要搭建CI系統,這裏須要選擇安裝。若是gerrit系統中沒有安裝這個東西,後期能夠經過重裝gerrit的方式再裝上。重裝gerrit和初次安裝gerrit的命令同樣:java -jar /path/to/gerrit.war  /path/to/gerrit_dir。至於如何安裝gerrit,請參考第一篇文檔。服務器

重裝前,先停掉gerrit服務,交互安裝過程當中,不少步驟使用老的配置,默認便可。惟獨提示是否安裝Label Verified 時 選擇y,表示安裝。oracle

二、在Gerrit服務器上爲Jenkins服務器建立一個帳號爲jenkins。用該帳號登陸Gerrit Web UI,將該帳號加入系統預設的Non-Interactive Users組。該組默認就已有監聽Stream Events權限,Steam Events的原理是:Gerrit收到代碼提交後,會以event的形式發給Jenkins,從而觸發Jenkins自動構建。框架

三、爲該帳號設置SSH Key,即將Jenkins服務器的root帳戶下的公鑰傳到Gerrit上jenkins帳號下的SSH Public Keys中,若是不知道如何設置,請參考前面的Gerrit用戶配置文檔。ssh

四、爲jenkins帳號註冊郵箱

五、設置jenkins用戶的權限,注意設置權限,要對All-Projects進行設定

p_w_picpath2016-6-2%2016%3A13%3A58.png?version

p_w_picpath2016-6-2%2016%3A17%3A10.png?version

p_w_picpath2016-6-2%2016%3A15%3A14.png?version

設置jenkins用戶的read'權限

p_w_picpath2016-6-2%2016%3A20%3A45.png?version

p_w_picpath2016-6-2%2016%3A21%3A39.png?version

給jenkins用戶設置Code Review權限和Verified權限,Code Review權限爲-2~+1,當jenkins構建失敗時,直接將gerrit投票結果設置爲-2。

p_w_picpath2016-6-5%2018%3A22%3A29.png?version

 

Jenkins上的配置

一、安裝Gerrit Trigger插件

系統管理==>管理插件==>可選插件,搜索Gerrit Trigger,安裝後重啓Jenkins

  

二、配置Gerrit Trigger

系統管理==>Gerrit Trigger==>Add New Server

p_w_picpath2016-6-2%2016%3A29%3A5.png?version=


設置jenkins的對構建結果的一個gerrit投票值,構建失敗則爲-2,項目owner在不用code review了。項目若是構成成功則不表示代碼必定OK,仍是須要owner進行Code Review後在確認是否要merge

p_w_picpath2016-6-5%2018%3A29%3A48.png?version

四、CI工做流程演示

這裏咱們仍是用第4篇文檔中的TEST項目來測試。

登陸jenkins,建立一個maven項目

p_w_picpath2016-6-2%2016%3A38%3A9.png?version=

 

 

源碼管理這裏選擇Git,Repository URL就是Gerrit Web上的爲匿名用戶提供的地址,注意把地址中的

git clone命令去掉,Jenkins服務器自身安裝了git,集成了git環境。

注意:開發人員push的代碼尚未merged,是保存在gerrit上的臨時分支上的,因此咱們要構建的話,應該去下載臨時分支上的代碼去構建。而不是下載$GERRIT_BRANCH上已經merge過的代碼

Refspec:設置爲refs/changes/*:refs/changes/*  

Bracnes to build:設置爲$GERRIT_REFSPEC,這個是git插件自帶的宏,還有一個宏爲$GERRIT_BRANCH,表示Gerrit上的分支。下面是Jenkins官方對這兩個宏的解釋:

To get the Git Plugin to download your change; set Refspec to $GERRIT_REFSPEC and the Choosing strategy to Gerrit Trigger. You may also need to set 'Branches to build' to $GERRIT_BRANCH. If this does not work for you set Refspec torefs/changes/*:refs/changes/* and 'Branches to build' to $GERRIT_REFSPEC.

Note: Be aware that $GERRIT_BRANCH and $GERRIT_REFSPEC are not set in the Ref Updated case. If you want to trigger a build, you can set Refspec and 'Branches to build' to $GERRIT_REFNAME.

只有這兩個地方設置對,jenkins才能到gerrit上下載changes(即開發人員push的最新的代碼)去構建。

p_w_picpath2016-6-6%2013%3A7%3A11.png?version=

 

 

構建觸發器選擇Gerrit event

Choose a server:選擇前面配置的Gerrit Server

Trigger on:能夠不配置,jenkins會默認選擇 Patchset Created  Draft Published。表示開發人員只要push代碼則觸發構建,這是咱們指望的。Change Merged表示當代碼審覈經過後,而且成功地Merge後才觸發構建。Comment Added:這個選項能夠自定義Code Review和Verified的值來觸發構建,假如我這裏Trigger on選擇Comment Added,而且Code Review的值選擇1,那麼當項目管理員審覈代碼時,給的值爲1,就會觸發構建。

下面是官網的解釋:

  • Draft Published: Sent when a change moves from draft state to new. (only available in version 2.5 or higher of Gerrit).

  • Patchset Created: Sent when a new patchset arrives on a change. Before version 2.6.0, this was the only event you could trigger on.

  • Change Merged: Sent when a change is merged on the Gerrit server.

  • Comment Added: Sent when a comment is added to a change. Which category and value to trigger on can be configured. The available categories can be configured in the server settings for the plugin.

  • Ref Updated: Sent when a ref is updated on the Gerrit server, i.e. someone pushes past code review.


 Silent Mode:靜默模式,即gerrit上作了code review和submit操做,Gerrit上對應的jenkins帳號不發送郵件通知。

 

p_w_picpath2016-6-5%2019%3A3%3A24.png?version=

 

Gerrit Project:左邊選擇項目,右邊選擇分支,支持如下三種方式:

  • Plain: The exact name in Gerrit, case sensitive equality.

我選擇Path,後面寫**,表示該項目全部分支。

p_w_picpath2016-6-6%2013%3A40%3A38.png?version


p_w_picpath2016-6-2%2016%3A48%3A32.png?version

構建後的操做,選擇郵件通知

p_w_picpath2016-6-2%2016%3A50%3A7.png?version=


測試CI是否成功

用user2用戶登陸jenkins服務器10.10.10.202, 從Gerrit Web UI上clone TEST項目,

第一次clone TEST項目時,因爲這個項目沒有開發人員參與,因此TEST文件夾爲空,這裏的全部文件都是user2用戶建立的。

pom.xml文件是構建maven項目必須的,cat  pom.xml,能夠看到我這裏加入了testng的測試框架

p_w_picpath2016-6-2%2017%3A17%3A40.png?version

 

在./src/test/java/com/carkey/testng/AppTest.java文件中寫好了測試用例

p_w_picpath2016-6-2%2017%3A19%3A24.png?version


 

建立代碼文件,並將代碼push到Gerrit服務器對應的項目倉庫中

user2@localhost:~/TEST$ git add *
user2@localhost:~/TEST$ git commit -m "init" 
[master 96c15a5] init
1 files changed, 1 insertions(+), 133 deletions(-)
rewrite code.sh (100%)
user2@localhost:~/TEST$ git push origin master:refs/for/master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 362 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: new: 1, refs: 1, done 
remote: 
remote: New Changes:
remote: http://10.10.10.206:8081/35 init
remote: 
To ssh://user2@10.10.10.206:29418/TEST
* [new branch] master -> refs/for/master

 登陸Jenkins,看到項目構建時測試經過了,構建結果爲Success。

p_w_picpath2016-6-5%2018%3A58%3A55.png?version

p_w_picpath2016-6-5%2018%3A43%3A55.png?version


用user2登陸Gerrit Web UI,查看Jenkins的投票結果(也能夠理解爲構建結果),並邀請admin管理員進行Code Review

以下圖能夠看到jenkins構建成功了,Code-Review和Verified都是+1,這兩個值是前面在Gerrit Trigger中配置的。

p_w_picpath2016-6-5%2018%3A48%3A56.png?version

邀請admin進行Code-Review

p_w_picpath2016-6-5%2018%3A53%3A25.png?version

 

admin用戶進行Code Review。管理員根據jenkins的投票指導構建結果是Success。而後進行Code-Review,若是代碼沒有問題,則Code-Review+2,並Submit。

此時代碼纔會合到對應的分支上。

p_w_picpath2016-6-5%2018%3A53%3A54.png?version

p_w_picpath2016-6-2%2017%3A26%3A30.png?version

到這裏CI工做流程就結束了。

 

五、Gerrit Trigger插件的的其餘功能

安裝這個插件後,在首頁能看到Query and Trigger Gerrit Patches的功能

p_w_picpath2016-6-2%2017%3A42%3A10.png?version

該功能能夠查詢Gerrit服務器上的全部項目的全部狀態的事件

根據狀態查詢

p_w_picpath2016-6-2%2017%3A46%3A37.png?version

根據項目查詢

p_w_picpath2016-6-2%2017%3A47%3A47.png?version

根據用戶查詢

p_w_picpath2016-6-2%2017%3A48%3A53.png?version

 

根根據時間來查詢

p_w_picpath2016-6-2%2017%3A58%3A46.png?version

 

p_w_picpath2016-6-2%2017%3A59%3A31.png?version

 

六、build-metrics插件介紹

這個插件是全局性的插件,能查看全部項目的構建狀況,包括成功、失敗、不穩定、被終止等狀態的構建。

安裝:

這個插件的安裝過程就不在詳細描述,在插件管理--可選插件中直接搜索build-metrics,安裝,重啓jenkins便可

p_w_picpath2016-6-2%2018%3A4%3A39.png?version=

 

使用:

系統管理中,找到build-metrics,點擊進去

p_w_picpath2016-6-2%2018%3A7%3A39.png?version=


根據時間和Job名來查詢

p_w_picpath2016-6-2%2018%3A11%3A49.png?version

p_w_picpath2016-6-2%2018%3A10%3A38.png?version

按項目來查詢

p_w_picpath2016-6-2%2018%3A11%3A7.png?version=

相關文章
相關標籤/搜索