Skip to content

Commit 5faa207

Browse files
committed
fix
1 parent fd0f7eb commit 5faa207

2 files changed

Lines changed: 72 additions & 36 deletions

File tree

ci_scripts/ci_post_clone.sh

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,49 @@
11
#!/bin/bash
22

3-
# ============================================================
4-
# 腳本位置:專案目錄/ci_scripts/ci_post_clone.sh
5-
# 目的:動態抓取專案資訊、精準比對 Git 區間並通知 Discord
6-
# ============================================================
7-
8-
# 1. 配置 Webhook (請確認網址正確)
3+
# 1. 配置
94
DISCORD_WEBHOOK="https://discord.com/api/webhooks/1494864601500618783/ubSTg2Y_uS_pKvjTKSRHWm8vaBkO8Y4bvunh07l9EQUQqp_daQWX-CYtwaXGiQEru3ZF"
105

11-
# 2. 處理 Xcode Cloud 的 Shallow Clone 問題
6+
# 2. 處理淺層複製
127
if [ -f "$(git rev-parse --git-dir)/shallow" ]; then
13-
echo "🏗️ 偵測到淺層複製,正在解開以獲取完整歷史..."
148
git fetch --unshallow --tags
159
else
16-
echo "✅ 環境已具備完整歷史,僅同步最新 Tag。"
1710
git fetch --tags
1811
fi
1912

20-
# 3. 獲取專案資訊 (動態抓取)
21-
# 自動從 Project 設定中抓取產品名稱
22-
DYNAMIC_PROJECT_NAME=$(xcodebuild -showBuildSettings | grep " PRODUCT_NAME " | head -1 | awk -F '=' '{print $2}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
23-
[ -z "$DYNAMIC_PROJECT_NAME" ] && DYNAMIC_PROJECT_NAME="iOS Project"
13+
# 3. 獲取專案資訊 (優先使用 CI 內建變數,抓不到再用 xcodebuild)
14+
# CI_XCODE_SCHEME 或 CI_XCODE_PROJECT 是 Xcode Cloud 必備的
15+
DYNAMIC_PROJECT_NAME=${CI_XCODE_SCHEME:-${CI_XCODE_PROJECT:-"NES_EMU"}}
2416

25-
# 4. 獲取版本與 Git 區間資訊
17+
# 4. 獲取版本資訊
2618
CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
2719
BASE_VERSION=$(echo "$CURRENT_TAG" | sed -E 's/Build_v//; s/v\.//; s/\(.*\)//')
2820
BUILD_NUM=${CI_BUILD_NUMBER:-"Local"}
2921
DISPLAY_VERSION="v${BASE_VERSION} (Build ${BUILD_NUM})"
3022

31-
# 決定比對區間
32-
START_COMMIT=${CI_PREVIOUS_COMMIT:-"${CURRENT_TAG}^"}
23+
# 5. Git 比對區間 (強化版:增加保底顯示)
24+
# 使用 CI_COMMIT 變數,這是 Xcode Cloud 保證提供的
25+
START_COMMIT=${CI_PREVIOUS_COMMIT}
3326
END_COMMIT=${CI_COMMIT:-"HEAD"}
3427

35-
# 擷取短 Commit ID 供 Discord 顯示
36-
START_SHORT=$(git rev-parse --short $START_COMMIT 2>/dev/null || echo "N/A")
37-
END_SHORT=$(git rev-parse --short $END_COMMIT 2>/dev/null || echo "HEAD")
28+
# 擷取短雜湊,如果 START 為空則顯示 "First Build"
29+
if [ -n "$START_COMMIT" ]; then
30+
START_SHORT=$(git rev-parse --short "$START_COMMIT" 2>/dev/null || echo "Start")
31+
else
32+
START_SHORT="First"
33+
fi
34+
END_SHORT=$(git rev-parse --short "$END_COMMIT" 2>/dev/null || echo "HEAD")
35+
RANGE_TEXT="$START_SHORT...$END_SHORT"
3836

39-
# 5. 擷取 Changelog (Merge 嚴格模式)
40-
echo "--- 🔍 偵錯資訊開始 ---"
41-
echo "比對區間: $START_SHORT...$END_SHORT"
37+
# 6. 擷取 Changelog
38+
echo "--- 🔍 偵錯資訊 ---"
39+
echo "Range: $RANGE_TEXT"
4240

43-
RAW_LOGS=$(git log "${START_COMMIT}..${END_COMMIT}" --merges --pretty=format:'%s')
41+
if [ -n "$START_COMMIT" ]; then
42+
RAW_LOGS=$(git log "${START_COMMIT}..${END_COMMIT}" --merges --pretty=format:'%s')
43+
else
44+
# 第一次建置時抓最近 5 條 Merge
45+
RAW_LOGS=$(git log -n 5 --merges --pretty=format:'%s')
46+
fi
4447

4548
CHANGELOG=$(echo "$RAW_LOGS" | while read -r line; do
4649
[ -z "$line" ] && continue
@@ -52,21 +55,16 @@ CHANGELOG=$(echo "$RAW_LOGS" | while read -r line; do
5255
fi
5356
done | grep "^•" | sort -u | paste -sd "\n" -)
5457

55-
if [ -z "$CHANGELOG" ]; then
56-
CHANGELOG="無合併更新說明 (本次可能為直接提交或針對同一 Commit 重複打包)"
57-
fi
58+
[ -z "$CHANGELOG" ] && CHANGELOG="無合併更新說明 (本次可能為直接提交或針對同一 Commit 重複打包)"
5859

59-
# 將 Changelog 存入暫存檔供後續 ci_post_xcodebuild.sh 使用
60+
# 存入暫存檔給 post_xcodebuild 用
6061
echo "$CHANGELOG" > /tmp/final_changelog.txt
61-
echo "--- 🔍 偵錯資訊結束 ---"
62-
63-
# 6. 使用暫存檔模式組裝 JSON 並發送
64-
PAYLOAD_PATH="/tmp/discord_payload.json"
6562

63+
# 7. 組裝並發送
6664
export PY_NAME="$DYNAMIC_PROJECT_NAME"
6765
export PY_TAG="$CURRENT_TAG"
6866
export PY_VERSION="$DISPLAY_VERSION"
69-
export PY_RANGE="$START_SHORT...$END_SHORT"
67+
export PY_RANGE="$RANGE_TEXT"
7068
export PY_LOGS="$CHANGELOG"
7169

7270
python3 -c "
@@ -88,10 +86,9 @@ data = {
8886
}]
8987
}
9088
91-
with open('$PAYLOAD_PATH', 'w', encoding='utf-8') as f:
89+
with open('/tmp/payload.json', 'w', encoding='utf-8') as f:
9290
json.dump(data, f, ensure_ascii=False)
9391
"
9492

95-
# 7. 發送通知
96-
curl -s -H "Content-Type: application/json" -X POST -d @"$PAYLOAD_PATH" "$DISCORD_WEBHOOK"
97-
rm -f "$PAYLOAD_PATH"
93+
curl -s -H "Content-Type: application/json" -X POST -d @"/tmp/payload.json" "$DISCORD_WEBHOOK"
94+
rm -f "/tmp/payload.json"

retag.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#!/bin/bash
2+
3+
# ============================================================
4+
# 目的:自動抓取專案 Marketing Version,刪除舊 Tag 並重新推送
5+
# ============================================================
6+
7+
# 1. 自動從專案設定抓取 Marketing Version (例如 1.0.3)
8+
# 我們抓取第一個找到的 MARKETING_VERSION
9+
VERSION=$(xcodebuild -showBuildSettings 2>/dev/null | grep MARKETING_VERSION | head -1 | awk -F '=' '{print $2}' | tr -d ' ')
10+
11+
if [ -z "$VERSION" ]; then
12+
echo "❌ 錯誤:無法從專案設定中抓取到版本號。"
13+
exit 1
14+
fi
15+
16+
# 補上 v 前綴 (例如 v1.0.3)
17+
TAG_NAME="v${VERSION}"
18+
19+
echo "🚀 準備處理版本:$TAG_NAME"
20+
21+
# 2. 刪除遠端 GitHub 上的舊 Tag
22+
echo "🗑️ 正在刪除遠端 Tag: $TAG_NAME..."
23+
git push origin :refs/tags/$TAG_NAME 2>/dev/null
24+
25+
# 3. 刪除本地的舊 Tag
26+
echo "🗑️ 正在刪除本地 Tag: $TAG_NAME..."
27+
git tag -d $TAG_NAME 2>/dev/null
28+
29+
# 4. 在目前的 Commit 重新打上 Tag
30+
echo "🏷️ 正在重新建立 Tag: $TAG_NAME..."
31+
git tag $TAG_NAME
32+
33+
# 5. 推送到遠端
34+
echo "📤 正在推送 Tag 到 GitHub..."
35+
git push origin $TAG_NAME
36+
37+
echo "--------------------------------"
38+
echo "✅ 大功告成!Xcode Cloud 應該已經開始運作了。"
39+
echo "目前版本:$TAG_NAME"

0 commit comments

Comments
 (0)