Skip to content

Commit f1715ba

Browse files
committed
fix
1 parent 0bdf383 commit f1715ba

3 files changed

Lines changed: 55 additions & 143 deletions

File tree

Binary file not shown.

ci_scripts/ci_post_clone.sh

Lines changed: 31 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,38 @@
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}^"}
2626
END_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")
3529
RANGE_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 提取邏輯...)
6136
echo "$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. 發送啟動通知 (代碼略) ---

ci_scripts/ci_post_xcodebuild.sh

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,59 @@
11
#!/bin/bash
22

33
# ============================================================
4-
# 腳本位置:專案目錄/ci_scripts/ci_post_xcodebuild.sh
5-
# 目的:打包完成後,從暫存檔讀取資訊並發送 Discord 最終通知
4+
# 目的:直接讀取 post_clone 準備好的資訊,確保數據一致性
65
# ============================================================
76

87
DISCORD_WEBHOOK="https://discord.com/api/webhooks/1494864601500618783/ubSTg2Y_uS_pKvjTKSRHWm8vaBkO8Y4bvunh07l9EQUQqp_daQWX-CYtwaXGiQEru3ZF"
98

10-
# 1. 讀取由 ci_post_clone.sh 存儲的專案名稱與 Changelog
11-
# 我們假設名稱存在 /tmp/project_name.txt (需確保 post_clone 有寫入)
12-
# 如果沒有,則給予預設值
13-
if [ -f "/tmp/project_name.txt" ]; then
14-
DYNAMIC_PROJECT_NAME=$(cat /tmp/project_name.txt)
15-
else
16-
DYNAMIC_PROJECT_NAME=${CI_XCODE_SCHEME:-"NES_EMU"}
17-
fi
18-
19-
if [ -f "/tmp/final_changelog.txt" ]; then
20-
CHANGELOG=$(cat /tmp/final_changelog.txt)
21-
else
22-
CHANGELOG="無合併更新說明"
23-
fi
9+
# 1. 從 /tmp 讀取傳遞過來的資訊
10+
DYNAMIC_PROJECT_NAME=$(cat /tmp/ci_project_name.txt 2>/dev/null || echo "NES_EMU_IOS")
11+
CURRENT_TAG=$(cat /tmp/ci_current_tag.txt 2>/dev/null || echo "N/A")
12+
RANGE_TEXT=$(cat /tmp/ci_git_range.txt 2>/dev/null || echo "N/A")
13+
CHANGELOG=$(cat /tmp/final_changelog.txt 2>/dev/null || echo "無更新說明")
2414

25-
# 2. 獲取版本與 Git 區間 (維持與 clone 腳本一致)
26-
CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "1.0.0")
15+
# 2. 取得 Xcode Cloud 的 Build Number
2716
BUILD_NUM=${CI_BUILD_NUMBER:-"N/A"}
2817
DISPLAY_VERSION="${CURRENT_TAG} (Build ${BUILD_NUM})"
2918

30-
START_COMMIT=${CI_PREVIOUS_COMMIT:-"${CURRENT_TAG}^"}
31-
END_COMMIT=${CI_COMMIT:-"HEAD"}
32-
START_SHORT=$(git rev-parse --short $START_COMMIT 2>/dev/null || echo "Start")
33-
END_SHORT=$(git rev-parse --short $END_COMMIT 2>/dev/null || echo "End")
34-
RANGE_TEXT="$START_SHORT...$END_SHORT"
35-
36-
# 3. 判斷建置狀態 (Xcode Cloud 自動注入此變數)
37-
if [ "$CI_XCODEBUILD_EXIT_CODE" ="0" ]; then
38-
BUILD_STATUS="✅ 建置成功 Success"
39-
EMBED_COLOR=3066993 # 綠色
19+
# 3. 根據建置結果決定顏色與文字
20+
if [ "$CI_XCODEBUILD_EXIT_CODE" = "0" ]; then
21+
STATUS="✅ 建置成功 Success"
22+
COLOR=3066993
4023
else
41-
BUILD_STATUS="❌ 建置失敗 Failed"
42-
EMBED_COLOR=1515833 # 紅色
24+
STATUS="❌ 建置失敗 Failed"
25+
COLOR=1515833
4326
fi
4427

45-
# 4. 使用 Python 組裝 JSON (修復 PY_RANGE 語法錯誤)
46-
# 注意:這裡使用單引號包裹 Python 指令,避免 Shell 對引號的過度解析
47-
PAYLOAD_PATH="/tmp/discord_finish_payload.json"
48-
28+
# 4. 使用 Python 發送 (解決引號與環境變數衝突問題)
4929
export PY_NAME="$DYNAMIC_PROJECT_NAME"
5030
export PY_VER="$DISPLAY_VERSION"
51-
export PY_STATUS="$BUILD_STATUS"
31+
export PY_STATUS="$STATUS"
5232
export PY_LOGS="$CHANGELOG"
5333
export PY_RANGE="$RANGE_TEXT"
54-
export PY_COLOR="$EMBED_COLOR"
34+
export PY_COLOR="$COLOR"
5535

5636
python3 -c '
5737
import json, os
5838
59-
name = os.environ.get("PY_NAME", "Unknown")
60-
ver = os.environ.get("PY_VER", "N/A")
61-
status = os.environ.get("PY_STATUS", "Unknown")
62-
logs = os.environ.get("PY_LOGS", "No logs")
63-
git_range = os.environ.get("PY_RANGE", "N/A")
64-
color = int(os.environ.get("PY_COLOR", 3447003))
65-
6639
description = (
67-
f"**專案名稱:** {name}\n"
68-
f"**建置版本:** {ver}\n"
69-
f"**建置結果:** {status}\n"
70-
f"**Git 區間:** `{git_range}`\n\n"
71-
f"**更新說明:**\n{logs}"
40+
f"**專案名稱:** {os.environ.get(\"PY_NAME\")}\n"
41+
f"**建置版本:** {os.environ.get(\"PY_VER\")}\n"
42+
f"**建置結果:** {os.environ.get(\"PY_STATUS\")}\n"
43+
f"**Git 區間:** `{os.environ.get(\"PY_RANGE\")}`\n\n"
44+
f"**更新說明:**\n{os.environ.get(\"PY_LOGS\")}"
7245
)
7346
7447
data = {
7548
"embeds": [{
7649
"title": "📦 Xcode Cloud 打包任務完成",
77-
"color": color,
50+
"color": int(os.environ.get("PY_COLOR")),
7851
"description": description
7952
}]
8053
}
8154
82-
with open("/tmp/discord_finish_payload.json", "w", encoding="utf-8") as f:
55+
with open("/tmp/finish_payload.json", "w", encoding="utf-8") as f:
8356
json.dump(data, f, ensure_ascii=False)
8457
'
8558

86-
# 5. 發送通知
87-
curl -s -H "Content-Type: application/json" -X POST -d @"$PAYLOAD_PATH" "$DISCORD_WEBHOOK"
88-
rm -f "$PAYLOAD_PATH"
59+
curl -s -H "Content-Type: application/json" -X POST -d @"/tmp/finish_payload.json" "$DISCORD_WEBHOOK"

0 commit comments

Comments
 (0)