【转】Jenkins详细教程
? ? 最近花了一段時(shí)間研究jenkins這個(gè)工具。所以寫(xiě)下這篇文章,算是當(dāng)做記錄吧!
一、jenkins是什么?
? ? ? ? Jenkins是一個(gè)開(kāi)源的、提供友好操作界面的持續(xù)集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持續(xù)、自動(dòng)的構(gòu)建/測(cè)試軟件項(xiàng)目、監(jiān)控外部任務(wù)的運(yùn)行(這個(gè)比較抽象,暫且寫(xiě)上,不做解釋)。Jenkins用Java語(yǔ)言編寫(xiě),可在Tomcat等流行的servlet容器中運(yùn)行,也可獨(dú)立運(yùn)行。通常與版本管理工具(SCM)、構(gòu)建工具結(jié)合使用。常用的版本控制工具有SVN、GIT,構(gòu)建工具有Maven、Ant、Gradle。
?
二、CI/CD是什么?
? ? ? ? ?CI(Continuous integration,中文意思是持續(xù)集成)是一種軟件開(kāi)發(fā)時(shí)間。持續(xù)集成強(qiáng)調(diào)開(kāi)發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建、(單元)測(cè)試。根據(jù)測(cè)試結(jié)果,我們可以確定新代碼和原有代碼能否正確地集成在一起。借用網(wǎng)絡(luò)圖片對(duì)CI加以理解。
?
CI
? ? ? ? CD(Continuous Delivery, 中文意思持續(xù)交付)是在持續(xù)集成的基礎(chǔ)上,將集成后的代碼部署到更貼近真實(shí)運(yùn)行環(huán)境(類(lèi)生產(chǎn)環(huán)境)中。比如,我們完成單元測(cè)試后,可以把代碼部署到連接數(shù)據(jù)庫(kù)的Staging環(huán)境中更多的測(cè)試。如果代碼沒(méi)有問(wèn)題,可以繼續(xù)手動(dòng)部署到生產(chǎn)環(huán)境。下圖反應(yīng)的是CI/CD 的大概工作模式。
?
CI/CD
?
三、使用Jenkins進(jìn)行PHP代碼(單元)測(cè)試、打包。
? ? ? ? Jenkins是一個(gè)強(qiáng)大的CI工具,雖然本身使用Java開(kāi)發(fā),但也能用來(lái)做其他語(yǔ)言開(kāi)發(fā)的項(xiàng)目CI。下面講解如何使用Jenkins創(chuàng)建一個(gè)構(gòu)建任務(wù)。
?登錄Jenkins, 點(diǎn)擊左側(cè)的新建,創(chuàng)建新的構(gòu)建任務(wù)。
?
跳轉(zhuǎn)到如下界面。任務(wù)名稱可以自行設(shè)定,但需要全局唯一。輸入名稱后選擇構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目(其他選項(xiàng)不作介紹)。并點(diǎn)擊下方的確定按鈕即創(chuàng)建了一個(gè)構(gòu)建任務(wù)。之后會(huì)自動(dòng)跳轉(zhuǎn)到該job的配置頁(yè)面。
?
新建自由風(fēng)格的軟件項(xiàng)目
?
下圖是構(gòu)建任務(wù)設(shè)置界面,可以看到上方的幾個(gè)選項(xiàng)"General", "源碼管理", "構(gòu)建觸發(fā)器","構(gòu)建環(huán)境", "構(gòu)建", "構(gòu)建后操作"。下面逐一介紹。
?
1.General
General是構(gòu)建任務(wù)的一些基本配置。名稱,描述之類(lèi)的。
?
General
項(xiàng)目名稱:?是剛才創(chuàng)建構(gòu)建任務(wù)步驟設(shè)置的,當(dāng)然在這里也可以更改。
描述:?對(duì)構(gòu)建任務(wù)的描述。??
丟棄舊的構(gòu)建: 服務(wù)器資源是有限的,有時(shí)候保存了太多的歷史構(gòu)建,會(huì)導(dǎo)致Jenkins速度變慢,并且服務(wù)器硬盤(pán)資源也會(huì)被占滿。當(dāng)然下方的"保持構(gòu)建天數(shù)" 和 保持構(gòu)建的最大個(gè)數(shù)是可以自定義的,需要根據(jù)實(shí)際情況確定一個(gè)合理的值。
其他幾個(gè)選項(xiàng)在這里不做介紹,有興趣的可以查看Jenkins"幫助信息", 會(huì)有一個(gè)大概的介紹。不過(guò)這些"幫助信息"都是英文的。
?
點(diǎn)擊右方的這些"問(wèn)號(hào)"查看"幫助信息"
?
2.源碼管理
源碼管理就是配置你代碼的存放位置。
?
源碼管理
?Git: 支持主流的github 和gitlab代碼倉(cāng)庫(kù)。因我們的研發(fā)團(tuán)隊(duì)使用的是gitlab,所以下面我只會(huì)對(duì)該項(xiàng)進(jìn)行介紹。
Repository URL:倉(cāng)庫(kù)地址
Credentials:憑證。可以使用HTTP方式的用戶名密碼,也可以是RSA文件。 但要通過(guò)后面的"ADD"按鈕添加憑證。
Branches to build:構(gòu)建的分支。*/master表示master分支,也可以設(shè)置為其他分支。
源碼瀏覽器:你所使用的代碼倉(cāng)庫(kù)管理工具,如github, gitlab.??
URL:填入上方的倉(cāng)庫(kù)地址即可。
Version: 8.7? ?這個(gè)是我們gitlab服務(wù)器的版本。
Subversion:就是SVN,這里不作介紹。
?
3.構(gòu)建觸發(fā)器
構(gòu)建觸發(fā)器,顧名思義,就是構(gòu)建任務(wù)的觸發(fā)器。
觸發(fā)遠(yuǎn)程構(gòu)建(例如,使用腳本): 該選項(xiàng)會(huì)提供一個(gè)接口,可以用來(lái)在代碼層面觸發(fā)構(gòu)建。這里不做介紹,后期可能會(huì)用到。
Build after other projects are built: 該選項(xiàng)意思是"在其他projects構(gòu)建后構(gòu)建"。這里不作介紹,后期可能會(huì)用到該選項(xiàng)。
Build periodically: 周期性的構(gòu)建。很好理解,就是每隔一段時(shí)間進(jìn)行構(gòu)建。日程表類(lèi)似? ? ? ? linux crontab書(shū)寫(xiě)格式。如下圖的設(shè)置,表示每隔30分鐘進(jìn)行一次構(gòu)建。
周期構(gòu)建
?
Build when a change is pushed to GitLab:當(dāng)有更改push到gitlab代碼倉(cāng)庫(kù),即觸發(fā)構(gòu)建。后面會(huì)有一個(gè)觸發(fā)構(gòu)建的地址,一般被稱為webhooks。需要將這個(gè)地址配置到gitlab中,webhooks如何配置后面介紹。這個(gè)是常用的構(gòu)建觸發(fā)器。
Poll SCM:該選項(xiàng)是配合上面這個(gè)選項(xiàng)使用的。當(dāng)代碼倉(cāng)庫(kù)發(fā)生改動(dòng),jenkins并不知道。需要配置這個(gè)選項(xiàng),周期性的去檢查代碼倉(cāng)庫(kù)是否發(fā)生改動(dòng)。
?
十分鐘檢查一次
?
4.構(gòu)建環(huán)境
構(gòu)建環(huán)境就是構(gòu)建之前的一些準(zhǔn)備工作,如指定構(gòu)建工具(在這里我使用ant)。
構(gòu)建環(huán)境中的構(gòu)建工具
?
With Ant:選擇這個(gè)工具,并指定ant版本和jdk版本。這兩個(gè)工具的版本我都事先在服務(wù)器上安裝,并且在jenkins全局工具中配置好了。
其他選項(xiàng)不作介紹,同樣可以查看"幫助信息" 獲得使用幫助。
?
5.構(gòu)建
? ? ? ?選擇下方的增加構(gòu)建步驟。
?
增加構(gòu)建步驟
可以選擇的項(xiàng)很多。這里就介紹"Invoke Ant" 和"Execute shell".
Eexcute shell: 執(zhí)行shell命令,該工具是針對(duì)linux環(huán)境的,windows環(huán)境也有對(duì)應(yīng)的工? ? ? ? ? ? 具"Execute Windows batch command"。 在構(gòu)建之前,可能我們需要執(zhí)行一些命令,比如壓縮包的解壓之類(lèi)的。為了演示,我就簡(jiǎn)單的執(zhí)行? "echo $RANDOM" 這樣的linux shell下生產(chǎn)隨機(jī)數(shù)命令。
Invoke Ant:Ant是一款java項(xiàng)目構(gòu)建工具,當(dāng)然也能用來(lái)構(gòu)建php。
?
?
?
Ant Version: 選擇Ant版本。這個(gè)ant版本是安裝在jenkins服務(wù)器上的版本,并且需要在jenkins"系統(tǒng)工具"中設(shè)置好。
Targets:要執(zhí)行的操作,一行一個(gè)操作任務(wù)。以上圖為例,build是構(gòu)建,tar是打包。
Build File: 是Ant構(gòu)建的配置文件,如果不指定,則是在項(xiàng)目路徑下的workspace目錄中的build.xml。build.xml文件具體怎么配置,后面再細(xì)講。
properties: 設(shè)定一些變量,這些變量可以在build.xml 中被引用。
Send files or execute commands over SSH:發(fā)送文件到遠(yuǎn)程主機(jī)或執(zhí)行命令(腳本)
?
Name: SSH Server的名稱。SSH Server可以在jenkins-系統(tǒng)設(shè)置中配置。
source files: 需要發(fā)送給遠(yuǎn)程主機(jī)的源文件。
Remove prefix: 移除前面的路徑。如果不設(shè)置這個(gè)參數(shù),則遠(yuǎn)程主機(jī)會(huì)自動(dòng)創(chuàng)建構(gòu)建源 source files 包含的那個(gè)路徑。
Remote directory: 遠(yuǎn)程主機(jī)目錄。
Exec command:在遠(yuǎn)程主機(jī)上執(zhí)行的命令,或者執(zhí)行的腳本。
?
?
6.構(gòu)建后操作
? ? ? ? 構(gòu)建后操作,就是對(duì)project構(gòu)建完成后的一些后續(xù)操作,比如生成相應(yīng)的代碼測(cè)試報(bào)告。
?
?
郵件通知
Publish Clover PHP Coverage Report:發(fā)布代碼覆蓋率xml格式的文件報(bào)告。路徑會(huì)在"build.xml"文件中定義
Publish HTML reports:發(fā)布代碼覆蓋率的HTML報(bào)告。??
Report Crap: 發(fā)布crap報(bào)告。
E-mail Notification:? 郵件通知,構(gòu)建完成后發(fā)郵件到指定的郵箱。
以上配置完成后,點(diǎn)擊保存。
7.其他相關(guān)配置
?SSH Server配置
登錄jenkins -- 系統(tǒng)管理 -- 系統(tǒng)設(shè)置
配置請(qǐng)看下圖
?
SSH SERVER
SSH Servers: 由于jenkins服務(wù)器公鑰文件我已經(jīng)配置好,所以之后新增SSH Servers 只需要配置這一項(xiàng)即可。?
Name: 自定義,需要全局唯一。
HostName: 主機(jī)名,直接用ip地址即可。
Username: 新增Server的用戶名,這里配置的是root。
Remote Directory: 遠(yuǎn)程目錄。jenkins服務(wù)器發(fā)送文件給新增的server默認(rèn)是在這個(gè)目錄。
?
Ant 配置文件 "build.xml"
接下來(lái)講解Ant 構(gòu)建配置文件"build.xml"。 之所以是build.xml 這是因?yàn)楣俜綉T例。就好比任何編程語(yǔ)言的入門(mén)都會(huì)是打印"Hello world".? 你也可以用其他名稱代替"build.xml" .
下面針對(duì)配置文件"build.xml" 關(guān)鍵配置進(jìn)行說(shuō)明。
project name就是項(xiàng)目名稱,和jenkins所創(chuàng)建的對(duì)應(yīng)。
target name="build" 就是構(gòu)建的名稱,和jenkins構(gòu)建步驟 那里的targets對(duì)應(yīng)。depends指明構(gòu)建需要進(jìn)行的一些操作。
property 用來(lái)設(shè)置變量。
fileset 這一行指明了一個(gè)文件夾,用include來(lái)指明需要包含的文件,exclude指明不包含的文件,"tar"即是打包這個(gè)文件夾中匹配到的文件。
下面的這些target都是一些實(shí)際的操作步驟,比如make_runtime這個(gè)"target" 就是創(chuàng)建了一些目錄。phpcs就是利用PHP_CodeSniffer這個(gè)工具 對(duì)PHP代碼規(guī)范與質(zhì)量檢查工具。
?
?
最后這個(gè)target "tar" 就是打包文件。因?yàn)樯厦娴腷uild 并沒(méi)有包含這個(gè)target,所以默認(rèn)情況下,執(zhí)行build是不會(huì)打包文件的,所以在jenkins project配置界面,Ant構(gòu)建那一步的targets,我們才會(huì)有"build" 和 "tar" 這兩個(gè)targets。如果build.xml 中 "build"這個(gè)target depends中已經(jīng)包含"tar" , 就不需要在jenkins中增加"tar"了。
其他一些target 都是利用一些工具對(duì)php代碼的操作,比如phpunit是進(jìn)行php單元測(cè)試。這一些方面我沒(méi)有深入的研究,只是進(jìn)行了一些簡(jiǎn)單的配置,畢竟不是這方面的專業(yè)人士。
?
配置 Gitlab webhooks
在gitlab的project頁(yè)面 打開(kāi)settings,再打開(kāi) web hooks 。點(diǎn)擊"ADD WEB HOOK" 添加webhook。把之前jenkins配置中的那個(gè)url 添加到這里,添加完成后,點(diǎn)擊"TEST HOOK"進(jìn)行測(cè)試,如果顯示SUCCESS 則表示添加成功。
?
?
?
?
?
?
配置phpunit.xml
phpunit.xml是phpunit這個(gè)工具用來(lái)單元測(cè)試所需要的配置文件。這個(gè)文件的名稱同樣也是可以自定義的,但是要在"build.xml"中配置好名字就行。默認(rèn)情況下,用"phpunit.xml", 則不需要在"build.xml"中配置文件名。
?
build.xml中phpunit配置
fileset dir 指定單元測(cè)試文件所在路徑,include指定包含哪些文件,支持通配符匹配。當(dāng)然也可以用exclude關(guān)鍵字指定不包含的文件。
?
?
四、進(jìn)行jenkins project 構(gòu)建
第一次配置好jenkins project之后,會(huì)自動(dòng)觸發(fā)一次構(gòu)建。此后,每當(dāng)有commit 提交到master分支(前面設(shè)置的是master分支,也可以設(shè)置為其他分支),就會(huì)觸發(fā)一次構(gòu)建。當(dāng)然也可以在project頁(yè)面手動(dòng)觸發(fā)構(gòu)建。點(diǎn)擊左邊的"立即構(gòu)建" 手動(dòng)觸發(fā)構(gòu)建。
?
手動(dòng)觸發(fā)構(gòu)建
?
五、構(gòu)建結(jié)果說(shuō)明
構(gòu)建狀態(tài)
Successful藍(lán)色:構(gòu)建完成,并且被認(rèn)為是穩(wěn)定的。
Unstable黃色:構(gòu)建完成,但被認(rèn)為是不穩(wěn)定的。
Failed紅色:構(gòu)建失敗。
Disable灰色:構(gòu)建已禁用
?
構(gòu)建穩(wěn)定性
構(gòu)建穩(wěn)定性用天氣表示:晴、晴轉(zhuǎn)多云、多云、小雨、雷陣雨。天氣越好表示構(gòu)建越穩(wěn)定,反之亦然。
?
構(gòu)建歷史界面
?console output:?輸出構(gòu)建的日志信息
六、jenkins權(quán)限管理
由于jenkins默認(rèn)的權(quán)限管理體系不支持用戶組或角色的配置,因此需要安裝第三發(fā)插件來(lái)支持角色的配置,本文將使用Role Strategy Plugin。基于這個(gè)插件的權(quán)限管理設(shè)置請(qǐng)參考這篇文章:http://blog.csdn.net/russ44/article/details/52276222,這里不作詳細(xì)介紹。
?
至此,就可以用jenkins周而復(fù)始的進(jìn)行CI了,當(dāng)然jenkins是一個(gè)強(qiáng)大的工具,功能絕不僅僅是以上這些,其他方面要是以后用到,我會(huì)更新到這篇文章中。有疑問(wèn)歡迎在下方留言。
最后,放上一張Jenkins的思維導(dǎo)圖
?
344人點(diǎn)贊
?
CI/CD
?
作者:哥本哈根月光
鏈接:https://www.jianshu.com/p/5f671aca2b5a
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的【转】Jenkins详细教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中信百度金融联名卡的返现返在哪
- 下一篇: Azure手把手系列 3:把IT的钱花在