Jenkins 自動化部署實例講解,另附安裝教程!

前言

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

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

本文分爲兩部分:

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


Jenkins 安裝

當前環境

安裝 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

2. 通過 yum 安裝 Jenkins

3. 修改 Jenkins 端口號

  1. Jenkins 默認端口號爲 8080,輸入vim /etc/sysconfig/jenkins進行編輯,將 JENKINS_PORT 修改爲自己想要的端口號,前提得保證修改後的這個端口沒有被其他的進程佔用。

  1. 這裏修改了可能還不能生效,還需要修改另一個地方,輸入以下指令進行編輯
vim /usr/lib/systemd/system/jenkins.service
# 找到下面的文字
Environment="JENKINS_PORT=8080" # 修改爲自己想要的端口號
# :wq退出

  1. 修改完成後,重新加載配置文件,隨後再重啓 Jenkins,此時的啓動端口應該已經變成你修改的端口號了。
# 重新加載配置文件
systemctl daemon-reload
# 重啓jenkins
systemctl restart jenkins

啓動 Jenkins

Jenkins 可以單獨指定 Java 路徑,在/etc/init.d/jenkins文件內大概一百行左右的位置,在最上面加上你的 java 路徑即可:

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

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

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

  1. 在瀏覽器輸入 ip+port,可以進入到 Jenkins 的初始化界面,第一次啓動要等的比較久:

進入這個界面,說明你的 Jenkins 已經在啓動中了。

初始化配置 Jenkins

  1. 系統啓動完畢後,系統會提示你查看並輸入管理員密碼,根據中顯示的密碼位置,打開該文件並將密碼複製粘貼即可:
# 在服務器查看密碼文件
cat /var/lib/jenkins/secrets/initialAdminPassword

  1. 密碼輸入成功後,進入插件安裝界面,如果你是新手,直接使用推薦安裝的插件即可:

  1. 系統開始安裝插件,需要等待系統安裝完畢,這一步可能要比較久,耐心等待:

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

  1. 安裝完畢後,系統會提示你創建第一個管理員賬戶:

  1. 配置 Jenkins 訪問地址,便於一些插件使用,一般會有默認值:

  1. 配置完成,點擊開始使用 Jenkins:

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

至此,Jenkins 安裝完畢。

擴展

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

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


實例講解

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

此實例是基於我的開源項目校園博客的 Jenkins 部分進行講解的,如果你對我的項目感興趣,歡迎訪問項目的 GitHub 地址:stick-i/scblogs: 🎉 校園博客,基於微服務架構且前後端分離的博客社區系統。項目後端技術棧:SpringBoot + SpringCloud + Mybatis-Plus + Nacos + MySQL + Redis + MQ + ElasticSearch + Docker。前端主要是基於 Vue2 和 ElementUI 進行開發的

https://github.com/stick-i/scblogs

基本環境

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

全局工具配置

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

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

創建任務

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

別問我在哪新建任務,請你返回首頁好好看看:

任務配置

源碼管理

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

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

構建步驟(Build Steps)

第一步:調用 Maven

點擊增加構建步驟,由於我們是 Maven 管理的項目,需要先使用 Maven 構建,所以第一步就用調用頂層Maven目標

選擇 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的步驟即可。

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

  1. 清理之前的舊鏡像。由於我們剛剛構建了一個新的鏡像,新鏡像和舊鏡像的名稱和版本我們是沒有改的,所以舊的鏡像就會自動變成<none>,使用命令docker image prune -f 就可以清理掉這部分鏡像。

  2. 停止舊容器運行並刪除舊容器。當然我們得先判斷一下是否存在舊容器,使用容器名稱來進行判斷,這部分指令涉及到shelldocker的命令知識,看不懂沒關係,可以直接 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 構建時是會比較喫 CPU 的,爲了不影響生產環境,所以我把它們分開了。當然,這種情況下,腳本也會稍微複雜一點,具體流程大概是下面這樣的:

_作者:阿杆 _

出處:https://goo.gs/ayfro

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2Uidpn6FAZH9iw0Bzl0wLQ