鏈接:https://www.zhihu.com/question/419920057/answer/1459267023
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
Jenkins是一個非常方便強大的CI工具, 它利用插件提供了很多動態化的擴展, 是開發者能夠自由的使用各種方案部署項目到服務器上。但因為它是一個全英文文檔的工具,對於國內的開發者而言,仍然存在一定的學習成本,但是只要了解其原理及各個流程需要使用哪些插件,成功的部署自己的項目到服務器上並不難。
下面通過六步完整的說明了從安裝到使用的全流程。
養成習慣,點贊再看!
一 持續集成與部署工具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年9月,原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文件里面的<finalname>標簽名字是否與shell命令中的一致, 其次檢查打包后文件的路徑是否與shell命令中的一致。
