diff --git a/lib/entry-points.js b/lib/entry-points.js index 841bb36a1..9e674a2c1 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -166182,6 +166182,17 @@ var Env = class extends ReadOnlyEnv { core.exportVariable(name, val); } } + /** + * Set some initial environment variables that we can set even without + * knowing what version of CodeQL we're running. + */ + initialise(version) { + this.export("CODEQL_ACTION_FEATURE_MULTI_LANGUAGE" /* FEATURE_MULTI_LANGUAGE */, "false"); + this.export("CODEQL_ACTION_FEATURE_SANDWICH" /* FEATURE_SANDWICH */, "false"); + this.export("CODEQL_ACTION_FEATURE_SARIF_COMBINE" /* FEATURE_SARIF_COMBINE */, "true"); + this.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); + this.export("CODEQL_ACTION_VERSION" /* VERSION */, version); + } /** Gets a value indicating whether `set` was called at least once. */ hasChanged() { return this.changed; @@ -169892,13 +169903,6 @@ var ExhaustivityCheckingError = class extends Error { function assertNever(value) { throw new ExhaustivityCheckingError(value); } -function initializeEnvironment(version, env = getEnv()) { - env.export("CODEQL_ACTION_FEATURE_MULTI_LANGUAGE" /* FEATURE_MULTI_LANGUAGE */, "false"); - env.export("CODEQL_ACTION_FEATURE_SANDWICH" /* FEATURE_SANDWICH */, "false"); - env.export("CODEQL_ACTION_FEATURE_SARIF_COMBINE" /* FEATURE_SARIF_COMBINE */, "true"); - env.export("CODEQL_ACTION_FEATURE_WILL_UPLOAD" /* FEATURE_WILL_UPLOAD */, "true"); - env.export("CODEQL_ACTION_VERSION" /* VERSION */, version); -} function getBaseDatabaseOidsFilePath(config) { return path.join(config.dbLocation, BASE_DATABASE_OIDS_FILE_NAME); } @@ -180759,7 +180763,7 @@ async function run(action) { let dependencyCacheResults; let databaseUploadResults = []; try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); persistInputs(); const statusReportBase = await createStatusReportBase( "finish" /* Analyze */, @@ -185938,8 +185942,8 @@ async function runWrapper2() { // src/autobuild-action.ts var core17 = __toESM(require_core()); -async function sendCompletedStatusReport(config, logger2, startedAt, allLanguages, failingLanguage, cause) { - initializeEnvironment(getActionVersion()); +async function sendCompletedStatusReport(env, config, logger2, startedAt, allLanguages, failingLanguage, cause) { + env.initialise(getActionVersion()); const status = getActionsStatus(cause, failingLanguage); const statusReportBase = await createStatusReportBase( "autobuild" /* Autobuild */, @@ -186011,6 +186015,7 @@ async function run2({ `We were unable to automatically build your code. Please replace the call to the autobuild action with your custom build steps. ${error3.message}` ); await sendCompletedStatusReport( + env, config, logger2, startedAt, @@ -186021,7 +186026,13 @@ async function run2({ return; } env.export("CODEQL_ACTION_AUTOBUILD_DID_COMPLETE_SUCCESSFULLY" /* AUTOBUILD_DID_COMPLETE_SUCCESSFULLY */, "true"); - await sendCompletedStatusReport(config, logger2, startedAt, languages ?? []); + await sendCompletedStatusReport( + env, + config, + logger2, + startedAt, + languages ?? [] + ); } var autobuild = { name: "autobuild" /* Autobuild */, @@ -186449,7 +186460,7 @@ async function run3(actionState) { let toolsSource; let toolsVersion; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); persistInputs(); apiDetails = { auth: getRequiredInput("token"), @@ -187492,7 +187503,7 @@ async function run6(actionState) { let toolsSource; let toolsVersion; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); const apiDetails = { auth: getRequiredInput("token"), externalRepoAuth: getOptionalInput("external-repository-token"), @@ -188444,9 +188455,10 @@ async function sendSuccessStatusReport2(startedAt, uploadStats, logger2) { await sendStatusReport(statusReport); } } -async function run8({ startedAt, logger: logger2 }) { +async function run8(action) { + const logger2 = action.logger; try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); const gitHubVersion = await getGitHubVersion(); checkActionVersion(getActionVersion(), gitHubVersion); persistInputs(); @@ -188460,7 +188472,7 @@ async function run8({ startedAt, logger: logger2 }) { const startingStatusReportBase = await createStatusReportBase( "upload-sarif" /* UploadSarif */, "starting", - startedAt, + action.startedAt, void 0, await checkDiskUsage(logger2), logger2 @@ -188503,7 +188515,7 @@ async function run8({ startedAt, logger: logger2 }) { } } await sendSuccessStatusReport2( - startedAt, + action.startedAt, codeScanningResult?.statusReport || {}, logger2 ); @@ -188514,7 +188526,7 @@ async function run8({ startedAt, logger: logger2 }) { const errorStatusReportBase = await createStatusReportBase( "upload-sarif" /* UploadSarif */, getActionsStatus(error3), - startedAt, + action.startedAt, void 0, await checkDiskUsage(logger2), logger2, diff --git a/src/actions-util.test.ts b/src/actions-util.test.ts index 17cf96a4a..8ef947cdc 100644 --- a/src/actions-util.test.ts +++ b/src/actions-util.test.ts @@ -12,8 +12,8 @@ import { import { computeAutomationID } from "./api-client"; import { EnvVar } from "./environment"; import { getRunnerLogger } from "./logging"; -import { RecordingLogger, setupTests } from "./testing-utils"; -import { initializeEnvironment, withTmpDir } from "./util"; +import { getTestEnv, RecordingLogger, setupTests } from "./testing-utils"; +import { withTmpDir } from "./util"; setupTests(test); @@ -228,8 +228,9 @@ test.serial( ); test.serial("initializeEnvironment", (t) => { - initializeEnvironment("1.2.3"); - t.deepEqual(process.env[EnvVar.VERSION], "1.2.3"); + const env = getTestEnv(); + env.initialise("1.2.3"); + t.deepEqual(env.getOptional(EnvVar.VERSION), "1.2.3"); }); test.serial("fixCodeQualityCategory", (t) => { diff --git a/src/analyze-action.ts b/src/analyze-action.ts index 9efbb529b..f7cad45f3 100644 --- a/src/analyze-action.ts +++ b/src/analyze-action.ts @@ -238,7 +238,7 @@ async function run(action: ActionState<["Base", "Logger", "Env", "Actions"]>) { let databaseUploadResults: DatabaseUploadResult[] = []; try { - util.initializeEnvironment(actionsUtil.getActionVersion()); + action.env.initialise(actionsUtil.getActionVersion()); // Make inputs accessible in the `post` step, details at // https://github.com/github/codeql-action/issues/2553 diff --git a/src/api-client.test.ts b/src/api-client.test.ts index 2bb878f3b..34ebd52e9 100644 --- a/src/api-client.test.ts +++ b/src/api-client.test.ts @@ -7,7 +7,7 @@ import { ProxyAgent } from "undici"; import * as actionsUtil from "./actions-util"; import * as api from "./api-client"; import { DO_NOT_RETRY_STATUSES } from "./api-client"; -import { ActionsEnvVars, RegistryProxyVars } from "./environment"; +import { ActionsEnvVars, RegistryProxyVars, getEnv } from "./environment"; import { GITHUB_DOTCOM_API_URL, GITHUB_DOTCOM_URL } from "./github"; import { callee, @@ -21,7 +21,7 @@ import * as util from "./util"; setupTests(test); test.beforeEach(() => { - util.initializeEnvironment(actionsUtil.getActionVersion()); + getEnv().initialise(actionsUtil.getActionVersion()); }); test.serial("getApiClient", async (t) => { diff --git a/src/autobuild-action.ts b/src/autobuild-action.ts index 18aad1185..3e2eb1a3f 100644 --- a/src/autobuild-action.ts +++ b/src/autobuild-action.ts @@ -10,7 +10,7 @@ import { getGitHubVersion } from "./api-client"; import { determineAutobuildLanguages, runAutobuild } from "./autobuild"; import { getCodeQL } from "./codeql"; import { Config, getConfig } from "./config-utils"; -import { EnvVar } from "./environment"; +import { EnvVar, type Env } from "./environment"; import { Language } from "./languages"; import { Logger } from "./logging"; import { @@ -26,7 +26,6 @@ import { checkDiskUsage, checkGitHubVersionInRange, ConfigurationError, - initializeEnvironment, wrapError, } from "./util"; @@ -38,6 +37,7 @@ interface AutobuildStatusReport extends StatusReportBase { } async function sendCompletedStatusReport( + env: Env, config: Config | undefined, logger: Logger, startedAt: Date, @@ -45,7 +45,7 @@ async function sendCompletedStatusReport( failingLanguage?: string, cause?: Error, ) { - initializeEnvironment(getActionVersion()); + env.initialise(getActionVersion()); const status = getActionsStatus(cause, failingLanguage); const statusReportBase = await createStatusReportBase( @@ -129,6 +129,7 @@ async function run({ `We were unable to automatically build your code. Please replace the call to the autobuild action with your custom build steps. ${error.message}`, ); await sendCompletedStatusReport( + env, config, logger, startedAt, @@ -141,7 +142,13 @@ async function run({ env.export(EnvVar.AUTOBUILD_DID_COMPLETE_SUCCESSFULLY, "true"); - await sendCompletedStatusReport(config, logger, startedAt, languages ?? []); + await sendCompletedStatusReport( + env, + config, + logger, + startedAt, + languages ?? [], + ); } /** Defines the `autobuild` Action. */ diff --git a/src/codeql.test.ts b/src/codeql.test.ts index e70dcd99f..e07d1b811 100644 --- a/src/codeql.test.ts +++ b/src/codeql.test.ts @@ -21,6 +21,7 @@ import { import type { Config } from "./config-utils"; import * as defaults from "./defaults.json"; import { DocUrl } from "./doc-url"; +import { getEnv } from "./environment"; import { BuiltInLanguage } from "./languages"; import { getRunnerLogger } from "./logging"; import { ToolsSource } from "./setup-codeql"; @@ -37,14 +38,13 @@ import { } from "./testing-utils"; import { ToolsDownloadStatusReport } from "./tools-download"; import * as util from "./util"; -import { initializeEnvironment } from "./util"; setupTests(test); let stubConfig: Config; test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); stubConfig = createTestConfig({ languages: [BuiltInLanguage.cpp], diff --git a/src/database-upload.test.ts b/src/database-upload.test.ts index 908994112..7d7145dd3 100644 --- a/src/database-upload.test.ts +++ b/src/database-upload.test.ts @@ -15,6 +15,7 @@ import { cleanupAndUploadDatabases, uploadBundledDatabase, } from "./database-upload"; +import { getEnv } from "./environment"; import { Feature } from "./feature-flags"; import * as gitUtils from "./git-utils"; import { BuiltInLanguage } from "./languages"; @@ -31,18 +32,12 @@ import { setupActionsVars, setupTests, } from "./testing-utils"; -import { - CleanupLevel, - GitHubVariant, - HTTPError, - initializeEnvironment, - withTmpDir, -} from "./util"; +import { CleanupLevel, GitHubVariant, HTTPError, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); const testRepoName: RepositoryNwo = { owner: "github", repo: "example" }; diff --git a/src/environment.ts b/src/environment.ts index bbb29aab1..cff462fa3 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -371,6 +371,18 @@ export class Env extends ReadOnlyEnv { } } + /** + * Set some initial environment variables that we can set even without + * knowing what version of CodeQL we're running. + */ + public initialise(version: string) { + this.export(EnvVar.FEATURE_MULTI_LANGUAGE, "false"); + this.export(EnvVar.FEATURE_SANDWICH, "false"); + this.export(EnvVar.FEATURE_SARIF_COMBINE, "true"); + this.export(EnvVar.FEATURE_WILL_UPLOAD, "true"); + this.export(EnvVar.VERSION, version); + } + /** Gets a value indicating whether `set` was called at least once. */ public hasChanged(): boolean { return this.changed; diff --git a/src/feature-flags.test.ts b/src/feature-flags.test.ts index d8b5eea04..7b1c1ef3e 100644 --- a/src/feature-flags.test.ts +++ b/src/feature-flags.test.ts @@ -4,6 +4,7 @@ import * as path from "path"; import test from "ava"; import * as defaults from "./defaults.json"; +import { getEnv } from "./environment"; import { Feature, featureConfig, @@ -26,12 +27,12 @@ import { setupTests, stubFeatureFlagApiEndpoint, } from "./testing-utils"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "./util"; +import { GitHubVariant, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test.serial( diff --git a/src/feature-flags/offline-features.test.ts b/src/feature-flags/offline-features.test.ts index 2870ef3b8..1c3d2a8c1 100644 --- a/src/feature-flags/offline-features.test.ts +++ b/src/feature-flags/offline-features.test.ts @@ -8,7 +8,7 @@ import { LoggedMessage, setupTests, } from "../testing-utils"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "../util"; +import { getEnv, GitHubVariant, withTmpDir } from "../util"; import { assertAllFeaturesHaveDefaultValues, @@ -18,7 +18,7 @@ import { setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test("OfflineFeatures makes no API requests", async (t) => { diff --git a/src/init-action.ts b/src/init-action.ts index 7f9178304..b5749e9c8 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -92,7 +92,6 @@ import { DEFAULT_DEBUG_DATABASE_NAME, getCodeQLMemoryLimit, getThreadsFlagValue, - initializeEnvironment, ConfigurationError, wrapError, checkActionVersion, @@ -225,7 +224,7 @@ async function run( let toolsVersion: string; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); // Make inputs accessible in the `post` step. persistInputs(); diff --git a/src/setup-codeql-action.ts b/src/setup-codeql-action.ts index 757b26fac..1bbfdacec 100644 --- a/src/setup-codeql-action.ts +++ b/src/setup-codeql-action.ts @@ -38,7 +38,6 @@ import { checkDiskUsage, checkForTimeout, checkGitHubVersionInRange, - initializeEnvironment, ConfigurationError, wrapError, checkActionVersion, @@ -108,7 +107,7 @@ async function run( let toolsVersion: string; try { - initializeEnvironment(getActionVersion()); + actionState.env.initialise(getActionVersion()); const apiDetails = { auth: getRequiredInput("token"), diff --git a/src/setup-codeql.test.ts b/src/setup-codeql.test.ts index 7dfac1914..319729acd 100644 --- a/src/setup-codeql.test.ts +++ b/src/setup-codeql.test.ts @@ -11,7 +11,13 @@ import * as sinon from "sinon"; import * as actionsUtil from "./actions-util"; import * as api from "./api-client"; import * as diagnostics from "./diagnostics"; -import { ActionsEnvVars, Env, EnvVar, ReadOnlyEnv } from "./environment"; +import { + ActionsEnvVars, + Env, + EnvVar, + getEnv, + ReadOnlyEnv, +} from "./environment"; import { Feature } from "./feature-flags"; import { BuiltInLanguage } from "./languages"; import { getRunnerLogger } from "./logging"; @@ -37,18 +43,12 @@ import { setupTests, } from "./testing-utils"; import * as toolsDownload from "./tools-download"; -import { - getErrorMessage, - GitHubVariant, - HTTPError, - initializeEnvironment, - withTmpDir, -} from "./util"; +import { getErrorMessage, GitHubVariant, HTTPError, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); function stubDownloadAndExtract() { diff --git a/src/setup/repository.test.ts b/src/setup/repository.test.ts index d1c6d034c..9fabd8488 100644 --- a/src/setup/repository.test.ts +++ b/src/setup/repository.test.ts @@ -6,7 +6,6 @@ import * as sinon from "sinon"; import * as actionsUtil from "../actions-util"; import { ActionsEnvVars } from "../environment"; import { callee, getTestEnv, setupTests } from "../testing-utils"; -import { initializeEnvironment } from "../util"; import { getCodeQLActionRepository } from "./repository"; @@ -16,7 +15,7 @@ test.serial("getCodeQLActionRepository", async (t) => { const initialEnv = getTestEnv({ [ActionsEnvVars.RUNNER_TEMP]: path.dirname(__dirname), }); - initializeEnvironment("1.2.3", initialEnv); + initialEnv.initialise("1.2.3"); const target = callee(getCodeQLActionRepository) .withArgs() diff --git a/src/upload-lib.test.ts b/src/upload-lib.test.ts index 2c27d56c1..393e3720d 100644 --- a/src/upload-lib.test.ts +++ b/src/upload-lib.test.ts @@ -10,17 +10,18 @@ import * as analyses from "./analyses"; import { AnalysisKind, CodeQuality, CodeScanning } from "./analyses"; import * as api from "./api-client"; import * as diffUtils from "./diff-informed-analysis-utils"; +import { getEnv } from "./environment"; import { getRunnerLogger, Logger } from "./logging"; import * as sarif from "./sarif"; import { setupTests } from "./testing-utils"; import * as uploadLib from "./upload-lib"; import { UploadPayload } from "./upload-lib/types"; -import { GitHubVariant, initializeEnvironment, withTmpDir } from "./util"; +import { GitHubVariant, withTmpDir } from "./util"; setupTests(test); test.beforeEach(() => { - initializeEnvironment("1.2.3"); + getEnv().initialise("1.2.3"); }); test.serial("validateSarifFileSchema - valid", (t) => { diff --git a/src/upload-sarif-action.ts b/src/upload-sarif-action.ts index d3437510c..7d67c5567 100644 --- a/src/upload-sarif-action.ts +++ b/src/upload-sarif-action.ts @@ -23,7 +23,6 @@ import { ConfigurationError, checkActionVersion, checkDiskUsage, - initializeEnvironment, shouldSkipSarifUpload, wrapError, } from "./util"; @@ -54,11 +53,13 @@ async function sendSuccessStatusReport( } } -async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { +async function run(action: ActionState<["Base", "Env", "Logger"]>) { // To capture errors appropriately, keep as much code within the try-catch as // possible, and only use safe functions outside. + const logger = action.logger; + try { - initializeEnvironment(getActionVersion()); + action.env.initialise(getActionVersion()); const gitHubVersion = await getGitHubVersion(); checkActionVersion(getActionVersion(), gitHubVersion); @@ -77,7 +78,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { const startingStatusReportBase = await createStatusReportBase( ActionName.UploadSarif, "starting", - startedAt, + action.startedAt, undefined, await checkDiskUsage(logger), logger, @@ -131,7 +132,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { // so we can't wait for that here. } await sendSuccessStatusReport( - startedAt, + action.startedAt, codeScanningResult?.statusReport || {}, logger, ); @@ -147,7 +148,7 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { const errorStatusReportBase = await createStatusReportBase( ActionName.UploadSarif, getActionsStatus(error), - startedAt, + action.startedAt, undefined, await checkDiskUsage(logger), logger, diff --git a/src/util.ts b/src/util.ts index 7ba59c675..b9f51011e 100644 --- a/src/util.ts +++ b/src/util.ts @@ -20,8 +20,6 @@ import { getRequiredEnvParam, isInTestMode, exportEnvVar, - getEnv, - type Env, } from "./environment"; import { ConfigurationError, getErrorMessage, wrapError } from "./errors"; import { GitHubVariant, type GitHubVersion } from "./github"; @@ -538,18 +536,6 @@ export function assertNever(value: never): never { throw new ExhaustivityCheckingError(value); } -/** - * Set some initial environment variables that we can set even without - * knowing what version of CodeQL we're running. - */ -export function initializeEnvironment(version: string, env: Env = getEnv()) { - env.export(EnvVar.FEATURE_MULTI_LANGUAGE, "false"); - env.export(EnvVar.FEATURE_SANDWICH, "false"); - env.export(EnvVar.FEATURE_SARIF_COMBINE, "true"); - env.export(EnvVar.FEATURE_WILL_UPLOAD, "true"); - env.export(EnvVar.VERSION, version); -} - export function getBaseDatabaseOidsFilePath( config: ActionConfig<"dbLocation">, ): string {