先了解一下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

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 apkdream@163.com</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,重新創建一下容器。

推薦閱讀
