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" } } }