手把手教你使用 Jenkins+Docker 實現持續集成

作者:樂之終曲
來源:https://blog.csdn.net/qq_37143673/

對於 Jenkins 我只能用兩個字形容,難用。就不過多吐槽了,本篇是基於 docker 環境的使用。

1.安裝

尋找需要的 Jenkins 鏡像:

https://hub.docker.com/r/jenkinsci/blueocean

docker pull jenkinsci/blueocean

我選擇的鏡像是 Jenkins-blueocean Jenkins 海洋版,為什麼選這個?

  • 踩坑:普通的 Jenkins 在部署的時候不少人都遇到過,插件下不下來,但是在海洋版沒有這個問題(最主要原因)
  • blueocean 的頁面更加人性化,流程的監控上看著讓人舒服的多,當然普通 Jenkins 也可以通過安裝插件添加這個功能

啟動鏡像

docker run 
--name jenkinsci-blueocean -u root
--rm -d -p 7005:8080 -p 50000:50000
-v /data/jenkins:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
  • -u root:以 root 權限啟動,防止出現權限問題
  • -p 7005:8080:端口映射,服務器的 7005 端口映射容器的 8080 端口
  • -p 50000:50000:Jenkins代理默認通過TCP端口50000與Jenkins主機通信
  • -v /data/jenkins:/var/jenkins_home:把容器內的 Jenkins 目錄掛載到服務器的 /data/jenkins 目錄以防容器沒了,數據也沒了
  • -v /var/run/docker.sock:/var/run/docker.sock:保證容器內的 docker 與 服務器上 docker 的通訊

附帶下刪除 jenkinsci/blueocean 容器

# 刪除對應綁定網橋
docker network disconnect --force bridge jenkinsci-blueocean
# 刪除 jenkinsci-blueocean 容器,xxxx 容器 ID
docker rm -f xxxx

輸入密碼進入

手把手教你使用 Jenkins+Docker 實現持續集成

由於我們掛載映射到服務器,所以可以直接通過服務器路徑找密碼

cat /data/jenkins/secrets/initialAdminPassword

或者直接通過容器日誌可以看到密碼:docker logs xxxx(容器 ID)

手把手教你使用 Jenkins+Docker 實現持續集成

接下來,我選擇推薦插件安裝

手把手教你使用 Jenkins+Docker 實現持續集成

創建第一個賬號,我用的 root 123456

手把手教你使用 Jenkins+Docker 實現持續集成

然後完成安裝,由於是用的是鏡像,所以安裝起來非常的簡單,海洋版也沒有出現插件無法下載的問題

2.創建項目與持續集成

踩坑PS:為什麼說難用,就是在這。一開始我是把 jdk 和 maven 也掛載到容器裡的,但是配置完全局變量後,根本無法使用,可能是容器內也要配置好這些才行,我就搞不懂容器內配了那還要專門配個全局環境變量幹啥。。。自動安裝也是完全沒用,所以我放棄了,用我自己的方法進行持續集成部署。

接下來配置項目,選擇流水線

手把手教你使用 Jenkins+Docker 實現持續集成

配置

這裡我們通過 webhook,讓項目提交後,自動調用鉤子函數進行部署,進行持續集成

配置構建觸發器,也就是鉤子函數

手把手教你使用 Jenkins+Docker 實現持續集成

身份驗證令牌自己寫的,所以這裡鉤子函數的路徑就是

http://127.0.0.1:7005/job/spring-cloud/build?token=123456

PS:身份驗證令牌框下面就是鉤子函數的請求路徑說明,不太明白的,可以自己看看,我上面給的這個是示例

配置項目

手把手教你使用 Jenkins+Docker 實現持續集成

手把手教你使用 Jenkins+Docker 實現持續集成

公私密鑰的可參考:

https://blog.csdn.net/weixin_41235146/article/details/81780894

然後保存,這裡暫時就配好了

root 創建 API token

手把手教你使用 Jenkins+Docker 實現持續集成

手把手教你使用 Jenkins+Docker 實現持續集成

手把手教你使用 Jenkins+Docker 實現持續集成

記住這串 token,後面要和鉤子函數一起使用,離開這個頁面後再進入就看不到這串 token 了

系統管理 => 全局安全配置

手把手教你使用 Jenkins+Docker 實現持續集成

PS踩坑:這裡不配置的話,後面鉤子函數的請求都會 403 失敗

接下來配置鉤子函數的請求了,這裡以 gitee 為例

進入項目 => 管理 => WebHook

手把手教你使用 Jenkins+Docker 實現持續集成

請求歷史可以看到請求成功 201

手把手教你使用 Jenkins+Docker 實現持續集成

先說下本人用於測試的這個項目是父子項目,打包時候把每個子項目打成 jar 包,然後通過 Dockerfile 生產 docker 鏡像,然後啟動鏡像生成容器,這就是我的部署流程

項目根目錄下新增 Jenkinsfile

PS踩坑:由於 maven 配置不成功,我也不想進容器配置 maven,因為服務器才 1G ,進容器就死機了,所以我改了依賴 maven 鏡像部署,然後再通過另一個任務把 jar 包生成鏡像,因為 maven 容器裡沒有 docker 環境

手把手教你使用 Jenkins+Docker 實現持續集成

先 pull 個 maven 鏡像,以及在構建鏡像時候所需要的 jdk8 的鏡像

# maven 用於 Jenkins 構建有 maven 環境的容器
docker pull maven
# jdk8 的鏡像用於 Dockerfile 中設置構建擁有 jdk8 環境鏡像的基礎鏡像
docker pull kdvolder/jdk8
  • image 'docker.io/maven':基於這個鏡像生成容器部署,所以環境有 maven 環境
  • args 中 -v /root/.m2:/root/.m2:把依賴掛載導服務器上,不用每次打包都下依賴
  • PS:首先,你要知道這個流程是如何進行的,在你根據下的那個 maven 鏡像去打包時,由於內外 docker 建立了通訊,所有服務器的 docker 就會生成一個你 maven 的容器,而你的命令都會在這個容器裡進行,所以這裡掛載就能直接把 maven 這個臨時容器裡的依賴掛載到服務器上,打包的過程中,你用 docker ps 是可以看到這個 maven 容器的
  • args 中 -v /data/maven/apache-maven-3.6.0/conf/settings.xml:/root/.m2/settings.xml:阿里環境配置掛進去
  • PS踩坑:這裡注意,掛載進去的 settings.xml 文件必須放在 .m2 文件夾下,不是放在 maven 的 conf 下面,那樣不會生效
  • --entrypoint=:配置下好像就不會打開進入容器了,沒深入研究
  • ${env.WORKSPACE}:工作空間路徑
  • ${env.NODE_NAME}:進行的分支

Jenkins 內置環境變量可參考:

https://www.cnblogs.com/puresoul/p/4828913.htm

可以看到,我這部署先判度為 master 分支的情況下,package 任務中調用腳本進行打包,build 任務下調用腳本部署

下面貼下這兩個腳本,大夥可以參考下

package-prod.sh

#!/bin/sh
#進入文件根目錄
#cd "$WORKSPACE"
#項目打包
mvn clean install package '-Dmaven.test.skip=true'

build-prod.sh

手把手教你使用 Jenkins+Docker 實現持續集成

我寫配置喜歡統一性配置,後面改起來簡單,上面參數換下下面都不需要改,這裡我的文件夾名,鏡像名和生產的 jar 名都用一樣的也是這個目的

手把手教你使用 Jenkins+Docker 實現持續集成

打包成功,這畫面看的好看不少


分享到:


相關文章: