Files
customer-im-client-dev/scripts/publish_sdk.sh
ethan 92f4632ee2 Update:
1.SDK開發流程說明 ReadMe.md
2.主項目開發流程說明
3.新增Sdk發布腳本
4.新增repo鏈結/取消鏈結指令
2026-03-10 15:46:27 +08:00

119 lines
4.2 KiB
Bash
Executable File
Raw 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 發布腳本 (僅限 main 分支使用)
# 用法: ./scripts/publish_sdk.sh <sdk-name> <version>
# 此腳本執行後的行為說明:
# 1.強制分支檢查:如果當前不是 main 分支,腳本會立即報錯終止。
# 2.版本一致性檢查:它會讀取 packages/xxx/pubspec.yaml 裡面的 version 欄位。如果你輸入的參數是 1.1.0 但檔案裡寫的是 1.0.9,腳本會拒絕執行。這強制要求你必須在 PR 階段就正確更新版本號。
# 3.同步檢查:它會檢查本地的 main 是否與遠端的 origin/main 一致。這防止你在忘記 git pull 的情況下把 Tag 打在舊的 Commit 上。
# 4.防重複檢查:如果該 Tag 名稱(例如 networks_sdk/1.1.0)已經存在,腳本會報錯,防止覆蓋發布。
# 5.不修改檔案:此腳本不會修改任何代碼,它只負責「蓋章(打 Tag」和「公告Push Tag」。
#操作流程:
# 1.開發:在功能分支開發,手動更新 pubspec.yaml 的版本號。
# 2.審核:提交 PR通過測試與 Code Review合併進入 main 分支。
# 3.發布:
# •git checkout main
# •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 1.0.0"
exit 1
fi
SDK_NAME=$1
VERSION=$2
PACKAGE_DIR="packages/$SDK_NAME"
TAG_NAME="${SDK_NAME}/${VERSION}"
# 1. 檢查是否在 main 分支
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" != "main" ]; then
echo -e "${RED}錯誤: 此腳本只能在 'main' 分支執行。${NC}"
echo "當前分支為: $CURRENT_BRANCH"
echo "請先合併 PR 並切換至 main 分支後再執行。"
exit 1
fi
# 2. 檢查 SDK 目錄與 pubspec.yaml
if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then
echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}"
exit 1
fi
# 3. 檢查 pubspec.yaml 內部的版本號是否已經正確更新
# 這是為了確保開發者在 PR 時已經手動改好了版本號
FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //')
if [ "$FILE_VERSION" != "$VERSION" ]; then
echo -e "${RED}錯誤: 版本號不匹配!${NC}"
echo "參數輸入的版本為: $VERSION"
echo "pubspec.yaml 內的版本為: $FILE_VERSION"
echo "請確保已在 PR 中更新了 pubspec.yaml 的版本號並已合併。"
exit 1
fi
# 4. 檢查遠端是否有更新 (確保本地 main 是最新的)
echo -e "${CYAN}正在檢查遠端狀態...${NC}"
git fetch origin
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/main)
if [ "$LOCAL" != "$REMOTE" ]; then
echo -e "${RED}錯誤: 本地 main 分支落後於遠端,請先執行 git pull。${NC}"
exit 1
fi
# 5. 檢查 Tag 是否已存在
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo -e "${RED}錯誤: Tag '$TAG_NAME' 已經存在。${NC}"
exit 1
fi
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}SDK 正式發布 (Git Tag Only)${NC}"
echo -e "${GREEN}========================================${NC}"
echo "SDK Name: $SDK_NAME"
echo "Version: $VERSION"
echo "Tag: $TAG_NAME"
echo "Branch: main"
echo -e "${GREEN}========================================${NC}"
# 確認訊息
echo -e "${YELLOW}警告:這將會為當前 commit 創建並推送一個正式的 Tag。${NC}"
read -p "確定要發布 $TAG_NAME? (y/n): " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo "已取消發布"
exit 0
fi
# Step 1: Create Tag
echo ""
echo -e "${GREEN}[1/2] 創建本地 Git Tag...${NC}"
git tag "$TAG_NAME"
# Step 2: Push Tag
echo ""
echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}"
git push origin "$TAG_NAME"
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} Tag 發布成功!${NC}"
echo -e "${GREEN}========================================${NC}"
echo "現在可以在其他項目中使用此版本:"
echo "ref: $TAG_NAME"