需求是:实现跨平台批量打包发布
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
评论区