一.敏捷開發(fā)相關(guān)概念
1.微服務(wù)的痛點
再來看一下我們的微服務(wù)架構(gòu) , 每個組件都需要服務(wù)器去部署,加起來可能需要幾十個甚至上百個服務(wù)器。這樣的微服務(wù)項目在部署上會遇到什么問題?
- 需要很多很多的服務(wù)器,服務(wù)器的采購安裝,布線都很麻煩
- 每個服務(wù)都需要:編譯,構(gòu)建,打包,測試,發(fā)布,運維重復(fù)的工作量重復(fù)做
- 操作麻煩(編譯,打包,測試,發(fā)布,上線等等都很麻煩)
2.什么是DevOps
問題:軟件的迭代過程包括,設(shè)計,編碼,編譯,構(gòu)建,測試,發(fā)布,運維等等流程,早期的軟件開發(fā)模式為瀑布式開發(fā),這種開發(fā)模式迭代更新太慢,每個環(huán)境都需要耗費大量人力和時間成本。往往很長時間才迭代一次。如今企業(yè)追求的都是敏捷開發(fā):快速開發(fā)快速迭代,盡可能的縮短軟件的開發(fā)生命周期。
DevOps 強調(diào)的是高效組織團隊之間如何通過自動化的工具協(xié)作和溝通來完成軟件的生命周期管理,從而更快、更頻繁地交付更穩(wěn)定的軟件。
DevOps是一種方法或理念,它涵蓋開發(fā)、測試、運維的整個過程。DevOps是提高軟件開發(fā)、測試、運維、運營 等各部門的溝通與協(xié)作質(zhì)量的方法和過程,DevOps強調(diào)軟件開發(fā)人員與軟件測試、軟件運維、質(zhì)量保障(QA)部 門之間有效的溝通與協(xié)作,強調(diào)通過自動化的方法去管理軟件變更、軟件集成,使軟件從構(gòu)建到測試、發(fā)布更加快 捷、可靠,最終按時交付軟件。
DevOps是一套項目從開發(fā)到運維的解決方案,而不是具體的一個技術(shù),DevOps需要整合一些列的技術(shù)來實現(xiàn),比如:通過Git拉取代碼,通過Mavn的命令進(jìn)行項目的清理,編譯,打包,測試等,通過Docker命令進(jìn)行鏡像構(gòu)建…。
DevOps使用到的技術(shù)如:GitHub、Git/SVN、Docker、Jenkins、 Hudson、Ant/Maven/Gradle(編譯,打包)、Selenium(自動化測試)、QUnit、JMeter(性能測試)等
下面普及2個概念
- CI : Continuous Intergration : 持續(xù)集成 ,持續(xù)交付的核心意義:盡快的將最終的產(chǎn)品發(fā)布到線上環(huán)境,給用戶使用。持續(xù)交付是每個企業(yè)追求的目標(biāo),我們常說的CI/CD里的CD一般指的就是持續(xù)交付
- CD:Continuous Deployment :持續(xù)部署就是在持續(xù)交付的基礎(chǔ)上,將編譯、測試、打包部署到生產(chǎn)環(huán)境的過程做成自動化。
3.什么是敏捷開發(fā)
傳統(tǒng)的瀑布式開發(fā)模型要求一個項目版本的所有功能都開發(fā)完成才會進(jìn)行版本地迭代,這種開發(fā)模式不僅項目版本迭代速度慢,沒法盡早的發(fā)現(xiàn)軟件的質(zhì)量問題,和持續(xù)的項目交付。
而敏捷開發(fā)最重要的目標(biāo)是通過及早和持續(xù)不斷地交付有價值的軟件使客戶滿意;要達(dá)到這一目的就需要更高頻率的版本迭代,包括:編譯,打包,測試,運維。且應(yīng)該自動化的完成,才有可能達(dá)到更快的軟件開發(fā)生命周期。
敏捷與 DevOps 之間的主要區(qū)別在于:敏捷是關(guān)于如何開發(fā)和交付軟件的哲學(xué),而 DevOps 則描述了如何通過使用現(xiàn)代工具和自動化流程來持續(xù)部署代碼。
4.什么是云原生
云原生的定義最早也是由 Pivotal 公司的 Matt Stine 于 2013 年提出的,云原生是基于分布部署和統(tǒng)一運管的分布式云 [1] ,以容器、微服務(wù)、DevOps等技術(shù)為基礎(chǔ)建立的一套云技術(shù)產(chǎn)品體系。 它具有:**DevOps、持續(xù)交付、微服務(wù)、容器、**等特點 。
云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中構(gòu)建和運行可彈性擴展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式 API。這些技術(shù)能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術(shù)使工程師能夠輕松地對系統(tǒng)做出頻繁和可預(yù)測的重大變更。
5.什么是jenkins
Jenkins是一個開源的、可擴展的持續(xù)集成、交付、部署(軟件/代碼的編譯、打包、部署)的基于web界面的平臺。
起源于Hudson(Hudson是商用的),主要用于持續(xù)、自動的構(gòu)建/測試軟件項目、監(jiān)控外部任務(wù)的運行(這個比較抽象,暫且寫上,不做解釋)。
允許持續(xù)集成和持續(xù)交付項目,無論用的是什么平臺,可以處理任何類型的構(gòu)建或持續(xù)集成。
它可以在代碼上傳倉庫(如github,gitee,gitlab)后,在jenkins(一個網(wǎng)站界面)中通過獲取代碼倉庫中最新代碼,進(jìn)行自動化部署,而省去手動打包、上傳服務(wù)器、部署這一系列步驟,非常方便。
Jenkins的特性
- 開源的java語言開發(fā)持續(xù)集成工具,支持CI,CD;
- 易于安裝部署配置:可通過yum安裝,或下載war包以及通過docker容器等快速實現(xiàn)安裝部署,可方便web界面配置管理;
- 消息通知及測試報告:集成RSS/E-mail通過RSS發(fā)布構(gòu)建結(jié)果或當(dāng)構(gòu)建完成時通過e-mail通知,生成JUnit/TestNG測試報告;
- 分布式構(gòu)建:支持Jenkins能夠讓多臺計算機一起構(gòu)建/測試;
- 文件識別:Jenkins能夠跟蹤哪次構(gòu)建生成哪些jar,哪次構(gòu)建使用哪個版本的jar等;
- 豐富的插件支持:支持?jǐn)U展插件,你可以開發(fā)適合自己團隊使用的工具,如git,svn,maven,docker等。
二.Jenkins安裝
1.方案設(shè)計
現(xiàn)在我們已經(jīng)有docker的環(huán)境了,可以用來部署項目,現(xiàn)在我們只需要使用Jenkins實現(xiàn)一鍵部署即可,整體方案如下
- 在和安裝了docker的服務(wù)器上安裝好jenkins
- 程序員把代碼提交到遠(yuǎn)程 git 倉庫,jenkins可以自動從git倉庫拉取代碼到本地
- jenkins安裝好maven和jdk,然后執(zhí)行 package 對代碼進(jìn)行打包如:app.jar
- jenkins執(zhí)行事先準(zhǔn)備好的Dockerfile腳本構(gòu)建docker鏡像
- jenkins執(zhí)行shell腳本,根據(jù)鏡像啟動容器
上面的問題是安裝docker和安裝jenkins的服務(wù)器是同一個服務(wù)器,或者這樣:
- 在服務(wù)器上安裝好jenkins
- 程序員把代碼提交到遠(yuǎn)程 git 倉庫,jenkins可以自動從git倉庫拉取代碼到本地
- jenkins安裝好maven和jdk,然后執(zhí)行 package 對代碼進(jìn)行打包如:app.jar
- jenkins執(zhí)行事先準(zhǔn)備好的Dockerfile腳本構(gòu)建docker鏡像
- jenkins把docker鏡像推送到鏡像倉庫
- 安裝了k8s的服務(wù)器,從docker鏡像倉庫中拉取鏡像然后啟動容器
2.安裝jenkins
準(zhǔn)備jenkins映射的目錄
#創(chuàng)建jenkins文件映射目錄
mkdir /var/jenkins_home
#給目錄設(shè)置權(quán)限
chmod 777 /var/jenkins_home
執(zhí)行下面命令啟動jenkins容器
docker run --privileged -d --name jenkins -p 9999:8080 -p 8888:8888 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker jenkins/jenkins:latest-jdk17
- -d : 后臺運行
- -p 8088:8080 : 將容器的8080端口映射到宿主的8088端口
- -v /var/jenkins_home:/var/jenkins_home : 將容器中/var/jenkins_home的目錄掛載到宿主的/mnt/jenkins_home
- -v $(which docker):/bin/docker : 將宿主的docker目錄映射到容器內(nèi),以便在容器中能使用docker對應(yīng)的命令完成自動化部署
上面的操作已經(jīng)將docker相互映射,但在jenkins容器中直接執(zhí)行docker的命令時,可能會報權(quán)限不足。這個問題是容器中的docker是通過docker.sock的方式與宿主的docker通信的,其對應(yīng)的可執(zhí)行用戶為root。此時我們可以將 /var/run/docker.sock 的權(quán)限放開來解決此問題
chmod 777 /var/run/docker.sock
然后在linux機器的 /usr/local/src/jdk 目錄安裝好JDK, 以及在 /usr/local/src/maven 目錄安裝好maven 請注意版本
3.jenkins初始化
更改jenkins插件下載地址,因為默認(rèn)是去國外網(wǎng)站下載插件比較慢,而且容易下載失敗,我們修改插件下載地址為國內(nèi)地址
cd /var/jenkins_home
vi hudson.model.UpdateCenter.xml
修改地址為下面的地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
然后重啟jenkins : docker restart jenkins
瀏覽器訪問:http://服務(wù)IP:9999/ ,進(jìn)入jenkins初始化頁面
可以通過:docker logs jenkins 來查看密碼 ,輸入密碼后,選擇:安裝推薦的插件
耐心等待安裝完成進(jìn)入下面界面,你可以創(chuàng)建一個新的管理員,或者使用admin賬戶繼續(xù)
后面就一直下一步就可以了,安裝完成后界面如下
4.安裝插件
根據(jù)推薦安裝好插件后,還需安裝一個maven 插件,登錄jenkins,找到插件管理
然后在可用插件一欄中,搜索:Maven Integration 插件進(jìn)行安裝
5.全局工具配置
接下來我們對maven做配置,找到 manager jenkins - tools
進(jìn)去后,找到最下邊的maven ,選擇自動安裝,如下
注意:如果采用jenkins自動安裝方式可能會安裝不上,我們可以自己解壓一個maven到 -v 的目錄中,然后設(shè)置好權(quán)限,比如:我上傳了一個maven到linux中,然后他會自動同步到容器中去
然后設(shè)置權(quán)限
chmod -R 777 /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/apache-maven-3.9.4
然后在全局工具設(shè)置出不要使用自動安裝,而是指向上傳的maven home.
然后保存退出即可
三.構(gòu)建項目
1.項目導(dǎo)入插件
給要部署的項目安裝好打包插件,并指定項目的名字如:
- 打包后項目名為: app.jar
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker的maven插件,官網(wǎng): https://github.com/spotify/docker‐maven‐plugin-->
</plugins>
</build>
同時在項目根目錄準(zhǔn)備一個Dockerfile文件,內(nèi)容如下
- 大概的意思是就是基于Dockerfile把項目打包成docker鏡像,并隨著容器啟動自動啟動項目
FROM meddream/jdk17:latest
VOLUME /tmp
ADD ./target/app.jar /app.jar
ENV TZ=Asia/Shanghai
EXPOSE 10010
#CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
ENTRYPOINT ["java", "-jar ", "/app.jar","--spring.profiles.active=prod"]
2.代碼推送到遠(yuǎn)程
然后需要準(zhǔn)備一個遠(yuǎn)程Git倉庫,企業(yè)內(nèi)部可能會選擇搭建自己的Git私服,我這里就直接使用Gitee,把代碼提送上去,如:
3.構(gòu)建項目
回到j(luò)enkins的最外層 - 點擊 新建 item
選擇構(gòu)建一個自由軟件 - 指定構(gòu)建的項目名 ,拉后確定
進(jìn)去之后,找到 源碼管理 - 指定你的代碼倉庫地址 ,以及添加賬號
填好之后往下滾動,找到構(gòu)建環(huán)境 - 選擇調(diào)用頂層Maven目標(biāo)
然后指定maven版本和目標(biāo): clean install -Dmaven.test.skip=true 該命令是對項目進(jìn)行打包
點擊保存退出,然后點擊立即構(gòu)建 - 查看構(gòu)建日志
日志如下 - jenkins從嘗試安裝maven,然后從git下載代碼后,進(jìn)行 : clean install -Dmaven.test.skip=true 命令執(zhí)行
4.啟動項目容器
啟動項目的原理是通過Dockerfile構(gòu)建項目鏡像,并自動啟動容器 ,因為我們項目和jenkins在同一臺服務(wù)器,所以我們用shell腳本運行項目,原理既是通過dockerfile 打包鏡像,然后docker運行即可。接下來我們,修改jenkins任務(wù)配置 -
shell腳本如下:
- 注意: 這個 install 目錄和構(gòu)建jenins項目時取的名字保持一樣
cd /var/jenkins_home/workspace/gateway/it-drive-service-gateway
docker stop drive-gateway || true
docker rm drive-gateway || true
docker rmi drive-gateway || true
docker build -t drive-gateway .
docker run -id -p 10010:10010 --name drive-gateway drive-gateway:latest
解釋:
- /var/jenkins_home/workspace/gateway/it-drive-service-gateway :是jenkins拉取的代碼目錄
- 當(dāng)執(zhí)行jenins項目構(gòu)建,jenkins會執(zhí)行install把我們的代碼打包為jar
- 然后執(zhí)行上面腳本,腳本通過docker file 來構(gòu)建鏡像并啟動容器
然后執(zhí)行構(gòu)建,效果如下
然后回到docker,執(zhí)行:docker ps 查看容器文章來源:http://www.zghlxwxcb.cn/news/detail-771868.html
為了方便理解,下面整理了一個流程圖文章來源地址http://www.zghlxwxcb.cn/news/detail-771868.html
- 程序員吧IDEA的代碼推送到GIT遠(yuǎn)程倉庫
- Jenkins通過Git客戶端從Git倉庫中拉取最新的代碼
- Jenkins執(zhí)行maven命令打包項目:clean install
- Jenkins執(zhí)行腳本,cd到代碼目錄,執(zhí)行docker build,根據(jù)Dockerfile 構(gòu)建鏡像
- 執(zhí)行腳本 docker run 啟動容器
到了這里,關(guān)于五.docker+jenkins自動部署項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!