Merge pull request 'Update:修正publish腳本' (#22) from ethan/sdk/script/update_publish_script into dev
Reviewed-on: https://gitea.winwayinfo.com/CUS-IM/customer-im-client/pulls/22
This commit is contained in:
@@ -10,7 +10,5 @@ IDE開啟主項目project:
|
|||||||
|
|
||||||
## 每次pull/fetch後:
|
## 每次pull/fetch後:
|
||||||
|
|
||||||
1. flutter put get
|
如果有新的.g文件引入失敗,可以透過指令生成:
|
||||||
|
melos run gen
|
||||||
2. 如果有新的.g文件引入失敗,可以透過指令生成:
|
|
||||||
melos run gen
|
|
||||||
@@ -7,25 +7,23 @@
|
|||||||
## 操作流程
|
## 操作流程
|
||||||
|
|
||||||
1. **開發**:在功能分支開發,開發完成後手動更新 `pubspec.yaml` 的版本號。
|
1. **開發**:在功能分支開發,開發完成後手動更新 `pubspec.yaml` 的版本號。
|
||||||
2. **審核**:提交 PR,通過測試與 Code Review,合併進入 `main` 分支。
|
2. **審核**:提交 PR,通過測試與 Code Review,合併進入 `dev` 分支。
|
||||||
3. **發布**:
|
3. **發布**:
|
||||||
* `git checkout main`
|
* 執行 `melos run publish:sdk -- <sdk-name> <version>`
|
||||||
* `git pull`
|
* **範例**:`melos run publish:sdk -- networks_sdk v1.1.0`
|
||||||
* 執行 `melos run publish:sdk:only -- <sdk-name> <version>`
|
|
||||||
* **範例**:`melos run publish:sdk:only -- networks_sdk 1.1.0`
|
|
||||||
4. **完成**:Tag 已推送到遠端,其他專案可以引用該 Tag。
|
4. **完成**:Tag 已推送到遠端,其他專案可以引用該 Tag。
|
||||||
|
|
||||||
## 特殊情況
|
## 特殊情況
|
||||||
在一些緊急情況,或是特別難單獨在sdk解決的問題,必須跟主項目一起操作才能重現時,
|
在一些緊急情況,或是特別難單獨在sdk解決的問題,必須跟主項目一起操作才能重現時,
|
||||||
可以透過指令執行:
|
可以透過指令執行:
|
||||||
melos bootstrap:dev
|
melos bootstrap:dev
|
||||||
|
|
||||||
執行後會產生一個 pubspec.overrides.yaml 的檔案,會自動鏈結所有項目強制讀取這個yaml
|
執行後會產生一個 pubspec.overrides.yaml 的檔案,會自動鏈結所有項目強制讀取這個yaml
|
||||||
此時主項目中pubspec.yaml的sdk標籤引用會失效,會直接讀取sdk本地內容,可以幫助解決問題。
|
此時主項目中pubspec.yaml的sdk標籤引用會失效,會直接讀取sdk本地內容,可以幫助解決問題。
|
||||||
|
|
||||||
## 注意
|
## 注意
|
||||||
如果使用特殊情況開發,開發完後,必須遵守:
|
如果使用特殊情況開發,開發完後,必須遵守:
|
||||||
1. 執行 melos clean 刪除pubspec.overrides.yaml 的檔案(不可提交到gitea)
|
1. 執行 melos bootstrap:clean 刪除pubspec.overrides.yaml 的檔案(不可提交到gitea)
|
||||||
2. 一樣必須走開發流程,不可主項目修改程式與sdk修改提交到同個commit。
|
2. 一樣必須走開發流程,不可主項目修改程式與sdk修改提交到同個commit。
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ melos:
|
|||||||
run: bash scripts/remove_sdk.sh
|
run: bash scripts/remove_sdk.sh
|
||||||
|
|
||||||
publish:sdk:
|
publish:sdk:
|
||||||
description: "發布 SDK 並更新主項目依賴. Usage: melos run publish:sdk -- <sdk-name> <version>"
|
description: "發布 SDK. Usage: melos run publish:sdk -- <sdk-name> <version>"
|
||||||
run: bash scripts/release_sdk.sh $MELOS_ARG_1 $MELOS_ARG_2
|
run: bash scripts/publish_sdk.sh
|
||||||
|
|
||||||
bootstrap:dev:
|
bootstrap:dev:
|
||||||
description: "本地開發模式: 鏈接所有 SDK 到主項目 (melos bootstrap)"
|
description: "本地開發模式: 鏈接所有 SDK 到主項目 (melos bootstrap)"
|
||||||
|
|||||||
@@ -20,9 +20,10 @@
|
|||||||
# melos run publish:sdk:only -- networks_sdk 1.1.0
|
# melos run publish:sdk:only -- networks_sdk 1.1.0
|
||||||
#
|
#
|
||||||
# 4.完成:Tag 已推送到遠端,其他專案可以引用該 Tag。
|
# 4.完成:Tag 已推送到遠端,其他專案可以引用該 Tag。
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# 顏色定義
|
# 顏色
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
@@ -32,7 +33,7 @@ NC='\033[0m'
|
|||||||
# 檢查參數
|
# 檢查參數
|
||||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||||
echo -e "${RED}用法: $0 <sdk-name> <version>${NC}"
|
echo -e "${RED}用法: $0 <sdk-name> <version>${NC}"
|
||||||
echo "例如: $0 networks_sdk 1.0.0"
|
echo "例如: $0 networks_sdk v0.0.1"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -41,79 +42,97 @@ VERSION=$2
|
|||||||
PACKAGE_DIR="packages/$SDK_NAME"
|
PACKAGE_DIR="packages/$SDK_NAME"
|
||||||
TAG_NAME="${SDK_NAME}/${VERSION}"
|
TAG_NAME="${SDK_NAME}/${VERSION}"
|
||||||
|
|
||||||
# 1. 檢查是否在 dev 分支
|
echo ""
|
||||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
echo -e "${CYAN}開始 SDK 發布流程...${NC}"
|
||||||
if [ "$CURRENT_BRANCH" != "dev" ]; then
|
|
||||||
echo -e "${RED}錯誤: 此腳本只能在 'dev' 分支執行。${NC}"
|
# 1. 檢查版本格式 (必須 vX.X.X)
|
||||||
echo "當前分支為: $CURRENT_BRANCH"
|
if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
echo "請先合併 PR 並切換至 dev 分支後再執行。"
|
echo -e "${RED}錯誤: 版本號必須為 vX.X.X 格式${NC}"
|
||||||
|
echo "例如: v1.0.0"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. 檢查 SDK 目錄與 pubspec.yaml
|
# 去掉 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
|
if [ ! -f "$PACKAGE_DIR/pubspec.yaml" ]; then
|
||||||
echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}"
|
echo -e "${RED}錯誤: 找不到 $PACKAGE_DIR/pubspec.yaml${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. 檢查 pubspec.yaml 內部的版本號是否已經正確更新
|
# 5. 讀取 pubspec.yaml 版本
|
||||||
# 這是為了確保開發者在 PR 時已經手動改好了版本號
|
|
||||||
FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //')
|
FILE_VERSION=$(grep "^version: " "$PACKAGE_DIR/pubspec.yaml" | sed 's/version: //')
|
||||||
if [ "$FILE_VERSION" != "$VERSION" ]; then
|
|
||||||
echo -e "${RED}錯誤: 版本號不匹配!${NC}"
|
if [ "$FILE_VERSION" != "$VERSION_NO_V" ]; then
|
||||||
echo "參數輸入的版本為: $VERSION"
|
echo -e "${RED}錯誤: 版本號不匹配${NC}"
|
||||||
echo "pubspec.yaml 內的版本為: $FILE_VERSION"
|
echo "輸入版本(tag): $VERSION"
|
||||||
echo "請確保已在 PR 中更新了 pubspec.yaml 的版本號並已合併。"
|
echo "pubspec.yaml: $FILE_VERSION"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. 檢查遠端是否有更新 (確保本地 dev 是最新的)
|
# 6. 檢查 Tag 是否存在
|
||||||
echo -e "${CYAN}正在檢查遠端狀態...${NC}"
|
|
||||||
git fetch origin
|
|
||||||
LOCAL=$(git rev-parse HEAD)
|
|
||||||
REMOTE=$(git rev-parse origin/dev)
|
|
||||||
if [ "$LOCAL" != "$REMOTE" ]; then
|
|
||||||
echo -e "${RED}錯誤: 本地 dev 分支落後於遠端,請先執行 git pull。${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 5. 檢查 Tag 是否已存在
|
|
||||||
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
|
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
|
||||||
echo -e "${RED}錯誤: Tag '$TAG_NAME' 已經存在。${NC}"
|
echo -e "${RED}錯誤: Tag '$TAG_NAME' 已存在${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
echo -e "${GREEN}========================================${NC}"
|
echo -e "${GREEN}========================================${NC}"
|
||||||
echo -e "${GREEN}SDK 正式發布 (Git Tag Only)${NC}"
|
echo -e "${GREEN}SDK Tag 發布${NC}"
|
||||||
echo -e "${GREEN}========================================${NC}"
|
echo -e "${GREEN}========================================${NC}"
|
||||||
echo "SDK Name: $SDK_NAME"
|
echo "SDK Name: $SDK_NAME"
|
||||||
echo "Version: $VERSION"
|
echo "Version: $VERSION"
|
||||||
echo "Tag: $TAG_NAME"
|
echo "Tag: $TAG_NAME"
|
||||||
echo "Branch: dev"
|
echo "Branch: dev"
|
||||||
|
echo "Commit: $(git rev-parse --short HEAD)"
|
||||||
echo -e "${GREEN}========================================${NC}"
|
echo -e "${GREEN}========================================${NC}"
|
||||||
|
|
||||||
# 確認訊息
|
echo ""
|
||||||
echo -e "${YELLOW}警告:這將會為當前 commit 創建並推送一個正式的 Tag。${NC}"
|
echo -e "${YELLOW}警告:這將會在當前 commit 建立並推送 Git Tag。${NC}"
|
||||||
read -p "確定要發布 $TAG_NAME? (y/n): " confirm
|
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
|
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
|
||||||
echo "已取消發布"
|
echo ""
|
||||||
|
echo -e "${CYAN}發布已取消${NC}"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Step 1: Create Tag
|
# 7. 建立 Tag
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}[1/2] 創建本地 Git Tag...${NC}"
|
echo -e "${GREEN}[1/2] 創建 Git Tag...${NC}"
|
||||||
git tag "$TAG_NAME"
|
git tag "$TAG_NAME"
|
||||||
|
|
||||||
# Step 2: Push Tag
|
# 8. 推送 Tag
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}"
|
echo -e "${GREEN}[2/2] 推送 Tag 到遠端...${NC}"
|
||||||
git push origin "$TAG_NAME"
|
git push --tags --quiet
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}========================================${NC}"
|
echo -e "${GREEN}========================================${NC}"
|
||||||
echo -e "${GREEN} Tag 發布成功!${NC}"
|
echo -e "${GREEN}Tag 發布成功!${NC}"
|
||||||
echo -e "${GREEN}========================================${NC}"
|
echo -e "${GREEN}========================================${NC}"
|
||||||
echo "現在可以在其他項目中使用此版本:"
|
|
||||||
|
echo "現在可以在其他專案使用:"
|
||||||
echo "ref: $TAG_NAME"
|
echo "ref: $TAG_NAME"
|
||||||
Reference in New Issue
Block a user