一、簡介
1、CI/CD
CI/CD 是一種通過在應用開發階段引入自動化來頻繁向客戶交付應用的方法。CI/CD 的核心概念是持續集成、持續交付和持續部署。作為一個面向開發和運營團隊的解決方案,CI/CD 主要針對在集成新代碼時所引發的問題(亦稱:“集成地獄”)。
CI 持續集成(Continuous Integration)
現代應用開發的目標是讓多位開發人員同時處理同一應用的不同功能。但是,如果企業安排在一天內將所有分支源代碼合並在一起(稱為“合並日”),最終可能造成工作繁瑣、耗時,而且需要手動完成。這是因為當一位獨立工作的開發人員對應用進行更改時,有可能會與其他開發人員同時進行的更改發生沖突。如果每個開發人員都自定義自己的本地集成開發環境(IDE),而不是讓團隊就一個基於雲的 IDE 達成一致,那么就會讓問題更加雪上加霜。
持續集成(CI)可以幫助開發人員更加頻繁地(有時甚至每天)將代碼更改合並到共享分支或“主干”中。一旦開發人員對應用所做的更改被合並,系統就會通過自動構建應用並運行不同級別的自動化測試(通常是單元測試和集成測試)來驗證這些更改,確保這些更改沒有對應用造成破壞。這意味着測試內容涵蓋了從類和函數到構成整個應用的不同模塊。如果自動化測試發現新代碼和現有代碼之間存在沖突,CI 可以更加輕松地快速修復這些錯誤。
CD 持續交付(Continuous Delivery)
完成 CI 中構建及單元測試和集成測試的自動化流程后,持續交付可自動將已驗證的代碼發布到存儲庫。為了實現高效的持續交付流程,務必要確保 CI 已內置於開發管道。持續交付的目標是擁有一個可隨時部署到生產環境的代碼庫。
在持續交付中,每個階段(從代碼更改的合並,到生產就緒型構建版本的交付)都涉及測試自動化和代碼發布自動化。在流程結束時,運維團隊可以快速、輕松地將應用部署到生產環境中。
CD 持續部署(Continuous Deployment)
對於一個成熟的 CI/CD 管道來說,最后的階段是持續部署。作為持續交付——自動將生產就緒型構建版本發布到代碼存儲庫——的延伸,持續部署可以自動將應用發布到生產環境。由於在生產之前的管道階段沒有手動門控,因此持續部署在很大程度上都得依賴精心設計的測試自動化。
實際上,持續部署意味着開發人員對應用的更改在編寫后的幾分鍾內就能生效(假設它通過了自動化測試)。這更加便於持續接收和整合用戶反饋。總而言之,所有這些 CI/CD 的關聯步驟都有助於降低應用的部署風險,因此更便於以小件的方式(而非一次性)發布對應用的更改。不過,由於還需要編寫自動化測試以適應 CI/CD 管道中的各種測試和發布階段,因此前期投資還是會很大。
2、Jenkins、Maven、Gradle
2.1 jenkins 概述: Jenkins是一個功能強大的應用程序,允許持續集成和持續交付項目,無論用的是什么平台。這是一個免費的源代碼,可以處理任何類型的構建或持續集成。集成Jenkins可以用於一些測試和部署技術。Jenkins是一種軟件允許持續集成。 目的: 持續、自動地構建/測試軟件項目。 監控軟件開放流程,快速問題定位及處理,提示開放效率。 特性: 開源的java語言開發的持續集成工具,支持CI,CD。 易於安裝部署配置:可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署,可方便web界面配置管理。 消息通知及測試報告:集成RSS/E-mail通過RSS發布構建結果或當構建完成時通過e-mail通知,生成JUnit/TestNG測試報告。 分布式構建:支持Jenkins能夠讓多台計算機一起構建/測試。 文件識別:Jenkins能夠跟蹤哪次構建生成哪些jar,哪次構建使用哪個版本的jar等。 豐富的插件支持:支持擴展插件,你可以開發適合自己團隊使用的工具,如git,svn,maven,docker等。 2.2 maven、gradle 概述: Maven 是一個項目管理工具,可以對 Java 項目進行構建、依賴管理,是一個自動化構建工具。Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。 Gradle是一個基於Apache Ant和ApacheMaven概念的項目自動化構建工具。它使用一種基於Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。 自動化構建工具:將原材料(java、js、css、html....)->產品(可發布項目)編譯-打包-部署-測試 -> 自動構建 maven和gradle的比較:(具體的比較可以百度,這里沒有詳細介紹) 都是java程序的構建工具 1、可擴展性 gradle夠靈活。一方面是因為gradle使用的是groovy或者kotlin語言作為腳本的編寫語言,這樣極大的提高了腳本的靈活性,但是其本質上的原因是gradle的基礎架構能夠支持這種靈活性。 相對而言,maven的靈活性就差一些,並且自定義起來也比較麻煩,但是maven的項目比較容易看懂,並且上手簡單。 所以如果你的項目沒有太多自定義構建需求的話還是推薦使用maven,但是如果有自定義的構建需求,那么還是投入gradle的懷抱吧。 2、性能 Gradle和Maven都支持並行的項目構建和依賴解析。但是gradle的三個特點讓gradle可以跑的比maven快上一點: 增量構建 構建緩存 gradle守護進程
3、自動化部署流程(jenkins+gogs+maven/gradle)
我們的初衷:
就是要實現只要開發提交代碼到git遠程倉庫,jenkins就會自動檢測到並且自動進行構建(合並、打包),構建完成之后將打好的包(war、jar包都可以)通過jenkins的插件傳到tomcat的webapps目錄下,然后重啟tomcat,實現自動打包部署。
其工作流程是:
開發提交代碼到gogs遠程倉庫——>使用jenkins觸發構建任務,git插件從gogs倉庫上拉取代碼——>maven/gradle將代碼編譯打包——>jenkins將war包部署到tomcat/將jar包放到服務器
4、項目構建前環境准備
1、docker環境,搭建jenkins 192.168.1.20
2、搭建gogs代碼倉庫,192.168.1.20
3、nginx服務器 192.168.1.10
4、應用程序服務器安裝tomcat:192.168.1.30
二、Jenkins構建maven項目
1、新建maven項目
打開新建的test項目,進行配置
2、配置maven項目的構建操作
保存構建歷史,可以方便查看構建歷史所用分支等信息:
配置git parameter插件,選擇指定分支進行構建的功能。后面的git參數名稱可以自定義,參數類型選分支:
配置jdk parameter插件,如果有多個jdk版本,指定一組作為構建參數選取的JDK:
源碼管理, 配置git遠程倉庫地址等信息:
指定分支,跟git參數的自定義名稱對應:
maven工具 清理舊數據,解決依賴並打包:
maven命令:mvn clean install -Dmaven.test.skip=true clean 移除所有上一次構建生成的文件 install 將包安裝至本地倉庫,以讓其它項目依賴 maven.test.skip 跳過測試
3、配置java程序包發送到應用服務器
情況一:構建jar包通過配置SSH發送文件到服務器:(Publish over SSH插件 使用ssh免密登錄到目標服務器)
系統管理——>系統配置——>publish over ssh——>SSH Server——>添加目標服務器信息——>測試是否正確
在Post Steps配置里添加選項 Send files or execute commands over SSH,並配置圖示信息:
Source files #jenkins項目工作區中jar包路徑 eg:mall-admin/target/mall-admin-1.0-SNAPSHOT.jar Remove prefix #刪除jar包路徑的前綴 eg:mall-admin/target/ Remote directory #將jar包放到應用服務器的目錄地址 Exec command #應用服務器執行命令。
可以在Exec conmand 執行命令,也可以添加Execute shell腳本執行,也可以在應用服務器寫好shell腳本執行。
完整的程序運行腳本,只需修改變量值就可以為你所用:
#自定義變量 DATE=$(date +%Y%m%d%T) JAVADIR=/usr/local/jdk1.8.0_171 PROJECT=mall-admin DIR=/server/jenkins SOFTDIR=$DIR/soft TEMPDIR=$DIR/temp LOGSDIR=$DIR/logs BACKUPDIR=$DIR/backup JARFILE=$PROJECT-1.0-SNAPSHOT.jar PID=$LOGSDIR/$PROJECT/$PROJECT.pid LOGS=$LOGSDIR/$PROJECT/$PROJECT.log #創建應用服務器目錄 mkdir -p $DIR/{logs,soft,backup} if [ ! -d $LOGSDIR/$PROJECT ];then mkdir -p $LOGSDIR/$PROJECT fi #程序啟動、停止、備份 cd $SOFTDIR kill -9 `cat $PID` mv $JARFILE $BACKUPDIR/$JARFILE.$DATE mv $LOGS $LOGS.$DATE mv -f $TEMPDIR/$JARFILE . $JAVADIR/bin/java -jar -Dspring.profiles.active=test $JARFILE >$LOGS & echo $! > $PID if [ $? = 0 ];then sleep 30 tail -n 50 $LOGS fi #清理多余日志 cd $LOGSDIR/$PROJECT ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
情況二:構建war包放到tomcat中運行
#docker搭建tomcat
啟動測試tomcat:
docker run -itd -p 8080:8080 --name=tomcat tomcat
拷貝配置文件到宿主機:
docker cp tomcat:/usr/local/tomcat /server/docker/
可以修改tomcat配置文件(server.xml): 自定義端口等
刪除測試,啟動正式tomcat:
docker rm -f tomcat
docker run --restart=always --name=tomcat -p 8080:8080 \ -v /server/docker/tomcat:/usr/local/tomcat \ -itd tomcat
在"構建后操作"添加Deploy war/ear to a container 選項,讓war包放到tomcat的webapps目錄下,程序就能運行起來了。
修改tomcat配置文件,允許jenkins訪問:
vim /server/docker/tomcat/config/tomcat-users.xml #管理員密碼為:tomcat/tomcat
<role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
vim /server/docker/tomcat/webapps/manager/META-INF/context.xml
如下圖修改,將這段話注銷,讓所以ip都可以訪問tomcat,修改完重啟tomcat:docker restart tomcat
4、指定分支構建項目
上面所有配置完成后,指定代碼分支構建項目
到應用服務器或者jenkins查看日志,是否構建成功,如果沒有構建成功,可從日志里找問題並解決。
打開"控制台輸出",就能看到構建項目輸出的日志了。
三、Jenkins構建gradle項目
1、新建一個自由風格項目
注意:接下來的配置跟構建maven項目一樣,不同是的maven項目需要配置maven工具操作,gradle項目需要配置gradle工具操作
2、配置gradle工具打包編譯操作
只有這兩步跟maven不一樣,其他都參考 “二、jenkins構建maven項目” 來配置,這里就不多說了~
四、Jenkins其他功能
1、用戶權限管理,實現不同用戶擁有不同的項目增刪改查權限
2、jenkins+docker 微服務部署到docker容器中
3、jenkins+Sonarqube 構建前審查代碼
活着不為取悅任何人