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