天天看點

Jenkins 自動化部署執行個體講解

前言

你平常在做自己的項目時,是否有過部署項目太麻煩的想法?如果你是單體項目,可能沒什麼感觸,但如果你是微服務項目,相信你應該是有過這種感觸的。

這種情況下,我一般會勸你了解一下 Jenkins 這個玩意。怎麼了解呢?我會建議你閱讀本文 。

本文分為兩部分:

  • 第一部分為 Jenkins 安裝教程,會教你如何在 Linux 上安裝 Jenkins。
  • 第二部分為一個簡單的 Jenkins 自動化建構部署執行個體講解。

你可以根據自己的意願,選擇性的跳過第一部分,因為第二部分才是重點。(通過目錄可以快速翻到第二部分)

Jenkins 安裝

目前環境

  • CentOS 7.8
  • Java 11(注意目前 jenkins 支援的 Java 版本最低為 Java11)
  • FinalShell 3.9(操作環境)

安裝 Jenkins

PS:不建議使用 Docker 安裝 Jenkins,因為使用 Jenkins 的時候一般會調用外部程式,比如 Maven、Docker、JDK、Nodejs 等,是以我們最好直接安裝在本機上,以避免不必要的麻煩。

1. 添加 Jenkins 源

執行下面兩條指令:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

Jenkins 自動化部署執行個體講解

2. 通過 yum 安裝 Jenkins

  • yum -y install jenkins
Jenkins 自動化部署執行個體講解
Jenkins 自動化部署執行個體講解

3. 修改 Jenkins 端口号

  1. Jenkins 預設端口号為 8080,輸入vim /etc/sysconfig/jenkins進行編輯,将 JENKINS_PORT 修改為自己想要的端口号,前提得保證修改後的這個端口沒有被其他的程序占用。
Jenkins 自動化部署執行個體講解
  1. 這裡修改了可能還不能生效,還需要修改另一個地方,輸入以下指令進行編輯
vim /usr/lib/systemd/system/jenkins.service
           
# 找到下面的文字
Environment="JENKINS_PORT=8080" # 修改為自己想要的端口号
# :wq退出
           
Jenkins 自動化部署執行個體講解
  1. 修改完成後,重新加載配置檔案,随後再重新開機 Jenkins,此時的啟動端口應該已經變成你修改的端口号了。
# 重新加載配置檔案
systemctl daemon-reload
# 重新開機jenkins
systemctl restart jenkins
           

啟動 Jenkins

Jenkins 可以單獨指定 Java 路徑,在/etc/init.d/jenkins檔案内大概一百行左右的位置,在最上面加上你的 java 路徑即可:
Jenkins 自動化部署執行個體講解

PS:目前 Jenkins 支援的最低 Java 版本為 11,如果機器上隻有 Java8 的朋友需要先安裝 Java11 或以上版本。Linux 下多版本 Java 建議通過系統自帶的 alternatives 來管理,參考這篇文章外加自己琢磨搞定:

linux alternatives 指令詳解:

https://www.cnblogs.com/lpfuture/p/4638425.html

  1. 輸入service jenkins start,會彈出提示:Starting jenkins (via systemctl):,意思是正在啟動,第一次啟動比較耗時,此時耐心等待。如果提示逾時失敗,沒關系,jenkins 仍然在啟動,隻是第一次啟動比較耗時。如果提示内容不是逾時失敗,那大機率是你的 Java 沒安裝好或者版本不對。
  2. 放行剛剛配置的端口
# 放行15369端口
firewall-cmd --zone=public --add-port=15369/tcp --permanent
# 重新加載防火牆
firewall-cmd --reload
# 檢視是否已經開啟
firewall-cmd --list-ports
           

如果你是在阿裡雲騰訊雲等類似伺服器上的話,那你還需要去控制台防火牆或者安全組開放這個端口,像這樣:

Jenkins 自動化部署執行個體講解

開放端口時記得設定授權 ip,建議你直接給自家 ip 位址授權全部端口号。

  1. 在浏覽器輸入 ip+port,可以進入到 Jenkins 的初始化界面,第一次啟動要等的比較久:
進入這個界面,說明你的 Jenkins 已經在啟動中了。
Jenkins 自動化部署執行個體講解

初始化配置 Jenkins

  1. 系統啟動完畢後,系統會提示你檢視并輸入管理者密碼,根據中顯示的密碼位置,打開該檔案并将密碼複制粘貼即可:
# 在伺服器檢視密碼檔案
cat /var/lib/jenkins/secrets/initialAdminPassword
           
Jenkins 自動化部署執行個體講解
  1. 密碼輸入成功後,進入插件安裝界面,如果你是新手,直接使用推薦安裝的插件即可:
Jenkins 自動化部署執行個體講解
  1. 系統開始安裝插件,需要等待系統安裝完畢,這一步可能要比較久,耐心等待:
Jenkins 自動化部署執行個體講解

安裝過程中可能會出現部分插件安裝失敗的情況,沒關系,全部處理完畢後可以選擇重試。

  1. 安裝完畢後,系統會提示你建立第一個管理者賬戶:
Jenkins 自動化部署執行個體講解
  1. 配置 Jenkins 通路位址,便于一些插件使用,一般會有預設值:
Jenkins 自動化部署執行個體講解
  1. 配置完成,點選開始使用 Jenkins:
Jenkins 自動化部署執行個體講解

随後就進入到 Jenkins 的管理界面了,不同版本的 Jenkins 界面可能會不一樣:

Jenkins 自動化部署執行個體講解

至此,Jenkins 安裝完畢。

擴充

如果你是使用 Jenkins 來對 Java 服務做持續內建的話,那麼你還需要安裝下面的插件:

  • Maven Integration:Maven 內建管理插件。
  • Docker plugin:Docker 內建插件。
  • Publish Over SSH:遠端檔案釋出插件。
  • SSH: 遠端腳本執行插件。
  • GitLab:拉取遠端倉庫代碼插件。

安裝插件在系統管理 -> 插件管理裡面

執行個體講解

接下來,我會拿出我的使用者微服務建構任務的實際配置來向你進行解讀,當你了解了 Jenkins 自動化建構部署的工作原理後,你便可以很快的上手這個玩意,因為你會發現它是如此的簡單。

基本環境

在此之前,我需要介紹一下我的基本環境:

  • 我的操作環境為 Windows,但是我要把微服務部署到一台 Linux 伺服器上去,包括 Jenkins 也是安裝在這個上面的。
  • 伺服器上安裝了 Jenkins、Git、Docker、JDK、Maven、NodeJs,都是些拿來建構的東西,都是單獨安裝的,而不是跑在 Docker 上。
  • 而項目服務都是跑在 Docker 上的,還有 Redis 這種輕量的中間件也跑在 Docker 上。
  • 我的項目已經在 Git 倉庫裡放好了,放 github 或者 gitee 或者 gitlab 都行。

全局工具配置

在 Jenkins 上,我已經配置好了這些建構工具的路徑,以便于 Jenkins 可以直接調用到他們,在系統管理 -> 全局工具配置 這個頁面下,這張圖有點長:

Jenkins 自動化部署執行個體講解

在這張圖上,你可以看到其中有一部分的配置是有路徑的,還有一部配置設定置是沒有路徑的,這是因為我把他們的指令路徑加到了系統路徑上,即使不添加完整路徑,Jenkins 也可以調用到它們。

建立任務

好,現在我們已經準備好環境了,可以建立一個任務來試試水了,輸入任務名稱,然後選擇建構一個自由風格的軟體項目:

Jenkins 自動化部署執行個體講解

别問我在哪建立任務,請你傳回首頁好好看看:

Jenkins 自動化部署執行個體講解

任務配置

源碼管理

現在我們已經進入到任務配置界面了,往下劃到源碼管理的地方,選擇 Git,然後填寫倉庫位址等資訊:

Jenkins 自動化部署執行個體講解

添加 Credentials 的時候,如果你會使用 SSH 密鑰的話,建議還是用這個,但你得在機器上進行格外的配置,這裡我就不多說了,不會的話直接用賬号密碼也是可以的:

Jenkins 自動化部署執行個體講解

建構步驟(Build Steps)

第一步:調用 Maven

點選增加建構步驟,由于我們是 Maven 管理的項目,需要先使用 Maven 建構,是以第一步就用調用頂層Maven目标:

Jenkins 自動化部署執行個體講解

選擇 maven 版本,然後 target 根據項目的實際情況編寫,我的指令是這樣的:

  1. 先建構 jar 包,執行 install 的過程中會先執行 package 的,是以我直接 install。我的項目中單元測試是沒怎麼梳理的,是以我使用參數-Dmaven.test.skip=true跳過單元測試。
  2. 然後我得打包成 docker 鏡像,我使用的是dockerfile-maven-plugin這個 Maven 插件,是以打包 docker 鏡像的步驟就也放在 maven 裡面了,建構 docker 鏡像的資訊都在項目的 pom 檔案裡面。
install -Dmaven.test.skip=true
dockerfile:build -f user-service/user-server/pom.xml

           

建構完鏡像了,接下來我們直接使用這個鏡像建立容器然後運作就完事了。

第二步:執行 shell 啟動容器

再添加一個建構步驟,正常情況下我們調用 docker 通過指令行調用就可以了,是以我們現在也添加一個執行shell的步驟即可。

Jenkins 自動化部署執行個體講解

具體的指令也很簡單,就這麼幾步:

  1. 清理之前的舊鏡像。由于我們剛剛建構了一個新的鏡像,新鏡像和舊鏡像的名稱和版本我們是沒有改的,是以舊的鏡像就會自動變成<none>,使用指令docker image prune -f 就可以清理掉這部分鏡像。
  2. 停止舊容器運作并删除舊容器。當然我們得先判斷一下是否存在舊容器,使用容器名稱來進行判斷,這部分指令涉及到shell和docker的指令知識,看不懂沒關系,可以直接 cv,注意修改容器名稱就好。
  3. 調用 docker 啟動容器,根據項目實際情況來設定不同的參數,我這裡設定了網絡模式為 host,并且映射了一個容器卷,用于讀取 nacos 的位址,再指定容器名稱為user-service,最後指定使用的鏡像名稱。

大功告成!具體指令如下:

# 清理鏡像
docker image prune -f

# 清理容器
if [ -n  "$(docker ps -a -f  name=user-service  --format '{{.ID}}' )" ] then
 #停止容器運作
 docker stop $(docker ps -a -f  name=user-service  --format '{{.ID}}' )
 #删除之前的容器
 docker rm $(docker ps -a -f  name=user-service  --format '{{.ID}}' )
fi

# 啟動容器
docker run -d  --net=host  -v scblogs-config:/config -e PARAMS="$params"  --name  user-service  scblogs/user-server

           

最後别忘了點選儲存!

後記

經過上面這些步驟,我不僅安裝好了 Jenkins,還完成了一個基本的自動化建構腳本,這個腳本會調用 maven 把我的項目打包,然後建構成一個 docker 鏡像,再通過一段 shell 指令去啟動這個程式。

如果你想嘗試啟動這個建構任務的話,你可以回到首頁點選右邊的綠色符号。

Jenkins 自動化部署執行個體講解

當然,你大機率是會建構失敗的 。因為我的這份執行個體講解并沒有完全的講清楚,甚至裡面有很多步驟你都看不懂,是不是?

其實我并沒有想寫一份手把手的 Jenkins 使用教程,因為這要寫的内容實在是太多了,我甚至可以是以寫一本小冊了!

還記得我在執行個體講解的最開始寫的嗎?寫這個建構案例的目的是讓你了解 Jenkins 自動化建構的原理,如果你看到這裡已經發現了,這自動化建構,其實就跟我們手動建構部署差不多!隻不過是把手動操作的東西設定成了腳本,那你就已經有能力去自己摸索它了。

用用插件、寫寫腳本,就可以搞定自己項目的自動化部署啦。

實際情況是,我有一台伺服器專門用于 Jenkins 自動化部署,還有一台伺服器專門用于生産環境,這兩台伺服器都可以連接配接到外網,也可以互相通路到彼此。這是由于 Jenkins 建構時是會比較吃 CPU 的,為了不影響生産環境,是以我把它們分開了。當然,這種情況下,腳本也會稍微複雜一點,具體流程大概是下面這樣的:

Jenkins 自動化部署執行個體講解

原文連結:https://juejin.cn/post/7204774274979659832

繼續閱讀