Skip to content

Commit 75fc41e

Browse files
committed
ci: redo log checking
1 parent 8ddef8a commit 75fc41e

File tree

2 files changed

+80
-10
lines changed

2 files changed

+80
-10
lines changed

.github/workflows/reusable-build-system-test-react-native.yml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,15 @@ jobs:
155155

156156
- name: Cache Android SDK and emulator
157157
if: ${{ matrix.platform == 'android' }}
158+
id: android-cache
158159
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
159160
with:
160161
path: |
161162
~/Library/Android/sdk/system-images
162163
~/Library/Android/sdk/build-tools
163164
~/Library/Android/sdk/platform-tools
164165
~/.android/avd
165-
key: ${{ runner.os }}-android-sdk-27-x86_64-v1
166+
key: ${{ runner.os }}-android-sdk-27-x86_64-snapshot-v1
166167
env:
167168
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5
168169

@@ -204,8 +205,8 @@ jobs:
204205
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "build-tools;33.0.2" "platform-tools" "system-images;android-27;default;x86_64"
205206
$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --name Pixel_5_API_27 --force --device "pixel_5" --abi x86_64 --package "system-images;android-27;default;x86_64"
206207
207-
- name: Start Android emulator
208-
if: ${{ matrix.platform == 'android' }}
208+
- name: Start Android emulator (cold boot - first run)
209+
if: ${{ matrix.platform == 'android' && steps.android-cache.outputs.cache-hit != 'true' }}
209210
run: |
210211
$ANDROID_HOME/emulator/emulator -avd Pixel_5_API_27 -port ${{ env.EMULATOR_PORT }} -no-boot-anim -no-audio -no-snapshot-load -gpu host -accel on &
211212
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
@@ -216,6 +217,15 @@ jobs:
216217
$ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0.0
217218
$ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0.0
218219
$ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0.0
220+
# Save snapshot for future runs
221+
$ANDROID_HOME/platform-tools/adb emu avd snapshot save default_boot
222+
223+
- name: Start Android emulator (from snapshot - cached)
224+
if: ${{ matrix.platform == 'android' && steps.android-cache.outputs.cache-hit == 'true' }}
225+
run: |
226+
$ANDROID_HOME/emulator/emulator -avd Pixel_5_API_27 -port ${{ env.EMULATOR_PORT }} -no-boot-anim -no-audio -snapshot default_boot -gpu host -accel on &
227+
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
228+
$ANDROID_HOME/platform-tools/adb devices
219229
220230
- name: Create MegaApp ${{ env.MEGA_APP_NAME }} and run build on NodeJS ${{ matrix.node-version }}
221231
run: npm run setup:${{matrix.framework}}:${{matrix.build-tool}} -- --name ${{ env.MEGA_APP_NAME }} --platform ${{matrix.platform}} --tag ${{inputs.dist-tag}} --framework-version ${{matrix.framework-version.value}} --build-tool-version ${{matrix.build-tool-version}}

build-system-tests/scripts/checkReactNativeLog.ts

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,17 +133,77 @@ const checkErrorMessage = async (logLines: string[]): Promise<boolean> => {
133133
return results.some((result) => result === true);
134134
};
135135

136+
/**
137+
* waitForLogs polls the log file until meaningful content appears or timeout is reached
138+
* @returns {string} the log file content
139+
*/
140+
const waitForLogs = async (): Promise<string> => {
141+
const pollInterval = 10; // seconds between checks
142+
const maxWaitTime = 180; // max 3 minutes total wait
143+
const minLogLines = 5; // minimum lines to consider logs "ready"
144+
145+
const startMessages = [
146+
'info Starting logkitty',
147+
'React Native iOS Logger started for XCode project',
148+
];
149+
150+
let elapsed = 0;
151+
log(
152+
'info',
153+
`Waiting for logs (polling every ${pollInterval}s, max ${maxWaitTime}s)...`
154+
);
155+
156+
while (elapsed < maxWaitTime) {
157+
await sleep(pollInterval);
158+
elapsed += pollInterval;
159+
160+
if (!fs.existsSync(logFileName)) {
161+
log('info', `[${elapsed}s] Log file not found yet...`);
162+
continue;
163+
}
164+
165+
const logFile = fs.readFileSync(logFileName, 'utf-8');
166+
const logLines = logFile.split('\n').filter((line) => line !== '');
167+
168+
// Check if we only have the start message (logs not ready yet)
169+
if (logLines.length === 1) {
170+
const isOnlyStartMessage = startMessages.some((msg) =>
171+
logLines[0].includes(msg)
172+
);
173+
if (isOnlyStartMessage) {
174+
log('info', `[${elapsed}s] Only start message found, waiting...`);
175+
continue;
176+
}
177+
}
178+
179+
// Check if we have enough log lines
180+
if (logLines.length >= minLogLines) {
181+
log(
182+
'success',
183+
`[${elapsed}s] Found ${logLines.length} log lines, proceeding with check`
184+
);
185+
return logFile;
186+
}
187+
188+
log(
189+
'info',
190+
`[${elapsed}s] Found ${logLines.length} lines, waiting for more...`
191+
);
192+
}
193+
194+
// Timeout reached, return whatever we have
195+
log('warning', `Timeout reached after ${maxWaitTime}s`);
196+
if (fs.existsSync(logFileName)) {
197+
return fs.readFileSync(logFileName, 'utf-8');
198+
}
199+
return '';
200+
};
201+
136202
const checkReactNativeLog = async (): Promise<void> => {
137203
log('command', `cd mega-apps/${megaAppName}`);
138204
process.chdir(`mega-apps/${megaAppName}`);
139205

140-
// Wait for the logging messages to be ready. The number is based on real experiments in Github Actions.
141-
const timeToWait = 500;
142-
143-
log('info', `Sleep for '${timeToWait}' seconds...`);
144-
await sleep(timeToWait);
145-
146-
const logFile = fs.readFileSync(logFileName, 'utf-8');
206+
const logFile = await waitForLogs();
147207
const logLines = logFile.split('\n').filter((line) => line !== '');
148208

149209
await checkStartMessage(logLines, logFile);

0 commit comments

Comments
 (0)