运维--个人打包脚本分享(Linux)

前言:运维工作免不了脚本或者部署包的输出,当需求变更需要更新文件后就需要输出新的文件包,提供出去的时候版本的定义就显得非常重要(就曾因为这个给自己挖过坑😅),避免因为老旧脚本或者部署包混用导致非必要的问题排查。为此自己写了一个专门打包的脚本,基本涉及到打包的场景都能通用。

先看执行效果:

只要输入较上个版本的更新类型,以及更新说明信息即可自动打包;

[root@localhost] ./tar_pack.sh
[2025-03-22 11:51:03] [INFO] 当前版本: 3.3.7
选择更新类型:
1. 增加文件、项目为大版本
2. 更新、替换其它单文件或者 SQL 文件为次版本
3. 修改现有配置为小版本
0. 特殊情况不增加版本号
请输入 0、1、2 或者 3: 1
[2025-03-22 11:51:05] [INFO] 选择的更新类型: 3
[2025-03-22 11:51:05] [INFO] 更新版本: 3.3.8
请输入更新说明: 1、测试更新后打包;2、打包测试。
[2025-03-22 11:51:11] [INFO] 更新说明已写入 ./versioninfo.txt
即将创建版本为 3.3.8 的压缩包:
压缩的文件夹为:./Aproject
压缩包将保存在:./Aproject_version_tar_package
确认要继续吗?(yes/no): yes
[2025-03-22 11:32:46] 创建压缩包: Aproject_amd64_V3.3.8.tar.gz 完成!
[2025-03-22 11:32:46] 更新版本文件为: 3.3.8
[2025-03-22 11:32:46] 所有操作完成!

 直接上脚本tar_pack.sh(定义好自己的文件及路径后,可直接使用)

#!/bin/bash
# DeanL

VERSION_FILE="./version.txt"  # 记录版本号信息
BACKUP_DIR="./Aproject_version_tar_package"  # 打包文件存放路径,以及历史版本
LOG_FILE="./pack_log.log"  # 打包日志
PROJECT_DIR="./Aproject"  # 需要压缩的文件夹名称
VERSION_INFO_FILE="./versioninfo.txt"  # 存储版本更新说明信息

log() {
  local level="$1"
  shift
  echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $*" | tee -a "$LOG_FILE"
}

# 读取当前版本
get_current_version() {
  if [ -f "$VERSION_FILE" ]; then
    CURRENT_VERSION=$(cat "$VERSION_FILE")
    log "INFO" "当前版本: $CURRENT_VERSION"
  else
    log "INFO" "版本文件不存在,默认版本 1.0.0"
    CURRENT_VERSION="1.0.0"
  fi
}

# 计算新版本
increment_version() {
  local version=$1
  local new_version
  IFS='.' read -r major minor patch <<< "$version"

  case "$2" in
    1) # 第一位:增加文件、项目为大版本
      major=$((major + 1))
      minor=0
      patch=0
      ;;
    2) # 第二位:更新、替换其它单文件或者 SQL 文件为次版本
      minor=$((minor + 1))
      patch=0
      ;;
    3) # 第三位:修改现有配置为小版本
      patch=$((patch + 1))
      ;;
    0) # 特殊情况不增加版本号
      new_version="$version"
      echo "$new_version"
      return
      ;;
    *) 
      log "ERROR" "无效的版本更新类型"
      exit 1
      ;;
  esac

  new_version="$major.$minor.$patch"
  echo "$new_version"
}

# 确认操作
confirm_action() {
  echo "选择更新类型:"
  echo "1. 增加文件、项目为大版本"
  echo "2. 更新、替换其它单文件或者 SQL 文件为次版本"
  echo "3. 修改现有配置为小版本"
  echo "0. 特殊情况不增加版本号"

  read -p "请输入 0、1、2 或者 3: " choice

  if [[ "$choice" -ge 0 && "$choice" -le 3 ]]; then
    log "INFO" "选择的更新类型: $choice"
    NEW_VERSION=$(increment_version "$CURRENT_VERSION" "$choice")
    log "INFO" "更新版本: $NEW_VERSION"
  else
    log "ERROR" "无效选择,请输入 0、1、2 或 3。"
    exit 1
  fi
}

# 输入更新说明
get_update_description() {
  read -p "请输入更新说明: " update_desc
  echo "版本 $NEW_VERSION 更新说明: $update_desc" >> "$VERSION_INFO_FILE"
  log "INFO" "更新说明已写入 $VERSION_INFO_FILE"
}

# 输出压缩提示
prompt_compression() {
  echo "即将创建版本为 $NEW_VERSION 的压缩包:"
  echo "压缩的文件夹为:$PROJECT_DIR"
  echo "压缩包将保存在:$BACKUP_DIR"
  read -p "确认要继续吗?(yes/no): " confirmation
  if [[ "$confirmation" != "yes" ]]; then
    log "INFO" "操作已取消。"
    exit 1
  fi
}

# 压缩打包文件
create_backup() {
  BACKUP_NAME="Aproject_amd64_V$NEW_VERSION.tar.gz"  # 定义自己打包名字的固定部分

  # 确保 BACKUP_DIR 存在
  mkdir -p "$BACKUP_DIR"

  # 确保 Aproject 目录有效
  if [ ! -d "$PROJECT_DIR" ] || [ -z "$(ls -A "$PROJECT_DIR")" ]; then
    log "ERROR" "目录 $PROJECT_DIR 不存在或为空,无法创建压缩包!"
    exit 1
  fi

  tar -czf "$BACKUP_DIR/$BACKUP_NAME" "$PROJECT_DIR"
  if [ $? -ne 0 ]; then
    log "ERROR" "创建压缩包: $BACKUP_NAME 失败!"
    # 回滚更新说明
    [ -s "$VERSION_INFO_FILE" ] && sed -i "$ d" "$VERSION_INFO_FILE"
    log "INFO" "回滚更新说明"
    exit 1
  fi
  log "INFO" "创建压缩包: $BACKUP_NAME 完成!"
}

# 更新版本文件
update_version_file() {
  touch "$VERSION_FILE"
  echo "$NEW_VERSION" > "$VERSION_FILE"
  log "INFO" "更新版本文件为: $NEW_VERSION"
}

# 种种情况,意料之外
trap 'log "ERROR" "脚本执行失败!"; exit 1' ERR

# 执行
get_current_version
confirm_action
get_update_description  # 获取更新说明并写入 versioninfo.txt
prompt_compression  # 在压缩之前提示确认
create_backup
update_version_file

log "INFO" "打包完成!"

2025年3月22日 正在加班,共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值