持續集成工具Jenkins
持續部署、持續集成、持續交付
Jenkins 和 Hudson 都是一款持續集成及自動化部署工具。
Jenkins 解決了什么問題:
Jenkins 的主要目標是監控軟件開發流程,快速顯示問題。所以能保證開發人員以及相
關人員省時省力提高開發效率。
解決了傳統的打包、部署枯燥過程。
Jenkins 主要用於
1.持續、自動地構建/測試軟件項目
2. 監控一些定時執行的任務
Jenkins 歷史
Jenkins 和 Hudson 之間的關系,2009年,甲骨文收購了sun公司並集成了Hudson代碼庫。在2011年年初,甲骨文和開源社區之間關系破裂,該項目分為兩個獨立的項目。
Jenkins: 由大部分原始開發人員組成
Hudson:由甲骨文公司繼續管理
所以 Jenkins 和 Hudson 是兩款非常相似的產品
流程圖
Red hat 安裝Jenkins
jenkins下載 https://pkg.jenkins.io/redhat-stable/
下載rpm包到本地
sudo rpm -ih jenkins-2.222.3-1.1.noarch.rpm
自動安裝完成之后:
/usr/lib/jenkins/jenkins.war WAR包
/etc/sysconfig/jenkins 配置文件
/var/lib/jenkins/ 默認的JENKINS_HOME目錄
/var/log/jenkins/jenkins.log Jenkins日志文件
安裝完成之后啟動jenkins, 可能報這個錯誤,這是由於沒有配置java環境,先檢查一下java虛擬機有沒有安裝,如果沒有就安裝
解決辦法在 vim /etc/init.d/jenkins
在第一行添加java環境,紅色框中為自己的路徑
為了避免jenkins默認端口沖突,修改enkins默認端口
執行 vi /etc/sysconfig/jenkins
找到 JENKINS_PORT="8080" 此端口不沖突可以不修改
修改jenkins默認的操作用戶,linux下jenkins默認使用jenkins用戶進行腳本和文件的操作,如果不修改,在部署項目時需要調整涉及到的文件和目錄的操作權限,可以調整jenkins配置文件,將用戶修改為root用戶。
將JENKINS_USER="jenkins"調整為JENKINS_USER="root"
然后執行啟動命令
sudo service jenkins start
然后訪問:http://ip/8081
如果訪問不到,檢查服務器的防火牆是否關閉。
接着 :cd /var/lib/jenkins/secrets
進入此頁面后,需要配置一下允許用戶注冊,Configure Global Security ,勾選此處,保存。
接着配置jdk 、maven、及setting.xml
需要安裝 Subversion 和 Deploy to container 插件,如果無法安裝提示Update information obtained: 不可用 ago;
其原因是無法上網,可檢查 ping www.baidu.com 如果無法ping通,需要設置DNS
命令: vim /etc/resolv.conf 修改文件中nameserver為 8.8.8.8 和 8.8.4.4 保存退出 :wq
再次檢查 ping www.baidu.com
開始構建部署springboot的jar項目
- 回到jenkins主頁面,點擊新建Item
-Dmaven.test.skip=true 忽略測試
然后點擊頁面下方的應用,並保存。接着設置全局配置進入jekins 主頁面,點擊左側 Manage Jenkins進入頁面后點擊Configure System 系統配置
再次操作之前,需要安裝 Publish over SSH 插件,
點擊高級 勾選
以上配置完后,點擊Test Configuretion 測試一下
之后我們去job中配置一下ssh,
此處的順序需要注意一下,shell 腳本需要放在下面。
shell 腳本內容:
#!/bin/sh
#Copy jar to target path
BUILD_ID=DONTKILLME #后台執行
pid=$(ps -ef|grep ene-center.jar|grep -v grep | awk '{print $2}')
#copy jar 到啟動目錄
#cp -r /var/lib/jenkins/workspace/ene-center/target/ene-center.jar /data/test/em
# 關閉已經啟動的jar進程
function stop(){
if [ -n "$pid" ]
then
echo "pid進程 :$pid"
kill -9 $pid
else
echo "進程沒有啟動"
fi
}
stop
sleep 5s
#發布jar服務
function start(){
cd /data/test/em
nohup java -jar ene-center.jar --server.port=5010 >center.log 2>&1 &
}
start
然后,應用並保存,在jenkins 任務列表頁面點擊構建,
前后端shell 腳本
- 后端腳本
#!/bin/bash
root="/data/test/ene"
for project in {"ene-center","ene-auth","ene-gateway","ene-basic","ene-sys"}
do
echo
echo
echo
echo $project"開始部署..."
BUILD_ID=DONTKILLME
pid=$(ps -ef|grep $project.jar|grep -v grep | awk '{print $2}')
function stop(){
if [ -n "$pid" ]
then
echo "關閉進程pid=:$pid"
kill -9 $pid
else
echo "未啟動,不需要kill"
fi
}
file="${root}/$project/target/${project}.jar"
if [ -e $file ]
then
echo "原始文件路徑:${root}/$project/target/${project}.jar...已找到"
else
echo "原始位置 ${root}/$project/target/${project}.jar...不存在,停止部署!"
continue
fi
echo "移動jar到 ${root}/_jar/$project.jar"
mv -f ${root}/$project/target/${project}.jar ${root}/_jar
function start(){
cd $root
echo "開始啟動..."
nohup java -jar _jar/$project.jar > _jar/$project.log 2>&1 &
}
stop
sleep 3s
start
done
echo "腳本執行完畢!!!!!!"
echo
echo
echo
- 前端腳本
#!/bin/bash
BUILD_ID=DONTKILLME
cd /var/lib/jenkins/workspace/ene-vue/ene-vue
npm install
npm install script-ext-html-webpack-plugin
npm run build:prod
rm -rf /data/test/dist
rm -rf /data/test/ene-vue
mv /var/lib/jenkins/workspace/ene-vue/ene-vue/dist /data/test
cd /data/test
mv dist ene-vue