diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f3f2da01..5468894b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,6 +68,10 @@ jobs: echo "public directory is empty" exit 1 fi + if [ ! -f .BUILD_FINISHED ]; then + echo ".BUILD_FINISHED not found" + exit 1 + fi - uses: actions/upload-artifact@v4 with: name: build-artifact-${{ github. ref_name }} diff --git a/.gitignore b/.gitignore index 096e1f75..35fd7c3f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules .cache public tmp.* +.BUILD_FINISHED diff --git a/Build/index.ts b/Build/index.ts index 9b16fba2..a8d67fb3 100644 --- a/Build/index.ts +++ b/Build/index.ts @@ -1,5 +1,6 @@ import process from 'node:process'; import os from 'node:os'; +import fs from 'node:fs'; import { downloadPreviousBuild } from './download-previous-build'; import { buildCommon } from './build-common'; @@ -28,6 +29,7 @@ import { buildCloudMounterRules } from './build-cloudmounter-rules'; import { createSpan, printTraceResult, whyIsNodeRunning } from './trace'; import { buildDeprecateFiles } from './build-deprecate-files'; import { cacheGc } from './lib/make-fetch-happen'; +import path from 'node:path'; process.on('uncaughtException', (error) => { console.error('Uncaught exception:', error); @@ -38,6 +40,8 @@ process.on('unhandledRejection', (reason) => { process.exit(1); }); +const buildFinishedLock = path.join(__dirname, '../.BUILD_FINISHED'); + (async () => { console.log('Version:', process.version); @@ -60,6 +64,10 @@ process.on('unhandledRejection', (reason) => { const rootSpan = createSpan('root'); + if (fs.existsSync(buildFinishedLock)) { + fs.unlinkSync(buildFinishedLock); + } + try { const downloadPreviousBuildPromise = downloadPreviousBuild(rootSpan); const buildCommonPromise = downloadPreviousBuildPromise.then(() => buildCommon(rootSpan)); @@ -97,6 +105,9 @@ process.on('unhandledRejection', (reason) => { printTraceResult(rootSpan.traceResult); + // write a file to demonstrate that the build is finished + fs.writeFileSync(buildFinishedLock, 'BUILD_FINISHED\n'); + // Finish the build to avoid leaking timer/fetch ref await whyIsNodeRunning(); process.exit(0);