11#! /bin/bash
22
3- # ============================================================
4- # 腳本位置:專案目錄/ci_scripts/ci_post_clone.sh
5- # 目的:動態抓取專案資訊、精準比對 Git 區間並通知 Discord
6- # ============================================================
7-
8- # 1. 配置 Webhook (請確認網址正確)
3+ # 1. 配置
94DISCORD_WEBHOOK=" https://discord.com/api/webhooks/1494864601500618783/ubSTg2Y_uS_pKvjTKSRHWm8vaBkO8Y4bvunh07l9EQUQqp_daQWX-CYtwaXGiQEru3ZF"
105
11- # 2. 處理 Xcode Cloud 的 Shallow Clone 問題
6+ # 2. 處理淺層複製
127if [ -f " $( git rev-parse --git-dir) /shallow" ]; then
13- echo " 🏗️ 偵測到淺層複製,正在解開以獲取完整歷史..."
148 git fetch --unshallow --tags
159else
16- echo " ✅ 環境已具備完整歷史,僅同步最新 Tag。"
1710 git fetch --tags
1811fi
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. 獲取版本資訊
2618CURRENT_TAG=$( git describe --tags --abbrev=0 2> /dev/null || echo " v0.0.0" )
2719BASE_VERSION=$( echo " $CURRENT_TAG " | sed -E ' s/Build_v//; s/v\.//; s/\(.*\)//' )
2820BUILD_NUM=${CI_BUILD_NUMBER:- " Local" }
2921DISPLAY_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}
3326END_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
4548CHANGELOG=$( 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
5356done | 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 用
6061echo " $CHANGELOG " > /tmp/final_changelog.txt
61- echo " --- 🔍 偵錯資訊結束 ---"
62-
63- # 6. 使用暫存檔模式組裝 JSON 並發送
64- PAYLOAD_PATH=" /tmp/discord_payload.json"
6562
63+ # 7. 組裝並發送
6664export PY_NAME=" $DYNAMIC_PROJECT_NAME "
6765export PY_TAG=" $CURRENT_TAG "
6866export PY_VERSION=" $DISPLAY_VERSION "
69- export PY_RANGE=" $START_SHORT ... $END_SHORT "
67+ export PY_RANGE=" $RANGE_TEXT "
7068export PY_LOGS=" $CHANGELOG "
7169
7270python3 -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"
0 commit comments