編寫自動化部署腳本之前要先確認git 插件 maven插件以及setting文件設置 jdk 插件都已經安裝並配置到jenkins中
腳本實現思路
1.將git 項目下載到jenkins的工作空間裏 /var/lib/jenkins/workspace
2.使用maven 打包構建項目
3.上傳文件夾構建腳本到目標服務器
3-1.修改文件夾構建腳本中項目路徑變量爲當前項目路徑
3-2.並執行構建不存在的目標文件夾 然後刪除文件夾構建腳本
4.上傳jar包到目標服務器
5.上傳執行腳本到目標服務器
5-1.修改執行腳本中的jar包全路徑變量爲當前項目jar包全路徑
6.執行啓動腳本
jenkins pipeline腳本示例:
node () {
def workspace = pwd()
user='root'
passwd='*******'
project_name='scf-gateway'
jar_name='scf-gateway-1.0.0-SNAPSHOT.jar'
server_path='/var/lib/jenkins/workspace/server.sh'
haveDivectory_path='/var/lib/jenkins/workspace/haveDivectory.sh'
currentpath='/data/'+project_name+'/'+jar_name
project_path='/data/'+project_name+'/'
/**
* 項目檢出 新項目複製腳本只需要修改project_name 和 jar_name 兩個變量 在項目結構不一致情況下需注意下方兩個註釋處區別
**/
stage 'checkout'
git branch: branches, credentialsId: 'git_account', url: 'http://192.168.0.246:2080/scf-ms/scf-gateway.git'
/**
* 項目構建 當項目結構爲單項目體結構時使用"cd $workspace/" 項目結構爲多項目結構式使用 "cd $workspace/$project_name/"
**/
stage 'Build'
sh """
cd $workspace/
/usr/local/maven/apache-maven-3.6.1/bin/mvn clean install -Dmaven.test.skip=true -P $activation
"""
stage 'delete_old'
sh """sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "rm -rf $currentpath && rm -rf /data/$project_name/server.sh"
"""
/**
* 上傳文件 當項目結構爲單項目體結構時使用"cd $workspace/target" 項目結構爲多項目結構式使用 "cd $workspace/$project_name/target"
**/
stage 'upload'
sh """
cd $workspace/target
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$haveDivectory_path' '$user'@'$environment_ip':/haveDivectory.sh
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "sed -i 's#targetServerPath#$project_path#g' /haveDivectory.sh"
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd / && sh haveDivectory.sh && rm -rf haveDivectory.sh"
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$jar_name' '$user'@'$environment_ip':$currentpath
sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$server_path' '$user'@'$environment_ip':/data/$project_name/server.sh
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "sed -i 's#currentappath#$currentpath#g' /data/$project_name/server.sh"
"""
/**
* 啓動項目
**/
stage 'restart'
sh """
sshpass -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd $project_path && sh server.sh restart"
"""
echo 'done_______________'
}
變量說明
1.workspace=pwd() 是獲取當前項目所在工作空間一般在jenkins安裝目錄下的workspace目錄下可以找到
2.user 目標服務器的鏈接用戶名
3.passwd 目標服務器的密碼
4.project_name 當前項目名稱
5.jar_name 當前項目打包後jar包名稱
6.server_path 原始啓動腳本(未修改項目路徑的腳本)地址
7.haveDivectory_path 原始在目標服務器創建目標文件夾腳本地址(未修改項目路徑的腳本)
8.currentpath 目標服務器jar包所在全路徑
9.project_path 目標服務器項目所在路徑
10.branches git源碼分支變量(頁面配置多選)
11.environment_ip 目標服務器ip地址(頁面配置多選)
12.activation 配置文件環境變量 (頁面配置多選。需要在maven項目中pom中設置profiles參數變量)
13.git_account 是在jenkins中配置的全局憑證(git倉庫的用戶名密碼)
2.jenkins配置變量示例
3.原始新建文件夾腳本示例:(使用shell命令修改'targetServerPath'變量)
#!/bin/bash
if [ ! -d 'targetServerPath' ];then
mkdir targetServerPath
else
echo "文件夾已經存在"
fi
4.原始啓動服務腳本示例:(修改shell命令修改'currentappath'變量)
#!/bin/bash
export JAVA_HOME=/usr/local/jdk1.8.0_101/
export JRE_HOME=/$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
#這裏可替換爲你自己的執行程序,其他代碼無需更改
APP_NAME=currentappath
#使用說明,用來提示輸入參數
usage() {
echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
exit 1
}
#檢查程序是否在運行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#啓動方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar ${APP_NAME} >info.out 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#輸出運行狀態
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重啓
restart(){
stop
sleep 5
start
}
#根據輸入參數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac