作者:mousycoder(極簡(jiǎn)小站)
來(lái)源地址:segmentfault.com/a/1190000002895521
Jenkins 是一個(gè)開(kāi)源軟件項目,旨在提供一個(gè)開(kāi)放易用的軟件平臺,使軟件的持續集成變得可能?,F在軟件開(kāi)發(fā)追求的是效率以及質(zhì)量,Jenkins使得自動(dòng)化成為可能!
亮點(diǎn)
1.采用shell自定義腳本,控制集成部署環(huán)境更加方便靈活
2.精簡(jiǎn)war包中的lib包,常駐tomcat里,減少war包傳輸時(shí)間
3.Jenkins 用戶(hù)權限管理,不讓淘氣鬼亂動(dòng)
4.構建失敗發(fā)郵件通知相關(guān)人員解決
5.自動(dòng)按天備份war包,Jenkins配置備份以及版本控制化
環(huán)境
Ubuntu 14.10 (GNU/Linux 3.16.0-33-generic x86_64)
準備工作
1.Git版本控制服務(wù)器
2.Tomcat發(fā)布服務(wù)器
3.Jenkins服務(wù)器(提前安裝好Maven,Git,Jdk)
實(shí)驗時(shí)可以在同一臺機器配置,但是生產(chǎn)不建議,一臺機器掛了,所有服務(wù)器都掛了。
廢話(huà)不多說(shuō),直接上干貨!
步驟
安裝Jenkins
下載Jenkins War包,Jenkins官網(wǎng) 。
啟動(dòng)Jenkins ,將War包放入Tomcat容器里,啟動(dòng)Tomcat。
提示:
此時(shí)Jenkins在初始化配置目錄,其默認配置目錄路徑為當前用戶(hù)下的.jenkins目錄,用戶(hù)也可以自定義目錄,Jenkins默認是把配置文件中的數據讀到內存中,如果你替換了之前的配置文件,此時(shí)需要點(diǎn)擊Jenkins的讀取設置或者重啟Tomcat,如果此時(shí)Jenkins頁(yè)面無(wú)響應,則應該查看Tomcat的Catalina.out,多半是由于內存溢出造成(解決方法增大Tomcat調用Java虛擬機時(shí)內存大小,本文不做重點(diǎn)),運行Jenkins的服務(wù)器配置最好內存1G以上,因為后續會(huì )加入一些Jenkins插件,有一些會(huì )比較占用內存,導致Jenkins啟動(dòng)不了。

安裝Jenkins插件
1.Email Extension Plugin (郵件通知)
2.GIT plugin (可能已經(jīng)默認安裝了)
3.Publish Over SSH (遠程Shell)
安裝方法:
首頁(yè)->系統管理->管理插件->可選插件->過(guò)濾(搜索插件名)->勾選->點(diǎn)擊最下面直接安裝即可(需要等待一段時(shí)間,詳情可以看catalina.out日志變化)


配置Jenkins
配置基本信息
每個(gè)選項后都有個(gè)問(wèn)號解釋當前含義(此步新手可以略過(guò),默認不填即可)
配置方法:首頁(yè)->系統管理->系統設置

配置郵件
管理員郵件地址就是郵件的發(fā)件人地址(必須和后面郵件配置發(fā)件人郵箱一致,否則發(fā)不成功郵件)

配置Jdk
JAVA_HOME為Jdk路徑 其中Jdk也可以從這里下載安裝解壓(不推薦,需要填寫(xiě)oracle account)


配置 Maven
配置 Maven Configuration
路徑為maven的setting.xml路徑(Maven安裝略)

配置Maven項目

配置Maven安裝目錄

配置 Git
其中Path to Git executable為你git執行的路徑 一般默認是/usr/bin/git ,如有差異,可以whereis git


配置 Publish over SSH
遠程執行shell腳本 采用公鑰私鑰連接 其中Key里貼的是私鑰 遠程被管理的主機里貼的是公鑰,這2臺主機就是相互信任,這樣scp等操作就不需要輸入用戶(hù)名和密碼。
公鑰私鑰生成方法:
1.管理主機linux 上 ssh-keygen -t rsa -C 'mousycoder@foxmail.com 一路回車(chē) 會(huì )在/root/.ssh下生成id_rsa(私鑰) id_rsa.pub(公鑰)。
2.copy 公鑰的內容到遠程需要通信(被管理)的主機 /root/.ssh/authorized_keys 如無(wú)此目錄文件則手動(dòng)創(chuàng )建。




配置完之后可以Test Configuration

配置 Job
步驟:首頁(yè)->新建->構建一個(gè)maven項目(輸入item名稱(chēng))->進(jìn)入該項目->配置


JOB基本信息

項目源碼管理
Repository UR 項目地址 Credentials授權可以是SSH也可以是用戶(hù)名密碼(SSH方法同上)


選擇需要構建的分支,我們項目采用git工作流 默認master和develop 平時(shí)開(kāi)發(fā)構建develop分支,正式上線(xiàn)構建master并且打標簽(前公司git提交標準化相當復雜,分支相當多,這里大家可以根據實(shí)際情況來(lái))。

構建觸發(fā)器
這里我們選擇poll輪詢(xún)每隔1分鐘去檢測git倉庫代碼庫版本,如果有更改則立刻構建,這里大家可以根據自己團隊實(shí)際情況去制定,當然還有另外一個(gè)插件gitlab-hook可以主動(dòng)去通知jenkins構建,不過(guò)插件所占內存比較大,需要增大tomcat虛擬機內存配置,不然會(huì )內存溢出,個(gè)人覺(jué)得如果一個(gè)團隊人很多的話(huà),選擇poll更適合并且時(shí)間間隔設置長(cháng)一些,避免頻繁構建,gitlab-hook 適合人很少甚至一個(gè)人的情況。

構建命令
我們采用最簡(jiǎn)單的clean install 當然這里可以根據各自需求
例如 部署后的產(chǎn)物上傳到nexus等,詳情參考 Maven命令
clean install deploy:deploy-file -DgroupId=com.weitoo -DartifactId=common -Dversion=0.1-SNAPSHOT -Dpackaging=jar -Dfile=D:\workspace\server-aggregator\common\target\common-0.1-SNAPSHOT.jar -Durl=http://192.168.0.200:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
Add post-build step
構建成功后執行shell命令

該shell的目的是取出war包lib中其他所有lib包 只留下common-0.1-SNAPSHOT.jar 大大減少war包大小(完整war包30M 傳包到阿里云服務(wù)器需要2分多,精簡(jiǎn)后2M,10秒多,大大提高構建速度)。

分享我的Shell
mv ~/.jenkins/jobs/server/workspace/server/target/server/WEB-INF/lib/common-0.1-SNAPSHOT.jar ~/.jenkins/jobs/server/workspace/server/target/
rm -rf ~/.jenkins/jobs/server/workspace/server/target/server/WEB-INF/lib/*
rm -rf ~/.jenkins/jobs/server/workspace/server/target/server.war
mv ~/.jenkins/jobs/server/workspace/server/target/common-0.1-SNAPSHOT.jar ~/.jenkins/jobs/server/workspace/server/target/server/WEB-INF/lib/
cd ~/.jenkins/jobs/server/workspace/server/target/server/
zip -r ~/.jenkins/jobs/server/workspace/server/target/server.war * -r
scp /root/.jenkins/jobs/server/workspace/server/target/server.war root@123.56.xxx.xx:/opt/war/構建成功遠程執行shell腳本
exec command 是遠程sh的路徑


分享我的publish.sh文件
作用是備份每次上傳的war包 重啟Tomcat。
export JAVA_HOME=/opt/software/jdk1.7.0_25
TOMCAT_HOME='/opt/software/apache-tomcat-7.0.59'
TOMCAT_PORT=80
PROJECT='server'
BAK_DIR=/opt/war/bak/$PROJECT/`date %Y%m%d`
mkdir -p '${BAK_DIR}'
cp /opt/war/'${PROJECT}'.war '${BAK_DIR}'/'${PROJECT}'_`date %Y%m%d%H%M%S`.war
#shutdown tomcat
/opt/sh/kill-tomcat-force.sh
#publish project
rm -rf '${TOMCAT_HOME}'/webapps/${PROJECT}
cp /opt/war/'${PROJECT}'.war '${TOMCAT_HOME}'/webapps/${PROJECT}.war
#remove tmp
rm -rf /opt/war/${PROJECT}.war
#unzip war
unzip '${TOMCAT_HOME}'/webapps/${PROJECT}.war -d '${TOMCAT_HOME}'/webapps/${PROJECT}
rm -rf '${TOMCAT_HOME}'/webapps/${PROJECT}.war
##copy lib
cp /opt/lib/* '${TOMCAT_HOME}'/webapps/${PROJECT}/WEB-INF/lib/
## start tomcat
sleep 3
#start tomcat
/opt/software/apache-tomcat-7.0.59/bin/startup.sh
echo 'tomcat is starting!' 分享我的kill-tomcat-force.sh文件
作用是強制關(guān)閉tomcat進(jìn)程
set fileformat=unix
path=/opt/software/apache-tomcat-7.0.59/bin
ps -ef|grep $path|grep tomcat|awk '{print $2}'
echo 'exec $path/shutdown.sh'
$path/shutdown.sh
sleep 3s
#kill -9 pid
ps -ef|grep $path|grep tomcat|awk '{print $2}'|xargs kill -9
#success msg
echo 'shutdown success'
ps -ef|grep $path|grep java|awk '{print $2}'分享我的Tomcat精簡(jiǎn)方法
1.在tomcat_home/lib下新建自定義jar包文件,導入項目所需其他jar包(以后有新增的話(huà),單獨再導一次)
2.修改tomcat_home/conf/catalina.properties 搜索=shared.loader加上路徑
shared.loader=${catalina.base}/lib/server,${catalina.base}/lib/server/*.jar,${catalina.home}/lib/server,${catalina.home}/lib/server/*.jar此時(shí)Tomcat運行前會(huì )加載server下的lib包,如果是多個(gè)項目公用一個(gè)tomcat的時(shí)候,就需要這里放公共的lib包,避免tomcat加載多余的jar包,消耗內存。


構建后郵件設置
郵件主題收件人配置

郵件觸發(fā)器
局部配置會(huì )覆蓋掉全局配置,我們之前在全局配置里配置了構建失敗郵件觸發(fā)器,這里是更加精細的配置,
我們選擇構建失敗Failure-1st觸發(fā)器,失敗以后發(fā)郵件給開(kāi)發(fā)者,(這里可以根據實(shí)際需要,配置,可以配置多個(gè)觸發(fā)器)開(kāi)發(fā)者的郵件在Recipient List里配置。

Jenkins用戶(hù)權限管理
步驟:首頁(yè)-> 系統管理-> Configure Global Security
基本配置:
只有注冊的用戶(hù)才能操作,當然如果是大企業(yè)的話(huà),可以采用項目矩陣授權策略,詳情可以Google。

Jenkins配置的備份和版本控制
很多情況下稍不注意改變了Jenkins的配置,把平臺弄壞了,又想去恢復,這個(gè)時(shí)候就得把Jenkins的配置文件進(jìn)行配置或者版本化,只需要把/root/.jenkins/加入git版本庫里即可,該目錄下包含Jenkins所有信息,包括每次構建歷史信息和歷史jar包
進(jìn)行全備份然后覆蓋掉該文件夾的時(shí)候,重新構建JOB會(huì )出現文件夾已經(jīng)存在等exception,只需要手動(dòng)刪掉這些目錄即可,不會(huì )丟失數據。(這是Jenkins的一個(gè)bug,參考 JENKINS-21330)

能點(diǎn)個(gè)「在看」再走嘛??
聯(lián)系客服