使用Jenkins实现自动化构建!
整理來自:程序員高級碼農(nóng)
使用Jenkins實現(xiàn)自動化構(gòu)建
一個大型平臺的微服務(wù)架構(gòu)設(shè)計通常會產(chǎn)生很多項目工程,因此會有很多服務(wù)和應(yīng)用需要部署,并且需要不斷地迭代和更新,這是一個龐大的工程,所以我們需要借助自動化工具,實現(xiàn)各個微服務(wù)工程的CICD工作流程。
CICD是持續(xù)集成(Continuous Integration)和持續(xù)部署(Continuous Deployment)的總稱,是指通過自動化的構(gòu)建、測試和部署,實現(xiàn)軟件產(chǎn)品可循環(huán)使用的快速交付流程。
Jenkins是一個基于Java開發(fā)的功能強(qiáng)大的自動化構(gòu)建工具,并且有一個非常豐富的插件倉庫,可以很好地擴(kuò)充和豐富其本身的功能。因此,Jenkins是實現(xiàn)自動化構(gòu)建的一個很不錯的工具。
單擊Jenkins首頁上的Plugins選項,可以查看各種插件的介紹,如圖15-1所示。
本章我們使用Jenkins,結(jié)合Maven、Docker、Selenium和JMeter等工具,建立一個可持續(xù)交付的自動化設(shè)施。
持續(xù)交付工作流程
從代碼提交開始,建立一個包括自動測試和自動部署的持續(xù)交付工作流程如圖15-2所示。
這個工作流程的步驟如下所示:
(1)開發(fā)者向GitLab提交代碼。
(2)GitLab使用 WebHook通知Jenkins有代碼更新。
(3)Jenkins 從節(jié)點(Slave)拉取代碼,打包并構(gòu)建鏡像。
(4)Jenkins使用從節(jié)點上構(gòu)建的鏡像運行測試用例。
(5)如果測試(Test)通過,則將鏡像推送到鏡像倉庫。
(6)Jenkins在應(yīng)用服務(wù)器上進(jìn)行更新部署。
(7)Jenkins將構(gòu)建報告以郵件方式通知開發(fā)者。
在開發(fā)者向代碼庫提交代碼之后,整個流程都是自動進(jìn)行的。如果中間某個環(huán)節(jié)出現(xiàn)錯誤,則中止流程的執(zhí)行,并將結(jié)果通知相關(guān)人員。提交的代碼不僅包括應(yīng)用程序,還包括構(gòu)建鏡像的腳本、測試用例的腳本和部署的編排腳本等。
其中,各個步驟的操作可以使用插件或直接在命令行中使用各種工具來完成。
例如,拉取項目代碼會用到Git插件;打包項目會用到 Maven;構(gòu)建鏡像和應(yīng)用部署可直接通過命令行使用Docker或docker-compose;集成測試可通過命令行執(zhí)行由Selenium、JMeter等生成的腳本。
下面,我們通過一個簡單的案例,演示和說明Jenkins 的使用方法。
Jenkins的安裝
下面的安裝過程以MacOS為例進(jìn)行說明。
因為Jenkins需要JVM的支持,所以請確保機(jī)器上已經(jīng)安裝了JDK 1.8或以上版本。為了完成后面的自動化演示,請確保機(jī)器中已經(jīng)安裝了Maven、Git客戶端和 Docker等。
打開Jenkins官網(wǎng),進(jìn)入下載頁面,選擇左邊的LTS穩(wěn)定版中的Mac OSX版本進(jìn)行下載,如圖15-3所示。
下載完成后,單擊安裝包“jenkins-2.89.1.pkg”開始安裝。
安裝過程比較簡單,直接單擊“繼續(xù)”按鈕,按提示使用系統(tǒng)推薦使用的插件即可。安裝完成后,通過下列網(wǎng)址打開本地的Jenkins控制臺:
http://localhost:8080第一次打開后會看到如圖15-4所示頁面。
按圖15-4的提示打開管理員密碼文件,把密碼復(fù)制并粘貼到密碼輸入框中,單擊右下角的Continue 按鈕。如果密碼驗證成功,則會提示讀者創(chuàng)建一個操作員用戶。在創(chuàng)建用戶之后,即可登錄Jenkins控制臺。新用戶登錄的歡迎界面如圖15-5所示。
Jenkins的基本配置
由于要用到Maven編譯和打包,所以單擊歡迎界面的“系統(tǒng)管理”→“全局工具配置”選項,如圖15-6所示,打開“全局工具配置”對話框。
在“全局工具配置”對話框中單擊“Maven安裝”選項,配置一個名字,并設(shè)置Maven的安裝路徑,如圖15-7所示。
單擊圖15-6中的“管理插件”選項,從彈出的對話框中單擊“可選插件”選項,找到“Maven Invoker plugin”插件,勾選后單擊“直接安裝”按鈕,如圖15-8所示。
注意,在設(shè)置settings.xml配置中的repositys路徑時,如果是在本機(jī)測試,則最好與IDEA的配置相同,這樣打包時將不用再重新下載一次依賴包。
在Jenkins的命令行配置中,為了能夠正常使用Docker 和 docker-compose,我們需要對Jenkins的系統(tǒng)權(quán)限進(jìn)行設(shè)置。因為Jenkins 使用默認(rèn)用戶“jenkins”開啟服務(wù),所以權(quán)限設(shè)置就是為這個用戶進(jìn)行授權(quán)。
通過如下操作步驟,為“jenkins”用戶設(shè)置一個免密碼配置,這樣,在Jenkins 的命令行配置中,就可以使用超級管理員的命令“sudo”了。
在MacOS的終端中,執(zhí)行下列命令,切換到超級管理員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的權(quán)限設(shè)置,添加如下所示的配置并保存:
jenkins ALL=(ALL) NOPASSWD: ALL %admin ALL=(ALL) NOPASSWD: ALL使用“dscl”命令把“jenkins”用戶加進(jìn) admin用戶組中,這個命令等同于Linux操作系統(tǒng)中的“usermod”命令:
sh-3.2# dscl . -append /Groups/admin GroupMembership jenkins至此,就完成了Jenkins的權(quán)限設(shè)置。
Jenkins的自動部署實例
為了演示Jenkins的使用,下面創(chuàng)建一個自動部署實例。
在這個實例中使用的是一個功能非常簡單的項目,項目中只有一個主程序,代碼如下所示
@SpringBootApplication@RestController public class DemoApplication { public static void main (String[] args){ SpringApplication.run(DemoApplication.class,args) ; } @RequestMapping (value = "/")public String index(){ return "Hello world! "; } }應(yīng)用啟動后,打開首頁將輸出“Hello World!”。
下面介紹這個自動部署項目的實現(xiàn)過程。
創(chuàng)建任務(wù)
在Jenkins首頁中單擊“新建”選項,打開創(chuàng)建任務(wù)頁,如圖15-9所示。
輸入任務(wù)名稱“demo”,并選擇“構(gòu)建一個自由風(fēng)格的軟件項目”選項,單擊“確定”按鈕,即可創(chuàng)建一個空任務(wù),如圖15-10所示。
配置任務(wù)
在圖15-10中,單擊“源碼管理”選項,顯示如圖15-11所示對話框。在圖15-11中勾選“Git選項,在代碼庫的地址欄中輸入“demo”項目的存放地址。
因為這是一個公開項目,所以不用設(shè)置訪問項目的權(quán)限。如果是一個私有項目,則必須在圖15-11的“Credentials”中配置對項目有存取權(quán)限的用戶名和密碼。
單擊圖15-11中的“構(gòu)建觸發(fā)器”選項,在“構(gòu)建觸發(fā)器”對話框中勾選“Poll SCM”選項,配置一個定時任務(wù)的日程表,如圖15-12所示。
圖15-12中的日程表“00 20*”,表示在每天的20:00點整執(zhí)行任務(wù)構(gòu)建。在本實例中不使用定時任務(wù)。
接下來,使用 Maven 配置項目的打包。單擊“構(gòu)建”選項,在“增加構(gòu)建步驟”下拉列表中選擇“Invoke top-level Maven targets”選項,如圖15-13所示。
其中,在“Maven Version”中選擇前面安裝的Maven,在“Goals”中輸人如下所示的打包命令:
clean package配置創(chuàng)建鏡像和部署的操作命令,這里會用到Dockerfile和 docker-compose.yml,這兩個文件已經(jīng)包含在項目工程的docker目錄中。
Dockerfile 中的內(nèi)容如下所示: 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"單擊“構(gòu)建”選項,在“增加構(gòu)建步驟”下拉列表中選擇“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這些命令與我們在主機(jī)上直接使用Docker等工具部署應(yīng)用的命令相同,即先停止正在運行的容器,再刪除容器和鏡像,最后重新進(jìn)行部署,如圖15-14所示。
執(zhí)行任務(wù)
當(dāng)手動執(zhí)行任務(wù)時,首先單擊任務(wù)的名稱,返回任務(wù)首頁。然后在任務(wù)首頁中單擊左側(cè)菜單中的“立即構(gòu)建”選項即可,如圖15-15所示。
在任務(wù)執(zhí)行過程中,會在控制臺中輸出信息,一個完整的執(zhí)行過程的輸出日志如下所示
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從控制臺的輸出日志中可以看到構(gòu)建已經(jīng)成功完成。這時,我們可以通過下面的網(wǎng)址打開應(yīng)用運行的首頁:
http://localhost:8888從中可以看到我們預(yù)期的結(jié)果,即輸出“Hello World!”,如圖15-16所示。
在本節(jié)的輸出日志中,有一個如下所示的錯誤提示:
+ 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")出現(xiàn)這個錯誤提示的原因是在第一次構(gòu)建時,并不存在可以移除的鏡像,但這并不影響整個構(gòu)建過程的執(zhí)行。
現(xiàn)在驗證一下項目更新的自動化部署效果。首先將項目主程序的輸出結(jié)果“Hello World ! ”改為“Hello Jerkins! ”,然后提交代碼。完成之后,再在Jenkins 中單擊“立即構(gòu)建”選項,構(gòu)建完成后,刷新訪問應(yīng)用的瀏覽器,即可看到如圖15-17所示的效果。
再次查看控制臺的輸出日志,現(xiàn)在,移除鏡像的命令已經(jīng)不再顯示錯誤,而是輸出了如下所示的結(jié)果,表示已經(jīng)停止了運行的容器,并移除了原來的容器和鏡像:
+ 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這里只是一個簡單的自動部署的演示,在實際使用中,可以通過定時任務(wù),或結(jié)合使用WebHook 的代碼提交通知,實現(xiàn)自動部署。另外,還可以通過Selenium、JMeter等工具生成測試腳本,增加自動測試的功能。
小結(jié)
本章介紹了如何使用自動化構(gòu)建工具Jenkins 設(shè)計持續(xù)交付的工作流程,并以一個簡單的實例演示了自動部署的實現(xiàn)過程。在該實例中,我們使用Git進(jìn)行代碼拉取、使用 Maven進(jìn)行程序打包、使用Docker進(jìn)行鏡像的創(chuàng)建和應(yīng)用的更新與部署。從這個實例中可以看出Jenkins的強(qiáng)大的可擴(kuò)展性。
通過對本章的學(xué)習(xí),相信讀者能夠根據(jù)實際情況,建立一個完善的自動化基礎(chǔ)設(shè)施,從而實現(xiàn)在微服務(wù)發(fā)布中集成測試和持續(xù)部署的自動化構(gòu)建流程。
?
回復(fù)?【idea激活】即可獲得idea的激活方式
回復(fù)?【Java】獲取java相關(guān)的視頻教程和資料
回復(fù)?【SpringCloud】獲取SpringCloud相關(guān)多的學(xué)習(xí)資料
回復(fù)?【python】獲取全套0基礎(chǔ)Python知識手冊
回復(fù)?【2020】獲取2020java相關(guān)面試題教程
回復(fù)?【加群】即可加入終端研發(fā)部相關(guān)的技術(shù)交流群
最近于哥也在玩視頻號啦,主要針對于程序員方向的,大家可以去關(guān)注一波:
哎喲,我去,這些代碼片段太有意思了!
Docker+Jenkins+Seneca構(gòu)建去集中化微服務(wù)架構(gòu)!
用完Gradle后,賊快!開始嫌棄Maven了
超清晰的 DNS 原理入門指南!邊學(xué)邊用
記錄一次SQL引起的內(nèi)網(wǎng)滲透
相信自己,沒有做不到的,只有想不到的
在這里獲得的不僅僅是技術(shù)!
喜歡就給個“在看”
總結(jié)
以上是生活随笔為你收集整理的使用Jenkins实现自动化构建!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(813):dom简介
- 下一篇: 看完这篇还不知道css固定和自适应可以小