Jenkins 自动获取分支 和 回滚

获取分支

在这里插入图片描述
在这里插入图片描述
这个是保存的构建记录个数以及保存时间长久
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

结果

首次

第一次运行会显示默认的分支 会提示没有权限什么的,不用管! 运行到能从远程拉下来代码的时候就能显示所有分支了
在这里插入图片描述
分支列表太多可以过滤
在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值