Docker+Jenkins+Gitee自動化部署maven項(xiàng)目的實(shí)現(xiàn)
1.簡介
各位看官老爺,本文為Jenkins實(shí)戰(zhàn),注重實(shí)際過程,閱讀完會有以下收獲:
- 了解如何使用Docker安裝Jenkins
- 了解如何使用Jenkins部署maven項(xiàng)目
- 了解如何使用Jenkins+Gitee實(shí)現(xiàn)自動化部署
2.Jenkins介紹
相信,正在讀這篇文章的你,對Jenkins應(yīng)該有或多或少的了解,就算沒有也應(yīng)該在某個地方聽說過。??
接下來,我們就一起來進(jìn)行探索吧。??
2.1 Jenkins是什么
Jenkins是一個開源的自動化工具,可以自動化地完成構(gòu)建、測試、交付或部署等任務(wù)??傊攸c(diǎn)就是三個字:自動化
,至于如何實(shí)現(xiàn)這些功能,Jenkins基于插件化的機(jī)制,提供了眾多的插件來完成持續(xù)集成與持續(xù)部署。
2.2 什么是持續(xù)集成與持續(xù)部署
在軟件開發(fā)中經(jīng)常會提到持續(xù)集成(Continuous Integration)和持續(xù)部署(Continuous Delivery),那么它們的真正意思是什么呢?
- 『持續(xù)集成』:當(dāng)我們向代碼倉庫提交代碼后,可以對變更進(jìn)行監(jiān)測,進(jìn)而實(shí)現(xiàn)自動拉取代碼、構(gòu)建、測試等操作。試想一下,如果這些操作都手動進(jìn)行,效率是非常低的,因而提出了持續(xù)集成。
- 『持續(xù)部署』:持續(xù)集成幫助我們實(shí)現(xiàn)了對項(xiàng)目的自動化構(gòu)建、測試等工作,我們知道,項(xiàng)目最終需要部署到服務(wù)器上,在不借助Jenkins的情況下,需要我們手動將項(xiàng)目部署到服務(wù)器上,如果項(xiàng)目數(shù)量多,就會容易出現(xiàn)錯誤且效率低,而且特別麻煩,因而提出了持續(xù)部署,來實(shí)現(xiàn)對項(xiàng)目的自動化部署。
同樣滴,Jenkins借助插件,例如Maven、Git、Pipeline、SSH等來實(shí)現(xiàn)這一系列的功能。
3.Docker安裝Jenkins
系統(tǒng)環(huán)境:ubuntu20.04 + Docker20.10.8
3.1 拉取鏡像
docker pull jenkins/jenkins:lts
3.2 啟動容器
docker run -d --restart=always --name jenkins -uroot -p 8080:8080 -p 50000:50000 -v /home/docker/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts
說明:這里我們掛載了宿主機(jī)的/var/run/docker.sock
以及/usr/bin/docker
,是因?yàn)?,我們后續(xù)需要在容器內(nèi)執(zhí)行docker相關(guān)命令。
3.3 Jenkins初體驗(yàn)
訪問http://192.168.110.101:8080
,會出現(xiàn)如下界面:
提示我們可以去容器的/var/jenkins_home/secrets/initialAdminPassword
中查看登錄密碼,我們一開始已經(jīng)將/var/jenkins_home
掛載到宿主機(jī)的/home/docker/jenkins
,因此我們直接去宿主機(jī)的對應(yīng)目錄進(jìn)行查看。
# 查看初始化登錄密碼 cat /home/docker/jenkins/secrets/initialAdminPassword
然后將密碼復(fù)制粘貼到輸入框,會進(jìn)入如下界面:
不得不說,這里Jenkins的選項(xiàng)對于新手小白還是挺友好的,我們選擇安裝推薦的插件,至于后面我們所要用到的功能,再去插件市場按需安裝即可。
可以看到,Jenkins為我們安裝了Git、Pipeline等常用插件,因?yàn)镴enkins默認(rèn)使用的是國外的安裝源,咱們耐心等待一下。??
經(jīng)歷過漫長的等待,終于,終于,這個步驟是走完了,但還是有些插件下載失敗了,后續(xù)我們再手動安裝吧。不得不說,這下載速度著實(shí)有點(diǎn)慢?。。?!
這里我們就不創(chuàng)建新用戶了,使用admin賬戶繼續(xù)。
點(diǎn)擊保存并完成。提示部分插件需要重啟才會生效。
終于,它來了。小伙伴們上號?。。?/p>
主界面如下:
這里我們先修改一下admin賬戶的登錄密碼,否則只能使用安裝時提到的初始化密碼。當(dāng)然,如果你在前面的步驟中創(chuàng)建了新的管理員用戶,就可以忽略該步驟。
4.Jenkins插件安裝、環(huán)境配置
4.1 插件安裝
我們這里是部署一個maven的單模塊項(xiàng)目,同時需要用到Gitee的WebHook,因此需要下載Maven、Gitee相關(guān)的插件,所以在Jenkins首頁選擇系統(tǒng)管理—》插件管理,搜索進(jìn)行下載即可。
下載完成后,點(diǎn)擊返回首頁。
4.2 配置maven
在Jenkins首頁點(diǎn)擊系統(tǒng)管理—》全局工具配置。在這里我們可以對Maven、JDK等要使用的環(huán)境進(jìn)行配置。我這里只對Maven進(jìn)行了配置,JDK無需配置,因?yàn)槲覀兒罄m(xù)在將項(xiàng)目打包成Docker鏡像時,會將JRE運(yùn)行環(huán)境一起打包。
在Maven配置這里,使用默認(rèn)Maven配置即可。由于我們的Jenkins運(yùn)行在Docker之中,因此需要在容器中安裝Maven,這里我們選擇自動安裝(會安裝到/var/jenkins_home/tools
目錄下),也可以自行下載,然后將文件放在該目錄下即可。
4.3 添加憑據(jù)
由于需要使用Git從Gitee倉庫拉取代碼,我們這里添加一個Gitee的SSH key。Jenkins首頁—》系統(tǒng)管理—》Credentials,這里應(yīng)該是Jenkins的漢化插件沒有漢化完全,不過無傷大雅。
1)添加憑據(jù)頁面
2)創(chuàng)建SSH key
Gitee官方提供了添加生成SSH key的方法:https://gitee.com/help/articles/4181,總結(jié)命令如下:
# 生成密鑰,一直按回車即可。 ssh-keygen -t ed25519 -C "jenkins@example.com" # 查看公鑰 cat ~/.ssh/id_ed25519.pub # 將host添加到SSH信任列表 ssh -T git@gitee.com
接下來我們就進(jìn)入Jenkins容器,執(zhí)行這些命令。
docker exec -it jenkins bash
3)Gitee設(shè)置中添加SSH key
這時候我們再回過頭來,將私鑰添加到憑據(jù)中,一個憑據(jù)就添加好了。
5.Jenkins自動化部署Maven單模塊項(xiàng)目
5.1 準(zhǔn)備Maven項(xiàng)目
準(zhǔn)備一個Maven項(xiàng)目,我這里是一個簡單的基于SpringBoot的Web項(xiàng)目。項(xiàng)目結(jié)構(gòu)如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.stone</groupId> <artifactId>jenkins-test</artifactId> <version>1.0.0-SNAPSHOT</version> <description>Jenkins-test</description> <properties> <java.version>11</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--開啟分層構(gòu)建--> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build> </project>
Dockerfile
# 指定基礎(chǔ)鏡像,這是分階段構(gòu)建的前期階段 FROM openjdk:11-jre as builder # 執(zhí)行工作目錄 WORKDIR apps # 配置參數(shù) ARG JAR_FILE=target/*.jar # 將編譯構(gòu)建得到的jar文件復(fù)制到鏡像空間中 COPY ${JAR_FILE} application.jar # 通過工具spring-boot-jarmode-layertools從application.jar中提取拆分后的構(gòu)建結(jié)果 RUN java -Djarmode=layertools -jar application.jar extract # 正式構(gòu)建鏡像 FROM openjdk:11-jre RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone WORKDIR apps # 前一階段從jar中提取除了多個文件,這里分別執(zhí)行COPY命令復(fù)制到鏡像空間中,每次COPY都是一個layer COPY --from=builder apps/dependencies/ ./ COPY --from=builder apps/spring-boot-loader/ ./ COPY --from=builder apps/snapshot-dependencies/ ./ COPY --from=builder apps/application/ ./ ENTRYPOINT java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher
5.2 準(zhǔn)備外網(wǎng)映射
由于我這里是在虛擬機(jī)上搭建的環(huán)境,為了能夠在更新倉庫代碼時通過WebHook觸發(fā)自動構(gòu)建,需要進(jìn)行外網(wǎng)映射,使用云服務(wù)器的小伙伴可以忽略此步驟。
由于只需要達(dá)到演示的效果,我這里使用的是免費(fèi)的ngrok。下載地址:https://ngrok.com/download
# 安裝snapd,才能使用snap安裝ngrok apt install -y snapd # 安裝ngrok snap install ngrok
如下圖所示,表示已經(jīng)安裝成功。
這里需要注冊一個ngrok的賬號,才能獲得authtoken。我這里已經(jīng)注冊好了,直接執(zhí)行ngrok config add-authtoken xxx就行
# xxx為對應(yīng)的token ngrok config add-authtoken xxx
現(xiàn)在我們將虛擬機(jī)服務(wù)器的8080端口映射出去。出現(xiàn)如下界面就表示映射成功。
ngrok http 8080
5.3 Jenkins任務(wù)配置
1)新建任務(wù)
Jenkins首頁點(diǎn)擊新建任務(wù),選擇構(gòu)建一個maven項(xiàng)目。
2)Git配置
3)Gitee的webhook配置
我這兒勾選的是當(dāng)倉庫有推送代碼事件時觸發(fā)自動構(gòu)建。
配置WebHook密碼。
Gitee中添加WebHook。
4)編譯、打包
5)編譯、打包后執(zhí)行后置腳本
我這兒準(zhǔn)備了一個deploy.sh
,并放在容器的/var/jenkins_home/sh
目錄下
deploy.sh
#!/bin/bash # 服務(wù)名稱 SERVER_NAME=$1 # 鏡像tag IMAGE_TAG=$2 # 鏡像名稱 IMAGE_NAME=$SERVER_NAME:$IMAGE_TAG echo "------ 開始構(gòu)建鏡像:${SERVER_NAME} ------" docker build -t ${IMAGE_NAME} . echo "------ 鏡像構(gòu)建結(jié)束:${IMAGE_NAME} ------" if [[ -n $(docker ps -q -f "name=^${SERVER_NAME}$") ]];then echo "------ 容器正在運(yùn)行:${SERVER_NAME} ------" echo "------ 停止容器:$SERVER_NAME ------" docker stop $SERVER_NAME echo "------ 刪除容器:$SERVER_NAME ------" docker rm $SERVER_NAME else echo "------ 容器未在運(yùn)行:${SERVER_NAME} ------" echo "------ 刪除容器:$SERVER_NAME ------" docker rm $SERVER_NAME fi echo "------ 開始運(yùn)行容器:$SERVER_NAME ------" docker run -d --name $SERVER_NAME -p 9090:9090 ${IMAGE_NAME} echo "------ 清理虛懸鏡像 ------" if [[ -n $(docker images | grep "none" | awk '{print $3}') ]];then docker rmi -f $(docker images | grep "none" | awk '{print $3}') fi
5.4 手動部署
1)點(diǎn)擊立即構(gòu)建
2)查看日志
拉取代碼。
編譯、打包。
構(gòu)建鏡像、運(yùn)行容器。
查看運(yùn)行中的容器,jenkins-maven已成功運(yùn)行。
5.5 自動部署
查看日志,拉取到最新的commit信息。
到此這篇關(guān)于Docker+Jenkins+Gitee自動化部署maven項(xiàng)目的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Docker Jenkins Gitee maven內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS修改docker鏡像存儲位置并進(jìn)行數(shù)據(jù)遷移的操作方法
本文詳細(xì)介紹了在CentOS上修改Docker鏡像存儲位置并進(jìn)行數(shù)據(jù)遷移的步驟,包括停止Docker服務(wù)、創(chuàng)建新的存儲目錄、復(fù)制現(xiàn)有數(shù)據(jù)、修改Docker配置、重啟Docker服務(wù)、驗(yàn)證配置、清理舊數(shù)據(jù)(可選)以及檢查容器和鏡像,感興趣的朋友一起看看吧2025-01-01docker-compose網(wǎng)絡(luò)配置-?IP?主機(jī)名?hosts配置方式
這篇文章主要介紹了docker-compose網(wǎng)絡(luò)配置-?IP?主機(jī)名?hosts配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01docker 查看進(jìn)程, 內(nèi)存, cup消耗的情況
這篇文章主要介紹了docker 查看進(jìn)程, 內(nèi)存, cup消耗的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03docker compose入門helloworld的詳細(xì)過程
docker-compose是基于docker的,所以我們需要先安裝docker才能使用docker-compose,接下來通過本文給大家介紹docker compose入門helloworld的過程,一起看看吧2021-09-09docker覆蓋鏡像默認(rèn)命令之docker?entrypoint詳解
entrypoint命令就是覆蓋ENTRYPOINT命令的,本文給大家介紹了docker覆蓋鏡像默認(rèn)命令之docker?entrypoint的相關(guān)知識,需要的朋友可以參考下2023-10-10如何通過Dockerfile 創(chuàng)建 kali-novnc
這篇文章主要介紹了如何通過Dockerfile 創(chuàng)建 kali-novnc,在Dockerfile所在目錄運(yùn)行相關(guān)命令操作即可完成,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04Docker 容器互聯(lián)互通的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker 容器互聯(lián)互通,本文講解不同網(wǎng)絡(luò)下的容器可以通過加入同一個docker網(wǎng)絡(luò),來訪問該docker網(wǎng)絡(luò)下的容器,并且既可以通過容器ip也可以通過容器名連接,非常方便,需要的朋友可以參考下2022-10-10深入了解docker(docker鏡像、容器、倉庫的基本概念)
本文重點(diǎn)給大家介紹docker鏡像、容器、倉庫的基本概念,感興趣的朋友跟著小編一起學(xué)習(xí)吧2016-10-10