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
2. 通過 yum 安裝 Jenkins
- yum -y install jenkins
3. 修改 Jenkins 端口號
- Jenkins 默認端口號爲 8080,輸入
vim /etc/sysconfig/jenkins
進行編輯,將 JENKINS_PORT 修改爲自己想要的端口號,前提得保證修改後的這個端口沒有被其他的進程佔用。
- 這裏修改了可能還不能生效,還需要修改另一個地方,輸入以下指令進行編輯
vim /usr/lib/systemd/system/jenkins.service
# 找到下面的文字
Environment="JENKINS_PORT=8080" # 修改爲自己想要的端口號
# :wq退出
- 修改完成後,重新加載配置文件,隨後再重啓 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
-
輸入
service jenkins start
,會彈出提示:Starting jenkins (via systemctl):,意思是正在啓動,第一次啓動比較耗時,此時耐心等待。如果提示超時失敗,沒關係,jenkins 仍然在啓動,只是第一次啓動比較耗時。如果提示內容不是超時失敗,那大概率是你的 Java 沒安裝好或者版本不對。
-
放行剛剛配置的端口
# 放行15369端口
firewall-cmd --zone=public --add-port=15369/tcp --permanent
# 重新加載防火牆
firewall-cmd --reload
# 查看是否已經開啓
firewall-cmd --list-ports
如果你是在阿里雲騰訊雲等類似服務器上的話,那你還需要去控制檯防火牆或者安全組開放這個端口,像這樣:
開放端口時記得設置授權 ip,建議你直接給自家 ip 地址授權全部端口號。
- 在瀏覽器輸入 ip+port,可以進入到 Jenkins 的初始化界面,第一次啓動要等的比較久:
進入這個界面,說明你的 Jenkins 已經在啓動中了。
初始化配置 Jenkins
- 系統啓動完畢後,系統會提示你查看並輸入管理員密碼,根據中顯示的密碼位置,打開該文件並將密碼複製粘貼即可:
# 在服務器查看密碼文件
cat /var/lib/jenkins/secrets/initialAdminPassword
- 密碼輸入成功後,進入插件安裝界面,如果你是新手,直接使用推薦安裝的插件即可:
- 系統開始安裝插件,需要等待系統安裝完畢,這一步可能要比較久,耐心等待:
安裝過程中可能會出現部分插件安裝失敗的情況,沒關係,全部處理完畢後可以選擇重試。
- 安裝完畢後,系統會提示你創建第一個管理員賬戶:
- 配置 Jenkins 訪問地址,便於一些插件使用,一般會有默認值:
- 配置完成,點擊開始使用 Jenkins:
隨後就進入到 Jenkins 的管理界面了,不同版本的 Jenkins 界面可能會不一樣:
至此,Jenkins 安裝完畢。
擴展
如果你是使用 Jenkins 來對 Java 服務做持續集成的話,那麼你還需要安裝下面的插件:
-
Maven Integration:Maven 集成管理插件。
-
Docker plugin:Docker 集成插件。
-
Publish Over SSH:遠程文件發佈插件。
-
SSH: 遠程腳本執行插件。
-
GitLab:拉取遠程倉庫代碼插件。
安裝插件在系統管理 -> 插件管理
裏面
實例講解
接下來,我會拿出我的用戶微服務構建任務的實際配置來向你進行解讀,當你瞭解了 Jenkins 自動化構建部署的工作原理後,你便可以很快的上手這個玩意,因爲你會發現它是如此的簡單。
此實例是基於我的開源項目校園博客的 Jenkins 部分進行講解的,如果你對我的項目感興趣,歡迎訪問項目的 GitHub 地址:stick-i/scblogs: 🎉 校園博客,基於微服務架構且前後端分離的博客社區系統。項目後端技術棧:SpringBoot + SpringCloud + Mybatis-Plus + Nacos + MySQL + Redis + MQ + ElasticSearch + Docker。前端主要是基於 Vue2 和 ElementUI 進行開發的
https://github.com/stick-i/scblogs
基本環境
在此之前,我需要介紹一下我的基本環境:
-
我的操作環境爲 Windows,但是我要把微服務部署到一臺 Linux 服務器上去,包括 Jenkins 也是安裝在這個上面的。
-
服務器上安裝了 Jenkins、Git、Docker、JDK、Maven、NodeJs,都是些拿來構建的東西,都是單獨安裝的,而不是跑在 Docker 上。
-
而項目服務都是跑在 Docker 上的,還有 Redis 這種輕量的中間件也跑在 Docker 上。
-
我的項目已經在 Git 倉庫裏放好了,放 github 或者 gitee 或者 gitlab 都行。
全局工具配置
在 Jenkins 上,我已經配置好了這些構建工具的路徑,以便於 Jenkins 可以直接調用到他們,在系統管理 -> 全局工具配置
這個頁面下,這張圖有點長:
在這張圖上,你可以看到其中有一部分的配置是有路徑的,還有一部分配置是沒有路徑的,這是因爲我把他們的命令路徑加到了系統路徑上,即使不添加完整路徑,Jenkins 也可以調用到它們。
創建任務
好,現在我們已經準備好環境了,可以創建一個任務來試試水了,輸入任務名稱,然後選擇構建一個自由風格的軟件項目
:
別問我在哪新建任務,請你返回首頁好好看看:
任務配置
源碼管理
現在我們已經進入到任務配置界面了,往下劃到源碼管理的地方,選擇 Git,然後填寫倉庫地址等信息:
添加 Credentials 的時候,如果你會使用 SSH 密鑰的話,建議還是用這個,但你得在機器上進行格外的配置,這裏我就不多說了,不會的話直接用賬號密碼也是可以的:
構建步驟(Build Steps)
第一步:調用 Maven
點擊增加構建步驟,由於我們是 Maven 管理的項目,需要先使用 Maven 構建,所以第一步就用調用頂層Maven目標
:
選擇 maven 版本,然後 target 根據項目的實際情況編寫,我的命令是這樣的:
-
先構建 jar 包,執行 install 的過程中會先執行 package 的,所以我直接 install。我的項目中單元測試是沒怎麼梳理的,所以我使用參數
-Dmaven.test.skip=true
跳過單元測試。 -
然後我得打包成 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
的步驟即可。
具體的命令也很簡單,就這麼幾步:
-
清理之前的舊鏡像。由於我們剛剛構建了一個新的鏡像,新鏡像和舊鏡像的名稱和版本我們是沒有改的,所以舊的鏡像就會自動變成
<none>
,使用命令docker image prune -f
就可以清理掉這部分鏡像。 -
停止舊容器運行並刪除舊容器。當然我們得先判斷一下是否存在舊容器,使用容器名稱來進行判斷,這部分指令涉及到
shell
和docker
的命令知識,看不懂沒關係,可以直接 cv,注意修改容器名稱就好。 -
調用 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