06 工程化 03 Jenkins:Jenkins詳細教程

一、jenkins是什麼?

        Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,起源於Hudson(Hudson是商用的),主要用於持續、自動的構建/測試軟件項目、監控外部任務的運行(這個比較抽象,暫且寫上,不做解釋)。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。

        相信大家都知道jenkins是用來做可持續集成的? 但部問題是很多人並不明白什麼叫可持續化集成。講概念之前我們先來舉一個場景:

        一個團隊正着手開發一個項目,在需求評審之後由小組長把項目拆成了若干個模塊,分給不同的小夥伴去實現。2個星期以後各自模塊的功能都實現了,大家都很開心。這時該合在一起提測了吧。這一合小組長傻眼了,功能沒一個能用的,要麼公共類衝突了,要麼配置衝突....

        經過上次的教訓,小組長變聰明瞭,在也不等功能開發之後在合併提測了,而是每天集成提測,如果發現衝突當天就要解決。

 

二、CI/CD是什麼?

         CI(Continuous integration,中文意思是持續集成)是一種軟件開發時間。持續集成強調開發人員提交了新代碼之後,立刻進行構建、(單元)測試。根據測試結果,我們可以確定新代碼和原有代碼能否正確地集成在一起。借用網絡圖片對CI加以理解。

 

CI

        CD(Continuous Delivery, 中文意思持續交付)是在持續集成的基礎上,將集成後的代碼部署到更貼近真實運行環境(類生產環境)中。比如,我們完成單元測試後,可以把代碼部署到連接數據庫的Staging環境中更多的測試。如果代碼沒有問題,可以繼續手動部署到生產環境。下圖反應的是CI/CD 的大概工作模式。

 

CI/CD

 

持續集成要點:

  1. 統一的代碼庫(git)
  2. 統一的依賴包管理(nexus)
  3. 測試自動化
  4. 構建全自動化(maven)
  5. 部署自動化
  6. 可追蹤的集成記錄

 

三、使用Jenkins進行PHP代碼(單元)測試、打包。

        Jenkins是一個強大的CI工具,雖然本身使用Java開發,但也能用來做其他語言開發的項目CI。下面講解如何使用Jenkins創建一個構建任務。

 登錄Jenkins, 點擊左側的新建,創建新的構建任務。

 

跳轉到如下界面。任務名稱可以自行設定,但需要全局唯一。輸入名稱後選擇構建一個自由風格的軟件項目(其他選項不作介紹)。並點擊下方的確定按鈕即創建了一個構建任務。之後會自動跳轉到該job的配置頁面。

 

新建自由風格的軟件項目

 

下圖是構建任務設置界面,可以看到上方的幾個選項"General", "源碼管理", "構建觸發器","構建環境", "構建", "構建後操作"。下面逐一介紹。

 

1.General

General是構建任務的一些基本配置。名稱,描述之類的。

 

General

項目名稱: 是剛纔創建構建任務步驟設置的,當然在這裏也可以更改。

描述: 對構建任務的描述。  

丟棄舊的構建: 服務器資源是有限的,有時候保存了太多的歷史構建,會導致Jenkins速度變慢,並且服務器硬盤資源也會被佔滿。當然下方的"保持構建天數" 和 保持構建的最大個數是可以自定義的,需要根據實際情況確定一個合理的值。

其他幾個選項在這裏不做介紹,有興趣的可以查看Jenkins"幫助信息", 會有一個大概的介紹。不過這些"幫助信息"都是英文的。

 

點擊右方的這些"問號"查看"幫助信息"

 

2.源碼管理

源碼管理就是配置你代碼的存放位置。

 

源碼管理

 Git: 支持主流的github 和gitlab代碼倉庫。因我們的研發團隊使用的是gitlab,所以下面我只會對該項進行介紹。

Repository URL:倉庫地址

Credentials:憑證。可以使用HTTP方式的用戶名密碼,也可以是RSA文件。 但要通過後面的"ADD"按鈕添加憑證。

Branches to build:構建的分支。*/master表示master分支,也可以設置爲其他分支。

源碼瀏覽器:你所使用的代碼倉庫管理工具,如github, gitlab.  

URL:填入上方的倉庫地址即可。

Version: 8.7   這個是我們gitlab服務器的版本。

Subversion:就是SVN,這裏不作介紹。

 

3.構建觸發器

構建觸發器,顧名思義,就是構建任務的觸發器。

觸發遠程構建(例如,使用腳本): 該選項會提供一個接口,可以用來在代碼層面觸發構建。這裏不做介紹,後期可能會用到。

Build after other projects are built: 該選項意思是"在其他projects構建後構建"。這裏不作介紹,後期可能會用到該選項。

Build periodically: 週期性的構建。很好理解,就是每隔一段時間進行構建。日程表類似        linux crontab書寫格式。如下圖的設置,表示每隔30分鐘進行一次構建。

週期構建

 

Build when a change is pushed to GitLab:當有更改push到gitlab代碼倉庫,即觸發構建。後面會有一個觸發構建的地址,一般被稱爲webhooks。需要將這個地址配置到gitlab中,webhooks如何配置後面介紹。這個是常用的構建觸發器。

Poll SCM:該選項是配合上面這個選項使用的。當代碼倉庫發生改動,jenkins並不知道。需要配置這個選項,週期性的去檢查代碼倉庫是否發生改動。

 

十分鐘檢查一次

 

4.構建環境

構建環境就是構建之前的一些準備工作,如指定構建工具(在這裏我使用ant)。

構建環境中的構建工具

 

With Ant:選擇這個工具,並指定ant版本和jdk版本。這兩個工具的版本我都事先在服務器上安裝,並且在jenkins全局工具中配置好了。

其他選項不作介紹,同樣可以查看"幫助信息" 獲得使用幫助。

 

5.構建

       選擇下方的增加構建步驟。

 

增加構建步驟

可以選擇的項很多。這裏就介紹"Invoke Ant" 和"Execute shell".

Eexcute shell: 執行shell命令,該工具是針對linux環境的,windows環境也有對應的工            具"Execute Windows batch command"。 在構建之前,可能我們需要執行一些命令,比如壓縮包的解壓之類的。爲了演示,我就簡單的執行  "echo $RANDOM" 這樣的linux shell下生產隨機數命令。

Invoke Ant:Ant是一款java項目構建工具,當然也能用來構建php。

 

 

 

Ant Version: 選擇Ant版本。這個ant版本是安裝在jenkins服務器上的版本,並且需要在jenkins"系統工具"中設置好。

Targets:要執行的操作,一行一個操作任務。以上圖爲例,build是構建,tar是打包。

Build File: 是Ant構建的配置文件,如果不指定,則是在項目路徑下的workspace目錄中的build.xml。build.xml文件具體怎麼配置,後面再細講。

properties: 設定一些變量,這些變量可以在build.xml 中被引用。

Send files or execute commands over SSH:發送文件到遠程主機或執行命令(腳本)

 

Name: SSH Server的名稱。SSH Server可以在jenkins-系統設置中配置。

source files: 需要發送給遠程主機的源文件。

Remove prefix: 移除前面的路徑。如果不設置這個參數,則遠程主機會自動創建構建源 source files 包含的那個路徑。

Remote directory: 遠程主機目錄。

Exec command:在遠程主機上執行的命令,或者執行的腳本。

 

 

6.構建後操作

        構建後操作,就是對project構建完成後的一些後續操作,比如生成相應的代碼測試報告。

 

 

郵件通知

Publish Clover PHP Coverage Report:發佈代碼覆蓋率xml格式的文件報告。路徑會在"build.xml"文件中定義

Publish HTML reports:發佈代碼覆蓋率的HTML報告。  

Report Crap: 發佈crap報告

E-mail Notification:  郵件通知,構建完成後發郵件到指定的郵箱。

以上配置完成後,點擊保存。

7.其他相關配置

 SSH Server配置

登錄jenkins -- 系統管理 -- 系統設置

配置請看下圖

 

SSH SERVER

SSH Servers: 由於jenkins服務器公鑰文件我已經配置好,所以之後新增SSH Servers 只需要配置這一項即可。 

Name: 自定義,需要全局唯一。

HostName: 主機名,直接用ip地址即可。

Username: 新增Server的用戶名,這裏配置的是root。

Remote Directory: 遠程目錄。jenkins服務器發送文件給新增的server默認是在這個目錄。

 

Ant 配置文件 "build.xml"

接下來講解Ant 構建配置文件"build.xml"。 之所以是build.xml 這是因爲官方慣例。就好比任何編程語言的入門都會是打印"Hello world".  你也可以用其他名稱代替"build.xml" .

下面針對配置文件"build.xml" 關鍵配置進行說明。

project name就是項目名稱,和jenkins所創建的對應。

target name="build" 就是構建的名稱,和jenkins構建步驟 那裏的targets對應。depends指明構建需要進行的一些操作。

property 用來設置變量。

fileset 這一行指明瞭一個文件夾,用include來指明需要包含的文件,exclude指明不包含的文件,"tar"即是打包這個文件夾中匹配到的文件。

下面的這些target都是一些實際的操作步驟,比如make_runtime這個"target" 就是創建了一些目錄。phpcs就是利用PHP_CodeSniffer這個工具 對PHP代碼規範與質量檢查工具。

 

 

最後這個target "tar" 就是打包文件。因爲上面的build 並沒有包含這個target,所以默認情況下,執行build是不會打包文件的,所以在jenkins project配置界面,Ant構建那一步的targets,我們纔會有"build" 和 "tar" 這兩個targets。如果build.xml 中 "build"這個target depends中已經包含"tar" , 就不需要在jenkins中增加"tar"了。

其他一些target 都是利用一些工具對php代碼的操作,比如phpunit是進行php單元測試。這一些方面我沒有深入的研究,只是進行了一些簡單的配置,畢竟不是這方面的專業人士。

 

配置 Gitlab webhooks

在gitlab的project頁面 打開settings,再打開 web hooks 。點擊"ADD WEB HOOK" 添加webhook。把之前jenkins配置中的那個url 添加到這裏,添加完成後,點擊"TEST HOOK"進行測試,如果顯示SUCCESS 則表示添加成功。

 

 

 

 

 

 

配置phpunit.xml

phpunit.xml是phpunit這個工具用來單元測試所需要的配置文件。這個文件的名稱同樣也是可以自定義的,但是要在"build.xml"中配置好名字就行。默認情況下,用"phpunit.xml", 則不需要在"build.xml"中配置文件名。

 

build.xml中phpunit配置

fileset dir 指定單元測試文件所在路徑,include指定包含哪些文件,支持通配符匹配。當然也可以用exclude關鍵字指定不包含的文件。

 

 

四、進行jenkins project 構建

第一次配置好jenkins project之後,會自動觸發一次構建。此後,每當有commit 提交到master分支(前面設置的是master分支,也可以設置爲其他分支),就會觸發一次構建。當然也可以在project頁面手動觸發構建。點擊左邊的"立即構建" 手動觸發構建。

 

手動觸發構建

 

五、構建結果說明

構建狀態

Successful藍色:構建完成,並且被認爲是穩定的。

Unstable黃色:構建完成,但被認爲是不穩定的。

Failed紅色:構建失敗。

Disable灰色:構建已禁用

 

構建穩定性

構建穩定性用天氣表示:晴、晴轉多雲、多雲、小雨、雷陣雨。天氣越好表示構建越穩定,反之亦然。

 

構建歷史界面

 console output: 輸出構建的日誌信息

六、jenkins權限管理

由於jenkins默認的權限管理體系不支持用戶組或角色的配置,因此需要安裝第三發插件來支持角色的配置,本文將使用Role Strategy Plugin。基於這個插件的權限管理設置請參考這篇文章:http://blog.csdn.net/russ44/article/details/52276222,這裏不作詳細介紹。

 

至此,就可以用jenkins周而復始的進行CI了,當然jenkins是一個強大的工具,功能絕不僅僅是以上這些,其他方面要是以後用到,我會更新到這篇文章中。有疑問歡迎在下方留言。

最後,放上一張Jenkins的思維導圖



作者:哥本哈根月光
鏈接:https://www.jianshu.com/p/5f671aca2b5a
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章