diff --git a/lib/analyze-action.js b/lib/analyze-action.js index de4ecf150..99e2697eb 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -91098,7 +91098,7 @@ function getDefaultCacheConfig() { async function makeGlobber(patterns) { return glob.create(patterns.join("\n")); } -async function uploadDependencyCaches(config, logger, minimizeJavaJars) { +async function uploadDependencyCaches(codeql, features, config, logger) { const status = []; for (const language of config.languages) { const cacheConfig = getDefaultCacheConfig()[language]; @@ -91124,7 +91124,7 @@ async function uploadDependencyCaches(config, logger, minimizeJavaJars) { ); continue; } - const key = await cacheKey2(language, cacheConfig, minimizeJavaJars); + const key = await cacheKey2(codeql, features, language, cacheConfig); logger.info( `Uploading cache of size ${size} for ${language} with key ${key}...` ); @@ -91152,17 +91152,21 @@ async function uploadDependencyCaches(config, logger, minimizeJavaJars) { } return status; } -async function cacheKey2(language, cacheConfig, minimizeJavaJars = false) { +async function cacheKey2(codeql, features, language, cacheConfig) { const hash2 = await glob.hashFiles(cacheConfig.hash.join("\n")); - return `${await cachePrefix2(language, minimizeJavaJars)}${hash2}`; + return `${await cachePrefix2(codeql, features, language)}${hash2}`; } -async function cachePrefix2(language, minimizeJavaJars) { +async function cachePrefix2(codeql, features, language) { const runnerOs = getRequiredEnvParam("RUNNER_OS"); const customPrefix = process.env["CODEQL_ACTION_DEPENDENCY_CACHE_PREFIX" /* DEPENDENCY_CACHING_PREFIX */]; let prefix = CODEQL_DEPENDENCY_CACHE_PREFIX; if (customPrefix !== void 0 && customPrefix.length > 0) { prefix = `${prefix}-${customPrefix}`; } + const minimizeJavaJars = await features.getValue( + "java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */, + codeql + ); if (language === "java" /* java */ && minimizeJavaJars) { prefix = `minify-${prefix}`; } @@ -93980,14 +93984,11 @@ async function run() { logger ); if (shouldStoreCache(config.dependencyCachingEnabled)) { - const minimizeJavaJars = await features.getValue( - "java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */, - codeql - ); dependencyCacheResults = await uploadDependencyCaches( + codeql, + features, config, - logger, - minimizeJavaJars + logger ); } if (isInTestMode()) { diff --git a/lib/init-action.js b/lib/init-action.js index 21b5fc123..506360660 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -87285,7 +87285,7 @@ function getDefaultCacheConfig() { async function makeGlobber(patterns) { return glob.create(patterns.join("\n")); } -async function downloadDependencyCaches(languages, logger, minimizeJavaJars) { +async function downloadDependencyCaches(codeql, features, languages, logger) { const status = []; for (const language of languages) { const cacheConfig = getDefaultCacheConfig()[language]; @@ -87303,9 +87303,9 @@ async function downloadDependencyCaches(languages, logger, minimizeJavaJars) { ); continue; } - const primaryKey = await cacheKey2(language, cacheConfig, minimizeJavaJars); + const primaryKey = await cacheKey2(codeql, features, language, cacheConfig); const restoreKeys = [ - await cachePrefix2(language, minimizeJavaJars) + await cachePrefix2(codeql, features, language) ]; logger.info( `Downloading cache for ${language} with key ${primaryKey} and restore keys ${restoreKeys.join( @@ -87330,17 +87330,21 @@ async function downloadDependencyCaches(languages, logger, minimizeJavaJars) { } return status; } -async function cacheKey2(language, cacheConfig, minimizeJavaJars = false) { +async function cacheKey2(codeql, features, language, cacheConfig) { const hash = await glob.hashFiles(cacheConfig.hash.join("\n")); - return `${await cachePrefix2(language, minimizeJavaJars)}${hash}`; + return `${await cachePrefix2(codeql, features, language)}${hash}`; } -async function cachePrefix2(language, minimizeJavaJars) { +async function cachePrefix2(codeql, features, language) { const runnerOs = getRequiredEnvParam("RUNNER_OS"); const customPrefix = process.env["CODEQL_ACTION_DEPENDENCY_CACHE_PREFIX" /* DEPENDENCY_CACHING_PREFIX */]; let prefix = CODEQL_DEPENDENCY_CACHE_PREFIX; if (customPrefix !== void 0 && customPrefix.length > 0) { prefix = `${prefix}-${customPrefix}`; } + const minimizeJavaJars = await features.getValue( + "java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */, + codeql + ); if (language === "java" /* java */ && minimizeJavaJars) { prefix = `minify-${prefix}`; } @@ -90072,15 +90076,12 @@ exec ${goBinaryPath} "$@"` core13.exportVariable(envVar, "false"); } } - const minimizeJavaJars = await features.getValue( - "java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */, - codeql - ); if (shouldRestoreCache(config.dependencyCachingEnabled)) { dependencyCachingResults = await downloadDependencyCaches( + codeql, + features, config.languages, - logger, - minimizeJavaJars + logger ); } if (await codeQlVersionAtLeast(codeql, "2.17.1")) { @@ -90118,7 +90119,7 @@ exec ${goBinaryPath} "$@"` logger.debug( `${"CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */} is already set to '${process.env["CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */]}', so the Action will not override it.` ); - } else if (minimizeJavaJars && config.dependencyCachingEnabled && config.buildMode === "none" /* None */ && config.languages.includes("java" /* java */)) { + } else if (await features.getValue("java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */, codeql) && config.dependencyCachingEnabled && config.buildMode === "none" /* None */ && config.languages.includes("java" /* java */)) { core13.exportVariable( "CODEQL_EXTRACTOR_JAVA_OPTION_MINIMIZE_DEPENDENCY_JARS" /* JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS */, "true" diff --git a/lib/setup-codeql-action.js b/lib/setup-codeql-action.js index 18b293b2a..ea999b534 100644 --- a/lib/setup-codeql-action.js +++ b/lib/setup-codeql-action.js @@ -83876,6 +83876,11 @@ var featureConfig = { legacyApi: true, minimumVersion: "2.15.0" }, + ["csharp_new_cache_key" /* CsharpNewCacheKey */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_CSHARP_NEW_CACHE_KEY", + minimumVersion: void 0 + }, ["diff_informed_queries" /* DiffInformedQueries */]: { defaultValue: true, envVar: "CODEQL_ACTION_DIFF_INFORMED_QUERIES", diff --git a/lib/start-proxy-action.js b/lib/start-proxy-action.js index 322609fc0..c36841952 100644 --- a/lib/start-proxy-action.js +++ b/lib/start-proxy-action.js @@ -99995,6 +99995,11 @@ var featureConfig = { legacyApi: true, minimumVersion: "2.15.0" }, + ["csharp_new_cache_key" /* CsharpNewCacheKey */]: { + defaultValue: false, + envVar: "CODEQL_ACTION_CSHARP_NEW_CACHE_KEY", + minimumVersion: void 0 + }, ["diff_informed_queries" /* DiffInformedQueries */]: { defaultValue: true, envVar: "CODEQL_ACTION_DIFF_INFORMED_QUERIES", diff --git a/src/analyze-action.ts b/src/analyze-action.ts index ff24dd400..3ab1dd132 100644 --- a/src/analyze-action.ts +++ b/src/analyze-action.ts @@ -438,14 +438,11 @@ async function run() { // Store dependency cache(s) if dependency caching is enabled. if (shouldStoreCache(config.dependencyCachingEnabled)) { - const minimizeJavaJars = await features.getValue( - Feature.JavaMinimizeDependencyJars, - codeql, - ); dependencyCacheResults = await uploadDependencyCaches( + codeql, + features, config, logger, - minimizeJavaJars, ); } diff --git a/src/dependency-caching.ts b/src/dependency-caching.ts index 5c7a4a4e8..58eb80e41 100644 --- a/src/dependency-caching.ts +++ b/src/dependency-caching.ts @@ -7,8 +7,10 @@ import * as glob from "@actions/glob"; import { getTemporaryDirectory } from "./actions-util"; import { listActionsCaches } from "./api-client"; import { getTotalCacheSize } from "./caching-utils"; +import { CodeQL } from "./codeql"; import { Config } from "./config-utils"; import { EnvVar } from "./environment"; +import { Feature, Features } from "./feature-flags"; import { KnownLanguage, Language } from "./languages"; import { Logger } from "./logging"; import { getErrorMessage, getRequiredEnvParam } from "./util"; @@ -110,15 +112,18 @@ export type DependencyCacheRestoreStatusReport = DependencyCacheRestoreStatus[]; /** * Attempts to restore dependency caches for the languages being analyzed. * + * @param codeql The CodeQL instance to use. + * @param features Information about which FFs are enabled. * @param languages The languages being analyzed. * @param logger A logger to record some informational messages to. - * @param minimizeJavaJars Whether the Java extractor should rewrite downloaded JARs to minimize their size. + * * @returns An array of `DependencyCacheRestoreStatus` objects for each analysed language with a caching configuration. */ export async function downloadDependencyCaches( + codeql: CodeQL, + features: Features, languages: Language[], logger: Logger, - minimizeJavaJars: boolean, ): Promise { const status: DependencyCacheRestoreStatusReport = []; @@ -144,9 +149,9 @@ export async function downloadDependencyCaches( continue; } - const primaryKey = await cacheKey(language, cacheConfig, minimizeJavaJars); + const primaryKey = await cacheKey(codeql, features, language, cacheConfig); const restoreKeys: string[] = [ - await cachePrefix(language, minimizeJavaJars), + await cachePrefix(codeql, features, language), ]; logger.info( @@ -203,16 +208,18 @@ export type DependencyCacheUploadStatusReport = DependencyCacheUploadStatus[]; /** * Attempts to store caches for the languages that were analyzed. * + * @param codeql The CodeQL instance to use. + * @param features Information about which FFs are enabled. * @param config The configuration for this workflow. * @param logger A logger to record some informational messages to. - * @param minimizeJavaJars Whether the Java extractor should rewrite downloaded JARs to minimize their size. * * @returns An array of `DependencyCacheUploadStatus` objects for each analysed language with a caching configuration. */ export async function uploadDependencyCaches( + codeql: CodeQL, + features: Features, config: Config, logger: Logger, - minimizeJavaJars: boolean, ): Promise { const status: DependencyCacheUploadStatusReport = []; for (const language of config.languages) { @@ -258,7 +265,7 @@ export async function uploadDependencyCaches( continue; } - const key = await cacheKey(language, cacheConfig, minimizeJavaJars); + const key = await cacheKey(codeql, features, language, cacheConfig); logger.info( `Uploading cache of size ${size} for ${language} with key ${key}...`, @@ -299,31 +306,35 @@ export async function uploadDependencyCaches( /** * Computes a cache key for the specified language. * + * @param codeql The CodeQL instance to use. + * @param features Information about which FFs are enabled. * @param language The language being analyzed. * @param cacheConfig The cache configuration for the language. - * @param minimizeJavaJars Whether the Java extractor should rewrite downloaded JARs to minimize their size. * @returns A cache key capturing information about the project(s) being analyzed in the specified language. */ async function cacheKey( + codeql: CodeQL, + features: Features, language: Language, cacheConfig: CacheConfig, - minimizeJavaJars: boolean = false, ): Promise { const hash = await glob.hashFiles(cacheConfig.hash.join("\n")); - return `${await cachePrefix(language, minimizeJavaJars)}${hash}`; + return `${await cachePrefix(codeql, features, language)}${hash}`; } /** * Constructs a prefix for the cache key, comprised of a CodeQL-specific prefix, a version number that * can be changed to invalidate old caches, the runner's operating system, and the specified language name. * + * @param codeql The CodeQL instance to use. + * @param features Information about which FFs are enabled. * @param language The language being analyzed. - * @param minimizeJavaJars Whether the Java extractor should rewrite downloaded JARs to minimize their size. * @returns The prefix that identifies what a cache is for. */ async function cachePrefix( + codeql: CodeQL, + features: Features, language: Language, - minimizeJavaJars: boolean, ): Promise { const runnerOs = getRequiredEnvParam("RUNNER_OS"); const customPrefix = process.env[EnvVar.DEPENDENCY_CACHING_PREFIX]; @@ -334,6 +345,10 @@ async function cachePrefix( } // To ensure a safe rollout of JAR minimization, we change the key when the feature is enabled. + const minimizeJavaJars = await features.getValue( + Feature.JavaMinimizeDependencyJars, + codeql, + ); if (language === KnownLanguage.java && minimizeJavaJars) { prefix = `minify-${prefix}`; } diff --git a/src/init-action.ts b/src/init-action.ts index 97cb6b784..3512520c2 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -578,15 +578,12 @@ async function run() { } // Restore dependency cache(s), if they exist. - const minimizeJavaJars = await features.getValue( - Feature.JavaMinimizeDependencyJars, - codeql, - ); if (shouldRestoreCache(config.dependencyCachingEnabled)) { dependencyCachingResults = await downloadDependencyCaches( + codeql, + features, config.languages, logger, - minimizeJavaJars, ); } @@ -648,7 +645,7 @@ async function run() { `${EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS} is already set to '${process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]}', so the Action will not override it.`, ); } else if ( - minimizeJavaJars && + (await features.getValue(Feature.JavaMinimizeDependencyJars, codeql)) && config.dependencyCachingEnabled && config.buildMode === BuildMode.None && config.languages.includes(KnownLanguage.java)