1 為什么要引入jenkins
- 人都向往自由,自由是舒服的汪厨,但自由是無序的赃春,混亂的,也是低效的劫乱。管理就是要讓無序聘鳞、混亂薄辅、低效變的有序、齊整和高效抠璃。但管理需要成本站楚,需要制定規(guī)則,需要去推行和實施這個規(guī)則搏嗡,對任何人來說都是痛苦的窿春。映射到開發(fā)中就是不能讓開發(fā)流程處于自由的狀態(tài),應該是一個有序的集合采盒,需要有相關的規(guī)則去阻止一些混亂的行為旧乞,這樣才能產出高效,責任清晰磅氨。
- 對項目組公共代碼倉庫中的代碼尺栖,是否有經常下下來編譯不通過的情景,也不知道是那一次誰提交的烦租,什么時候提交的延赌,你還要回到歷史的提交點一個個去確認是那個提交編譯出問題了叉橱,在去找相關的提交者去修復挫以,如果提交者休假或者離職了你才發(fā)現(xiàn)這個問題,而現(xiàn)在卻要等著用程序窃祝,作為項目管理者這就是你的失職掐松。為了避免出現(xiàn)這種情況,你只能定期的去監(jiān)控代碼倉庫粪小,發(fā)現(xiàn)有改動就下載下來進行編譯大磺,確認是否有問題,并通知相關責任人探膊,這些雖然簡單但是還是很耗人精力的量没,不做就有風險,做就是管理的成本在里面突想。
-
項目代碼你可能可以編譯通過殴蹄,但是運行的時候卻出錯了,你這時又要追溯到歷史的提交點一個個去確認那個提交是最終正常的版本猾担,在讓相關責任人去修復代碼袭灯,為了阻止這種情況發(fā)生你只能制定相應的規(guī)則,強制要求提交者在提交之前都必須進行冒煙測試(系統(tǒng)能正常運行的最低測試)
上面提到的場景绑嘹,很大一部分是可以通過工具進行自動化進行的稽荧。所以我們需要這樣的一些工具來管理開發(fā)的一些流程。讓無序變的有序工腋,讓混亂變的齊整姨丈,讓重復和可以自動化的事情交給機器去做畅卓,解放你的時間,讓有限的時間去做更多無限的事蟋恬。 - Jenkins就是這樣的一個工具能讓項目管理的一些流程自動化翁潘,它可以自動構建項目源碼,自動進行單元測試歼争,自動部署等拜马。它可以監(jiān)控代碼倉庫的變化,并根據(jù)變化進行自動的編譯沐绒,如果編譯不通過它會發(fā)郵件通知項目管理者和出錯提交的責任者俩莽,可以及時對出錯進行跟進,避免出現(xiàn)風險乔遮。同時它也可以進行自動化的單元測試扮超,并生成測試報告,如果測試出現(xiàn)問題蹋肮,也會及時郵件通知相關人員出刷。
- 所以我肯定只要你有在做項目源碼的管理,就一定需要像jenkins這樣的工具括尸,因為它能解決日常開發(fā)流程中出現(xiàn)的一些尖銳問題巷蚪,解放項目管理者的時間病毡,用不大的代價(學習jenkins的管理成本)濒翻,來提升開發(fā)的效率,降低開發(fā)管理的成本啦膜。
2 jenkins安裝
我安裝的機器軟件環(huán)境是
Ubuntu 14.04.4 LTS trusty
按下面jenkins官網的命令進行安裝有送,有些問題(我這邊系統(tǒng)的默認ppa源有點舊無法自動安裝依賴的Java8環(huán)境)
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ >/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
2.1 軟件手動安裝
需要提取預裝Java 8或者更高版本的的JRE或者JDK都可以
我這邊安裝的是oracle的JDK
1)添加ppa
$sudo add-apt-repository ppa:webupd8team/java
$sudo apt-get update
2)安裝jdk8
$sudo apt-get install oracle-java8-installer
安裝器會詢問你是否同意oracle的服務條款,同意即可
因為我這邊下載速度很慢,我中斷了安裝满着,去oracle官網下載JDK包
jdk-8u151-linux-x64.tar.gz
放在/var/cache/oracle-jdk8-installer屯掖,刪除上一次安裝的鎖和緩存數(shù)據(jù)涯穷,重新安裝就會用下載好的包進行安裝
$sudo rm -f /var/lib/dpkg/lock
$sudo rm -f /var/cache/apt/archives/lock
$sudo rm -f /var/cache/debconf/*
$sudo dpkg --configure -a
$sudo apt-get install oracle-java8-installer
3)設置系統(tǒng)默認jdk版本
$sudo update-java-alternatives -s java-8-oracle
查看jdk看是否安裝成功
$java -version
4)安裝jenkins的安裝包
直接在官網下載最新的安裝包jenkins_2.73.3_all.deb,用dpgk安裝不會自動安裝依賴的軟件阵赠,如果提示需要依賴其他軟件用apt-get install自行安裝
$sudo dpkg -i jenkins_2.73.3_all.deb
5)其他問題
如果你不是按步驟2進行安裝JDK而是解壓進行安裝JDK的話,配置并啟用JDK的相關環(huán)境變量之后肌稻,進行deb包的安裝提示用的還是舊的JDK環(huán)境清蚀,需要進行下面設置(使用解壓安裝JDK的話,Ubuntu的包管理器并不清楚我們已經安裝了最新的jdk爹谭,因此我們需要將我們安裝的jdk信息加入到Ubuntu的包管理器當中)
$sudo apt-get update
$sudo apt-get remove default-jre default-jdk
$sudo apt-get update
$sudo apt-get install default-jre default-jdk
6)測試jenkins安裝是否成功
在安裝的機器上使用瀏覽器登錄http://localhost:8080/(如果在其他機器上登錄枷邪,需要把localhost替換成安裝機器的具體IP,我這邊安裝jenkins機器的IP是172.16.1.143诺凡,我的win7機器上進行登錄直接輸入:http://172.16.1.143:8080/)
如果能出現(xiàn)jenkins的相關界面說明安裝已經成功东揣。
2.2 簡易安裝
-
如果你嫌2.1的安裝過程太麻煩践惑,或者對linux環(huán)境也不熟,安裝遇到一些問題也不知道什么去解決的話嘶卧,可以直接用BitNami stacks提供的大安裝包進行安裝尔觉。BitNami stacks除了包含應用程序本身,還包含了用以運行該應用程序所需的其它軟件(當然不是所有的軟件都是必須的脸候,既然你選擇了它的簡單就要忍受它對你機器空間的浪費穷娱,手動安裝,一些不需要的軟件就可以精簡不安裝比如docker容器)运沦。用這種方式進行安裝它的安裝環(huán)境和系統(tǒng)中的其他軟件是隔離開來的泵额,也就是說不會污染到現(xiàn)有系統(tǒng)的工作環(huán)境,如果你當心用手動進行安裝的話會破壞現(xiàn)在機器上的軟件工作環(huán)境的話用這種方式進行安裝也是一種很好的選擇携添。下面是BitNami stacks提供的jenkins的下載界面:
https://bitnami.com/stack/jenkins/installer
3 jenkins配置
3.1 初次使用的基本配置
安裝成功之后嫁盲,會有一個jenkins用戶,jenkins的home目錄默認在
/var/lib/jenkins
1)解鎖jenkins
登錄http://localhost:8080/烈掠,如果是第一次登陸會要求你進行解鎖羞秤,按提示到對應的目錄去拷貝解鎖密碼(初始管理員密碼),填入提示框左敌。
2)插件安裝
完成解鎖之后瘾蛋,繼續(xù)進行插件安裝提示,有默認和自定義矫限,一般用默認也就可以了哺哼,如果你對jenkins比較熟也可以自定義進行安裝,只選擇自己需要的插件進行安裝叼风。
3)注冊新管理員
插件安裝完之后需要注冊一個新的管理員賬號取董,按提示進行注冊就好,注冊成功之后就可以用該管理員帳戶進行登錄了无宿。
4)和git服務器通信的公鑰密碼生成
- 我這邊的源碼是用gitolite+git進行管理的走的是SSH協(xié)議茵汰,需要用公鑰密碼對訪問者進行認證。需要生成公鑰密碼對孽鸡。
- 第一次使用jenkins賬號需要先配置一下密碼蹂午,切換到root,用passwd對jenkins設置密碼彬碱,切換到jenkins賬號豆胸,使用RSA算法作為公鑰密碼
$su root
#passwd jenkins
#exit
$su jenkins
$ssh-keygen -t rsa
生成的密鑰默認存放位置jenkins home目錄下的.ssh
~/.ssh
生成兩個密鑰id_rsa(私鑰)和id_rsa.pub(公鑰)
公鑰需要提供給需要登錄的服務器(這里是gitolite)做授權用
5)把公鑰提交到gitolite服務器
把公鑰改名為jenkins.pub并給gitolite的管理員讓他提交到對應的key目錄,我這邊gitolite和jenkins安裝在同一臺服務器上堡妒,所以服務器地址直接是127.0.0.1配乱,操作如下
$su zgk
$git clone git@127.0.0.1:gitolite-admin
$cp jenkins.pub gitolite-admin/keydir
$git add .
$git commit -m “add user jenkins”
$git push
添加完之后切換到jenkins賬號,測試下連接是否正常,我這邊提供了一個testing的測試倉庫(對所有用戶權限全開)搬泥,如果能正常clone下來說明和git服務器的連接已經配置好了桑寨,我這邊環(huán)境測試如下:
$su jenkins
$cd ~
$git clone git@127.0.0.1:testing
3.2 系統(tǒng)管理
在http://localhost:8080/ 主界面,系統(tǒng)管理忿檩,可以對系統(tǒng)進行設置尉尾,安全配置等
1)系統(tǒng)設置
我這邊的環(huán)境只是設置了一個系統(tǒng)管理員郵件地址,如果任務構建失敗的話沙咏,有指定郵件通知責任人和相關人員時需要通過該郵件地址進行發(fā)送出去肢藐。
2)全局安全配置
- 這一版本的jenkins啟用了一些默認安全特性吆豹,默認情況下不允許新用戶注冊痘煤,啟用防止跨站點請求偽造(如果僅在在局域網內使用,關掉也沒關系)
-
如果你想要登錄界面可以進行注冊用戶的話猿规,勾選下面圈起來的選項
image.png -
下面對登錄的用戶權限進行管理進行介紹
image.png
一般選擇安全矩陣或者項目矩陣授權策略就行衷快,兩者的差別后者可以單獨對某個項目進行權限配置(但是我沒找到配置的地方),這里我用安全矩陣進行設置姨俩,下面是我test賬號的設置例子蘸拔,圈起來的部分
image.png - Overall: read的權限打開,否則登錄之后什么都看不到
- Job(就是你要管理的項目): read哼勇,build都伪,cancel呕乎,Discover积担,Read,Workspace
- view: Read
3)其他介紹
其他一些比較常用如猬仁,管理插件帝璧,系統(tǒng)信息,管理用戶如下圖圈起來部分湿刽,界面都有介紹也比較好理解的烁,其中系統(tǒng)信息包含的環(huán)境變量渴庆,可能在你編寫項目構建腳本時會用到相關的變量
image.png
4 創(chuàng)建一個自動構建的任務
1)新建
點擊新建,如下圖所示
2)填寫任務名稱并選擇類型
如下圖所示,一般選擇自由風格的也就夠用了砰诵,如果你的項目比較復雜可以使用pipeline來自定義一個任務模型,pipeline有相應的語法結構,可以編寫從構建哲嘲,測試,到部署的所有環(huán)節(jié)囱怕,可以按階段,按步驟執(zhí)行台丛。
3)一般配置
進入配置界面,包含六部分,如下圖圈起來的部分
其中General是一些通用的配置实胸,可以對項目進行簡要介紹
4)源碼管理
我這邊使用git倉庫涮瞻,URL使用git clone用的地址就可以,編譯的分支選擇你需要監(jiān)測的分支(如果你的源碼倉庫有好多分支宁否,每個分支都要監(jiān)測的話,這一格留空就好了)配置一切正常的話是如下圖所示
如果出現(xiàn)下圖的情況
可能有下面幾個原因
(1)你URL的格式不對或者對應的倉庫不存在
(2)你jenkins的公鑰密碼沒有提交到gitolite的服務器(可以參考第3部分相應配置介紹)
(3)Jenkins訪問的倉庫對jenkins沒有開放權限(至少是讀的權限譬挚,一般對應的代碼倉庫給jenkins開放讀的權限也就夠了)
5)構建觸發(fā)
一般使用Poll SCM輪詢源碼倉庫的方式盐须,也就是說定時去檢查源碼倉庫是否有變化有變化的就會去執(zhí)行構建腳本,下面日程表代表:每兩分鐘去執(zhí)行一次檢查
日程表的語法結構和linux的cron 命令語法非常相似,稍微有點差別统舀。
日程表主要有5個域绰筛,每個域用空格或者TAB鍵隔開
從左到右分別代表:“分鐘 小時 天 月 周”
分鐘 | 0–59 |
---|---|
小時 | 0–23 |
天 | 1–31 |
月 | 1–12 |
周 | 0–7衡蚂, 0 和7代表星期天 |
還有一些特殊的字符
- *:星號年叮,代表所有的值都是有效的,也就是說出現(xiàn)在對應的域就代表著每分鐘/每小時/每天/每月/每周的每天都有效跃惫。
- M-N:減號,代表一個從M到N的一個值范圍先较。
- /X :斜杠,代表每隔X間隔(單位為對應域的單位霉翔,比如出現(xiàn)在小時域,每隔X小時)
- ,:逗號,用來窮舉同一個域的所有有效值谚中,比如A,B,C 代表A,B,C三個值都有效
- H:hash,代表一個范圍內的隨機值某筐,主要是為了負載均衡考慮的
6)構建環(huán)境
我這邊選擇在構建之前先清空工作空間
7)構建
-
可以根據(jù)自己的項目情況去編寫構建的腳本。如果你的構建腳本經常變的話霉赡,也可以考慮直接寫成腳本文件放在源碼倉庫進行管理,構建的時候只要直接調用項目代碼里面的腳本文件去執(zhí)行就好了迫肖。
image.png
當然構建過程可以分多步進行玻粪,你可以按上面方式繼續(xù)增加構建步驟伦仍。
8)構建后操作
-
構建失敗或者構建狀態(tài)發(fā)生變化可以發(fā)郵件通知相關人員和提交者,我這邊用的是jenkins默認的郵件通知系統(tǒng),如果你需要制定更豐富的郵件通知模板可以使用擴展的郵件通知(這個需要使用插件涝焙,默認已經安裝)
image.png -
需要注意的是:
如果提交者之前沒有在jenkins上進行注冊妖滔,提交之后會自動生成一個帳號座舍,但是如果編譯出錯jenkins不會發(fā)送郵件給該提交者鉴竭,解決的方法,最好提前給所有提交者都注冊一個jenkins的帳號,當然如果之前沒有注冊的話责静,你需要給該提交者設置一下密碼該提交者就會成為合法用戶。具體密碼設置可在主界面的用戶->“對應帳號”->設置腰鬼,如下圖所圈位置重置下密碼就可以正常發(fā)送郵件了齿税。
image.png
5 創(chuàng)建好的項目界面說明
1)項目主界面
進入相應的項目主要界面如下
2)修改記錄
如下圖所示牵舱,可以觀察到源碼倉庫提交的修改記錄
3)工作空間
如下圖所示,工作空間就是jenkins從git倉庫下載源碼到自己的構建目錄的區(qū)域把篓,可以查看對應的文件,也可以直接下載全部的文件
4)立即構建
可以手動觸發(fā)項目進行構建坊谁,在你初步創(chuàng)建構建項目之后,進行構建測試時比較有用鬓椭。
5)刪除Project
可以直接刪除這個項目
6)配置
可以對你的項目進行配置修改
7)構建歷史
可以查看你項目過往的構建情況贮折,如下圖所示紅色的表示構建失敗,藍色的表示構建成功
你可以點擊對應的按鈕去查看該次構建輸出信息,如下圖所示
6 后記
- 上面記錄我從安裝,配置鸽斟,使用的過程及該過程遇到的一些問題,基本上也能滿足中小型項目日常的持續(xù)集成利诺,自動構建富蓄,自動測試,自動部署過程慢逾。當然也可以用pipeline來構建更復雜的項目立倍,目前jenkins的blue ocean插件也把pipeline語法界面化了,讓使用pipeline自定義模型更友好侣滩。
- 為什么選擇jenkins而不是其他持續(xù)集成工具毫缆,對我來說選擇的標準是鹦聪,開源免費,文檔豐富艘狭,使用簡單似谁,學習成本低,能夠很好的解決我現(xiàn)在遇到的實際問題煞抬,這些就已經夠了(當然肯定有更好的工具途茫,但評估和測試一個工具也需要花大量的時間枢析,而且不一定有正向的產出)智政。
參考資料
[1] https://jenkins.io/doc/
[2] http://www.cnblogs.com/a2211009/p/4265225.html