11#! /bin/bash
22
3- # 1. 配置
4- DISCORD_WEBHOOK= " https://discord.com/api/webhooks/1494864601500618783/ubSTg2Y_uS_pKvjTKSRHWm8vaBkO8Y4bvunh07l9EQUQqp_daQWX-CYtwaXGiQEru3ZF "
5-
6- # 2. 處理淺層複製
7- if [ -f " $( git rev-parse --git-dir ) /shallow " ] ; then
8- git fetch --unshallow --tags
9- else
10- git fetch --tags
11- fi
12-
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 " } }
16-
17- # 4. 獲取版本資訊
18- CURRENT_TAG= $( git describe --tags --abbrev=0 2> /dev/null || echo " v0.0.0 " )
19- BASE_VERSION= $( echo " $CURRENT_TAG " | sed -E ' s/Build_v//; s/v\.//; s/\(.*\)// ' )
20- BUILD_NUM= ${CI_BUILD_NUMBER :- " Local " }
21- DISPLAY_VERSION= " v ${BASE_VERSION} (Build ${BUILD_NUM} ) "
22-
23- # 5. Git 比對區間 (強化版:增加保底顯示)
24- # 使用 CI_COMMIT 變數,這是 Xcode Cloud 保證提供的
25- START_COMMIT=${CI_PREVIOUS_COMMIT}
3+ # --- 1. Git & 專案名稱解析 (結構化解析) ---
4+ # (此處省略你已處理好的 unshallow 邏輯)
5+ PROJECT_PATH= $( find .. -name " project.pbxproj " -depth 2 | head -n 1 )
6+ TARGET_NAME= " NES_EMU (iOS) "
7+
8+ # 使用 plutil + Python 獲取名稱
9+ DYNAMIC_PROJECT_NAME= $( plutil -convert json -o - " $PROJECT_PATH " | python3 -c "
10+ import json, sys
11+ data = json.load(sys.stdin)
12+ objects = data.get('objects', {})
13+ for obj in objects.values():
14+ if obj.get('isa') == 'PBXNativeTarget' and obj.get('name') == ' $TARGET_NAME ':
15+ config_list_id = obj.get('buildConfigurationList')
16+ config_list = objects.get(config_list_id, {})
17+ first_config_id = config_list.get('buildConfigurations', [None])[0]
18+ print(objects.get(first_config_id, {}).get('buildSettings', {}).get('PRODUCT_NAME', ' $TARGET_NAME ') )
19+ break
20+ " 2> /dev/null )
21+ [ -z " $DYNAMIC_PROJECT_NAME " ] && DYNAMIC_PROJECT_NAME= " NES_EMU_IOS "
22+
23+ # --- 2. 獲取版本與區間 ---
24+ CURRENT_TAG= $( git describe --tags --abbrev=0 2> /dev/null || echo " 1.0.0 " )
25+ START_COMMIT=${CI_PREVIOUS_COMMIT:- " ${CURRENT_TAG} ^ " }
2626END_COMMIT=${CI_COMMIT:- " HEAD" }
27-
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" )
27+ START_SHORT=$( git rev-parse --short $START_COMMIT 2> /dev/null || echo " Start" )
28+ END_SHORT=$( git rev-parse --short $END_COMMIT 2> /dev/null || echo " End" )
3529RANGE_TEXT=" $START_SHORT ...$END_SHORT "
3630
37- # 6. 擷取 Changelog
38- echo " --- 🔍 偵錯資訊 ---"
39- echo " Range: $RANGE_TEXT "
40-
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
47-
48- CHANGELOG=$( echo " $RAW_LOGS " | while read -r line; do
49- [ -z " $line " ] && continue
50- BRANCH=$( echo " $line " | sed -E " s/Merge branch '(.+)'($| into.*)/\1/; s/Merge pull request #[0-9]+ from .+\/(.+)/\1/" )
51- if [ " $BRANCH " != " $line " ]; then
52- if [[ ! " $BRANCH " =~ ^(release| main| master| develop| Release)/ ]]; then
53- echo " • $BRANCH "
54- fi
55- fi
56- done | grep " ^•" | sort -u | paste -sd " \n" -)
57-
58- [ -z " $CHANGELOG " ] && CHANGELOG=" 無合併更新說明 (本次可能為直接提交或針對同一 Commit 重複打包)"
59-
60- # 存入暫存檔給 post_xcodebuild 用
31+ # --- 3. 儲存所有資訊到暫存檔 ---
32+ echo " $DYNAMIC_PROJECT_NAME " > /tmp/ci_project_name.txt
33+ echo " $CURRENT_TAG " > /tmp/ci_current_tag.txt
34+ echo " $RANGE_TEXT " > /tmp/ci_git_range.txt
35+ # (Changelog 提取邏輯...)
6136echo " $CHANGELOG " > /tmp/final_changelog.txt
6237
63- # 7. 組裝並發送
64- export PY_NAME=" $DYNAMIC_PROJECT_NAME "
65- export PY_TAG=" $CURRENT_TAG "
66- export PY_VERSION=" $DISPLAY_VERSION "
67- export PY_RANGE=" $RANGE_TEXT "
68- export PY_LOGS=" $CHANGELOG "
69-
70- python3 -c "
71- import json, os
72-
73- description = (
74- f'**專案名稱:** {os.environ.get(\" PY_NAME\" )}\n'
75- f'**目前基準 Tag:** {os.environ.get(\" PY_TAG\" )}\n'
76- f'**預計版本:** {os.environ.get(\" PY_VERSION\" )}\n'
77- f'**Git 比對區間:** ` {os.environ.get(\" PY_RANGE\" )}` \n\n'
78- f'**更新說明:**\n{os.environ.get(\" PY_LOGS\" )}'
79- )
80-
81- data = {
82- 'embeds': [{
83- 'title': '🍎 Xcode Cloud 流程啟動 — 準備打包 🏗️',
84- 'color': 3447003,
85- 'description': description
86- }]
87- }
88-
89- with open('/tmp/payload.json', 'w', encoding='utf-8') as f:
90- json.dump(data, f, ensure_ascii=False)
91- "
92-
93- curl -s -H " Content-Type: application/json" -X POST -d @" /tmp/payload.json" " $DISCORD_WEBHOOK "
94- rm -f " /tmp/payload.json"
95-
96- # 在 ci_post_clone.sh 獲取名稱後加上:
97- echo " $DYNAMIC_PROJECT_NAME " > /tmp/project_name.txt
38+ # --- 4. 發送啟動通知 (代碼略) ---
0 commit comments