From 1922864a49f535e8f78bd428315551d9d0c4f983 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:41:32 -0700 Subject: [PATCH] Save artifacts on preload cache build failure --- .github/workflows/ci.yml | 7 +++ ts/scripts/generate-preload-cache.ts | 79 +++++++++++++++++++--------- 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 737280ddd..d6da27fdc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,6 +109,7 @@ jobs: env: DISABLE_INSPECT_FUSE: on SIGN_MACOS_SCRIPT: noop.sh + ARTIFACTS_DIR: artifacts/macos - name: Upload installer size if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }} run: | @@ -167,6 +168,8 @@ jobs: run: npm run build:esbuild:prod - name: Create preload cache run: xvfb-run --auto-servernum npm run build:preload-cache + env: + ARTIFACTS_DIR: artifacts/linux - name: Build with packaging .deb file run: npm run build:release -- --publish=never @@ -253,6 +256,8 @@ jobs: run: npm run build:esbuild:prod - name: Create preload cache run: npm run build:preload-cache + env: + ARTIFACTS_DIR: artifacts/win - name: Build with NSIS run: npm run build:release @@ -365,6 +370,8 @@ jobs: run: npm run build:esbuild:prod - name: Create preload cache run: xvfb-run --auto-servernum npm run build:preload-cache + env: + ARTIFACTS_DIR: artifacts/linux - name: Run mock server tests run: | diff --git a/ts/scripts/generate-preload-cache.ts b/ts/scripts/generate-preload-cache.ts index 93adb6b66..e751c299e 100644 --- a/ts/scripts/generate-preload-cache.ts +++ b/ts/scripts/generate-preload-cache.ts @@ -1,10 +1,14 @@ // Copyright 2024 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only -import { spawnSync } from 'node:child_process'; +import { spawn } from 'node:child_process'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; -import { mkdtemp, rm } from 'node:fs/promises'; +import { mkdir, mkdtemp, rm, rename } from 'node:fs/promises'; +import pTimeout from 'p-timeout'; + +import { MINUTE } from '../util/durations'; +import { explodePromise } from '../util/explodePromise'; const ROOT_DIR = join(__dirname, '..', '..'); @@ -18,30 +22,55 @@ const ELECTRON = join( async function main(): Promise { const storagePath = await mkdtemp(join(tmpdir(), 'signal-preload-cache-')); - let status: number | null; - try { - ({ status } = spawnSync( - ELECTRON, - ['--js-args="--predictable --random-seed 1"', 'ci.js'], - { - cwd: ROOT_DIR, - env: { - ...process.env, - GENERATE_PRELOAD_CACHE: 'on', - SIGNAL_CI_CONFIG: JSON.stringify({ - storagePath, - }), - }, - // Since we run `.cmd` file on Windows - use shell - shell: process.platform === 'win32', - } - )); - } finally { - await rm(storagePath, { recursive: true }); - } + const proc = spawn( + ELECTRON, + ['--js-args="--predictable --random-seed 1"', 'ci.js'], + { + cwd: ROOT_DIR, + env: { + ...process.env, + GENERATE_PRELOAD_CACHE: 'on', + SIGNAL_CI_CONFIG: JSON.stringify({ + storagePath, + }), + }, + // Since we run `.cmd` file on Windows - use shell + shell: process.platform === 'win32', + } + ); - if (status !== 0) { - throw new Error(`Exit code: ${status}`); + try { + const { promise, resolve, reject } = explodePromise(); + proc.on('exit', status => resolve(status)); + proc.on('error', error => reject(error)); + + const status = await pTimeout(promise, 5 * MINUTE); + + if (status !== 0) { + throw new Error(`Exit code: ${status}`); + } + } catch (error) { + const { ARTIFACTS_DIR } = process.env; + if (!ARTIFACTS_DIR) { + console.error( + 'Not saving artifacts. Please set ARTIFACTS_DIR env variable' + ); + } else { + console.error(`Saving logs to ${ARTIFACTS_DIR}`); + await mkdir(ARTIFACTS_DIR, { recursive: true }); + + const logsDir = join(storagePath, 'logs'); + await rename(logsDir, join(ARTIFACTS_DIR, 'logs')); + } + + throw error; + } finally { + try { + proc.kill(); + } catch { + // Ignore + } + await rm(storagePath, { recursive: true }); } }