Skip to content

Instantly share code, notes, and snippets.

@imyelo
Last active April 24, 2022 07:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save imyelo/418145264face5d5caab27e3b714607b to your computer and use it in GitHub Desktop.
Save imyelo/418145264face5d5caab27e3b714607b to your computer and use it in GitHub Desktop.
Deployment Activate Script
#!/bin/bash
# ---
# 部署构件激活脚本
# Author: yelo <zhihuzeye@gmail.com>
# ---
## 项目主目录
PROJECT_DIR=$(pwd)
## 上传目录
UPLOADS_DIR="$PROJECT_DIR/uploads"
## 存档目录
ARCHIVES_DIR="$PROJECT_DIR/archives"
## 入口目录
ENTRIES_DIR="$PROJECT_DIR/entries"
## 构件物压缩包文件名
TAR_FILENAME="dist.tar.gz"
## 构件物压缩包存放路径
TAR_FULLPATH="$UPLOADS_DIR/$TAR_FILENAME"
## 构件物压缩临时目录
UNTAR_TMP_DIR="$PROJECT_DIR/.untar"
## 入口名
if [ -d $ENTRY_NAME ]; then
ENTRY_NAME="current"
fi
## 完整的入口路径
ENTRY_FULLPATH="$ENTRIES_DIR/$ENTRY_NAME"
## 存档名随机后缀的字符范围
ARCHIVE_NAME_SUFFIX_RANDOM_CHARS="a-z0-9"
## 生成版本号
function generate_archive_name() {
echo "$(date '+%Y%m%d_%H%M%S')_$(
LC_CTYPE=C head /dev/urandom | LC_CTYPE=C tr -dc $ARCHIVE_NAME_SUFFIX_RANDOM_CHARS | head -c 11
echo ""
)"
}
## 激活新构件
function activate_upcoming() {
### 版本号 (规则: 日期_时间_随机字符串)
if [ -d $ARCHIVE_NAME ]; then
ARCHIVE_NAME="$(generate_archive_name)"
fi
### 环境检查
if [ ! -f "$TAR_FULLPATH" ]; then
echo -e "\n[ 激活失败 ] 构件物压缩包不存在,期望文件: $TAR_FULLPATH"
exit 1
fi
echo -e "\n[ 准备激活 ] 存档版本号:$ARCHIVE_NAME"
if [ -d "$ARCHIVES_DIR/$ARCHIVE_NAME" ]; then
echo -e "\n[ 激活失败 ] 存档版本已经存在,请重新执行命令"
exit 1
fi
### 准备存档目录
mkdir -p "$ARCHIVES_DIR"
### 准备入口目录
mkdir -p "$ENTRIES_DIR"
### 解压构件
mkdir -p "$UNTAR_TMP_DIR"
tar -zxf "$TAR_FULLPATH" -C "$UNTAR_TMP_DIR"
mv "$UNTAR_TMP_DIR" "$ARCHIVES_DIR/$ARCHIVE_NAME"
echo -e "\n[ 激活中.. ] 解压构件物成功"
### 更新软连接
rm -rf "$ENTRY_FULLPATH"
ln -s "$ARCHIVES_DIR/$ARCHIVE_NAME" "$ENTRY_FULLPATH"
echo -e "\n[ 激活中.. ] 更新软连接成功"
# ### 清理构件物压缩包
rm -rf $PROJECT_DIR/uploads/dist.tar.gz
echo -e "\n[ 激活中.. ] 清理构件物压缩包成功"
### 打印存档信息
echo -e "\n[ 激活中.. ] 最新文件状态:"
cd "$PROJECT_DIR" && echo -e "$PROJECT_DIR/" && tree -L 2
cd "$ENTRY_FULLPATH" && echo -e "$ENTRY_FULLPATH/" && tree
echo -e "\n[ 激活完成 ] 当前使用存档版本号: $ARCHIVE_NAME"
}
## 激活存档
function activate_archive() {
### 版本号
ARCHIVE_NAME="$1"
### 环境检查
if [ ! -n "$ARCHIVE_NAME" ]; then
echo -e "\n[ 激活失败 ] 请指定存档版本号"
exit 1
fi
echo -e "\n[ 准备激活 ] 存档版本号:$ARCHIVE_NAME"
if [ ! -d "$ARCHIVES_DIR/$ARCHIVE_NAME" ]; then
echo -e "\n[ 激活失败 ] 回滚存档版本不存在"
exit 1
fi
### 更新软连接
rm -rf "$ENTRY_FULLPATH"
ln -s "$ARCHIVES_DIR/$ARCHIVE_NAME" "$ENTRY_FULLPATH"
echo -e "\n[ 激活中.. ] 更新软连接成功"
### 打印存档信息
echo -e "\n[ 激活中.. ] 最新文件状态:"
cd "$PROJECT_DIR" && echo -e "$PROJECT_DIR/" && tree -L 2
cd "$ENTRY_FULLPATH" && echo -e "$ENTRY_FULLPATH/" && tree
echo -e "\n[ 激活完成 ] 当前使用存档版本号: $ARCHIVE_NAME"
}
function help() {
echo -e ""
echo -e "Activate.sh\n"
echo -e "> 部署构件激活脚本"
echo -e "> Author: yelo <zhihuzeye@gmail.com>"
echo -e "\n--------------------\n"
echo -e "- 激活新构件 (自动生成存档版本号): ./activate.sh upcoming"
echo -e "- 激活新构件 (使用给定的存档版本号): ARCHIVE_NAME=\"20210202.2\" ./activate.sh upcoming"
echo -e "\n--------------------\n"
echo -e "- 回滚旧存档: ./activate.sh archive ARCHIVE_NAME"
echo -e "- 回滚旧存档至指定入口: ENTRY_NAME=\"dev\" ./activate.sh archive ARCHIVE_NAME"
echo -e "\n--------------------\n"
echo -e "- 生成存档版本号: ./activate.sh generate-archive-name"
echo -e "\n--------------------\n"
echo -e ""
exit
}
if [ "$1" = "upcoming" ]; then
activate_upcoming
exit
fi
if [ "$1" = "archive" ]; then
activate_archive $2
exit
fi
if [ "$1" = "generate-archive-name" ]; then
generate_archive_name
exit
fi
if [ "$1" = "help" ]; then
help
fi
echo -e "\n[ 执行失败 ] 未找到命令。"
echo -e "\n--------------------\n"
help
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment