From 657964c39f90c08ebf0224f0e2e264eab1d5fc15 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Fri, 4 Sep 2026 17:31:24 +0100 Subject: [PATCH] Read the job status from a `ReadOnlyEnv` in `recordOverlayStatus` Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- lib/entry-points.js | 15 ++++++++------- src/init-action-post-helper.test.ts | 25 +++++++++++++++++++------ src/init-action-post-helper.ts | 15 +++++++++------ src/init-action-post.ts | 3 ++- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index 7666a9d2b..67cd84b78 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -162277,8 +162277,8 @@ async function tryUploadSarifIfRunFailed(config, repositoryNwo, features, logger return createFailedUploadFailedSarifResult(e); } } -async function uploadFailureInfo(uploadAllAvailableDebugArtifacts, printDebugLogs2, codeql, config, repositoryNwo, features, jobStatus, logger) { - await recordOverlayStatus(codeql, config, features, jobStatus, logger); +async function uploadFailureInfo(uploadAllAvailableDebugArtifacts, printDebugLogs2, codeql, config, repositoryNwo, features, jobStatus, env, logger) { + await recordOverlayStatus(codeql, config, features, jobStatus, env, logger); const uploadFailedSarifResult = await tryUploadSarifIfRunFailed( config, repositoryNwo, @@ -162340,15 +162340,15 @@ async function uploadFailureInfo(uploadAllAvailableDebugArtifacts, printDebugLog } return uploadFailedSarifResult; } -function didCodeQlReportError() { - const jobStatus = process.env["CODEQL_ACTION_JOB_STATUS" /* JOB_STATUS */]; +function didCodeQlReportError(env) { + const jobStatus = env.getOptional("CODEQL_ACTION_JOB_STATUS" /* JOB_STATUS */); return jobStatus === "JOB_STATUS_FAILURE" /* FailureStatus */ || jobStatus === "JOB_STATUS_CONFIGURATION_ERROR" /* ConfigErrorStatus */; } -async function recordOverlayStatus(codeql, config, features, jobStatus, logger) { - if (config.overlayDatabaseMode !== "overlay-base" /* OverlayBase */ || process.env["CODEQL_ACTION_ANALYZE_DID_COMPLETE_SUCCESSFULLY" /* ANALYZE_DID_COMPLETE_SUCCESSFULLY */] === "true" || !await features.getValue("overlay_analysis_status_save" /* OverlayAnalysisStatusSave */)) { +async function recordOverlayStatus(codeql, config, features, jobStatus, env, logger) { + if (config.overlayDatabaseMode !== "overlay-base" /* OverlayBase */ || env.getOptional("CODEQL_ACTION_ANALYZE_DID_COMPLETE_SUCCESSFULLY" /* ANALYZE_DID_COMPLETE_SUCCESSFULLY */) === "true" || !await features.getValue("overlay_analysis_status_save" /* OverlayAnalysisStatusSave */)) { return; } - if (jobStatus?.trim().toLowerCase() === "cancelled" && !didCodeQlReportError()) { + if (jobStatus?.trim().toLowerCase() === "cancelled" && !didCodeQlReportError(env)) { logger.info( "Not recording an improved incremental analysis failure for this job because the workflow run was cancelled." ); @@ -162481,6 +162481,7 @@ async function run4(startedAt) { repositoryNwo, features, jobStatus2, + getEnv(), logger ); if (await isAnalyzingDefaultBranch() && config.dependencyCachingEnabled !== "none" /* None */) { diff --git a/src/init-action-post-helper.test.ts b/src/init-action-post-helper.test.ts index 8f2868ef7..95ec27f4b 100644 --- a/src/init-action-post-helper.test.ts +++ b/src/init-action-post-helper.test.ts @@ -20,6 +20,7 @@ import { createFeatures, createTestConfig, DEFAULT_ACTIONS_VARS, + getTestEnv, makeMacro, makeVersionInfo, RecordingLogger, @@ -60,6 +61,7 @@ test.serial("init-post action with debug mode off", async (t) => { parseRepositoryNwo("github/codeql-action"), createFeatures([]), "success", + getTestEnv(), getRunnerLogger(true), ); @@ -83,6 +85,7 @@ test.serial("init-post action with debug mode on", async (t) => { parseRepositoryNwo("github/codeql-action"), createFeatures([]), "success", + getTestEnv(), getRunnerLogger(true), ); @@ -379,6 +382,7 @@ test.serial( parseRepositoryNwo("github/codeql-action"), createFeatures([Feature.OverlayAnalysisStatusSave]), "success", + getTestEnv(), getRunnerLogger(true), ); @@ -448,6 +452,7 @@ test.serial( parseRepositoryNwo("github/codeql-action"), createFeatures([]), "success", + getTestEnv(), getRunnerLogger(true), ); @@ -462,8 +467,13 @@ test.serial( test.serial("does not save overlay status when build successful", async (t) => { return await util.withTmpDir(async (tmpDir) => { setupActionsVars(tmpDir, tmpDir); - // Mark analyze as having completed successfully. + // Mark analyze as having completed successfully. `tryUploadSarifIfRunFailed` reads this from + // the process environment, while `recordOverlayStatus` reads it from the environment it is + // given. process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] = "true"; + const env = getTestEnv({ + [EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY]: "true", + }); sinon.stub(util, "checkDiskUsage").resolves({ numAvailableBytes: 100 * NUM_BYTES_PER_GIB, @@ -486,6 +496,7 @@ test.serial("does not save overlay status when build successful", async (t) => { parseRepositoryNwo("github/codeql-action"), createFeatures([Feature.OverlayAnalysisStatusSave]), "success", + env, getRunnerLogger(true), ); @@ -524,6 +535,7 @@ test.serial( parseRepositoryNwo("github/codeql-action"), createFeatures([]), "success", + getTestEnv(), getRunnerLogger(true), ); @@ -549,11 +561,11 @@ async function testCancelledOverlayJob({ return await util.withTmpDir(async (tmpDir) => { setupActionsVars(tmpDir, tmpDir); delete process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY]; - if (codeQlReportedError) { - process.env[EnvVar.JOB_STATUS] = JobStatus.FailureStatus; - } else { - delete process.env[EnvVar.JOB_STATUS]; - } + const env = getTestEnv( + codeQlReportedError + ? { [EnvVar.JOB_STATUS]: JobStatus.FailureStatus } + : {}, + ); sinon.stub(util, "checkDiskUsage").resolves({ numAvailableBytes: 100 * NUM_BYTES_PER_GIB, @@ -576,6 +588,7 @@ async function testCancelledOverlayJob({ parseRepositoryNwo("github/codeql-action"), createFeatures([Feature.OverlayAnalysisStatusSave]), jobStatus, + env, getRunnerLogger(true), ); diff --git a/src/init-action-post-helper.ts b/src/init-action-post-helper.ts index 72c9a6236..4363fc755 100644 --- a/src/init-action-post-helper.ts +++ b/src/init-action-post-helper.ts @@ -18,7 +18,7 @@ import { sanitizeArtifactName, } from "./debug-artifacts"; import * as dependencyCaching from "./dependency-caching"; -import { EnvVar } from "./environment"; +import { EnvVar, ReadOnlyEnv } from "./environment"; import { Feature, FeatureEnablement } from "./feature-flags"; import { Logger } from "./logging"; import { OverlayDatabaseMode } from "./overlay/overlay-database-mode"; @@ -317,6 +317,7 @@ export async function tryUploadSarifIfRunFailed( * @param repositoryNwo The name and owner of the repository. * @param features Information about enabled features. * @param jobStatus The status of the job, as reported by the Actions runtime environment. + * @param env The environment to read variables from. * @param logger The logger to use. * @returns The results of uploading the SARIF file for the failure. */ @@ -333,9 +334,10 @@ export async function uploadFailureInfo( repositoryNwo: RepositoryNwo, features: FeatureEnablement, jobStatus: string | undefined, + env: ReadOnlyEnv, logger: Logger, ): Promise { - await recordOverlayStatus(codeql, config, features, jobStatus, logger); + await recordOverlayStatus(codeql, config, features, jobStatus, env, logger); const uploadFailedSarifResult = await tryUploadSarifIfRunFailed( config, @@ -421,8 +423,8 @@ export async function uploadFailureInfo( * Note that the converse does not hold: an Action that is terminated abruptly, or that fails before * it can gather telemetry, does not get to report anything. */ -function didCodeQlReportError(): boolean { - const jobStatus = process.env[EnvVar.JOB_STATUS]; +function didCodeQlReportError(env: ReadOnlyEnv): boolean { + const jobStatus = env.getOptional(EnvVar.JOB_STATUS); return ( jobStatus === JobStatus.FailureStatus || jobStatus === JobStatus.ConfigErrorStatus @@ -439,11 +441,12 @@ async function recordOverlayStatus( config: Config, features: FeatureEnablement, jobStatus: string | undefined, + env: ReadOnlyEnv, logger: Logger, ) { if ( config.overlayDatabaseMode !== OverlayDatabaseMode.OverlayBase || - process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] === "true" || + env.getOptional(EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY) === "true" || !(await features.getValue(Feature.OverlayAnalysisStatusSave)) ) { return; @@ -454,7 +457,7 @@ async function recordOverlayStatus( // of our own Actions reported an error before the run was cancelled. if ( jobStatus?.trim().toLowerCase() === "cancelled" && - !didCodeQlReportError() + !didCodeQlReportError(env) ) { logger.info( "Not recording an improved incremental analysis failure for this job because the workflow " + diff --git a/src/init-action-post.ts b/src/init-action-post.ts index 6d6b653e6..749020ac6 100644 --- a/src/init-action-post.ts +++ b/src/init-action-post.ts @@ -21,7 +21,7 @@ import { DependencyCachingUsageReport, getDependencyCacheUsage, } from "./dependency-caching"; -import { EnvVar } from "./environment"; +import { EnvVar, getEnv } from "./environment"; import { initFeatures } from "./feature-flags"; import * as gitUtils from "./git-utils"; import * as initActionPostHelper from "./init-action-post-helper"; @@ -91,6 +91,7 @@ async function run(startedAt: Date) { repositoryNwo, features, jobStatus, + getEnv(), logger, );