前言:运维工作免不了脚本或者部署包的输出,当需求变更需要更新文件后就需要输出新的文件包,提供出去的时候版本的定义就显得非常重要(就曾因为这个给自己挖过坑😅),避免因为老旧脚本或者部署包混用导致非必要的问题排查。为此自己写了一个专门打包的脚本,基本涉及到打包的场景都能通用。
先看执行效果:
只要输入较上个版本的更新类型,以及更新说明信息即可自动打包;
[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日 正在加班,共勉!