使用Jenkins实现自动化构建!
整理來自:程序員高級碼農
使用Jenkins實現自動化構建
一個大型平臺的微服務架構設計通常會產生很多項目工程,因此會有很多服務和應用需要部署,并且需要不斷地迭代和更新,這是一個龐大的工程,所以我們需要借助自動化工具,實現各個微服務工程的CICD工作流程。
CICD是持續集成(Continuous Integration)和持續部署(Continuous Deployment)的總稱,是指通過自動化的構建、測試和部署,實現軟件產品可循環使用的快速交付流程。
Jenkins是一個基于Java開發的功能強大的自動化構建工具,并且有一個非常豐富的插件倉庫,可以很好地擴充和豐富其本身的功能。因此,Jenkins是實現自動化構建的一個很不錯的工具。
單擊Jenkins首頁上的Plugins選項,可以查看各種插件的介紹,如圖15-1所示。
本章我們使用Jenkins,結合Maven、Docker、Selenium和JMeter等工具,建立一個可持續交付的自動化設施。
持續交付工作流程
從代碼提交開始,建立一個包括自動測試和自動部署的持續交付工作流程如圖15-2所示。
這個工作流程的步驟如下所示:
(1)開發者向GitLab提交代碼。
(2)GitLab使用 WebHook通知Jenkins有代碼更新。
(3)Jenkins 從節點(Slave)拉取代碼,打包并構建鏡像。
(4)Jenkins使用從節點上構建的鏡像運行測試用例。
(5)如果測試(Test)通過,則將鏡像推送到鏡像倉庫。
(6)Jenkins在應用服務器上進行更新部署。
(7)Jenkins將構建報告以郵件方式通知開發者。
在開發者向代碼庫提交代碼之后,整個流程都是自動進行的。如果中間某個環節出現錯誤,則中止流程的執行,并將結果通知相關人員。提交的代碼不僅包括應用程序,還包括構建鏡像的腳本、測試用例的腳本和部署的編排腳本等。
其中,各個步驟的操作可以使用插件或直接在命令行中使用各種工具來完成。
例如,拉取項目代碼會用到Git插件;打包項目會用到 Maven;構建鏡像和應用部署可直接通過命令行使用Docker或docker-compose;集成測試可通過命令行執行由Selenium、JMeter等生成的腳本。
下面,我們通過一個簡單的案例,演示和說明Jenkins 的使用方法。
Jenkins的安裝
下面的安裝過程以MacOS為例進行說明。
因為Jenkins需要JVM的支持,所以請確保機器上已經安裝了JDK 1.8或以上版本。為了完成后面的自動化演示,請確保機器中已經安裝了Maven、Git客戶端和 Docker等。
打開Jenkins官網,進入下載頁面,選擇左邊的LTS穩定版中的Mac OSX版本進行下載,如圖15-3所示。
下載完成后,單擊安裝包“jenkins-2.89.1.pkg”開始安裝。
安裝過程比較簡單,直接單擊“繼續”按鈕,按提示使用系統推薦使用的插件即可。安裝完成后,通過下列網址打開本地的Jenkins控制臺:
http://localhost:8080第一次打開后會看到如圖15-4所示頁面。
按圖15-4的提示打開管理員密碼文件,把密碼復制并粘貼到密碼輸入框中,單擊右下角的Continue 按鈕。如果密碼驗證成功,則會提示讀者創建一個操作員用戶。在創建用戶之后,即可登錄Jenkins控制臺。新用戶登錄的歡迎界面如圖15-5所示。
Jenkins的基本配置
由于要用到Maven編譯和打包,所以單擊歡迎界面的“系統管理”→“全局工具配置”選項,如圖15-6所示,打開“全局工具配置”對話框。
在“全局工具配置”對話框中單擊“Maven安裝”選項,配置一個名字,并設置Maven的安裝路徑,如圖15-7所示。
單擊圖15-6中的“管理插件”選項,從彈出的對話框中單擊“可選插件”選項,找到“Maven Invoker plugin”插件,勾選后單擊“直接安裝”按鈕,如圖15-8所示。
注意,在設置settings.xml配置中的repositys路徑時,如果是在本機測試,則最好與IDEA的配置相同,這樣打包時將不用再重新下載一次依賴包。
在Jenkins的命令行配置中,為了能夠正常使用Docker 和 docker-compose,我們需要對Jenkins的系統權限進行設置。因為Jenkins 使用默認用戶“jenkins”開啟服務,所以權限設置就是為這個用戶進行授權。
通過如下操作步驟,為“jenkins”用戶設置一個免密碼配置,這樣,在Jenkins 的命令行配置中,就可以使用超級管理員的命令“sudo”了。
在MacOS的終端中,執行下列命令,切換到超級管理員root
輸入root的密碼:
appledeMacBook-Air:/ apples su Password:編輯“sudoers”,并找到如下所示信息:
sh-3.2# vi/etc/sudoers# root and users in group wheel can run anything on any machine as any userrootALL = (ALL) ALL %admin ALL- (ALL) ALL在上面信息的后面,參照root的權限設置,添加如下所示的配置并保存:
jenkins ALL=(ALL) NOPASSWD: ALL %admin ALL=(ALL) NOPASSWD: ALL使用“dscl”命令把“jenkins”用戶加進 admin用戶組中,這個命令等同于Linux操作系統中的“usermod”命令:
sh-3.2# dscl . -append /Groups/admin GroupMembership jenkins至此,就完成了Jenkins的權限設置。
Jenkins的自動部署實例
為了演示Jenkins的使用,下面創建一個自動部署實例。
在這個實例中使用的是一個功能非常簡單的項目,項目中只有一個主程序,代碼如下所示
@SpringBootApplication@RestController public class DemoApplication { public static void main (String[] args){ SpringApplication.run(DemoApplication.class,args) ; } @RequestMapping (value = "/")public String index(){ return "Hello world! "; } }應用啟動后,打開首頁將輸出“Hello World!”。
下面介紹這個自動部署項目的實現過程。
創建任務
在Jenkins首頁中單擊“新建”選項,打開創建任務頁,如圖15-9所示。
輸入任務名稱“demo”,并選擇“構建一個自由風格的軟件項目”選項,單擊“確定”按鈕,即可創建一個空任務,如圖15-10所示。
配置任務
在圖15-10中,單擊“源碼管理”選項,顯示如圖15-11所示對話框。在圖15-11中勾選“Git選項,在代碼庫的地址欄中輸入“demo”項目的存放地址。
因為這是一個公開項目,所以不用設置訪問項目的權限。如果是一個私有項目,則必須在圖15-11的“Credentials”中配置對項目有存取權限的用戶名和密碼。
單擊圖15-11中的“構建觸發器”選項,在“構建觸發器”對話框中勾選“Poll SCM”選項,配置一個定時任務的日程表,如圖15-12所示。
圖15-12中的日程表“00 20*”,表示在每天的20:00點整執行任務構建。在本實例中不使用定時任務。
接下來,使用 Maven 配置項目的打包。單擊“構建”選項,在“增加構建步驟”下拉列表中選擇“Invoke top-level Maven targets”選項,如圖15-13所示。
其中,在“Maven Version”中選擇前面安裝的Maven,在“Goals”中輸人如下所示的打包命令:
clean package配置創建鏡像和部署的操作命令,這里會用到Dockerfile和 docker-compose.yml,這兩個文件已經包含在項目工程的docker目錄中。
Dockerfile 中的內容如下所示: FROM java:8 VOLUME/tmp ADDdemo-0.0.1-SNAPSHOT.jar app.jar RUN bash 一c'touch /app.jar'EXPOSE8080 ENTRYPOINT , "/app.jar"] ["java", "-Djava.security.egd=file:/dev/./urandom", "-jardocker-compose.yml中的部署腳本如下所示:
demo: build:ports: "8888:8080"單擊“構建”選項,在“增加構建步驟”下拉列表中選擇“Execute shell”選項,在“Command”中輸入如下所示命令:
cd /Users/Shared/Jenkins/Home/workspace/demo /docker cp -f ../target/demo-0.0.1-SNAPSHOT .jar sudo /usr/local/bin/docker-compose down --rmi all sudo /usr/local/bin/docker-compose up -d這些命令與我們在主機上直接使用Docker等工具部署應用的命令相同,即先停止正在運行的容器,再刪除容器和鏡像,最后重新進行部署,如圖15-14所示。
執行任務
當手動執行任務時,首先單擊任務的名稱,返回任務首頁。然后在任務首頁中單擊左側菜單中的“立即構建”選項即可,如圖15-15所示。
在任務執行過程中,會在控制臺中輸出信息,一個完整的執行過程的輸出日志如下所示
Started by user mr.csj Building in workspace /Users/Shared/Jenkins/Home/workspace/demo>git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository >git config remote.origin.url https://gitee.com/chenshaojian/demo.git #timeout=10 Fetching upstream changes from https://gitee.com/chenshaojian/demo.git>git --version # timeout=10 >git fetch --tags --progress https://gitee.com/chenshaojian/demo.git+refs/heads/* :refs/remotes/origin/* >git rev-parse refs/remotes/origin/master^ { commit] # timeout=10 >git rev-parse refs/remotes/origin/origin/master"{ commit}# timeout=10Checking out Revision 1b0348a999cee3a1920b1b20576b54e58a50ab2 (refs/remotes/origin/master) >git config core.sparsecheckout # timeout=10 >git checkout-f 1b0348a999cee3a1920b1b2c576b54e58a50ab2Commit message: "add docker-compose" >git rev-list 8791f0a371ab67a83d1005197744475de5f177df # timeout=10[demo]$/Users/apple/apache-maven-3.5.0/bin/mvn clean package [INFO]Scanning for projects. . . [INFO] [INFO]------------- [INFO] Building demo 0.0.1-SNAPSHOT[INFO] [INFO] [INFO]--- maven-clean-plugin:2.6.1:clean (default-clean)& demo ---[INFO] Deleting /Users/Shared/Jenkins/Home/workspace/demo/target [INFO] [INFO] ---maven-resources-plugin:2.6:resources (default-resources)& demo -[INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO]Copying 1 resource [INEO]Copying 0 resource[INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) demo ---[ INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/Shared/Jenkins/Home/workspace/demo/target/classes[INEO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) edemo --- [INFO] Using 'UTF-8'encoding to copy filtered resources.[INFO] skip non existing resourceDirectory /Users/Shared/Jenkins/Home/workspace/demo/src/test/resources[INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile)Cdemo [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/Shared/Jenkins/Home/workspace/demo/target/test-classes[INEO] [ INFO] ---maven-surefire-plugin:2.20:test (default-test) C demo ---[INFO] Tests are skipped. [INFO] [INFO] --- maven-jar-plugin:2.6:jar (default-jar) demo --[INFO] Building jar: /Users/Shared/Jenkins/Home/workspace/demo/target/demo-0.0.1-SNAPSHOT.jar[INFO] [INFO] --- spring-boot-maven-plugin:1.5.8.RELEA.SE:repackage (default) demo [INFO] [INEO] BUILD SUCCESS[INFO] [INFO]Total time: 5.095 s [INFO] Finished at: 2017-10-30T16:18:18+08:00[INFO] Final Memory:29M/182M [INFO] [demo]$ /bin/sh -xe/Users/Shared/Jenkins/tmp/jenkins4696633078670494346.sh +cd /Users/Shared/ Jenkins/Home/workspace/demo/docker+ cp -f ../target/demo-0.0.1-SNAPSHOT.jar . + sudo /usr/local/bin/docker-compose down --rmi allRemoving image docker_demo Failed to remove image for service demo:404 Client Error: Not Found ("No suchimage: docker_demo: latest") + sudo /usr/local/bin/docker-compose up -dBuilding demo Step 1/6 : FROM java: 8 --->d23bdf 5b1b1b Step 2/6:VOLUME /tmp---> Using cache --->64c36a425bbf Step 3/6: ADD demo-0.0.1-SNAPSHOT.jar app.jar--->1788813d23d2 step 4/6:RUN bash-c 'touch /app.jar'---> Running in e4cfd4447b78 --->2c44a754963b Removing intermediate container e4cfd4447b78Step 5/6 :EXPOSE 8080 ---> Running in 95b96954618e---> 8bc53f642637 Removing intermediate container 95b96954618e Step 6/6:ENTRYPOINT java-Djava.security.egd=file:/dev/./urandom-jar/app.:一-->Running in al92a418f4f1 --->3a27629ceba9 Removing intermediate container a192a4184f1Successfully built 3a27629ceba9 Successfully tagged docker demo: latest Image for service demo was built because it did not already exist. To rebuithis image you must use `docker-compose build' or 'docker-compose up --buildCreating docker demo_1.. Creating docker_demo_1-[1A-[2K Creating docker demo 1 ...一[ 32mdone-[Om--[1BFinished:sUCCESS從控制臺的輸出日志中可以看到構建已經成功完成。這時,我們可以通過下面的網址打開應用運行的首頁:
http://localhost:8888從中可以看到我們預期的結果,即輸出“Hello World!”,如圖15-16所示。
在本節的輸出日志中,有一個如下所示的錯誤提示:
+ sudo /usr/local /bin/docker-compose down --rmi allRemoving image docker demo Failed to remove image for service demo:404 Client Error:Not Found ("No suchimage: docker demo: latest")出現這個錯誤提示的原因是在第一次構建時,并不存在可以移除的鏡像,但這并不影響整個構建過程的執行。
現在驗證一下項目更新的自動化部署效果。首先將項目主程序的輸出結果“Hello World ! ”改為“Hello Jerkins! ”,然后提交代碼。完成之后,再在Jenkins 中單擊“立即構建”選項,構建完成后,刷新訪問應用的瀏覽器,即可看到如圖15-17所示的效果。
再次查看控制臺的輸出日志,現在,移除鏡像的命令已經不再顯示錯誤,而是輸出了如下所示的結果,表示已經停止了運行的容器,并移除了原來的容器和鏡像:
+ sudo /usr/local/bin/docker-compose down--rmi all Stopping docker demo 1 ... -[1A-[2K Stopping docker demo 1 ... -[32mdone-[ Om-[1BRemoving docker demo 1 ... 一-[1A[2K Removing docker demo 1 ...-[32mdone-[ Om一[1BRemoving image docker demo這里只是一個簡單的自動部署的演示,在實際使用中,可以通過定時任務,或結合使用WebHook 的代碼提交通知,實現自動部署。另外,還可以通過Selenium、JMeter等工具生成測試腳本,增加自動測試的功能。
小結
本章介紹了如何使用自動化構建工具Jenkins 設計持續交付的工作流程,并以一個簡單的實例演示了自動部署的實現過程。在該實例中,我們使用Git進行代碼拉取、使用 Maven進行程序打包、使用Docker進行鏡像的創建和應用的更新與部署。從這個實例中可以看出Jenkins的強大的可擴展性。
通過對本章的學習,相信讀者能夠根據實際情況,建立一個完善的自動化基礎設施,從而實現在微服務發布中集成測試和持續部署的自動化構建流程。
?
回復?【idea激活】即可獲得idea的激活方式
回復?【Java】獲取java相關的視頻教程和資料
回復?【SpringCloud】獲取SpringCloud相關多的學習資料
回復?【python】獲取全套0基礎Python知識手冊
回復?【2020】獲取2020java相關面試題教程
回復?【加群】即可加入終端研發部相關的技術交流群
最近于哥也在玩視頻號啦,主要針對于程序員方向的,大家可以去關注一波:
哎喲,我去,這些代碼片段太有意思了!
Docker+Jenkins+Seneca構建去集中化微服務架構!
用完Gradle后,賊快!開始嫌棄Maven了
超清晰的 DNS 原理入門指南!邊學邊用
記錄一次SQL引起的內網滲透
相信自己,沒有做不到的,只有想不到的
在這里獲得的不僅僅是技術!
喜歡就給個“在看”
總結
以上是生活随笔為你收集整理的使用Jenkins实现自动化构建!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(813):dom简介
- 下一篇: 看完这篇还不知道css固定和自适应可以小