m-shell-scripts/m_xjj_1/jenkins_pipeline/wc_server_update_example.jenkinsfiile

279 lines
11 KiB
Plaintext
Raw Permalink Normal View History

2025-03-19 17:38:46 +08:00
pipeline {
agent {
label "master_node"
}
environment {
// 以年-月-日_时-分-秒生成备份版本号
BACKUP_TAG = "${new Date().format('yyyy-MM-dd_HH-mm-ss')}"
GIT_REPO_URL = '192.168.160.39/backend/wc-server-update.git'
GIT_BRANCH = "main"
GIT_CREDENTIALS_ID = "55281c9f-91ef-4aa1-98e4-b5f5b879a45f"
GIT_CLONE_DIR = "wc_server_update"
SSH_REMOTE_USER = "cicd"
SSH_REMOTE_HOST = "18.138.0.71"
SSH_REMOTE_PORT = 22229
// 远端的更新包上传目录
SSH_REMOTE_PUSH_DIR = "~/server/"
PROJECT_NAME = "wc-server-update"
// 下面是备份以及更新的目录
// 远端的 server 目录
SERVER_DIR="/home/cicd/temp/data/code/server"
// 远端的 map 目录
MAP_DIR="/home/cicd/temp/data/code/slotmap"
EBIN_DIR="${SERVER_DIR}/ebin/"
GAMEALGO_DIR="${SERVER_DIR}/gamealgo/"
BACKUP_DIR="/home/cicd/temp/data/code/server_backup/"
BACKUP_NAME="${BACKUP_DIR}/${BACKUP_TAG}"
Backup_Ebin="${Update_Ebin}"
Backup_Slotmap="$Update_Slotmap"
Backup_Gamealgo="$Update_Gamealgo"
}
stages {
stage('See Version') {
steps {
script {
sh "git --version"
sh "python3 --version"
sh "rsync --version"
sh "/usr/local/sbin/python3 ~/scripts/notify_server.py start null ${PROJECT_NAME} ${Build_Options}"
if ( "$Build_Options" != "Hot" && "$Build_Options" != "Restart" && "$Build_Options" != "Add" ) {
error "Options Error"
}
}
}
}
stage ("Git Pull") {
steps {
script {
echo "Attention: Git Pull [I Will Start]"
withCredentials([usernamePassword(credentialsId: GIT_CREDENTIALS_ID, usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
// URL编码用户名和密码
def encodedUsername = URLEncoder.encode(GIT_USERNAME, "UTF-8")
def encodedPassword = URLEncoder.encode(GIT_PASSWORD, "UTF-8")
if (fileExists(GIT_CLONE_DIR)) {
dir(GIT_CLONE_DIR) {
// 目录存在, 同步代码
echo "Attention: Git Code - I Will Pull Code!"
sh "git pull origin ${GIT_BRANCH}"
}
} else {
// 目录不存在时使用
// 使用URL编码后的用户名和密码克隆仓库
echo "Attention: Git Code - I Will Clone Code!"
sh "git clone -b ${GIT_BRANCH} http://${encodedUsername}:${encodedPassword}@${GIT_REPO_URL} ${GIT_CLONE_DIR}"
}
}
echo "Attention: Git Pull [I Finish]"
}
}
}
stage("Rsync Code") {
steps {
script {
echo "Attention: Rsync Code [I Will Start]"
sh """
ssh ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST} -p${SSH_REMOTE_PORT} '
cd ${SSH_REMOTE_PUSH_DIR}
pwd
if [ -d ${GIT_CLONE_DIR} ]
then
# /usr/bin/cp -r ${GIT_CLONE_DIR} ${GIT_CLONE_DIR}_${BACKUP_TAG}
echo "No Backup This Project"
fi
'
"""
sh "rsync -avz -e 'ssh -p${SSH_REMOTE_PORT}' --exclude=${GIT_CLONE_DIR}/.git ${GIT_CLONE_DIR} ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST}:${SSH_REMOTE_PUSH_DIR}/"
echo "Attention: Rsync Code [I Finish]"
}
}
}
stage ("Check Directiory") {
// SERVER_DIR="/home/cicd/temp/data/code/server"
// // 远端的 map 目录
// MAP_DIR="/home/cicd/temp/data/code/slotmap"
// EBIN_DIR="${SERVER_DIR}/ebin/"
// GAMEALGO_DIR="${SERVER_DIR}/gamealgo/"
// BACKUP_DIR="/home/cicd/temp/data/code/server_backup/"
// BACKUP_NAME="${BACKUP_DIR}/${BACKUP_TAG}"
// cd ${SSH_REMOTE_PROJECT_PARENT_DIR}
// [ ! -d ${SSH_REMOTE_PROJECT_DIR}_backup ] && mkdir ${SSH_REMOTE_PROJECT_DIR}_backup
// cp -r ${SSH_REMOTE_PROJECT_DIR} ${SSH_REMOTE_PROJECT_DIR}_backup/${SSH_REMOTE_PROJECT_DIR}_${BACKUP_TAG}
steps {
script {
sh """
ssh ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST} -p${SSH_REMOTE_PORT} '
[ -d $SERVER_DIR ] && [ -d $MAP_DIR ] && [ -d $EBIN_DIR ] && [ -d $BACKUP_DIR ] && [ -d $GAMEALGO_DIR ] && echo "Check Success"
'
"""
}
}
}
stage("Pause Process") {
steps {
echo "Please Let The Admin Check Update Dir = [ Temp Message No Message Now ]"
echo "Attention: Pause Process - Please Let The Admin Decide Update Or Not!"
echo "Attention Attention Attention: Next Process Will Handle Remote Host! "
}
}
stage("Backup Server") {
steps {
script {
echo "Backup_Ebin: $Backup_Ebin"
echo "Backup_Slotmap: $Backup_Slotmap"
echo "Backup_Gamealgo: $Backup_Gamealgo"
sh """
ssh ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST} -p${SSH_REMOTE_PORT} '
if [[ $Backup_Ebin == true ]]
then
if [ ! -d $BACKUP_NAME ]
then
mkdir -p $BACKUP_NAME
fi
/usr/bin/cp -r $EBIN_DIR $BACKUP_NAME/
fi
if [[ $Backup_Slotmap == true ]]
then
if [ ! -d $BACKUP_NAME ]
then
mkdir -p $BACKUP_NAME
fi
/usr/bin/cp -r $MAP_DIR $BACKUP_NAME/
fi
if [[ $Backup_Gamealgo == true ]]
then
if [ ! -d $BACKUP_NAME ]
then
mkdir -p $BACKUP_NAME
fi
/usr/bin/cp -r $GAMEALGO_DIR $BACKUP_NAME/
fi
if [ -d $BACKUP_NAME ]
then
du -sh $BACKUP_NAME/*
fi
'
"""
}
}
}
// // 确认更新
// stage("Confirm Tips"){
// steps {
// echo "Attention: Update Project - Administrator Decide Update This Project!"
// }
// input {
// message "Next Process Will Update Project, Continue?"
// ok "Yes, Do It."
// }
// }
stage("Update Server") {
steps {
script {
echo "Update_Ebin: $Update_Ebin"
echo "Update_Slotmap: $Update_Slotmap"
echo "Update_Gamealgo: $Update_Gamealgo"
echo "Build_Options: $Build_Options"
echo "SERVER_DIR: $SERVER_DIR"
echo "SLOTMAP_DIR: $MAP_DIR"
echo "EBIN_DIR: $EBIN_DIR"
echo "GAMEALGO_DIR: $GAMEALGO_DIR"
sh """
ssh ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST} -p${SSH_REMOTE_PORT} '
cd $SSH_REMOTE_PUSH_DIR/$GIT_CLONE_DIR
pwd
if [[ $Update_Ebin == true ]]
then
echo update ebin
/usr/bin/cp -r ./server/ebin/* $EBIN_DIR/
fi
if [[ $Update_Slotmap == true ]]
then
echo update slotmap
/usr/bin/cp -r ./slotmap/* $MAP_DIR/
fi
if [[ $Update_Gamealgo == true ]]
then
echo update gamealgo
/usr/bin/cp -r ./server/gamealgo/* $GAMEALGO_DIR/
fi
'
"""
}
}
}
stage("Command Server") {
steps {
script {
echo "Build_Options: $Build_Options"
sh """
ssh ${SSH_REMOTE_USER}@${SSH_REMOTE_HOST} -p${SSH_REMOTE_PORT} '
cd $SERVER_DIR
[ -f game_ctl.sh ] && echo "Use Command"
case $Build_Options in
"Hot")
echo Use Hot
./game_ctl.sh reload_all 1
;;
"Restart")
echo Use Restart
./game_ctl.sh stop 1
sleep 30
./game_ctl.sh start 1
;;
"Add")
echo Use Add
./game_ctl.sh reload_all 1
sleep 10
./game_ctl.sh add_slot 1
;;
*)
return 1
;;
esac
'
"""
}
}
}
}
post {
success{
// echo "Success"
sh "/usr/local/sbin/python3 ~/scripts/notify_server.py finish success ${PROJECT_NAME} $Build_Options"
}
failure {
// echo "Failure"
sh "/usr/local/sbin/python3 ~/scripts/notify_server.py finish failure ${PROJECT_NAME} $Build_Options"
}
}
}