自动获取分支&回滚
获取分支
– 这个是保存的构建记录个数以及保存时间长久
parameters {
gitParameter(
name: 'BRANCH_NAME',
type: 'PT_BRANCH',
defaultValue: 'origin/dev',
description: '选择分支构建',
useRepository: 'xxxxxxxx',
branchFilter: 'origin/(.*)'
)
}
回滚
stage('数据备份') {
steps {
script {
sh "chmod +x /home/.jenkins/rollback/Rollback_base.sh"
sh '/home/.jenkins/rollback/Rollback.sh ${REMOTE_PATH} ${WORKSPACE} ${BUILD_NUMBER} ${TAR_NAME} ${REMOTE_PASSWORD} ${REMOTE_USERNAME} ${REMOTE_HOST} ${PROJECT_PATH}'
}
}
}
stage('部署') {
steps {
script {
echo "开始部署"
if (params.Status == 'Deploy') {
// 发布操作,使用构建生成的压缩包
sh "sshpass -p ${REMOTE_PASSWORD} ssh ${REMOTE_USERNAME}@${REMOTE_HOST} 'tar zvxf ${REMOTE_PATH}/${TAR_NAME} -C ${REMOTE_PATH}/; rm -rf ${REMOTE_PATH}/${TAR_NAME}'"
} else if (params.Status == 'Rollback') {
// 回滚操作,使用备份的压缩包
def TAR_NAME = "build${Version}.tar.gz"
sh "sshpass -p ${REMOTE_PASSWORD} ssh ${REMOTE_USERNAME}@${REMOTE_HOST} 'tar zvxf ${REMOTE_PATH}/${TAR_NAME} -C ${REMOTE_PATH}/; rm -rf ${REMOTE_PATH}/${TAR_NAME}'"
}
}
}
}
脚本
jenkins 流水线脚本
pipeline {
agent any
parameters {
gitParameter(
name: 'BRANCH_NAME',
type: 'PT_BRANCH',
defaultValue: 'origin/dev',
description: '选择分支构建',
useRepository: 'xxxxxx',
branchFilter: 'origin/(.*)'
)
}
environment {
GIT_CREDENTIALS = credentials('凭据Id')
REMOTE_HOST = '服务器'
REMOTE_PORT = '端口号'
REMOTE_USERNAME = '用户名'
REMOTE_PASSWORD = '密码'
REMOTE_PATH = '打包位置'
WORKSPACE = '备份空间位置'
//cusversionall = sh(script: 'date +%Y%m%d%H%M%S', returnStdout: true).trim()
PROJECT_PATH = sh(returnStdout: true, script: 'pwd').trim()
TAR_NAME = "build${BUILD_NUMBER}.tar.gz"
}
stages {
stage('构建') {
steps {
echo "构建分支 ${params.BRANCH_NAME}"
checkout([$class: 'GitSCM', branches: [[name: "${params.BRANCH_NAME}"]], userRemoteConfigs: [[url: 'xxxxx']]])
script {
echo "构建计划名称: ${env.JOB_NAME}"
build_number = "jenkins${BUILD_NUMBER}"
echo "当前构建版本号为: ${build_number}"
PROJECT_NAME = sh(script: 'basename "$(pwd)"', returnStdout: true).trim()
echo "项目名: ${PROJECT_NAME}"
}
}
}
stage('安装依赖') {
steps {
script {
echo "开始安装依赖"
sh 'npm i --registry http://mirrors.cloud.tencent.com/npm/'
}
}
}
stage('构建项目') {
steps {
script {
echo "开始构建 base"
sh 'npm run build:dev'
//pwd()
sh 'ls'
}
}
}
stage('开始打包') {
steps {
script {
def cusversionall = sh(script: 'date "+%Y%m%d%H%M%S"', returnStdout: true).trim()
echo "当前时间:${cusversionall}"
echo "开始打包buil.tar.gz"
sh 'cd dist && tar czvf ${TAR_NAME} ./*'
}
}
}
stage('数据备份') {
steps {
script {
// 赋权限
sh "chmod +x Rollback.sh"
// 执行脚本
sh 'Rollback.sh ${REMOTE_PATH} ${WORKSPACE} ${BUILD_NUMBER} ${TAR_NAME} ${REMOTE_PASSWORD} ${REMOTE_USERNAME} ${REMOTE_HOST} ${PROJECT_PATH}'
}
}
}
stage('部署') {
steps {
script {
echo "开始部署"
if (params.Status == 'Deploy') {
// 发布操作,使用构建生成的压缩包
sh "sshpass -p ${REMOTE_PASSWORD} ssh ${REMOTE_USERNAME}@${REMOTE_HOST} 'tar zvxf ${REMOTE_PATH}/${TAR_NAME} -C ${REMOTE_PATH}/; rm -rf ${REMOTE_PATH}/${TAR_NAME}'"
} else if (params.Status == 'Rollback') {
// 回滚操作,使用备份的压缩包
def TAR_NAME = "build${Version}.tar.gz"
sh "sshpass -p ${REMOTE_PASSWORD} ssh ${REMOTE_USERNAME}@${REMOTE_HOST} 'tar zvxf ${REMOTE_PATH}/${TAR_NAME} -C ${REMOTE_PATH}/; rm -rf ${REMOTE_PATH}/${TAR_NAME}'"
}
}
}
}
}
}
Rollback.sh
#!/bin/bash
# 接收变量作为参数
REMOTE_PATH=$1
WORKSPACE=$2
BUILD_NUMBER=$3
TAR_NAME=$4
REMOTE_PASSWORD=$5
REMOTE_USERNAME=$6
REMOTE_HOST=$7
PROJECT_PATH=$8
# 根据不同的状态执行相应的操作
case $Status in
Deploy)
echo "状态:$Status"
path="${WORKSPACE}/backup/${BUILD_NUMBER}" # 创建每次要备份的目录
if [ -d "$path" ]; then
echo "目录已存在"
else
mkdir -p $path
fi
cp -f "${PROJECT_PATH}/dist/${TAR_NAME}" "${path}" # 将打包好的压缩包备份到相应目录,覆盖已存在的目标
echo "备份成功"
rm -rf ${PROJECT_PATH}/${TAR_NAME}
sshpass -p $REMOTE_PASSWORD scp -P$REMOTE_PORT "${path}/${TAR_NAME}" $REMOTE_USERNAME@$REMOTE_HOST:$REMOTE_PATH/$TAR_NAME
;;
Rollback)
echo "开始回滚"
echo "状态:$Status"
echo "版本:$Version"
sshpass -p $REMOTE_PASSWORD ssh $REMOTE_USERNAME@$REMOTE_HOST "cd $REMOTE_PATH && rm -rf *" # 清空远程部署目录
# 将备份文件复制到远程服务器
sshpass -p $REMOTE_PASSWORD scp -P$REMOTE_PORT "${WORKSPACE}/backup/${Version}/build${Version}.tar.gz" "$REMOTE_USERNAME@$REMOTE_HOST:$REMOTE_PATH/"
echo "回滚成功"
;;
*)
exit
;;
esac
ReservedNum=3 # 保留文件数
FileDir=${WORKSPACE}/backup/
date=$(date "+%Y%m%d-%H%M%S")
cd "$FileDir" # 进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l) # 当前有几个文件夹,即几个备份
# 清理多余的备份文件夹
while (( $FileNum > $ReservedNum ))
do
OldFile=$(ls -rt | head -1) # 获取最旧的那个备份文件夹
echo $date "删除多余备份文件:"$OldFile
rm -rf $FileDir/$OldFile
let "FileNum--"
done
结果
第一次运行会显示默认的分支 会提示没有权限什么的,不用管! 运行到能从远程拉下来代码的时候就能显示所有分支了
分支列表太多可以过滤