先了解一下Jenkins
Jenkins是一個開源的、提供友好操作界面的持續內建(CI)工具,提供了數百個插件來支援建構,部署和自動化任何項目。我們可以使用
Jenkins
結合常用的
版本控制工具(git、svn等)
來實作自動部署項目,比如說我們從本地上傳代碼到Gitlab代碼倉庫,Jenkins就會幫我們自動同步代碼,然後經編譯打包之後推送至遠端Docker倉庫,再之後我們通過伺服器從遠端Docker倉庫拉取鏡像、建立及啟動容器,然後就可以通過浏覽器通路了,整個過程幾乎都是自動完成的,而我們隻需要上傳代碼就可以了,接下來我們一起來看看整個搭建過程吧。
本文環境
Docker Version 19.03.11:https://www.cnblogs.com/niceyoo/p/13096181.html
Maven Version 3.3.9:https://www.cnblogs.com/niceyoo/p/13068935.html
JDK Version 1.8.0_181:https://www.cnblogs.com/niceyoo/p/11483139.html
GitLab:https://www.cnblogs.com/niceyoo/p/13057533.html
Jenkins Version 2.222.4:參考本文
通過本文可以了解哪些
- 通過Docker部署Jenkins
- 使用Jenkins一鍵部署Springboot項目
- 整合GitLab實作上傳代碼自動部署項目
如下Jenkins安裝及配置過程
1、拉取代碼
docker pull jenkins/jenkins:lts
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukDNyQzM3UTMxUDM2ADMyAjMtU2Zh1Wavw1Ztl2LcJXZ0NXYt9CX3Fmcvw1ZvxmYvw1bvlXZjlmbvwVbvNmLlVGdpd2Lc9CX6MHc0RHaiojIsJye.png)
2、建立并啟動容器:
在建構的過程,由于我本身CentOS已經安裝JDK、Maven了「可以參考上方的安裝連結」,是以在這我就直接指定本地環境變量了,當然,如果你不指定的話,安裝完Jenkins後還是可以在
全局工具配置
中修改的:
docker run --name=jenkins --privileged=true \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v $(which docker):/usr/bin/docker \
-v /etc/sysconfig/docker:/etc/sysconfig/docker \
-v /usr/java/jdk1.8.0_181:/usr/java/jdk1.8.0_181 \
-v /home/maven/apache-maven-3.3.9:/usr/local/maven \
-v /home/maven/repo:/usr/local/maven_repository \
-v /home/jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts
啟動後在浏覽器輸入:http://容器ip:8080 通路。
管理者密碼需要我們在
log
中查詢:
docker logs jenkins
3、安裝推薦的插件
輸入密碼登陸後,會彈出插件安裝提示,我們在這選擇安裝推薦的插件:
接下來就進入漫長的等待狀态~
4、建立管理者賬号
安裝之後,接下來建立一個賬号:
進行執行個體位址配置,該位址将作為将來
Jenkins
的通路位址:
至此,儲存并完成,會重新開機
Jenkins
,然後我們可以通過剛剛建立的賬戶登入「使用管理者root也可以」:
5、Maven配置修改
之前我們建立容器時複用了本地主控端的
Maven環境變量
,但是安裝完
Jenkins
後還是要指定一下
Maven
目錄的,依次進入:
系統管理
>
全局工具配置
首先是頂部的
Maven
,我們選擇
檔案系統中的setting
檔案,
檔案路徑
使用建立容器時指定的
Maven
路徑
usr/local/maven
:
/usr/local/maven/conf/settings.xml
然後拉到最下邊
Maven
節點,點選
新增Maven
,起一個名字,然後指定
maven路徑
,去掉
自動安裝
的選項,然後
應用>儲存
6、建立一個任務
然後我們建立一個任務,選擇建構一個
自由風格的軟體項目
點選确定之後會跳入配置界面,接下來就是配置我們的自動化操作,首先是配置項目的拉取位址,在這我是基于Gitlab的,關于Gitlab的搭建可以參考這篇:https://www.cnblogs.com/niceyoo/p/13057533.html
點選添加GitLab的賬戶密碼,不添加時會報紅,是沒法在GitLab中拉取代碼的:
接着我們選擇一下建構指令
執行shell
#!/bin/bash
result=$(docker ps | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result" != "" ]]
then
echo "stop niceyoo-demo"
docker stop niceyoo-demo
fi
result1=$(docker ps -a | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result1" != "" ]]
then
echo "rm niceyoo-demo"
docker rm niceyoo-demo
fi
result2=$(docker images | grep "10.211.55.4:5000/niceyoo-demo")
if [[ "$result2" != "" ]]
then
echo "10.211.55.4:5000/niceyoo-demo:latest"
docker rmi 10.211.55.4:5000/niceyoo-demo:latest
fi
這個地方解釋一下為啥要用到shel腳本,這個腳本有兩個操作,首先是通過
docker ps | grep "10.211.55.4:5000/niceyoo-demo"
查詢是否存在容器,如果存在的話則
stop
停止容器,然後再
rm
删除容器,第二步是通過
docker ps -a | grep "10.211.55.4:5000/niceyoo-demo"
檢視是否存在該鏡像,如果存在則
rmi
删除該鏡像,為啥要删除鏡像+容器?其實這樣是幫助我們把每次自動化建構鏡像、容器之前都把舊的給删除掉。
"10.211.55.4:5000/niceyoo-demo" 是我項目打包後的鏡像名稱,組成規則為:鏡像位址/項目名稱
然後添加Maven指令,用于建構項目,簡單說一下這個地方,我在項目的
pom.xml
,檔案中使用了
docker-maven-plugin
插件,同時替換了
mvn pavkage
指令,當每次執行該指令時就會自動送出至Docker遠端私有倉庫中「如果在本地執行測試的話需要開啟Docker遠端通路前提,具體配置可參考該連結:https://www.cnblogs.com/niceyoo/p/13270224.html」,私有倉庫是基于Docker+Registry搭建的,關于Registry的搭建可以參考這篇:https://www.cnblogs.com/niceyoo/p/13058238.html
clean package
如下是SpringBoot項目
pom.xml
檔案中的插件編寫,已經把注釋寫的很清楚了:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--鏡像名稱-->
<imageName>10.211.55.4:5000/${project.artifactId}</imageName>
<!--指定dockerfile路徑-->
<!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>-->
<!--指定标簽-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--遠端倉庫位址-->
<registryUrl>10.211.55.4:5000</registryUrl>
<pushImage>true</pushImage>
<!--基礎鏡像jdk1.8-->
<baseImage>java</baseImage>
<!--制作者提供本人資訊-->
<maintainer>niceyoo [email protected]</maintainer>
<!--切換到ROOT目錄-->
<workdir>/ROOT</workdir>
<cmd>["java","-version"]</cmd>
<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
<!--指定遠端docker位址-->
<dockerHost>http://10.211.55.4:2375</dockerHost>
<!--這裡是複制jar包到docker容器指定目錄配置-->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<!--指定需要複制的根目錄,${project.build.directory}表示target目錄-->
<directory>${project.build.directory}</directory>
<!--用于指定需要複制的檔案,${project.build.finalName}.jar表示打包後的jar封包件-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!--執行mvn package時,替換為執行mvn package docker:build-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
接下來再添加一個
執行shell
,用來執行建構容器:
docker run --rm -d -p 9999:9999 --name niceyoo-demo 10.211.55.4:5000/niceyoo-demo
部分參數解釋:在這我用的
-p 9999
端口,
--nama
後面指向的是重命名後的容器名稱
niceyoo-demo
+ 鏡像的名稱
10.211.55.4:5000/niceyoo-demo
,接下來就是
應用+儲存
了:
到這,我們就可以運作一下了,點選
立即建構
,然後通過點選
Build History
中的
控制台輸出
等待一會,最後看到下圖所示,
BUILD SUCCESS
就可以了
然後我們在
Registry
私有鏡像倉庫看一下是否推送:
再看看最後一步的shell腳本幫我們建立并啟動容器了沒~
到這我們就可以在浏覽器通路項目了:
7、建立Gitlab鈎子
我們要實作的最終效果是一上傳代碼就幫我們自動執行如上整個過程~,那麼我們需要配合Gitlab的鈎子實作,首先我們先去
系統管理
插件管理
安裝
GitLab
插件。
安裝後我們進入項目配置界面,切換至
建構觸發器
我們複制這個連結,然後進入GitLab項目中的
setting
Webhooks
「注意,這裡是項目中的,非GitLab的setting配置」:
點選
Add webhook
時,如果出現
Url is blocked: Requests to the local network are not allowed
解決方法: 進入GitLab首頁頂部的小扳手
setting
Network
目錄,執行如下4步,不要忘記最後點選
save changes
然後我們再回到之前界面重新添加一下連結,點選
Add webhook
配置之後測試一下:
如果上方提示200代表配置成功:
然後我們回到Jenkins項目面闆就可以看到自動建構了:
到這基本就完成自動化建立了,隻要上傳代碼就能完成建構了,比如我們通過Idea上傳代碼至GitLab,那麼Jenkins就會幫我們實作自動化部署了:
上傳完代碼後Jenkins自動建構的截圖:
可能會出現的問題 - 僅針對本文
1、/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker
/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker
出現這個問題說明建立的Jenkins是無法使用主控端裡的docker指令的,我們可以進入jenkins容器執行
docker version
,正常情況是可以列印資訊的,而不正常則如上方錯誤提示。
這個問題可以通過挂載
-v /etc/sysconfig/docker:/etc/sysconfig/docker
完成,再回到第2步看看是不是漏掉了。
2、You don't have either docker-client
You don't have either docker-client or docker-client-latest installed. Please install either one and retry.
這個問題我曾嘗試使用 yum 安裝最新的 docker-client,最後放棄了,然後就在糾結為何别人沒出現這個問題,後來幾經測試,果斷解除安裝重裝!
猜測之前使用 yum 預設安裝的 docker 實在是太老了, 預設安裝的是1.13.x版本,而現在最新版本都 19.x 了...
解除安裝重裝最新版是不會把之前下載下傳的鏡像删掉的,前提是不要完全删除幹淨哈,我測試過了,咳咳.....
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
安裝最新Docker可以參考這篇:https://www.cnblogs.com/niceyoo/p/13096181.html
然後再重新拉取Jenkins,重新建立一下容器。
推薦閱讀
CentOS中安裝Docker步驟
基于Docker搭建私有鏡像倉庫
基于Docker搭建Gitlab代碼存儲