批量替换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"