一 3w解析持續集成與部署工具Jenkins
why? 爲什麼要用?
手動部署項目的過程是痛苦且乏味的, 而一個持續集成和部署的工具能夠幫助你解放雙手, 投入更多的精力到其它的事情上。
此外jenkins是開源的,是CI(Continuous integration)工具中公認的老大。到目前2020年, 地位仍是不可撼動,廣泛應用於多種類型項目部署,自動化構建,測試和部署等功能。Jenkins雖然是用java編寫的, 但卻通過插件幾乎集成了所有流行的編程語言編寫的項目來進行集成和部署。
how? 怎麼用?
首先,需要了解項目整個部署的流程,然後結合各個流程jenkins提供的插件倉庫進行jenkins方面的實現。以一個使用git進行版本管理、Java語言編寫的maven項目舉例:
git倉庫拉取代碼 → maven編譯、打包 → 通過ftp協議上傳該包的服務器上 → 執行啓動腳本運行項目
這個過程就會用到Jenkins提供的一些插件來進行功能實現, 上述流程就會用到插件Git Parameter(參數化檢索代碼)、Maven Integration(使用maven構建代碼)以及Publish Over SSH(sftp傳輸文件並執行shell命令)來完成上述部署過程的實現。
what? 是什麼?
那麼Jenkins到底是什麼?看看它的自我介紹吧!
哈哈哈, 它的宣言是: 構建偉大,無所不能
它的介紹是:Jenkins是開源CI&CD軟件領導者, 提供超過1000個插件來支持構建、部署、自動化, 滿足任何項目的需要。
既然這麼6,那接下來就來全方位的系統瞭解一下Jenkins的使用,本篇博文會介紹jenkins從安裝到前後端項目的部署以及權限分配和使用過程中的常見問題,從原理上基本上滿足企業日常的需求,過程中也可以通過其他的一些插件進行優化和拓展,話不多說,整體開始。
本篇文章示例說明:
後端示例:
編程語言:Java
構建工具:Maven
代碼管理:Git
前端示例:
項目類型:Vue項目
構建工具:Node
代碼管理:Git
二 搭建Jenkins及工具配置
1. 安裝Jenkins
● Docker安裝Jenkins
docker run -itd \
-p 8080:8080 -p 50000:50000 \
--name jenkins --privileged=true \
-v /data/jenkins:/var/jenkins_home \
docker.io/jenkins/jenkins:lts
● war包方式安裝Jenkins
-
下載war包:
http://mirrors.jenkins.io/war-stable/latest/jenkins.war
-
啓動:
java -jar jenkins.war --httpPort=9090
● rpm安裝Jenkins
1.下載jenkins的rpm包
https://pkg.jenkins.io/redhat-stable/
-
安裝
sudo rpm -ih jenkins-2.235.1-1.1.noarch.rpm
-
啓動
systemctl start jenkins
推薦使用Docker和RPM的方式安裝!
安裝完成後瀏覽器訪問 http://localhost:8080 即可開始訪問了,如下圖那熟悉的老頭兒:
這個過程需要等待幾分鐘時間,這時候Jenkins會自動的做一些初始化工作,細心的小夥伴會發現在服務器jenkins_home文件夾下已經生成很多文件了。(請關注這個細節, 作者不會做一些無用功, 在插件加速步驟會用到)
config.xml hudson.model.UpdateCenter.xml jenkins.install.UpgradeWizard.state jobs nodeMonitors.xml plugins secret.key secrets userContent war
copy_reference_file.log identity.key.enc jenkins.telemetry.Correlator.xml logs nodes queue.xml.bak secret.key.not-so-secret updates users
完成後瀏覽器頁面會讓輸入jenkins初始化的密碼, 如下:
進入服務器: cat /var/jenkins_home/secrets/initialAdminPassword
,複製粘貼繼續即可 !
2. 配置插件加速
進入到該頁面後, 這時候下載插件因爲使用的是外網地址, 訪問大概率會超時從而導致下載失敗。
如何解決?
1.進入到jenkins_home目錄下, 查看是否有updates文件夾, 如果沒有, 地址欄訪問:
http://localhost:8080/pluginManager/advanced
2.查看Update Site 下check now
按鈕下方是否飄紅, 沒飄紅恭喜直接下一步即可, 飄紅報錯也沒有關係,
將url地址切換爲:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
之後 Submit
, Check now
即可!
(注: 切換爲該地址後本質上並不能解決插件下載問題, 具體原因可參考: https://blog.csdn.net/s78365126/article/details/105645080)
3.進入服務器jenkins_home/updates目錄下, 將default.json中的插件地址替換;
# 進入jenkins_home下的updates目錄
cd ${jenkins_home}/updates
# 替換default.json中的插件地址
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
之後重啓jenkins即可 !
docker方式: docker restart jenkins
| rpm方式: systemctl restart jenkins
再下載插件, 速度百倍提升有木有! 訪問: http://localhost:8080/, 如圖:
下載完之後進入配置admin用戶和jenkins地址, 分別跳過和默認即可!
三 Jenkins部署後端項目
1. 後端部署原理及插件應用
原理:
-
首先, Jenkins從Gitlab或Github或Gitee等git倉庫拉取項目代碼;
-
對於Java項目根據類型需要使用Maven或Gradle對源碼進行編譯和打包;
-
Jenkins將打包好的項目上傳到要發佈的服務器執行腳本進行啓動。
Jenkins提供了插件倉庫以便於對各種技術的集成與支持,包括對容器化技術Docker的支持,在Jenkins執行的每個環節都有多種方案進行替代和優化。本次結合後端常用的項目架構,目前在使用Jenkins的過程主要用到的是:
JDK8,Maven3.6.3, Git, Shell等。
使用到的插件有:
- Maven Integration
- Publish Over SSH
- Git Parameter
在插件倉庫下載完上述三個插件後, 就來開始正兒八經的部署後臺項目吧!
1.配置SSH Server
2. 配置全局工具(jdk、maven、git等)
進入系統管理 → 全局工具配置
2.項目搭建詳解
1.創建項目
點擊ok,進入正題
項目啓動腳本restart.sh如下:
#!/bin/sh
file="test.jar"
pid=`ps -ef| grep $file | grep -v grep | awk '{print $2}'`
log="log.log"
time=$(date +%Y%m%d%H%M%S)
#cp $file $file".bak."$time
if [ -n $pid ]
then
echo "kill "$file" success"
kill -9 $pid
else
echo "kill "$file" fail"
fi
nohup java -jar $file > $log 2>&1 &
2.構建項目進行啓動
四 Jenkins部署前端項目
1. 前端部署原理及插件應用
原理:
1.首先, Jenkins從Gitlab或Github或Gitee等git倉庫拉取項目代碼;
2.對於前端項目使用node進行相關modules下載;
3.使用webpack對項目進行打包;
4.將生成的dist文件夾打包傳輸到要部署的遠程服務器;
5.使用shell腳本或命令傳輸到nginx代理的文件夾中。
Jenkins在前端的項目部署中,主要承擔的角色就是使用node進行install和build,之後把構建好的文件傳輸到遠程服務器中,之後的工作就是由nginx進行代理和訪問。本次演示目前前端在jenkins中主要用到的是:
Node.JS v12.16.2,Git,Shell等。
用到的插件和工具有:
-
Publish Over SSH : 以支持Jenkins可以遠程發佈文件到其他服務器的插件
-
Git Parameter : 以支持Jenkins可以拉取Git倉庫不同分支上的代碼的插件
-
Node.js : 以支持Node.js項目的持續集成, 默認在全局工具中配置路徑
2. 前端項目搭建詳解
五 用戶管理及權限分配
1.下載權限擴展插件並進行相關配置
❶ 進入Manage Jenkins → Manage Plugins 下載下述插件:
插件名稱:Role-based Authorization Strategy
插件版本:3.0
❷ 進入Manage Jenkins → Configure Global Security中操作如下:
❸進入Manage Jenkins → Manage and Assign Roles, 點擊Manage Roles
點擊add添加角色;
admin: 具有所有權限
operator:具有查看、部署等權限
reader:具有查看權限
2.新建用戶並分配權限
進入Manage Jenkins → Manage Users,然後創建用戶
進入Manage Jenkins → Manage and Assign Roles,然後點擊Assign Roles分配之前創建的角色
六 常見問題解析
1.使用docker安裝的Jenkins版本老舊,插件升級失敗或不兼容
圖中可以看到,截止現在2020年7月,原jenkins鏡像已經兩年沒有更新了。安裝jenkins建議大家使用jenkins:lts鏡像。
2.安裝成功後Jenkins無法下載插件,顯示“實例已離線”
該博客可參考:https://blog.csdn.net/s78365126/article/details/105645080
此外如果是docker搭建方式,可嘗試下容器內能否ping通外網,看看是否是網絡模式問題。
3.傳輸文件數爲0, 文件傳輸失敗
首先檢查Publish over ssh 編輯區中上傳文件的目錄操作是否正確, 其次對照workspace中要上傳文件的目錄是否正確, 該問題的產生基本上都是因爲目錄找不到對應文件造成的。
還有可能原因是由於環境與Publish over ssh 編輯區中label的名字不匹配造成的, 修改爲與要啓動的PROFILE一致即可。
4.執行shell腳本或命令提示Permission denied
該問題的產生有多種情況:
-
情形1:當前用戶不具有操作其它用戶創建目錄的權限, 解決方案:
使用chown 和 chgrp 命令切換文件的用戶和用戶組。
-
情形2:要操作的目錄不具有讀寫或執行權限, 解決方案:
chmod賦予文件夾或文件操作權限。
-
情形3:無法殺掉其它用戶啓動的線程,解決方案:
切換到root用戶kill原來的進程,當前登錄用戶重新啓動。
5.使用maven打包項目後找不到打包後的文件
首先檢查項目中pom文件裏面的標籤名字是否與shell命令中的一致, 其次檢查打包後文件的路徑是否與shell命令中的一致。