From 4935fda41aebe0eceac667903f8e3ddf62112e0e Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 15 Oct 2026 17:13:58 +0100 Subject: [PATCH] Propagate `Config` to `combineSarifFilesUsingCLI` --- lib/entry-points.js | 24 ++++++++++++++++-------- src/analyze-action.ts | 1 + src/init-action-post-helper.test.ts | 1 + src/init-action-post-helper.ts | 1 + src/upload-lib.ts | 21 +++++++++++++++------ src/upload-sarif-action.ts | 10 +++++++++- src/upload-sarif.test.ts | 6 ++++++ src/upload-sarif.ts | 3 +++ 8 files changed, 52 insertions(+), 15 deletions(-) diff --git a/lib/entry-points.js b/lib/entry-points.js index cff5c198b..75207e966 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -180073,7 +180073,7 @@ async function shouldDisableCombineSarifFiles(sarifObjects, githubVersion) { } return true; } -async function combineSarifFilesUsingCLI(sarifFiles, gitHubVersion, features, logger2) { +async function combineSarifFilesUsingCLI(sarifFiles, gitHubVersion, features, logger2, config) { logger2.info("Combining SARIF files using the CodeQL CLI"); const sarifObjects = sarifFiles.map(readSarifFile); const deprecationWarningMessage = gitHubVersion.type === "GitHub Enterprise Server" /* GHES */ ? "and will be removed in GitHub Enterprise Server 3.18" : "and will be removed in July 2025"; @@ -180093,7 +180093,6 @@ async function combineSarifFilesUsingCLI(sarifFiles, gitHubVersion, features, lo } let codeQL; let tempDir = getTemporaryDirectory(); - const config = await getConfig(tempDir, logger2); if (config !== void 0) { codeQL = await getCodeQL(logger2, config.codeQLCmd); tempDir = config.tempDir; @@ -180382,7 +180381,7 @@ function buildPayload(commitOid, ref, analysisKey, analysisName, zippedSarif, wo } return payloadObj; } -async function postProcessSarifFiles(logger2, features, checkoutPath, sarifPaths, category, analysis) { +async function postProcessSarifFiles(logger2, features, config, checkoutPath, sarifPaths, category, analysis) { logger2.info(`Post-processing sarif files: ${JSON.stringify(sarifPaths)}`); const gitHubVersion = await getGitHubVersion(); let sarifLog; @@ -180396,7 +180395,8 @@ async function postProcessSarifFiles(logger2, features, checkoutPath, sarifPaths sarifPaths, gitHubVersion, features, - logger2 + logger2, + config ); } else { const sarifPath = sarifPaths[0]; @@ -180429,13 +180429,14 @@ async function writePostProcessedFiles(logger2, pathInput, uploadTarget, postPro logger2.debug(`Not writing post-processed SARIF files.`); } } -async function uploadFiles(inputSarifPath, checkoutPath, category, features, logger2, uploadTarget) { +async function uploadFiles(config, inputSarifPath, checkoutPath, category, features, logger2, uploadTarget) { const sarifPaths = getSarifFilePaths( inputSarifPath, uploadTarget.sarifPredicate ); return uploadSpecifiedFiles( sarifPaths, + config, checkoutPath, category, features, @@ -180443,10 +180444,11 @@ async function uploadFiles(inputSarifPath, checkoutPath, category, features, log uploadTarget ); } -async function uploadSpecifiedFiles(sarifPaths, checkoutPath, category, features, logger2, uploadTarget) { +async function uploadSpecifiedFiles(sarifPaths, config, checkoutPath, category, features, logger2, uploadTarget) { const processingResults = await postProcessSarifFiles( logger2, features, + config, checkoutPath, sarifPaths, category, @@ -180676,7 +180678,7 @@ function filterAlertsByDiffRange(logger2, sarifLog) { } // src/upload-sarif.ts -async function postProcessAndUploadSarif(logger2, features, uploadKind, checkoutPath, sarifPath, category, postProcessedOutputPath) { +async function postProcessAndUploadSarif(logger2, features, config, uploadKind, checkoutPath, sarifPath, category, postProcessedOutputPath) { const sarifGroups = await getGroupedSarifFilePaths( logger2, sarifPath @@ -180689,6 +180691,7 @@ async function postProcessAndUploadSarif(logger2, features, uploadKind, checkout const postProcessingResults = await postProcessSarifFiles( logger2, features, + config, checkoutPath, sarifFiles, category, @@ -180919,6 +180922,7 @@ async function run(action) { uploadResults = await postProcessAndUploadSarif( logger2, features, + config, uploadKind, checkoutPath, outputDir, @@ -187044,6 +187048,7 @@ async function maybeUploadFailedSarif(config, repositoryNwo, features, logger2) const failedSarif = failedSarifResult.value; logger2.info(`Uploading failed SARIF file ${failedSarif.sarifFile}`); const uploadResult = await uploadFiles( + config, failedSarif.sarifFile, failedSarif.checkoutPath, failedSarif.category, @@ -188535,11 +188540,12 @@ async function run8({ startedAt, logger: logger2 }) { const gitHubVersion = await getGitHubVersion(); checkActionVersion(getActionVersion(), gitHubVersion); persistInputs(); + const tempDir = getTemporaryDirectory(); const repositoryNwo = getRepositoryNwo(); const features = initFeatures( gitHubVersion, repositoryNwo, - getTemporaryDirectory(), + tempDir, logger2 ); const startingStatusReportBase = await createStatusReportBase( @@ -188556,9 +188562,11 @@ async function run8({ startedAt, logger: logger2 }) { const sarifPath = getRequiredInput("sarif_file"); const checkoutPath = getRequiredInput("checkout_path"); const category = getOptionalInput("category"); + const maybeConfig = await getConfig(tempDir, logger2); const uploadResults = await postProcessAndUploadSarif( logger2, features, + maybeConfig, "always", checkoutPath, sarifPath, diff --git a/src/analyze-action.ts b/src/analyze-action.ts index 9efbb529b..a11877b38 100644 --- a/src/analyze-action.ts +++ b/src/analyze-action.ts @@ -361,6 +361,7 @@ async function run(action: ActionState<["Base", "Logger", "Env", "Actions"]>) { uploadResults = await postProcessAndUploadSarif( logger, features, + config, uploadKind, checkoutPath, outputDir, diff --git a/src/init-action-post-helper.test.ts b/src/init-action-post-helper.test.ts index 4291361c2..b90ad3047 100644 --- a/src/init-action-post-helper.test.ts +++ b/src/init-action-post-helper.test.ts @@ -838,6 +838,7 @@ async function testFailedSarifUpload( } t.true( uploadFiles.calledOnceWith( + config, sinon.match.string, sinon.match.string, category, diff --git a/src/init-action-post-helper.ts b/src/init-action-post-helper.ts index 8706afe43..78210793a 100644 --- a/src/init-action-post-helper.ts +++ b/src/init-action-post-helper.ts @@ -248,6 +248,7 @@ async function maybeUploadFailedSarif( logger.info(`Uploading failed SARIF file ${failedSarif.sarifFile}`); const uploadResult = await uploadLib.uploadFiles( + config, failedSarif.sarifFile, failedSarif.checkoutPath, failedSarif.category, diff --git a/src/upload-lib.ts b/src/upload-lib.ts index f66feff14..74ef6094f 100644 --- a/src/upload-lib.ts +++ b/src/upload-lib.ts @@ -12,7 +12,7 @@ import * as analyses from "./analyses"; import * as api from "./api-client"; import { getGitHubVersion, wrapApiConfigurationError } from "./api-client"; import { CodeQL, getCodeQL } from "./codeql"; -import { getConfig } from "./config-utils"; +import type { ActionConfig } from "./config/action-config"; import { readDiffRangesJsonFile } from "./diff-informed-analysis-utils"; import { ActionsEnvVars, EnvVar, exportEnvVar } from "./environment"; import { FeatureEnablement } from "./feature-flags"; @@ -94,15 +94,19 @@ async function shouldDisableCombineSarifFiles( return true; } -// Takes a list of paths to sarif files and combines them together using the -// CLI `github merge-results` command when all SARIF files are produced by -// CodeQL. Otherwise, it will fall back to combining the files in the action. -// Returns the contents of the combined sarif file. +/** + * Takes a list of paths to sarif files and combines them together using the + * CLI `github merge-results` command when all SARIF files are produced by + * CodeQL. Otherwise, it will fall back to combining the files in the action. + * + * @returns The contents of the combined sarif file. + */ async function combineSarifFilesUsingCLI( sarifFiles: string[], gitHubVersion: GitHubVersion, features: FeatureEnablement, logger: Logger, + config: ActionConfig<"codeQLCmd" | "tempDir"> | undefined, ): Promise> { logger.info("Combining SARIF files using the CodeQL CLI"); @@ -138,7 +142,6 @@ async function combineSarifFilesUsingCLI( let codeQL: CodeQL; let tempDir: string = actionsUtil.getTemporaryDirectory(); - const config = await getConfig(tempDir, logger); if (config !== undefined) { codeQL = await getCodeQL(logger, config.codeQLCmd); tempDir = config.tempDir; @@ -603,6 +606,7 @@ export interface PostProcessingResults { export async function postProcessSarifFiles( logger: Logger, features: FeatureEnablement, + config: ActionConfig<"codeQLCmd" | "tempDir"> | undefined, checkoutPath: string, sarifPaths: string[], category: string | undefined, @@ -627,6 +631,7 @@ export async function postProcessSarifFiles( gitHubVersion, features, logger, + config, ); } else { const sarifPath = sarifPaths[0]; @@ -687,6 +692,7 @@ export async function writePostProcessedFiles( * to. */ export async function uploadFiles( + config: ActionConfig<"codeQLCmd" | "tempDir"> | undefined, inputSarifPath: string, checkoutPath: string, category: string | undefined, @@ -701,6 +707,7 @@ export async function uploadFiles( return uploadSpecifiedFiles( sarifPaths, + config, checkoutPath, category, features, @@ -714,6 +721,7 @@ export async function uploadFiles( */ async function uploadSpecifiedFiles( sarifPaths: string[], + config: ActionConfig<"codeQLCmd" | "tempDir"> | undefined, checkoutPath: string, category: string | undefined, features: FeatureEnablement, @@ -723,6 +731,7 @@ async function uploadSpecifiedFiles( const processingResults: PostProcessingResults = await postProcessSarifFiles( logger, features, + config, checkoutPath, sarifPaths, category, diff --git a/src/upload-sarif-action.ts b/src/upload-sarif-action.ts index d3437510c..52dd12ec0 100644 --- a/src/upload-sarif-action.ts +++ b/src/upload-sarif-action.ts @@ -5,6 +5,7 @@ import * as actionsUtil from "./actions-util"; import { getActionVersion, getTemporaryDirectory } from "./actions-util"; import * as analyses from "./analyses"; import { getGitHubVersion } from "./api-client"; +import { getConfig } from "./config-utils"; import { initFeatures } from "./feature-flags"; import { Logger } from "./logging"; import { getRepositoryNwo } from "./repository"; @@ -66,11 +67,12 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { // Make inputs accessible in the `post` step. actionsUtil.persistInputs(); + const tempDir = getTemporaryDirectory(); const repositoryNwo = getRepositoryNwo(); const features = initFeatures( gitHubVersion, repositoryNwo, - getTemporaryDirectory(), + tempDir, logger, ); @@ -91,9 +93,15 @@ async function run({ startedAt, logger }: ActionState<["Base", "Logger"]>) { const checkoutPath = actionsUtil.getRequiredInput("checkout_path"); const category = actionsUtil.getOptionalInput("category"); + // Although we wouldn't typically expect there to be a configuration since we don't expect another + // CodeQL Action step to have come before `upload-sarif`, this has previously been the behaviour + // when `combineSarifFilesUsingCLI` called `getConfig` directly. Since the only effect of this would + // be that an existing CLI that was installed gets re-used, we maintain this behaviour. + const maybeConfig = await getConfig(tempDir, logger); const uploadResults = await postProcessAndUploadSarif( logger, features, + maybeConfig, "always", checkoutPath, sarifPath, diff --git a/src/upload-sarif.test.ts b/src/upload-sarif.test.ts index d310bce92..033be70d0 100644 --- a/src/upload-sarif.test.ts +++ b/src/upload-sarif.test.ts @@ -26,6 +26,7 @@ function mockPostProcessSarifFiles() { const analysisConfig = getAnalysisConfig(analysisKind); postProcessSarifFiles .withArgs( + sinon.match.object, sinon.match.any, sinon.match.any, sinon.match.any, @@ -75,9 +76,11 @@ const postProcessAndUploadSarifMacro = makeMacro({ fs.writeFileSync(sarifFile, ""); } + const config = undefined; const actual = await postProcessAndUploadSarif( logger, features, + config, "always", "", testPath, @@ -94,6 +97,7 @@ const postProcessAndUploadSarifMacro = makeMacro({ postProcessSarifFiles.calledWith( logger, features, + config, sinon.match.any, analysisKindResult.expectedFiles?.map(toFullPath) ?? fullSarifPaths, @@ -223,6 +227,7 @@ test.serial( const actual = await postProcessAndUploadSarif( logger, features, + undefined, "never", "", tempDir, @@ -253,6 +258,7 @@ test.serial( const actual = await postProcessAndUploadSarif( logger, features, + undefined, "never", "", tempDir, diff --git a/src/upload-sarif.ts b/src/upload-sarif.ts index bc2c88698..0a8d8a14a 100644 --- a/src/upload-sarif.ts +++ b/src/upload-sarif.ts @@ -1,5 +1,6 @@ import { UploadKind } from "./actions-util"; import * as analyses from "./analyses"; +import type { ActionConfig } from "./config/action-config"; import { FeatureEnablement } from "./feature-flags"; import { Logger } from "./logging"; import * as upload_lib from "./upload-lib"; @@ -26,6 +27,7 @@ export type UploadSarifResults = Partial< export async function postProcessAndUploadSarif( logger: Logger, features: FeatureEnablement, + config: ActionConfig<"codeQLCmd" | "tempDir"> | undefined, uploadKind: UploadKind, checkoutPath: string, sarifPath: string, @@ -45,6 +47,7 @@ export async function postProcessAndUploadSarif( const postProcessingResults = await upload_lib.postProcessSarifFiles( logger, features, + config, checkoutPath, sarifFiles, category,