diff --git a/lib/analyze-action-post.js b/lib/analyze-action-post.js index 95609b3a2..45ab0ffb4 100644 --- a/lib/analyze-action-post.js +++ b/lib/analyze-action-post.js @@ -162824,6 +162824,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/analyze-action.js b/lib/analyze-action.js index f94d5a0dc..06d7e6c90 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -107934,6 +107934,16 @@ function writeDiagnostic(config, language, diagnostic) { logger.debug(JSON.stringify(diagnostic)); } } +function makeTelemetryDiagnostic(id, name, attributes) { + return makeDiagnostic(id, name, { + attributes, + visibility: { + cliSummaryTable: false, + statusPage: false, + telemetry: true + } + }); +} // src/diff-informed-analysis-utils.ts var fs6 = __toESM(require("fs")); @@ -108450,6 +108460,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -109820,7 +109835,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -109839,9 +109858,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -109859,9 +109906,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/lib/autobuild-action.js b/lib/autobuild-action.js index 4e1a75aac..a080b6928 100644 --- a/lib/autobuild-action.js +++ b/lib/autobuild-action.js @@ -104876,6 +104876,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/init-action-post.js b/lib/init-action-post.js index 4ed2d691b..a406b54d1 100644 --- a/lib/init-action-post.js +++ b/lib/init-action-post.js @@ -165864,6 +165864,16 @@ function writeDiagnostic(config, language, diagnostic) { logger.debug(JSON.stringify(diagnostic)); } } +function makeTelemetryDiagnostic(id, name, attributes) { + return makeDiagnostic(id, name, { + attributes, + visibility: { + cliSummaryTable: false, + statusPage: false, + telemetry: true + } + }); +} // src/diff-informed-analysis-utils.ts var fs6 = __toESM(require("fs")); @@ -166384,6 +166394,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -167548,7 +167563,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -167567,9 +167586,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -167587,9 +167634,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/lib/init-action.js b/lib/init-action.js index c4310c848..60b2aa4bc 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -105993,6 +105993,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -108759,7 +108764,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -108778,9 +108787,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -108798,9 +108835,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/lib/resolve-environment-action.js b/lib/resolve-environment-action.js index 2d03ee808..0fe58bb3d 100644 --- a/lib/resolve-environment-action.js +++ b/lib/resolve-environment-action.js @@ -104867,6 +104867,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/setup-codeql-action.js b/lib/setup-codeql-action.js index fd4f84a37..59458a705 100644 --- a/lib/setup-codeql-action.js +++ b/lib/setup-codeql-action.js @@ -104781,6 +104781,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -105568,6 +105573,16 @@ function writeDiagnostic(config, language, diagnostic) { logger.debug(JSON.stringify(diagnostic)); } } +function makeTelemetryDiagnostic(id, name, attributes) { + return makeDiagnostic(id, name, { + attributes, + visibility: { + cliSummaryTable: false, + statusPage: false, + telemetry: true + } + }); +} // src/languages/builtin.json var builtin_default = { @@ -106191,7 +106206,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -106210,9 +106229,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -106230,9 +106277,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/lib/start-proxy-action-post.js b/lib/start-proxy-action-post.js index 60fa054a6..8767a0138 100644 --- a/lib/start-proxy-action-post.js +++ b/lib/start-proxy-action-post.js @@ -162144,6 +162144,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/start-proxy-action.js b/lib/start-proxy-action.js index bd1e56c2b..0d4c0e733 100644 --- a/lib/start-proxy-action.js +++ b/lib/start-proxy-action.js @@ -121515,6 +121515,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/upload-lib.js b/lib/upload-lib.js index 0dfb131c1..cab779a62 100644 --- a/lib/upload-lib.js +++ b/lib/upload-lib.js @@ -107567,6 +107567,16 @@ function writeDiagnostic(config, language, diagnostic) { logger.debug(JSON.stringify(diagnostic)); } } +function makeTelemetryDiagnostic(id, name, attributes) { + return makeDiagnostic(id, name, { + attributes, + visibility: { + cliSummaryTable: false, + statusPage: false, + telemetry: true + } + }); +} // src/diff-informed-analysis-utils.ts var fs5 = __toESM(require("fs")); @@ -108079,6 +108089,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -108846,7 +108861,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -108865,9 +108884,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -108885,9 +108932,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/lib/upload-sarif-action-post.js b/lib/upload-sarif-action-post.js index 4824e4595..cb645d008 100644 --- a/lib/upload-sarif-action-post.js +++ b/lib/upload-sarif-action-post.js @@ -162314,6 +162314,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/lib/upload-sarif-action.js b/lib/upload-sarif-action.js index 520b5270c..fec1bf224 100644 --- a/lib/upload-sarif-action.js +++ b/lib/upload-sarif-action.js @@ -107746,6 +107746,11 @@ var featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: void 0 }, + ["overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: void 0 + }, ["overlay_analysis_resource_checks_v2" /* OverlayAnalysisResourceChecksV2 */]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", @@ -108339,6 +108344,16 @@ function writeDiagnostic(config, language, diagnostic) { logger.debug(JSON.stringify(diagnostic)); } } +function makeTelemetryDiagnostic(id, name, attributes) { + return makeDiagnostic(id, name, { + attributes, + visibility: { + cliSummaryTable: false, + statusPage: false, + telemetry: true + } + }); +} // src/diff-informed-analysis-utils.ts var fs7 = __toESM(require("fs")); @@ -109523,7 +109538,11 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw if (rawLanguages === void 0 || rawLanguages.length === 0) { return []; } - if (!await features.getValue("overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */)) { + const isEnabled = await features.getValue( + "overlay_analysis_match_codeql_version" /* OverlayAnalysisMatchCodeqlVersion */ + ); + const isDryRun = !isEnabled && await features.getValue("overlay_analysis_match_codeql_version_dry_run" /* OverlayAnalysisMatchCodeqlVersionDryRun */); + if (!isEnabled && !isDryRun) { return []; } let cachedVersions; @@ -109542,9 +109561,37 @@ async function getEnabledVersionsWithOverlayBaseDatabases(defaultCliVersion, raw return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter( + const overlayVersions = defaultCliVersion.enabledVersions.filter( (v) => cachedVersionsSet.has(v.cliVersion) ); + if (overlayVersions.length === 0) { + return []; + } + const isCachedVersionDifferent = overlayVersions[0].cliVersion !== defaultCliVersion.enabledVersions[0].cliVersion; + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + void 0, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion + } + ) + ); + } + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.` + ); + return []; + } + return overlayVersions; } async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, features, logger) { if (!isAnalyzingPullRequest()) { @@ -109562,9 +109609,6 @@ async function resolveDefaultCliVersion(defaultCliVersion, rawLanguages, feature ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled versions with cached overlay-base databases were found.` - ); return defaultCliVersion.enabledVersions[0]; } async function getCodeQLSource(toolsInput, defaultCliVersion, rawLanguages, apiDetails, variant, tarSupportsZstd, features, logger) { diff --git a/src/feature-flags.ts b/src/feature-flags.ts index d6a6ba7bb..ae3d24267 100644 --- a/src/feature-flags.ts +++ b/src/feature-flags.ts @@ -97,6 +97,12 @@ export enum Feature { * database exists in the cache. */ OverlayAnalysisMatchCodeqlVersion = "overlay_analysis_match_codeql_version", + /** + * Like `OverlayAnalysisMatchCodeqlVersion`, but only logs a diagnostic with the version that + * would have been chosen instead of actually changing the default CodeQL CLI version. + * `OverlayAnalysisMatchCodeqlVersion` overrides this flag. + */ + OverlayAnalysisMatchCodeqlVersionDryRun = "overlay_analysis_match_codeql_version_dry_run", OverlayAnalysisPython = "overlay_analysis_python", /** * Controls whether lower disk space requirements are used for overlay hardware checks. @@ -307,6 +313,11 @@ export const featureConfig = { envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION", minimumVersion: undefined, }, + [Feature.OverlayAnalysisMatchCodeqlVersionDryRun]: { + defaultValue: false, + envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_MATCH_CODEQL_VERSION_DRY_RUN", + minimumVersion: undefined, + }, [Feature.OverlayAnalysisResourceChecksV2]: { defaultValue: false, envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS_RESOURCE_CHECKS_V2", diff --git a/src/setup-codeql.test.ts b/src/setup-codeql.test.ts index 820e6acd4..39f2422bd 100644 --- a/src/setup-codeql.test.ts +++ b/src/setup-codeql.test.ts @@ -611,16 +611,20 @@ test.serial( }, ); -function makeOverlayMatchFeatures( - matchFlagEnabled: boolean, -): FeatureEnablement { +function makeOverlayMatchFeatures(opts: { + matchFlagEnabled?: boolean; + dryRunFlagEnabled?: boolean; +}): FeatureEnablement { return { getEnabledDefaultCliVersions: async () => { throw new Error("not implemented"); }, getValue: async (feature) => { if (feature === Feature.OverlayAnalysisMatchCodeqlVersion) { - return matchFlagEnabled; + return opts.matchFlagEnabled ?? false; + } + if (feature === Feature.OverlayAnalysisMatchCodeqlVersionDryRun) { + return opts.dryRunFlagEnabled ?? false; } return false; }, @@ -657,7 +661,7 @@ test.serial( const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( overlayMatchEnabledVersions, ["javascript"], - makeOverlayMatchFeatures(true), + makeOverlayMatchFeatures({ matchFlagEnabled: true }), getRunnerLogger(true), ); t.deepEqual(result, [ @@ -680,32 +684,13 @@ test.serial( const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( overlayMatchEnabledVersions, ["javascript"], - makeOverlayMatchFeatures(true), + makeOverlayMatchFeatures({ matchFlagEnabled: true }), getRunnerLogger(true), ); t.deepEqual(result, []); }, ); -test.serial( - "getEnabledVersionsWithOverlayBaseDatabases does not list caches when gate is off", - async (t) => { - const listStub = sinon.stub(api, "listActionsCaches").resolves([]); - - const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( - overlayMatchEnabledVersions, - ["javascript"], - makeOverlayMatchFeatures(false), - getRunnerLogger(true), - ); - t.deepEqual(result, []); - t.assert( - listStub.notCalled, - "Should not list Actions caches when the gating feature flag is off.", - ); - }, -); - test.serial( "getEnabledVersionsWithOverlayBaseDatabases does not list caches when rawLanguages is empty", async (t) => { @@ -714,7 +699,7 @@ test.serial( const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( overlayMatchEnabledVersions, undefined, - makeOverlayMatchFeatures(true), + makeOverlayMatchFeatures({ matchFlagEnabled: true }), getRunnerLogger(true), ); t.deepEqual(result, []); @@ -734,7 +719,7 @@ test.serial( const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( overlayMatchEnabledVersions, ["javascript"], - makeOverlayMatchFeatures(true), + makeOverlayMatchFeatures({ matchFlagEnabled: true }), getRunnerLogger(true), ); t.deepEqual(result, []); @@ -754,7 +739,7 @@ test.serial( const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( overlayMatchEnabledVersions, ["javascript"], - makeOverlayMatchFeatures(true), + makeOverlayMatchFeatures({ matchFlagEnabled: true }), getRunnerLogger(true), ); t.deepEqual(result, [ @@ -762,3 +747,75 @@ test.serial( ]); }, ); + +test.serial( + "getEnabledVersionsWithOverlayBaseDatabases does not list caches when both gates are off", + async (t) => { + const listStub = sinon.stub(api, "listActionsCaches").resolves([]); + + const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( + overlayMatchEnabledVersions, + ["javascript"], + makeOverlayMatchFeatures({}), + getRunnerLogger(true), + ); + t.deepEqual(result, []); + t.assert( + listStub.notCalled, + "Should not list Actions caches when both gating feature flags are off.", + ); + }, +); + +test.serial( + "getEnabledVersionsWithOverlayBaseDatabases dry-run returns empty but lists caches", + async (t) => { + sinon.stub(api, "getAutomationID").resolves("test/"); + const listStub = sinon.stub(api, "listActionsCaches").resolves([ + { + key: "codeql-overlay-base-database-1-aaaaaaaaaaaaaaaa-javascript-2.20.1-abc-1-1", + }, + ]); + + const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( + overlayMatchEnabledVersions, + ["javascript"], + makeOverlayMatchFeatures({ dryRunFlagEnabled: true }), + getRunnerLogger(true), + ); + t.deepEqual( + result, + [], + "Dry-run should return an empty list so the caller falls back.", + ); + t.assert( + listStub.calledOnce, + "Dry-run should still list Actions caches to populate the diagnostic.", + ); + }, +); + +test.serial( + "getEnabledVersionsWithOverlayBaseDatabases match flag wins over dry-run", + async (t) => { + sinon.stub(api, "getAutomationID").resolves("test/"); + sinon.stub(api, "listActionsCaches").resolves([ + { + key: "codeql-overlay-base-database-1-aaaaaaaaaaaaaaaa-javascript-2.20.1-abc-1-1", + }, + ]); + + const result = await setupCodeql.getEnabledVersionsWithOverlayBaseDatabases( + overlayMatchEnabledVersions, + ["javascript"], + makeOverlayMatchFeatures({ + matchFlagEnabled: true, + dryRunFlagEnabled: true, + }), + getRunnerLogger(true), + ); + t.deepEqual(result, [ + { cliVersion: "2.20.1", tagName: "codeql-bundle-v2.20.1" }, + ]); + }, +); diff --git a/src/setup-codeql.ts b/src/setup-codeql.ts index 6a0071eb1..108214735 100644 --- a/src/setup-codeql.ts +++ b/src/setup-codeql.ts @@ -14,7 +14,11 @@ import { } from "./actions-util"; import * as api from "./api-client"; import * as defaults from "./defaults.json"; -import { addNoLanguageDiagnostic, makeDiagnostic } from "./diagnostics"; +import { + addNoLanguageDiagnostic, + makeDiagnostic, + makeTelemetryDiagnostic, +} from "./diagnostics"; import { CODEQL_VERSION_ZSTD_BUNDLE, CodeQLDefaultVersionInfo, @@ -270,7 +274,13 @@ async function findOverridingToolsInCache( return undefined; } -/** Returns the sorted set of enabled versions that have cached overlay-base databases. */ +/** + * Returns the sorted set of enabled versions that have cached overlay-base databases for the + * given languages, or an empty list if neither the `OverlayAnalysisMatchCodeqlVersion` nor the + * `OverlayAnalysisMatchCodeqlVersionDryRun` feature flag is enabled. When only the dry-run flag + * is enabled, this performs the lookup and emits a telemetry diagnostic with the version that + * would have been chosen, but still returns an empty list so the caller falls back. + */ export async function getEnabledVersionsWithOverlayBaseDatabases( defaultCliVersion: CodeQLDefaultVersionInfo, rawLanguages: string[] | undefined, @@ -280,7 +290,13 @@ export async function getEnabledVersionsWithOverlayBaseDatabases( if (rawLanguages === undefined || rawLanguages.length === 0) { return []; } - if (!(await features.getValue(Feature.OverlayAnalysisMatchCodeqlVersion))) { + const isEnabled = await features.getValue( + Feature.OverlayAnalysisMatchCodeqlVersion, + ); + const isDryRun = + !isEnabled && + (await features.getValue(Feature.OverlayAnalysisMatchCodeqlVersionDryRun)); + if (!isEnabled && !isDryRun) { return []; } @@ -296,14 +312,50 @@ export async function getEnabledVersionsWithOverlayBaseDatabases( ); return []; } + if (cachedVersions === undefined || cachedVersions.length === 0) { return []; } const cachedVersionsSet = new Set(cachedVersions); - return defaultCliVersion.enabledVersions.filter((v) => + const overlayVersions = defaultCliVersion.enabledVersions.filter((v) => cachedVersionsSet.has(v.cliVersion), ); + + if (overlayVersions.length === 0) { + return []; + } + + const isCachedVersionDifferent = + overlayVersions[0].cliVersion !== + defaultCliVersion.enabledVersions[0].cliVersion; + + if (isCachedVersionDifferent) { + addNoLanguageDiagnostic( + undefined, + makeTelemetryDiagnostic( + "codeql-action/overlay-aware-default-codeql-version", + "Overlay-aware default CodeQL version selection", + { + cachedVersions, + enabledVersions: defaultCliVersion.enabledVersions.map( + (v) => v.cliVersion, + ), + isDryRun, + overlayAwareVersion: overlayVersions[0].cliVersion, + }, + ), + ); + } + + if (isDryRun) { + logger.debug( + `Overlay-aware default CodeQL version selection is running in dry-run mode. Would have used version ${overlayVersions[0].cliVersion}.`, + ); + return []; + } + + return overlayVersions; } /** @@ -334,10 +386,6 @@ async function resolveDefaultCliVersion( ); return overlayVersions[0]; } - logger.info( - `Using CodeQL version ${defaultCliVersion.enabledVersions[0].cliVersion} since no enabled ` + - `versions with cached overlay-base databases were found.`, - ); return defaultCliVersion.enabledVersions[0]; }