批量替换pom的版本号
Eave
2026.07.09
批量替换pom的版本号
#!/bin/bash
set -e
#set -x
# ================== 参数校验 ==================
usage() {
echo "用法:"
echo " $0 {start|finish} "
echo ""
echo "示例:"
echo " $0 start 2.2.1 20211209 2.2.0"
echo " $0 finish 2.2.1 20211209 2.2.0"
exit 1
}
[[ -z "$TYPE" || -z "$VERSION" || -z "$DATE" || -z "$MASTER_VERSION" ]] && usage
[[ "$TYPE" != "start" && "$TYPE" != "finish" ]] && usage
# ================== 常量定义 ==================
BASE_DIR="/var/lib/git"
PROJECT_FILE="project.txt"
BRANCH="release/release_v${VERSION}_${DATE}"
TAG="release_v${VERSION}_${DATE}"
OLD_VERSION="${MASTER_VERSION}-RELEASE"
NEW_VERSION="${VERSION}-RELEASE"
FILE="pom.xml"
# ================== 项目列表 ==================
mapfile -t PROJECTS < <(sed 's/\r//g' "$PROJECT_FILE" | grep -v '^\s*#' | grep -v '^\s*$')
if [[ ${#PROJECTS[@]} -eq 0 ]]; then
echo -e "\033[31m未读取到任何项目,请检查 $PROJECT_FILE\033[0m"
exit 1
fi
TOTAL=${#PROJECTS[@]}
INDEX=0
# ================== Git 工具函数 START ==================
# 安全拉取当前分支最新代码
git_safe_pull() {
git fetch -p
git reset --hard "origin/$(git rev-parse --abbrev-ref HEAD)"
}
# 切换并更新分支
update_branch() {
local branch="$1"
git checkout "$branch"
git_safe_pull
}
# 检查工作区是否有未提交的变更(包括未跟踪文件)
# 返回值:0:工作区干净、1:有未提交的变更
has_uncommitted_changes() {
# git status -s 输出为空说明工作区干净
# count=$(git status -s | wc -l)
# if [ "$count" -gt 0 ]; then
if [[ -n "$(git status -s)" ]]; then
return 1
fi
return 0
}
# 查看未提交文件列表(用于展示)
show_uncommitted_files() {
echo -e "\033[33m未提交文件列表:\033[0m"
git status -s | while read -r line; do
echo "$line"
done
}
# 提交并推送所有本地未提交的变更
commit_and_push_changes() {
local commit_msg="${1:-auto commit}"
echo -e "\033[33m检测到未提交的变更,准备提交...\033[0m"
show_uncommitted_files
git add -A
git commit -m "$commit_msg"
git push
echo -e "\033[32m未提交变更已提交并推送\033[0m"
}
# 检查并修复 pom 版本号
fix_pom_version() {
local SOURCE="${1}"
local TARGET="${2}"
local fixed=0
echo -e "\033[34m检查 pom 版本号是否正确 ($TARGET)...\033[0m"
find . -name "$FILE" -type f | while read -r pom; do
if grep -q "$SOURCE" "$pom"; then
echo "替换pom版本: $pom version: $SOURCE → $TARGET"
sed -i "s/$SOURCE/$TARGET/g" "$pom"
fixed=1
# sed -i 's|<maxHistory>[0-9]\+</maxHistory>|<<maxHistory>>30</maxHistory>|g' "$pom"
fi
done
if [[ $fixed -eq 0 ]]; then
echo -e "\033[32m所有 pom 版本号正确\033[0m"
else
echo -e "\033[32mpom 版本号已修复\033[0m"
fi
}
# ================== Git 工具函数 END ==================
# ================== 主流程 ==================
for project in "${PROJECTS[@]}"; do
INDEX=$((INDEX + 1))
echo -e "\n\033[42m============================== [$INDEX/$TOTAL] $project ==============================\033[0m"
PROJECT_DIR="$BASE_DIR/$project"
if [[ ! -d "$PROJECT_DIR/.git" ]]; then
echo -e "\033[31m $project 不是有效的 Git 仓库,跳过\033[0m"
continue
fi
cd "$PROJECT_DIR"
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
echo -e "\033[32m01. 当前分支: $CURRENT_BRANCH\033[0m"
echo -e "\033[32m02. 更新 master / develop 分支\033[0m"
update_branch develop
update_branch master
BRANCH_EXISTS=$(git branch -a | grep -c "remotes/origin/$BRANCH" || true)
if [[ "$TYPE" == "start" ]]; then
if [[ "$BRANCH_EXISTS" -eq 0 ]]; then
# ===== 分支不存在:新建分支 =====
echo -e "\033[32m03. 新建分支 $BRANCH\033[0m"
git checkout -b "$BRANCH"
echo -e "\033[32m04. 修改 pom 版本: $OLD_VERSION → $NEW_VERSION\033[0m"
fix_pom_version $OLD_VERSION $NEW_VERSION
git add -A
git commit -m "start release ${VERSION}"
git push --set-upstream origin "$BRANCH"
else
# ===== 分支已存在:检查 pom + 检查未提交文件 =====
echo -e "\033[33m 分支 $BRANCH 已存在,检查 pom 版本\033[0m"
git checkout "$BRANCH"
git_safe_pull
# Step1: 检查并修复 pom 版本号
echo -e "\033[32m03. 检查并修复 pom 版本号\033[0m"
fix_pom_version $OLD_VERSION $NEW_VERSION
# Step2: 检查本地是否有未提交的文件
echo -e "\033[32m04. 检查本地是否有未提交的文件\033[0m"
if ! has_uncommitted_changes; then
commit_and_push_changes "fix release ${VERSION}: auto commit uncommitted changes"
else
echo -e "\033[32m 工作区干净,无未提交文件\033[0m"
fi
fi
elif [[ "$TYPE" == "finish" ]]; then
if [[ "$BRANCH_EXISTS" -gt 0 ]]; then
echo -e "\033[32m03. 切换并拉取分支 $BRANCH\033[0m"
git checkout "$BRANCH"
git_safe_pull
echo -e "\033[32m04. 打 Tag: $BRANCH\033[0m"
git tag -a "$TAG" -m "${VERSION}-RELEASE"
git push origin "$TAG"
echo -e "\033[32m05. 合并到 develop\033[0m"
git checkout develop
git merge --no-ff -m "finish release ${VERSION}" "$BRANCH"
git push
echo -e "\033[32m06. 合并到 master\033[0m"
git checkout master
git merge --no-ff -m "finish release ${VERSION}" "$BRANCH"
git push
echo -e "\033[32m07. 删除分支 $BRANCH\033[0m"
git branch -D "$BRANCH"
git push origin --delete "$BRANCH"
else
echo -e "\033[33m 分支 $BRANCH 不存在,跳过\033[0m"
fi
fi
cd "$BASE_DIR"
done
echo -e "\n\033[32m所有项目处理完成\033[0m"