Files
customer-im-client-dev/scripts/publish_sdk.sh
ethan 2f380a7619 Update:
1.修正publish腳本
2026-03-10 18:06:03 +08:00

138 lines
4.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# SDK Tag 發布腳本 (僅限 dev 分支使用)
# 用法: ./scripts/publish_sdk.sh <sdk-name> <version>
# 此腳本執行後的行為說明:
# 1.強制分支檢查:如果當前不是 dev 分支,腳本會立即報錯終止。
# 2.版本一致性檢查:它會讀取 packages/xxx/pubspec.yaml 裡面的 version 欄位。如果你輸入的參數是 1.1.0 但檔案裡寫的是 1.0.9,腳本會拒絕執行。這強制要求你必須在 PR 階段就正確更新版本號。
# 3.同步檢查:它會檢查本地的 dev 是否與遠端的 origin/dev 一致。這防止你在忘記 git pull 的情況下把 Tag 打在舊的 Commit 上。
# 4.防重複檢查:如果該 Tag 名稱(例如 networks_sdk/1.1.0)已經存在,腳本會報錯,防止覆蓋發布。
# 5.不修改檔案:此腳本不會修改任何代碼,它只負責「蓋章(打 Tag」和「公告Push Tag」。
#操作流程:
# 1.開發:在功能分支開發,手動更新 pubspec.yaml 的版本號。
# 2.審核:提交 PR通過測試與 Code Review合併進入 dev 分支。
# 3.發布:
# •git checkout dev
# •git pull
# •執行 melos run publish:sdk:only -- <sdk-name> <version>
# 範例:
# melos run publish:sdk:only -- networks_sdk 1.1.0
#
# 4.完成Tag 已推送到遠端,其他專案可以引用該 Tag。
set -e
# 顏色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
# 檢查參數
if [ -z "$1" ] || [ -z "$2" ]; then
echo -e "${RED}用法: $0 <sdk-name> <version>${NC}"
echo "例如: $0 networks_sdk v0.0.1"
exit 1
fi
SDK_NAME=$1
VERSION=$2
PACKAGE_DIR="packages/$SDK_NAME"
TAG_NAME="${SDK_NAME}/${VERSION}"
echo ""
echo -e "${CYAN}開始 SDK 發布流程...${NC}"
# 1. 檢查版本格式 (必須 vX.X.X)
if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo -e "${RED}錯誤: 版本號必須為 vX.X.X 格式${NC}"
echo "例如: v1.0.0"
exit 1
fi
# 去掉 v 用於與 pubspec.yaml 比對
VERSION_NO_V=${VERSION#v}
# 2. 檢查目前分支
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" != "dev" ]; then
echo -e "${YELLOW}當前分支為 ${CURRENT_BRANCH}${NC}"
echo -e "${CYAN}正在切換到 dev 分支...${NC}"
git checkout dev
fi
# 3. 同步遠端 dev
echo -e "${CYAN}同步遠端 dev 分支...${NC}"
git fetch origin --quiet
echo -e "${CYAN}更新本地 dev...${NC}"
git pull origin dev --quiet
# 4. 檢查 SDK 目錄
if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then
echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}"
exit 1
fi
# 5. 讀取 pubspec.yaml 版本
FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //')
if [ "$FILE_VERSION" != "$VERSION_NO_V" ]; then
echo -e "${RED}錯誤: 版本號不匹配${NC}"
echo "輸入版本(tag): $VERSION"
echo "pubspec.yaml: $FILE_VERSION"
exit 1
fi
# 6. 檢查 Tag 是否存在
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo -e "${RED}錯誤: Tag '$TAG_NAME' 已存在${NC}"
exit 1
fi
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}SDK Tag 發布${NC}"
echo -e "${GREEN}========================================${NC}"
echo "SDK Name: $SDK_NAME"
echo "Version: $VERSION"
echo "Tag: $TAG_NAME"
echo "Branch: dev"
echo "Commit: $(git rev-parse --short HEAD)"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "${YELLOW}警告:這將會在當前 commit 建立並推送 Git Tag。${NC}"
echo -e "${YELLOW}如果確認發布,請輸入 'y' 並按 Enter。${NC}"
echo -e "${YELLOW}輸入其他內容將取消發布。${NC}"
# 重要:從 /dev/tty 讀取,避免 melos 吃掉輸入
echo -n "是否確定發布 $TAG_NAME ? [y/N]: "
read confirm < /dev/tty
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo ""
echo -e "${CYAN}發布已取消${NC}"
exit 0
fi
# 7. 建立 Tag
echo ""
echo -e "${GREEN}[1/2] 創建 Git Tag...${NC}"
git tag "$TAG_NAME"
# 8. 推送 Tag
echo ""
echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}"
git push --tags --quiet
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Tag 發布成功!${NC}"
echo -e "${GREEN}========================================${NC}"
echo "現在可以在其他專案使用:"
echo "ref: $TAG_NAME"