python 持续集成工具_持续集成工具: Jenkins学习
持續(xù)集成工具: Jenkins學(xué)習(xí)
-- 部分內(nèi)容收集自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系作者刪除
一. 概念
在過去的開發(fā)整體流程中,是所有人寫好代碼之后統(tǒng)一進行合并(svn,git),然后進行測試,確保準發(fā)布的版本無誤后再進行版本的正式發(fā)布。在這種流程下,往常會把風(fēng)險堆到軟件發(fā)布前的最后階段,在整體測試的環(huán)節(jié)下出現(xiàn)許多不可預(yù)知的問題。那持續(xù)的概念就是,做一部分就馬上遞交給下一個流程,這樣一個持續(xù)化的過程能夠盡早地發(fā)現(xiàn)并解決問題,避免把問題都暴露在一個環(huán)節(jié)上。
持續(xù)部署
1530005183252.png
裝修廚房
全部裝好之后發(fā)現(xiàn)燈不亮,電路有問題,冷熱水裝反了,管路有問題。這些問題要解決就必須把地磚、墻磚拆掉,一個環(huán)節(jié)有問題,其他環(huán)節(jié)跟著返工。
解決方案:
任何安裝完成后及時進行測試,確保其可以正常工作。
項目開發(fā)
開發(fā)過程中,本地進行測試能夠通過,但是部署到服務(wù)器上運行出現(xiàn)問題
解決方案:
僅僅單元測試還不夠,各個模塊都必須能夠在服務(wù)器上運行
關(guān)注點
持續(xù)部署的關(guān)注點在于項目功能部署至服務(wù)器后可以運行,為下一步測試環(huán)節(jié)或最終用戶正式使用做好準備
持續(xù)集成
1530005162855.png
裝修廚房
裝修廚房時我們需要鋪地磚,如果把所有地磚都切好再拿去鋪就會發(fā)現(xiàn):每一塊地磚單獨看都是好的,但是實際鋪的時候,把所有地磚整合起來,發(fā)現(xiàn)和廚房 地面總體尺寸不匹配,邊邊角角的地磚需要重新切,時間和物料成本陡然升高。
解決方案:
切一塊鋪一塊,根據(jù)需要的尺寸來切,盡早發(fā)現(xiàn)尺寸變化,避免返工。
項目開發(fā)
各個小組分別負責各個具體模塊開發(fā),本模塊獨立測試雖然能夠通過,但是上線前夕將所有模塊整合到一起集成測試卻發(fā)現(xiàn)很多問題,想要解決就需要把很多代碼返工重寫而且仍然有可能有問題,但現(xiàn)在時間很可能不夠了。
解決方案:
經(jīng)常性、頻繁的把所有模塊集成在一起進行測試,有問題盡早發(fā)現(xiàn),這就是持 續(xù)集成。
關(guān)注點
持續(xù)集成的關(guān)注點在于盡早發(fā)現(xiàn)項目整體運行問題,盡早解決。
持續(xù)交付
1530005211213.png
裝修廚房
全部裝修好之后房屋主人來驗收,各項功能都正常,但是水龍頭的樣式主人不 喜歡,灶臺的位置主人不滿意,要求返工。
解決方案:
房屋主人隨時查看裝修進度,施工團隊及時調(diào)整。
項目開發(fā)
項目的各個升級版本之間間隔時間太長,對用戶反饋感知遲鈍,無法精確改善 用戶體驗,用戶流失嚴重。
解決方案:
用小版本不斷進行快速迭代,不斷收集用戶反饋信息,用最快的速度改進優(yōu)化。
關(guān)注點
持續(xù)交付的關(guān)注點在于研發(fā)團隊的最新代碼能夠盡快讓最終用戶體驗到
優(yōu)缺點
降低風(fēng)險
一天中進行多次的集成,并做了相應(yīng)的測試,這樣有利于檢查缺陷,了解軟件的健康狀況,減少假定。
減少重復(fù)過程
產(chǎn)生重復(fù)過程有兩個方面的原因,一個是編譯、測試、打包、部署等等固定操作都必須要做,無法省略任何一個環(huán)節(jié)
一個缺陷如果沒有及時發(fā)現(xiàn),有可能導(dǎo)致后續(xù)代碼的開發(fā)方向是錯誤的,要修復(fù)問題需要重新編寫受影響的所有代碼。而使用 Jenkins 等持續(xù)集成工具既可以把構(gòu)建環(huán)節(jié)從手動完成轉(zhuǎn)換為自動化完成,又可以通過增加集成頻次盡早發(fā)現(xiàn)缺陷避免方向性錯誤。
任何時間、任何地點生成可部署的軟件
持續(xù)集成可以讓您在任何時間發(fā)布可以部署的軟件。從外界來看,這是持續(xù)集成最明顯的好處,我們可以對改進軟件品質(zhì)和減少風(fēng)險說起來滔滔不絕,但對于客戶來說,可以部署的軟件產(chǎn)品是最實際的資產(chǎn)。利用持續(xù)集成,您可以經(jīng)常對源代碼進行一些小改動,并將這些改動和其他的代碼進行集成。如果出現(xiàn)問題,項目成員馬上就會被通知到,問題會第一時間被修復(fù)。不采用持續(xù)集成的情況下,這些問題有可能到交付前的集成測試的時候才發(fā)現(xiàn),有可能會導(dǎo)致延遲發(fā)布產(chǎn)品,而在急于修復(fù)這些缺陷的時候又有可能引入新的缺陷,最終可能導(dǎo)致項目失敗。
增強項目的可見性
持續(xù)集成讓我們能夠注意到趨勢并進行有效的決策。如果沒有真實或最新的數(shù)據(jù)提供支持,項目就會遇到麻煩,每個人都會提出他最好的猜測。通常,項目成員通過手工收集這些信息,增加了負擔,也很耗時。
持續(xù)集成可以帶來兩點積極效果:
有效決策:持續(xù)集成系統(tǒng)為項目構(gòu)建狀態(tài)和品質(zhì)指標提供了及時的信息,有些持續(xù)集成系統(tǒng)可以報告功能完成度和缺陷率。
注意到趨勢:由于經(jīng)常集成,我們可以看到一些趨勢,如構(gòu)建成功或失敗、總體品質(zhì)以及其它的項目信息。
建立團隊對開發(fā)產(chǎn)品的信心
持續(xù)集成可以建立開發(fā)團隊對開發(fā)產(chǎn)品的信心,因為他們清楚的知道每一次構(gòu)建的結(jié)果,他們知道他們對軟件的改動造成了哪些影響,結(jié)果怎么樣。
二. 持續(xù)集成工具
1.1 持續(xù)集成工具
Jenkins 和 Hudson
目前最流行的一款持續(xù)集成及自動化部署工具。
Jenkins 和 Hundson 之間的關(guān)系:2009 年,甲骨文收購了 Sun 并繼承了 Hudson 代碼庫。在 2011 年年初,甲骨文和開源社區(qū)之間的關(guān)系破裂,該項目被分成兩個獨立的項目:
Jenkins:由大部分原始開發(fā)人員組成
Hudson:由甲骨文公司繼續(xù)管理
所以 Jenkins 和 Hudson 是兩款非常相似的產(chǎn)品。
1.2 技術(shù)組合
Jenkins 其本身上沒有整合太多的功能,只是提供了一個持續(xù)集成的平臺,它是通過大量的插件,實現(xiàn)了一系列的持續(xù)化集成的工作
整合 GitHub 或 Subversion實現(xiàn)版本的控制
通過構(gòu)建工具(ANT,MAVEN,GRADLE)等進行項目的部署
通過與sonarqube的結(jié)合,實現(xiàn)自動化測試
通過與shell腳本的結(jié)合,實現(xiàn)了部署,增量包等一系列的功能
三. 部署方式的對比
傳統(tǒng)的部署方式
1530020348129.png
自動化的部署方式
1530020387978.png
搭建上述持續(xù)集成環(huán)境可以把整個構(gòu)建、部署過程,自動化測試等過程進行集成,實現(xiàn)自動化操作。在很大程度上減輕了開發(fā)人員或者維護人員的工作量,對于程序員的日常開發(fā)來說不會造成任何額外負擔
四. 環(huán)境搭建
使用的相關(guān)軟件版本
centos 7
JDK1.8
Tomcat8
Jenkins 2.107.2
maven 3
gradle 3.5
Jenkins的架設(shè)對于一個JAVAEE程序員來說,與在linux上部署項目并無太大的差異,主要分為以下幾個環(huán)節(jié)
4.1 JDK的安裝
上傳JDK安裝包到服務(wù)器登錄用戶的home目錄下
1530023524258.png
解壓JDK到/usr/local/java中
1530023759049.png
執(zhí)行命令
#查看本機上安裝的java
rpm -qa | grep java
tzdata-java-2015g-1.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
python-javapackages-3.4.1-11.el7.noarch
#卸載所有相關(guān)的java軟件
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
#創(chuàng)建java目錄
mkdir /usr/local/java
#解壓jdk壓縮包文件到j(luò)ava目錄當中
tar -zvxf jdk-8u161-linux-x64.tar.gz -C /usr/local/java
配置環(huán)境變量
vim /etc/profile
#set java environment
JAVA_HOME=/usr/local/java/jdk1.8.0_161
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
#重新加載配置文件:
source /etc/profile
測試安裝是否成功
java -version
1530024218219.png
* 顯示以上信息表示安裝JDK成功
4.2 Tomcat的安裝
上傳tomcat的安裝文件
1530024604426.png
創(chuàng)建tomcat的安裝路徑并解壓
#創(chuàng)建tomcat目錄,由于一臺機器上往后可能需要多個服務(wù)器,所以分開存放tomcat,避免沖突
mkdir -p /usr/local/tomcat/jenkins
#解壓tomcat壓縮包文件到/usr/local/tomcat/jenkins目錄當中
tar -zvxf apache-tomcat-8.0.51.tar.gz -C /usr/local/tomcat/jenkins
配置tomcat
通過查看tomca的catalina.sh文件中我們可以看到,tomca建議我們對tomcat的個性化配置通過在bin目錄下新建一個setenv.sh進行參數(shù)上的配置
1530026334596.png
vim setenv.sh
#########setenv.sh文件信息###############
#!/bin/sh
CATALINA_HOME=/usr/local/tomcat/jenkins/apache-tomcat-8.0.51
JAVA_HOME=/usr/local/java/jdk1.8.0_161
########################################
chmod 744 setenv.sh
配置/usr/local/tomcat/jenkins/apache-tomcat-8.0.51/conf目錄下的server.xml配置文件
一共修改以下三處的端口
connectionTimeout="20000"
redirectPort="8443" />
設(shè)置防火墻
#配置防火墻,開放1314的端口
/sbin/iptables -I INPUT -p tcp --dport 1314 -j ACCEPT
啟動tomcat
#進入到
cd /usr/local/tomcat/jenkins/apache-tomcat-8.0.51/bin
#執(zhí)行啟動腳本
./startup.sh
1530027265046.png
訪問地址成功表示安裝完成
4.3 maven的安裝
上傳安裝包到服務(wù)器
1530030405670.png
創(chuàng)建安裝目錄并且解壓到指定的目錄下
mkdir /usr/local/maven
tar -zvxf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven/
配置環(huán)境變量
vim /etc/profile
MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4
PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
source /etc/profile
測試安裝結(jié)果
mvn -v
1530067631723.png
4.4 gradle的安裝
上傳安裝包到服務(wù)端
1530067656417.png
創(chuàng)建目錄并且解壓到指定的目錄下
mkdir /usr/local/gradle
unzip gradle-3.5-bin.zip -d /usr/local/gradle/
配置環(huán)境變量
vim /etc/profile
GRADLE_HOME=/usr/local/gradle/gradle-3.5
PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$GRADLE_HOME/bin:$PATH
source /etc/profile
測試安裝結(jié)果
gradle -v
1530067903139.png
4.5 Jenkins的部署
下載Jenkins
在jenkins的官網(wǎng)下載jenkins的安裝包
1530027702182.png
1530027722669.png
上傳到服務(wù)端
將jenkins上傳到tomcat的webapps目錄下
1530027828027.png
配置Jenkins目錄
Jenkins默認的工作目錄位于用戶目錄下的.jenkins中,在剛剛的啟動腳本上配置jenkins的目錄,如果需要修改自己指定的工作目錄,有以下三種方式
設(shè)置JENKINS_HOME環(huán)境參數(shù)
#編輯profile文件
vi /etc/profile
#在最后加入
export JENKINS_HOME=xxxx
#保存,退出后執(zhí)行.讓配置生效
source /etc/profile
使用Web容器的管理工具設(shè)置JENKINS_HOME環(huán)境參數(shù).
#打開tomcat的bin目錄,編輯catalina.sh文件。
# OS specific support. $var _must_ be set to either true or false.上面添加
export JENKINS_HOME=xxx
更改Jenkins.war(或者在展開的Web容器)內(nèi)的web.xml配置文件
HUDSON_HOME
java.lang.String
Jenkins初始化
在配置結(jié)束后,重啟tomcat服務(wù)器,查看tomcat的運行日志
tail -fn 1000 /usr/local/tomcat/jenkins/apache-tomcat-8.0.51/logs/catalina.out
1530028444311.png
訪問地址
http://服務(wù)器的ip:1314/jenkins/
1530028998395.png
其中為了確保安全,我們需要到j(luò)enkins地址提示的路徑下獲取密鑰填寫到網(wǎng)頁中
cat /usr/local/tomcat/jenkins/JENKINS_HOME/secrets/initialAdminPassword
1530029073523.png
將獲取到的密碼填寫入輸入框中點擊繼續(xù)
安裝插件
1530029252641.png
* 在這里,如果沒有特殊的需求的話,直接選擇安裝推薦插件即可,如果有特殊的需要,可以自己自定義選擇插件來安裝
* 靜等插件安裝結(jié)束
1530029548682.png
* 打×的插件是由于網(wǎng)絡(luò)傳輸導(dǎo)致的安裝失敗,后面再重新安裝即可。這個步驟中如果選擇了安裝插件則 Linux 必須能夠聯(lián)網(wǎng)
創(chuàng)建登錄賬戶,默認為admin
1530029762950.png
到此,就可以開始使用Jenkins了
1530029778300.png
五 Jenkins系統(tǒng)初始化配置
在jenkins中么,常用配置一般分為以下三個地方
1530068142093.png
全局安全配置
1530068268618.png
* 剛開始入門階段,我們一般不需要做太多的權(quán)限設(shè)置,如果需要進行權(quán)限上的管理,可以開啟安全矩陣功能進行對用戶權(quán)限的控制
1530068295764.png
全局工具配置
在此環(huán)節(jié)配置當中,沒有太多需要操作的地方,主要是把在服務(wù)器上設(shè)置的一系列的工具目錄配置到j(luò)enkins當中即可,
需要注意的是,在配置過程中都必須要使用絕對路徑,并且在非必須的情況下,把自動勾選去掉,使用我們自己安裝的工具
1530068632576.png
1530068651605.png
管理插件
1530068760238.png
在這里,以deploy to container這個插件為例,該插件主要功能讓jenkins自動的把構(gòu)建好的項目部署到服務(wù)器中間件當中,但是這也不是必須的插件,因為一般我們可以使用shell腳本來完成這些操作
六. Jenkins+svn+maven的項目構(gòu)建
6.1 創(chuàng)建工程
點擊新建任務(wù)
1530069586404.png
填寫任務(wù)的相關(guān)信息
1530069757985.png
通用配置
1530070153500.png
1530070492304.png
源碼管理
1530070690662.png
1530070821297.png
1530070890052.png
1530071357137.png
check-out Strategy的各選項說明
Check-out Strategy
第一次build
第n次build(除第一次)
Use 'svn update' as much as possible
將workspace下的所有文件清空,然后從svn上check out一份完整的項目到workspace下
update前不會revert
Always check out a fresh copy
將workspace下的所有文件清空,然后從svn上check out一份完整的項目到workspace下
刪除workspace下的所有文件,然后重新check out一份完整的項目到workspace下。
Emulate clean checkout by first deleting unversioned/ignored files, then 'svn update'
將workspace下的所有文件清空,然后從svn上check out一份完整的項目到workspace下
update前先刪除unversioned/ignored文件
Use 'svn update' as much as possible, with 'svn revert' before update
將workspace下的所有文件清空,然后從svn上check out一份完整的項目到workspace下
update前先revert
構(gòu)建觸發(fā)器
1530086317897.png
主要用于配置構(gòu)建的觸發(fā)條件
觸發(fā)遠程構(gòu)建 (例如,使用腳本)
可以通過使用以下URL遠程觸發(fā)構(gòu)建,遠程觸發(fā)的基本原理是外部給 Jenkins 項目特定的 URL 地址發(fā)送請求, 但必須以請求參數(shù)的形式攜帶一個特定值,這個特定值就是這里的“身份驗證令牌
JENKINS_URL/job/testPorject/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME
可在后面疊加&cause=Cause+Text提供構(gòu)建參數(shù)的原因等信息
1530087936045.png
其他工程構(gòu)建后觸發(fā) :
在其他項目觸發(fā)的時候觸發(fā),里面有分為三種情況,也就是其他項目構(gòu)建成功、失敗、或者不穩(wěn)定的時候觸發(fā)項目
輪詢 SCM
定時檢查源碼變更(根據(jù)SCM軟件的版本號),如果有更新就checkout最新code下來,然后執(zhí)行構(gòu)建動作
*/5 * * * * (每5分鐘檢查一次源碼變化)
定時構(gòu)建
[圖片上傳中...(1530086939631.png-4c2281-1538705797773-0)]
* 周期進行項目構(gòu)建(它不關(guān)心源碼是否發(fā)生變化),例如:
* 在 Schedule 中填寫 0 * * * *
* 第一個參數(shù)代表的是分鐘 minute,取值 0~59
* 第二個參數(shù)代表的是小時 hour,取值 0~23
* 第三個參數(shù)代表的是天 day,取值 1~31
* 第四個參數(shù)代表的是月 month,取值 1~12
* 最后一個參數(shù)代表的是星期 week,取值 0~7,0 和 7 都是表示星期天
所以 0 * * * * 表示的就是每個小時的第 0 分鐘執(zhí)行構(gòu)建
構(gòu)建環(huán)境
1530086939631.png
一般這個不需要配置,用于選擇當前構(gòu)建的環(huán)境
構(gòu)建
1530087083665.png
pre steps
用于構(gòu)建前的操作,其中可以選擇多個先前操作,一般在這里用于執(zhí)行關(guān)閉中間件,以及對當前項目進行庫的備份與項目備份等操作
1530087132088.png
Build
在這個步驟中主要是用于項目的構(gòu)建,通過執(zhí)行maven命令將項目構(gòu)建出來
post steps
這個步驟與pre steps可選方式一樣,都是通過一系列的配置,完成項目構(gòu)建之后的工作,比如將構(gòu)建完成的項目部署到服務(wù)器中間件,啟動項目等操作
服務(wù)端相關(guān)的自動部署腳本
#!/bin/bash
TOMCAT_HOME=/usr/local/tomcat/test/apache-tomcat-8.0.51
WAR_NAME=employeemanager-0.0.1-SNAPSHOT
JENKINS_HOME=/usr/local/tomcat/jenkins/JENKINS_HOME/workspace/testPorject/target
TARGET_WAR_NAME=employeemanager
BACK_HOME=/back_war
time=`date +%Y%m%d%s`
#################公用方法#####################
function kill_tomcat(){
if [ `ps auxwwww|grep $1|grep -v grep|wc -l` -gt 0 ]
then
for pid in `ps auxwww|grep $1|grep -v grep|tr -s ' '|cut -d ' ' -f2`
do
kill -9 $pid 2>&1 > /dev/null
done
echo "終止tomcat進程:$pid"
else
echo "tomcat無進程啟動,不需要終止"
fi
}
function clean(){
cd $1/webapps
rm -rf $2
}
function back(){
if [ -d $2 ];then
mkdir $2
fi
[ -f ./$1.war ] && mv $1.war $2/$1.war_$time
}
function deploy_tomcat(){
cd $1
[ -f ./$2.war ] && cp ./$2.war $3/webapps/$4.war
}
function start_tomcat(){
cd $1/bin
sudo ./startup.sh
}
#################公用方法#####################
echo "1.終止tomcat進程"
kill_tomcat $TOMCAT_HOME
echo "2.清理webapps目錄"
clean $TOMCAT_HOME $TARGET_WAR_NAME
echo "2.備份webapps目錄"
back $TARGET_WAR_NAME $BACK_HOME
echo "3.部署項目到webapps下"
deploy_tomcat $JENKINS_HOME $WAR_NAME $TOMCAT_HOME $TARGET_WAR_NAME
echo "3.啟動tomcat"
start_tomcat $TOMCAT_HOME
構(gòu)建后的操作
1530087524750.png
構(gòu)建設(shè)置
這里集成了一個郵件通知的插件,如果在外網(wǎng)的話可以在構(gòu)建結(jié)束后發(fā)送構(gòu)建相關(guān)的信息到指定的郵箱當中
構(gòu)建夠的操作
1530087590363.png
這里主要是用于完成構(gòu)建后的后續(xù)善后工作,在這里可以使用之前提到的deploy to container插件,將項目部署到相關(guān)的容器當中
6.2 手動構(gòu)建
Jenkins 使用天氣狀況來表示構(gòu)建成功率
1530087885861.png
開始構(gòu)建
1530088718060.png
點擊參數(shù)化構(gòu)建后,填寫完參數(shù),點開始構(gòu)建,那么項目就開始進入構(gòu)建環(huán)節(jié),jenkins會幫我們從svn開始下載源碼,然后通過maven進行項目的編譯打包,通過執(zhí)行構(gòu)建腳本,對項目進行自動部署等操作
1530088349814.png
在第一次構(gòu)建當中,maven需要進行初始化,會下載一系列的依賴,需要一個漫長等待的過程
1530088623933.png
自此項目構(gòu)建完成,顯示構(gòu)建成功
1530118124996.png
瀏覽測試成功
1530118184002.png
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python 持续集成工具_持续集成工具: Jenkins学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python是属于it界吗_转行IT行业
- 下一篇: python加载模型文件进行图片分类_t