Skip to content

Commit b1258ef

Browse files
committed
スクショ撮影のフレーク対策: 言語単位リトライとデバッグ成果物の保全
- capture_langs.sh: 失敗した言語はアプリ再起動して最大3回リトライ。 成否の最終判定は寸法検証に委ねる - capture.yaml: scrollUntilVisibleのtimeout延長とwaitToSettleTimeoutMs追加 - workflow: 一部言語失敗でも撮影済み成果物をアップロード、 失敗時はMaestroデバッグ出力もartifactに保存
1 parent bfb6d07 commit b1258ef

3 files changed

Lines changed: 36 additions & 8 deletions

File tree

.github/workflows/appstore-screenshots.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,17 @@ jobs:
130130
env:
131131
CAPTURE_LANGS: ${{ matrix.langs }}
132132
run: bash scripts/generate_screenshots/capture_langs.sh --udid "${{ steps.sim.outputs.udid }}" -l "$CAPTURE_LANGS"
133+
# 一部言語が失敗しても撮影済み言語の成果物は回収できるよう、失敗時もアップロードする
133134
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
135+
if: ${{ !cancelled() }}
134136
with:
135137
name: simulator-screenshots-${{ strategy.job-index }}
136138
path: scripts/generate_screenshots/artifacts/simulator
137139
if-no-files-found: error
140+
# 失敗原因調査用に Maestro のデバッグ出力(スクリーンショット・ログ)を上げる
141+
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
142+
if: ${{ failure() }}
143+
with:
144+
name: maestro-debug-${{ strategy.job-index }}
145+
path: ~/.maestro/tests
146+
if-no-files-found: ignore

.maestro/flows/appstore_screenshot/capture.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@ appId: com.mizuki.Ohashi.Pilll.dev
99
---
1010
- launchApp
1111
- waitForAnimationToEnd
12+
# 遅い環境(GitHub Actions Runner)でも見つけられるよう、timeout を長めに取り
13+
# スクロール間の描画安定待ちを入れる。
1214
- scrollUntilVisible:
1315
element:
1416
id: "${LANG}"
1517
direction: DOWN
16-
timeout: 20000
18+
timeout: 60000
19+
waitToSettleTimeoutMs: 500
1720
- tapOn:
1821
id: "${LANG}"
1922
- waitForAnimationToEnd

scripts/generate_screenshots/capture_langs.sh

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,41 @@ ios_language_id() {
4646

4747
# 言語ごとに端末言語を切り替え、Maestro フローを実行して 5 ページ撮影。
4848
# カンマ区切りの LANGS を空白区切りへ変換して 1 言語ずつ確実に分割する。
49+
# 遅い環境(GitHub Actions Runner)では描画待ちでフローが落ちることがあるため、
50+
# 言語単位でアプリを再起動してリトライする。成否の最終判定は後段の寸法検証が行う
51+
# (フローが最終ページ撮影後に落ちても 5 枚揃っていれば成功として扱えるようにするため)。
52+
MAX_ATTEMPTS=3
53+
flaky_langs=""
4954
for lang in $(printf '%s' "$LANGS" | tr ',' ' '); do
5055
[ -z "$lang" ] && continue
5156
case "$lang" in
5257
*[!A-Za-z0-9_-]*) echo "invalid language code: $lang" >&2; exit 1 ;;
5358
esac
5459
lang_artifact_dir="$SCREENSHOT_ARTIFACT_DIR/simulator/$lang"
55-
# この言語の生成物だけを作り直し、前回撮影のp*.pngが成功扱いになるのを防ぐ。
56-
if [ -d "$lang_artifact_dir" ]; then
57-
find "$lang_artifact_dir" -maxdepth 1 -type f -name 'p*.png' -delete
58-
fi
5960
mkdir -p "$lang_artifact_dir"
6061
ios_lang="$(ios_language_id "$lang")"
6162
echo "capture: $lang (device language: $ios_lang)"
6263
xcrun simctl spawn "$DEVICE_UDID" defaults write .GlobalPreferences AppleLanguages -array "$ios_lang"
6364
xcrun simctl spawn "$DEVICE_UDID" defaults write .GlobalPreferences AppleLocale -string "$(printf '%s' "$ios_lang" | tr '-' '_')"
64-
# 言語設定はアプリ起動時に読まれるため、切替後に必ずプロセスを終了して Maestro に再起動させる。
65-
xcrun simctl terminate "$DEVICE_UDID" "$APP_ID" 2>/dev/null || true
66-
maestro --device "$DEVICE_UDID" test .maestro/flows/appstore_screenshot/capture.yaml --env "LANG=$lang"
65+
attempt=1
66+
while [ "$attempt" -le "$MAX_ATTEMPTS" ]; do
67+
# 各試行の前に前回・前試行のp*.pngを消し、途中まで撮れた残骸が成功扱いになるのを防ぐ。
68+
find "$lang_artifact_dir" -maxdepth 1 -type f -name 'p*.png' -delete
69+
# 言語設定はアプリ起動時に読まれるため、切替後に必ずプロセスを終了して Maestro に再起動させる。
70+
xcrun simctl terminate "$DEVICE_UDID" "$APP_ID" 2>/dev/null || true
71+
if maestro --device "$DEVICE_UDID" test .maestro/flows/appstore_screenshot/capture.yaml --env "LANG=$lang"; then
72+
break
73+
fi
74+
echo "capture failed: $lang (attempt $attempt/$MAX_ATTEMPTS)" >&2
75+
if [ "$attempt" -eq 1 ]; then
76+
flaky_langs="$flaky_langs $lang"
77+
fi
78+
attempt=$((attempt + 1))
79+
done
6780
done
81+
if [ -n "$flaky_langs" ]; then
82+
echo "リトライが必要だった言語:$flaky_langs" >&2
83+
fi
6884

6985
# 寸法検証(1290×2796 であること)。
7086
echo ""

0 commit comments

Comments
 (0)