根據jenkins任務名成進行編譯,打包,部署項目到指定的環境
- 以下是根據項目進行編寫的歸檔部署腳本,后續添加其他項目時可以靈活擴展;
- 美中不足的是,ansilbe執行語句調用變量還沒寫出來.用腳本了,就不想再寫個playbook(這個暫時寫不出來);
- 那么就麻煩一點,ansible部署的部分,暫時很不靈活.只能固定格式了.
[root@localhost ~]# cat auto_archive_project_and_deploy.sh
#!/bin/bash
# by author HsLM_Z
# Tue Mar 10 09:43:33 CST 2020
# 根據jenkins任務名稱,判斷分支選擇歸檔方式並部署到指定分支
# jenkins任務名稱規則:liwanjia+項目名+分支名
######################################################################
# Step1: [參數1,為項目名稱(項目名成包含項目類型,項目發布環境)]
# Step2: [菜單]
# Step3: [創建臨時目錄],[打包備份],[刪除冗余文件]
# Step4: [對beta項目歸檔],[對manage項目歸檔],[對store-app項目歸檔]
# Step5: [對beta分支進行推送],[對manage分支進行推送],[對store-app分支進行推送]
######################################################################
######################################################################
######################################################################
# Step3
# 函數:創建臨時目錄;用途:存放臨時編譯后的代碼文件以及備份文件
function ArchiveBeforeMkdir(){
echo "開始創建臨時目錄"
[ ! -d $Jenkins_Dest ] && mkdir -p $Jenkins_Dest
[ ! -d ${Jenkins_Dest}/backup ] && mkdir -p ${Jenkins_Dest}/backup
[ ! -d ${Jenkins_Dest}/${ProjectName}/${Time_Now} ] && mkdir -p ${Jenkins_Dest}/${ProjectName}/${Time_Now}
}
# 函數:打包此次項目文件
# cd 切換到臨時目錄
# 將目錄名改為 項目文件所在目錄
# tar 打包項目文件所在目錄 打包名格式為 當前時間_任務名_tar.gz (此為備份文件)
# tar 打包項目文件所在目錄 打包名格式為 項目文件所在目錄.tar.gz (此為用ansible批量部署使用名稱,固定名稱,方便管理)
# mv 將備份文件 copy至 備份目錄
function TarProject(){
echo "開始打包並備份本次部署項目代碼"
cd ${Jenkins_Dest}/${ProjectName}
\mv ${Time_Now} $BeforeName
tar -czPf ${ProjectName}_${Time_Now}_tar.gz $BeforeName
tar -czPf ${BeforeName}.tar.gz $BeforeName
\mv ${Jenkins_Dest}/${ProjectName}/${ProjectName}_${Time_Now}_tar.gz ${Jenkins_Dest}/backup
}
# 函數:刪除臨時打包文件
# 刪除項目文件所在目錄
# 刪除項目文件所在目錄.tar.gz
function Del_TarProject(){
rm -rf ${Jenkins_Dest}/${ProjectName}/${BeforeName}
rm -rf ${Jenkins_Dest}/${ProjectName}/${BeforeName}.tar.gz
}
######################################################################
# Step4
# 函數:歸檔java項目
# 定義變量,此變量定義java項目名稱
# 調用函數:創建臨時目錄
# 創建/lib目錄,用於存放java項目運行所需的jar包
# 使用for循環
# 調用java項目名稱變量,依次將jar包和項目運行依賴的jar包拷貝至指定目錄
# 如果找不到java項目名,輸出提示:找不到項目名稱
function Project_Beta_Archive(){
echo "開始歸檔beta項目代碼"
Jar_Name="lwjwlkj-service-product lwjwlkj-service-order lwjwlkj-service-user lwjwlkj-service-payment lwjwlkj-web"
[ ! -d ${Jenkins_Dest}/${ProjectName}/${Time_Now}/lib ] && mkdir -p ${Jenkins_Dest}/${ProjectName}/${Time_Now}/lib
for i in $Jar_Name;
do
Jar_Wrap=${i}-1.0-SNAPSHOT.jar
if [ -f ${Jenkins_Source}/$i/target/${Jar_Wrap} -a -d ${Jenkins_Source}/$i/target/lib ];then
\cp ${Jenkins_Source}/$i/target/${Jar_Wrap} ${Jenkins_Dest}/${ProjectName}/${Time_Now}
\cp ${Jenkins_Source}/$i/target/lib/* ${Jenkins_Dest}/${ProjectName}/${Time_Now}/lib
else
echo -e "\-33[31mFile $Jar_Wrap cannot be found, please check.\033[0m";exit
fi
done
}
# 函數:歸檔manage項目
# 進入項目任務目錄
# 用npm命令編譯
# 判斷編譯成功后,將項目移動至臨時目錄
## yum install npm -y
## npm install
## npm run build
function Project_Manage_Archive(){
echo "開始歸檔manage項目"
cd ${Jenkins_Source}
npm run build
if [ $? -eq 0 ];then
\cp -r ${Jenkins_Source}/dist/* ${Jenkins_Dest}/${ProjectName}/${Time_Now}/
else
echo -e "\-33[31merror: npm run build exec error.\033[0m";exit
fi
# /bin/chown -R www.root /usr/local/nginx/html/
}
# 函數:歸檔store_app項目;[liwanjia/store-app]
function Project_StoreApp_Archive(){
echo "開始歸檔store-app項目"
\cp -r ${Jenkins_Source}/* ${Jenkins_Dest}/${ProjectName}/${Time_Now}/
}
######################################################################
# Step5
#### 根據項目分支選擇部署操作 ####
## [root@localhost ~]# cat /etc/ansible/hosts
## [preprod]
##
## [master]
##
## [frontpreprod]
##
## [frontmaster]
##
# beta項目
function Select_Beta_Master_Branch(){
ansible master -m copy -a 'src=/data/jenknins_arichive/liwanjia-beta-master/lwjwlkj_jar.tar.gz dest=/data/'
ansible master -m shell -a 'ls -lh /data/lwjwlkj_jar.tar.gz'
ansible master -m shell -a 'tar xf /data/lwjwlkj_jar.tar.gz -C /data/'
ansible master -m shell -a 'ls -lh /data/lwjwlkj_jar'
ansible master -m script -a '/data/sh/liwanjia/auto_kill_and_start_java_project.sh'
}
function Select_Beta_Preprod_Branch(){
ansible preprod -m copy -a 'src=/data/jenknins_arichive/liwanjia-beta-preprod/lwjwlkj_jar.tar.gz dest=/data/'
ansible preprod -m shell -a 'ls -lh /data/lwjwlkj_jar.tar.gz'
ansible preprod -m shell -a 'tar xf /data/lwjwlkj_jar.tar.gz -C /data/'
ansible preprod -m shell -a 'ls -lh /data/lwjwlkj_jar'
ansible preprod -m script -a '/data/sh/liwanjia/auto_kill_and_start_java_project.sh'
}
# manage項目
function Select_Manage_Master_Branch(){
ansible frontmaster -m copy -a 'src=/data/jenknins_arichive/liwanjia-manage-master/admin.lwjwlkj.com.tar.gz dest=/data/'
ansible frontmaster -m shell -a 'ls -lh /data/admin.lwjwlkj.com.tar.gz'
ansible frontmaster -m shell -a 'tar xf /data/admin.lwjwlkj.com.tar.gz -C /usr/local/nginx/html/'
ansible frontmaster -m shell -a '/bin/chmod -R 755 /usr/local/nginx/html/'
ansible frontmaster -m shell -a 'ls -lh /usr/local/nginx/html/admin.lwjwlkj.com'
}
function Select_Manage_Dev_Branch(){
ansible frontpreprod -m copy -a 'src=/data/jenknins_arichive/liwanjia-manage-dev/preadmin.lwjwlkj.com.tar.gz dest=/data/'
ansible frontpreprod -m shell -a 'ls -lh /data/preadmin.lwjwlkj.com.tar.gz'
ansible frontpreprod -m shell -a 'tar xf /data/preadmin.lwjwlkj.com.tar.gz -C /usr/local/nginx/html/'
ansible frontpreprod -m shell -a '/bin/chmod -R 755 /usr/local/nginx/html/'
ansible frontpreprod -m shell -a 'ls -lh /usr/local/nginx/html/preadmin.lwjwlkj.com'
}
# store-app項目
function Select_StoreApp_Master_Branch(){
ansible frontmaster -m copy -a 'src=/data/jenknins_arichive/liwanjia-store-app-master/onlinestore.lwjwlkj.com.tar.gz dest=/data/'
ansible frontmaster -m shell -a 'ls -lh /data/onlinestore.lwjwlkj.com.tar.gz'
ansible frontmaster -m shell -a 'tar xf /data/onlinestore.lwjwlkj.com.tar.gz -C /usr/local/nginx/html/'
ansible frontmaster -m shell -a '/bin/chmod -R 755 /usr/local/nginx/html/'
ansible frontmaster -m shell -a 'ls -lh /usr/local/nginx/html/onlinestore.lwjwlkj.com'
ansible frontmaster -m shell -a 'ls -lh /usr/local/nginx/html'
}
function Select_StoreApp_Dev_Branch(){
ansible frontpreprod -m copy -a 'src=/data/jenknins_arichive/liwanjia-store-app-dev/preonlinestore.lwjwlkj.com.tar.gz dest=/data/'
ansible frontpreprod -m shell -a 'ls -lh /data/preonlinestore.lwjwlkj.com.tar.gz'
ansible frontpreprod -m shell -a 'tar xf /data/preonlinestore.lwjwlkj.com.tar.gz -C /usr/local/nginx/html/'
ansible frontpreprod -m shell -a '/bin/chmod -R 755 /usr/local/nginx/html/'
ansible frontpreprod -m shell -a 'ls -lh /usr/local/nginx/html/preonlinestore.lwjwlkj.com'
ansible frontpreprod -m shell -a 'ls -lh /usr/local/nginx/html'
}
######################################################################
# Step2
#### 根據項目分支選擇部署操作 ####
# 函數:菜單
# 輸出:項目開始執行
# 判斷:jenkins任務目錄是否存在
# 不存在:輸出找不到項目
# 匹配任務名稱
# 定義變量路徑
# 定義變量目錄
# 調用函數:創建臨時目錄
# 調用函數:根據項目進行歸檔
# 調用函數:進行打包備份
# 調用函數:選擇分支進行推送
# 調用函數:刪除冗余文件
function menu(){
echo -e "\033[32m##### $0 Begin $Time_Now\033[0m"
if [ ! -d $Jenkins_Source ];then
echo -e "\033[31mNot found Project $ProjectName\033[0m"
exit
# [liwanjia/beta] java項目
elif [ $ProjectName == "liwanjia-beta-master" ];then
Project_Path="/data"
BeforeName="lwjwlkj_jar"
ArchiveBeforeMkdir
Project_Beta_Archive
TarProject
Select_Beta_Master_Branch
Del_TarProject
elif [ $ProjectName == "liwanjia-beta-preprod" ];then
Project_Path="/data"
BeforeName="lwjwlkj_jar"
ArchiveBeforeMkdir
Project_Beta_Archive
TarProject
Select_Beta_Preprod_Branch
Del_TarProject
# [liwanjia/manage] 后台管理系統項目
elif [ $ProjectName == "liwanjia-manage-master" ];then
Project_Path="/usr/local/nginx/html"
BeforeName="admin.lwjwlkj.com"
ArchiveBeforeMkdir
Project_Manage_Archive
TarProject
Select_Manage_Master_Branch
Del_TarProject
elif [ $ProjectName == "liwanjia-manage-dev" ];then
Project_Path="/usr/local/nginx/html"
BeforeName="preadmin.lwjwlkj.com"
ArchiveBeforeMkdir
Project_Manage_Archive
TarProject
Select_Manage_Dev_Branch
Del_TarProject
# [liwanjia/store-app] 商城系統
elif [ $ProjectName == "liwanjia-store-app-master" ];then
Project_Path="/usr/local/nginx/html"
BeforeName="onlinestore.lwjwlkj.com"
ArchiveBeforeMkdir
Project_StoreApp_Archive
TarProject
Select_StoreApp_Master_Branch
Del_TarProject
elif [ $ProjectName == "liwanjia-store-app-dev" ];then
Project_Path="/usr/local/nginx/html"
BeforeName="preonlinestore.lwjwlkj.com"
ArchiveBeforeMkdir
Project_StoreApp_Archive
TarProject
Select_StoreApp_Dev_Branch
Del_TarProject
fi
}
######################################################################
# Step1
ProjectName=$1
# jenkins項目家目錄
Jenkins_Source="/root/.jenkins/workspace/${ProjectName}"
# jenkins臨時存放文件目錄
Jenkins_Dest="/data/jenknins_arichive"
# 當前時間
Time_Now=`date +%Y%m%d-%H%M`
menu $*
[root@localhost ~]# cat /data/sh/liwanjia/auto_kill_and_start_java_project.sh
#!/bin/bash
source /etc/profile
echo "ps -ef|grep lwjwlkj|grep -v grep"
ps -ef|grep lwjwlkj|grep -v grep
echo "kill -9 `ps -ef|grep lwjwlkj|grep -v grep|awk '{print $2}'`"
kill -9 `ps -ef|grep lwjwlkj|grep -v grep|awk '{print $2}'`
sleep 3
cd /data/lwjwlkj_jar
echo "start java project"
nohup java -jar lwjwlkj-service-user-1.0-SNAPSHOT.jar >/tmp/log/lwjwlkj_jar/lwjwlkj-service-user.log 2>&1 &
sleep 1
nohup java -jar lwjwlkj-service-product-1.0-SNAPSHOT.jar > /tmp/log/lwjwlkj_jar/lwjwlkj-service-product.log 2>&1 &
sleep 1
nohup java -jar lwjwlkj-service-order-1.0-SNAPSHOT.jar > /tmp/log/lwjwlkj_jar/lwjwlkj-service-order.log 2>&1 &
sleep 1
nohup java -jar lwjwlkj-service-payment-1.0-SNAPSHOT.jar >/tmp/log/lwjwlkj_jar/lwjwlkj-service-payment.log 2>&1 &
sleep 1
nohup java -jar lwjwlkj-web-1.0-SNAPSHOT.jar > /tmp/log/lwjwlkj_jar/lwjwlkj-web.log 2>&1 &
sleep 1
echo "ps -ef|grep lwjwlkj|grep -v grep"
ps -ef|grep lwjwlkj|grep -v grep