博客 / 詳情

返回

藍易雲cdn:tomcat版本自動升級腳本

藍易雲CDN:<font color="red">Tomcat版本自動升級腳本</font> 實戰 🚀

先説結論:要在分佈式的藍易雲CDN節點上安全地做 <font color="red">Tomcat自動升級</font>,核心就是四件事:自動發現新版本 → 可回滾備份 → 無交互升級 → 平滑重啓。下面給你一份可直接改造上線的 Bash 腳本,並把每一段命令都拆開講清楚。

説明:示例以 Linux + systemd + /opt/tomcat 目錄結構為前提,適合絕大多數自建 Tomcat 環境。
截至 2025 年 11 月,主流分支中 11.0 最新為 11.0.14,10.1 為 10.1.49,9.0 為 9.0.112,可按業務兼容性選擇分支。(tomcat.apache.org)

一、升級腳本示例(可直接二次改造)

#!/usr/bin/env bash
# 藍易雲 · Tomcat 自動升級腳本(systemd + /opt/tomcat)
# 功能:自動檢測最新版本、備份、下載、切換目錄並重啓服務

set -euo pipefail

# ===== 1. 基本參數配置 =====
TOMCAT_USER="tomcat"
TOMCAT_BASE="/opt/tomcat"            # 運行用軟鏈接,如 /opt/tomcat -> /opt/apache-tomcat-10.1.49
BACKUP_DIR="/opt/backup/tomcat"
TOMCAT_SERVICE="tomcat.service"

# 需要手動配置的部分(請按實際環境修改)
TOMCAT_BASE_URL="官方Tomcat下載根路徑"  # 例如官方鏡像根路徑,務必改成真實地址
TOMCAT_MAJOR="10"                     # 主版本:9 / 10 / 11
TOMCAT_LINE="10.1"                    # 分支:9.0 / 10.1 / 11.0

mkdir -p "$BACKUP_DIR"

# ===== 2. 獲取當前 Tomcat 版本 =====
get_current_version() {
  if [[ -x "$TOMCAT_BASE/bin/version.sh" ]]; then
    "$TOMCAT_BASE/bin/version.sh" 2>/dev/null \
      | awk -F: '/Server version/ {gsub(/[[:space:]]+/, "", $2); print $2}' \
      | sed 's#ApacheTomcat/##'
  else
    echo "unknown"
  fi
}

# ===== 3. 自動解析最新版本號 =====
get_latest_version() {
  curl -fsSL "${TOMCAT_BASE_URL}/tomcat-${TOMCAT_MAJOR}/" \
    | grep -o "v${TOMCAT_LINE}\.[0-9]\+/" \
    | sed -e 's#/$##' -e 's/^v//' \
    | sort -V \
    | tail -n1
}

CURRENT_VERSION=$(get_current_version)
LATEST_VERSION=$(get_latest_version)

# ===== 4. 基本校驗與人工確認 =====
if [[ -z "$LATEST_VERSION" ]]; then
  echo "未能獲取最新版本號,請檢查 TOMCAT_BASE_URL 配置。"
  exit 1
fi

if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]]; then
  echo "當前已經是最新版本:$CURRENT_VERSION"
  exit 0
fi

echo "當前版本:$CURRENT_VERSION"
echo "最新版本:$LATEST_VERSION"
read -rp "確認升級到上述版本?(yes/no) " confirm
if [[ "$confirm" != "yes" ]]; then
  echo "已取消升級。"
  exit 0
fi

# ===== 5. 停止服務並打包備份 =====
echo "停止 Tomcat 服務..."
systemctl stop "$TOMCAT_SERVICE"

BACKUP_PATH="${BACKUP_DIR}/tomcat-${CURRENT_VERSION}-$(date +%Y%m%d%H%M%S).tar.gz"
echo "備份當前版本到:$BACKUP_PATH"
tar -czf "$BACKUP_PATH" -C "$(dirname "$TOMCAT_BASE")" "$(basename "$TOMCAT_BASE")"

# ===== 6. 下載並解壓新版本 =====
DOWNLOAD_DIR="/tmp/tomcat-upgrade"
mkdir -p "$DOWNLOAD_DIR"
cd "$DOWNLOAD_DIR"

TAR_NAME="apache-tomcat-${LATEST_VERSION}.tar.gz"
echo "下載新版本歸檔:$TAR_NAME"
curl -fSL "${TOMCAT_BASE_URL}/tomcat-${TOMCAT_MAJOR}/v${LATEST_VERSION}/bin/${TAR_NAME}" -o "$TAR_NAME"

echo "解壓新版本..."
tar -xzf "$TAR_NAME" -C "$(dirname "$TOMCAT_BASE")"

NEW_DIR="$(dirname "$TOMCAT_BASE")/apache-tomcat-${LATEST_VERSION}"

# ===== 7. 遷移配置並切換軟鏈接 =====
echo "遷移配置文件(保留 conf,避免覆蓋 webapps)..."
rsync -a --exclude='webapps/*' "${TOMCAT_BASE}/conf/" "${NEW_DIR}/conf/"

echo "切換軟鏈接到新版本..."
ln -sfn "$NEW_DIR" "$TOMCAT_BASE"
chown -R "$TOMCAT_USER":"$TOMCAT_USER" "$NEW_DIR"

# ===== 8. 啓動新版本並結束 =====
echo "啓動 Tomcat 服務..."
systemctl start "$TOMCAT_SERVICE"

echo "✅ 升級完成,當前運行版本:$LATEST_VERSION"

二、每一段命令的詳細解釋 🧩

  1. 腳本頭與安全選項

    • #!/usr/bin/env bash:指定使用系統中的 Bash 解釋器,保證在不同發行版上都能正確調用。
    • set -euo pipefail

      • <font color="red">-e</font>:任意命令出錯立即退出,避免半升級狀態;
      • <font color="red">-u</font>:使用未定義變量會報錯,防止拼錯變量名;
      • <font color="red">pipefail</font>:管道中任一命令失敗都會導致整體失敗,提升腳本可靠性。
  2. 基礎變量配置段

    • TOMCAT_USER:運行 Tomcat 的系統用户,升級完成後用來統一 chown 權限。
    • TOMCAT_BASE:對外統一的運行目錄(建議是軟鏈接),升級時只改軟鏈接指向即可,方便回滾。
    • BACKUP_DIR:備份存放目錄,按時間戳歸檔,確保升級失敗可回退。
    • TOMCAT_BASE_URL / TOMCAT_MAJOR / TOMCAT_LINE

      • 通過 <font color="red">主版本 + 分支</font> 控制升級範圍,例如鎖定在 10.1 分支而不是盲目跨大版本;
      • TOMCAT_BASE_URL 必須替換為真實的官方下載根路徑,否則 curl 無法獲取版本列表。
  3. get_current_version:獲取當前版本號

    • 調用 $TOMCAT_BASE/bin/version.sh:這是官方提供的版本腳本,輸出包含 Server version: Apache Tomcat/10.1.49
    • awk -F::按冒號分隔,取右側版本字符串,並用 gsub 去除多餘空格。
    • sed 's#ApacheTomcat/##':去掉固定前綴,只保留形如 10.1.49 的版本號,方便與遠端比較。
    • 若腳本不存在或不可執行,返回 unknown,避免腳本在舊環境直接崩潰。
  4. get_latest_version:自動解析最新版本號

    • curl -fsSL "${TOMCAT_BASE_URL}/tomcat-${TOMCAT_MAJOR}/"

      • <font color="red">-f</font>:HTTP 失敗時直接報錯;
      • <font color="red">-sS</font>:保持安靜但保留關鍵錯誤;
      • <font color="red">-L</font>:按需跟隨重定向。
    • grep -o "v${TOMCAT_LINE}\.[0-9]\+/":從目錄索引中提取所有匹配 v10.1.xx/ 這種形式的子目錄。
    • sed 去掉前綴 v 和尾部 /,只剩 10.1.xx
    • sort -V | tail -n1:按版本號排序,取最大值,即當前分支的 <font color="red">最新版本</font>。
  5. 版本比較與人工確認段

    • LATEST_VERSION 為空,説明下載根路徑、網絡或頁面結構異常,腳本直接退出,避免錯誤升級。
    • 當前版本與最新版本相等時直接結束,避免重複下載。
    • 使用 read -rp 強制確認,只接受 yes 才繼續,這一步是給生產環境留出的<font color="red">人工擋板</font>。
  6. 停服與備份段

    • systemctl stop "$TOMCAT_SERVICE":通過 systemd 停止 Tomcat,保證端口釋放,避免文件被佔用。
    • BACKUP_PATH=...$(date +%Y%m%d%H%M%S):備份文件名帶時間戳,支持多次升級留存歷史版本。
    • tar -czf ... -C "$(dirname "$TOMCAT_BASE")" "$(basename "$TOMCAT_BASE")"

      • -C 切換到上級目錄再打包,可以把軟鏈接指向的整個目錄打進壓縮包;
      • -czf 生成壓縮的 .tar.gz,方便長期歸檔與快速恢復。
  7. 下載與解壓新版本段

    • 使用臨時目錄 /tmp/tomcat-upgrade,避免把安裝目錄弄得很亂。
    • TAR_NAME="apache-tomcat-${LATEST_VERSION}.tar.gz":按官方命名規則構造文件名。
    • curl -fSL "${TOMCAT_BASE_URL}/tomcat-${TOMCAT_MAJOR}/v${LATEST_VERSION}/bin/${TAR_NAME}"

      • 路徑中使用 v${LATEST_VERSION},確保定位到對應版本的 bin 目錄;
      • <font color="red">-f</font> 保證下載失敗時腳本立刻退出,不會用到半截文件。
    • tar -xzf 解壓到 TOMCAT_BASE 的上級目錄,形成形如 apache-tomcat-10.1.49 的新目錄。
  8. 遷移配置與切換軟鏈接段

    • NEW_DIR="$(dirname "$TOMCAT_BASE")/apache-tomcat-${LATEST_VERSION}":構造新版本的目錄路徑。
    • rsync -a --exclude='webapps/*' "${TOMCAT_BASE}/conf/" "${NEW_DIR}/conf/"

      • 只同步 <font color="red">conf 配置</font>,不覆蓋 webapps,防止業務應用被誤刪;
      • -a 保留權限、時間戳等元數據。
    • ln -sfn "$NEW_DIR" "$TOMCAT_BASE"

      • -s 創建軟鏈接;
      • -f 強制覆蓋舊鏈接;
      • -n 避免把已存在的目錄當作目標目錄嵌套。
    • chown -R "$TOMCAT_USER":"$TOMCAT_USER" "$NEW_DIR":統一權限,防止因屬主不當導致啓動失敗。
  9. 啓動新版本段

    • systemctl start "$TOMCAT_SERVICE":重新啓動服務。
    • 最後輸出當前運行版本號,方便在流水線、監控系統中抓取。

三、Tomcat 自動升級流程説明表(支持 Markdown / vditor) 📊

步驟 操作説明 關鍵點
1 讀取當前 Tomcat 版本 調用 version.sh,解析出 <font color="red">當前版本號</font>
2 抓取遠端目錄並解析最新版本 通過 curl + grep + sort -V 得到 <font color="red">最新版本號</font>
3 比對版本並人工二次確認 避免誤升錯版本或跨大版本升級
4 停止服務並打包備份 systemctl stop + tar,確保可快速回滾
5 下載並解壓新版本 下載 apache-tomcat-X.Y.Z.tar.gz,解壓到統一父目錄
6 同步配置並切換軟鏈接 rsync 保留配置,ln -sfn 原子切換運行目錄
7 啓動新版本並驗證 systemctl start,按需結合健康檢查和監控告警

四、落地到藍易雲節點的實戰建議 ⚙️

  1. 建議分批灰度:優先在非核心節點或預生產環境跑這套腳本,確認應用兼容 Jakarta 包名變化後,再全量鋪開。
  2. 結合定時任務:可用 cron 在低峯時段執行,或者接入自己的運維平台,由平台觸發 <font color="red">自動升級</font>
  3. 配合監控與回滾策略

    • 監控端口、HTTP 狀態碼和 GC 情況;
    • 一旦發現異常,可直接解壓對應備份包,並恢復軟鏈接指向,實現 <font color="red">一鍵回滾</font>。

這樣一套腳本 + 規範流程,對你現在的藍易雲 CDN 節點集羣來説,就是一個可複製、可度量、可回滾的 Tomcat 標準升級方案 👍

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.