需求是:实现跨平台批量打包发布

jenkins pip流水线+xshell

jenkins pip

def createVersion() {
    // 定义一个版本号作为当次构建的版本,输出结果 年月日_构建ID
    return new Date().format('yyyyMMdd') + "_${env.BUILD_ID}"
}

pipeline {
    agent any

    // 在 environment 引入上边定义的函数,以便于全局调用
    environment {
        VERSION = createVersion()
        PROJECT = "single-enroll"
        ENV = "zou-edu-api-prod"
        JAR_PATH = "${PROJECT}/target"
        SERVER_LIST = "xxx,xxxx"
    }

    stages {
        stage('拉取代码') {
            steps {
                git branch: "${branch}", credentialsId: 'c1f395ca-d3db-45de-a345-b1613edbffda', url: 'http://101.69.246.86:18099/zjlll/single-enroll.git'
            }
        }

        stage('传输编译') {
            steps {
                script {
                    // 在这里使用双引号以进行变量插值,确保变量被正确替换
                    sh "/deploy/app/${ENV}/bin/jdk_1.8scp.sh ${PROJECT} ${VERSION} '${SERVER_LIST}' ${ENV}"
                }
            }
        }

        stage('版本信息') {
            steps {
                script {
                    sh "echo 版本信息 ==========   \${VERSION}"
                }
            }
        }
    }
}

shell

jdk_1.8scp.sh

#!/bin/bash

PROJECT=$1
VERSION=$2
SERVER_LIST=$3
ENV=$4

echo "开始打包 ${PROJECT} ${VERSION}"

# 打包项目
tar -czf ${VERSION}${PROJECT}.tar.gz .

# 传输到服务器列表中的每个服务器
for server in $(echo ${SERVER_LIST} | tr ',' ' '); do
    echo "传输到 ${server}..."

    # 使用 ssh 命令检查目标目录是否存在,不存在则创建目录
    ssh root@${server} << EOF
        if [ ! -d "/deploy/app/${ENV}/${PROJECT}/bak" ]; then
            mkdir -p /deploy/app/${ENV}/${PROJECT}/bak
        fi
        if [ ! -d "/deploy/app/${ENV}/${PROJECT}/build" ]; then
            mkdir -p /deploy/app/${ENV}/${PROJECT}/build
        fi
        if [ ! -d "/deploy/app/${ENV}/${PROJECT}/run" ]; then
            mkdir -p /deploy/app/${ENV}/${PROJECT}/run
        fi
EOF

    # 检查目录是否成功创建,如果创建失败则报错并退出
    if [ $? -ne 0 ]; then
        echo "无法在 ${server} 上创建目录 /deploy/app/${ENV}/${PROJECT}/bak 或 /deploy/app/${ENV}/${PROJECT}/build 或 /deploy/app/${ENV}/${PROJECT}/run"
        exit 1
    fi

    # 传输文件到目标服务器的目录
    scp ${VERSION}${PROJECT}.tar.gz root@${server}:/deploy/app/${ENV}/${PROJECT}/bak/

    # 在目标服务器上解压文件并执行 Maven 构建
    ssh root@${server} << EOF
        tar -xzf /deploy/app/${ENV}/${PROJECT}/bak/${VERSION}${PROJECT}.tar.gz -C /deploy/app/${ENV}/${PROJECT}/build
        cd /deploy/app/${ENV}/${PROJECT}/build && mvn install
EOF

    # 检查 Maven 构建结果并记录日志
    if [ $? -eq 0 ]; then
        echo "在 ${server} 上执行 Maven 构建成功."
    else
        echo "在 ${server} 上执行 Maven 构建失败."
        # 可添加额外的处理逻辑,如退出脚本或记录错误
    fi

    # 备份最近10份,超过就删除掉
    ssh root@${server} << EOF
        cd /deploy/app/${ENV}/${PROJECT}/bak
        files=(\$(ls -t))
        file_count=\${#files[@]}
        if [ \$file_count -gt 10 ]; then
            files_to_delete=\${files[@]:10}
            for file in \${files_to_delete}; do
                rm -f \$file
            done
        fi
EOF

    # 清空并移动 target 发布文件
    ssh root@${server} << EOF
        rm -rf /deploy/app/${ENV}/${PROJECT}/run/*.jar
        mv /deploy/app/${ENV}/${PROJECT}/build/target/${PROJECT}.jar /deploy/app/${ENV}/${PROJECT}/run/
        rm -rf /deploy/app/${ENV}/${PROJECT}/build/*
EOF

    # 使用 supervisor 启动应用程序
    ssh root@${server} << EOF
        supervisorctl status
        supervisorctl restart single-enroll
        sleep 10
        supervisorctl status
EOF
done

# 删除本服务器目录下文件(请谨慎执行)
rm -rf /var/lib/docker/jenkins2/workspace/zou-edu-api-prod/single-enroll/*

echo "打包和传输完成"

jenkins密钥反编译

密钥为

{AQAAABAAAAAgXontB+gAfa94Z2bn/64aYbsS9MxCEIYZq+h1DQcmTugt45nvAOq5l1TigGA}

去jenkins—系统管理-终端-执行代码—-反编译代码为

import hudson.util.Secret

// 替换为从 hudson.util.Secret 文件中提取的加密字符串
def encryptedString = '{AQAAABAAAAAgXontB+gAfa94Z2bn/64aYbsS9MxCEIYZq+h1DQcmTugt45nvAOq5l1TigGA}'

// 解密密钥字符串
def decryptedString = Secret.fromString(encryptedString).getPlainText()

// 打印解密后的字符串
println("Decrypted String: " + decryptedString)

build-api.sh

#!/bin/bash

SERVER_LIST=$1
VERSION=$2
PROJECT=$3
JAR_PATH=$4
ENV=$5
BAK_DIR="/deploy/app/${ENV}/bak/${PROJECT}/"


publish(){

         if [ -f "${JAR_PATH}/${PROJECT}.jar" ]; then
               echo 'jar包文件存在,执行发布流程'

           #发送jar包到节点服务器
           scp ${JAR_PATH}/${PROJECT}.jar root@$1:/deploy/app/${ENV}/jar
               scp ${JAR_PATH}/${PROJECT}.jar root@$1:/deploy/app/${ENV}/bak/${PROJECT}/${PROJECT}-${VERSION}.jar              
ssh -T $1 << EOF

             echo '=====在【'$1'】节点执行更新操作======'
             supervisorctl restart ${PROJECT}

         if [ ! -d  "${BAK_DIR}"  ]; then
             echo '无对应备份目录...执行创建操作,发布失败'
                 mkdir -p ${BAK_DIR}
                 exit 1 
         else
                   cd ${BAK_DIR}
               echo '保留10个最新的备份'
               find ${BAK_DIR} -type f -printf '%T@ %p\n' | sort -nr | tail -n +11 | cut -d' ' -f2- | xargs rm -rf
      fi
        exit
EOF
            else
               echo 'jar包文件不存在'
         fi
}
IFS=","
arr=($SERVER_LIST)
for server_ip in ${SERVER_LIST[@]}
do
  publish $server_ip
done

build-web.sh

#!/bin/bash

SERVER_LIST=$1
VERSION=$2
PROJECT=$3
STATIC_PATH=$4
ENV=$5
BAK_DIR="/deploy/app/${PROJECT}/bak/"
publish(){

         if [ -f "${STATIC_PATH}/${PROJECT}.tar.gz" ]; then
               echo '静态资源包文件存在,执行发布流程'

           #发送包到节点服务器
           scp ${STATIC_PATH}/${PROJECT}.tar.gz root@$1:/deploy/app/${PROJECT}/bak/${PROJECT}-${VERSION}.tar.gz

ssh -T $1 << EOF

             echo '=====在【'$1'】节点执行更新操作======'

         if [ ! -d  "${BAK_DIR}"  ]; then
             echo '无对应备份目录...执行创建操作,发布未成功'
                 mkdir -p ${BAK_DIR}
                 exit 1
         else
                   cd ${BAK_DIR}
                   tar -zxf ${PROJECT}-${VERSION}.tar.gz

                   rm -rf ../dist
                   mv ./dist ../  

               echo '保留10个最新的备份'
               find ${BAK_DIR} -type f -printf '%T@ %p\n' | sort -nr | tail -n +11 | cut -d' ' -f2- | xargs rm -rf
      fi
        exit
EOF
            else
               echo '静态文件包包文件不存在'
         fi
}
IFS=","
arr=($SERVER_LIST)
for server_ip in ${SERVER_LIST[@]}
do
  publish $server_ip
done