diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a424914..f5b37ac8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,9 @@ See the [releases page](https://github.com/github/codeql-action/releases) for th ## [UNRELEASED] -- Added an experimental change which skips collecting file coverage information on pull requests to improve analysis performance. File coverage information will still be computed on non-PR analyses. +- Upcoming change: Starting April 2026, the CodeQL Action will skip collecting file coverage information on pull requests to improve analysis performance. File coverage information will still be computed on non-PR analyses. Pull request analyses will log a warning about this upcoming change. - Repositories owned by an organization can opt out of this change by creating a custom repository property with the name `github-codeql-file-coverage-on-prs` and the type "True/false", then setting this property to `true` in the repository's settings. For more information, see [Managing custom properties for repositories in your organization](https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization). - - We expect to roll this change out to everyone in March. [#3562](https://github.com/github/codeql-action/pull/3562) + Repositories owned by an organization can opt out of this change by creating a custom repository property with the name `github-codeql-file-coverage-on-prs` and the type "True/false", then setting this property to `true` in the repository's settings. For more information, see [Managing custom properties for repositories in your organization](https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization). [#3562](https://github.com/github/codeql-action/pull/3562) - Fixed [a bug](https://github.com/github/codeql-action/issues/3555) which caused the CodeQL Action to fail loading repository properties if a "Multi select" repository property was configured for the repository. [#3557](https://github.com/github/codeql-action/pull/3557) - The CodeQL Action now loads [custom repository properties](https://docs.github.com/en/organizations/managing-organization-settings/managing-custom-properties-for-repositories-in-your-organization) on GitHub Enterprise Server, enabling the customization of features such as `github-codeql-disable-overlay` that was previously only available on GitHub.com. [#3559](https://github.com/github/codeql-action/pull/3559) diff --git a/lib/init-action.js b/lib/init-action.js index f5d4caece..a2a95f193 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -109087,18 +109087,38 @@ function cleanupDatabaseClusterDirectory(config, logger, options = {}, rmSync2 = } async function getFileCoverageInformationEnabled(debugMode, codeql, features, repositoryProperties) { if (debugMode) { - return { enabled: true, enabledByRepositoryProperty: false }; + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: false + }; } if (!isAnalyzingPullRequest()) { - return { enabled: true, enabledByRepositoryProperty: false }; - } - if (!await features.getValue("skip_file_coverage_on_prs" /* SkipFileCoverageOnPrs */, codeql)) { - return { enabled: true, enabledByRepositoryProperty: false }; + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: false + }; } if (repositoryProperties["github-codeql-file-coverage-on-prs" /* FILE_COVERAGE_ON_PRS */] === true) { - return { enabled: true, enabledByRepositoryProperty: true }; + return { + enabled: true, + enabledByRepositoryProperty: true, + showDeprecationWarning: false + }; } - return { enabled: false, enabledByRepositoryProperty: false }; + if (!await features.getValue("skip_file_coverage_on_prs" /* SkipFileCoverageOnPrs */, codeql)) { + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: true + }; + } + return { + enabled: false, + enabledByRepositoryProperty: false, + showDeprecationWarning: false + }; } // src/status-report.ts @@ -109767,6 +109787,15 @@ async function run(startedAt) { ) ); } + if (fileCoverageResult.showDeprecationWarning && !process.env["CODEQL_ACTION_DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION" /* DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION */]) { + logger.warning( + 'Starting April 2026, the CodeQL Action will skip collecting file coverage information on pull requests to improve analysis performance. File coverage information will still be computed on non-PR analyses. Repositories owned by an organization can opt out of this change by creating a custom repository property with the name `github-codeql-file-coverage-on-prs` and the type "True/false", then setting this property to `true` in the repository\'s settings.' + ); + core13.exportVariable( + "CODEQL_ACTION_DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION" /* DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION */, + "true" + ); + } await checkInstallPython311(config.languages, codeql); } catch (unwrappedError) { const error3 = wrapError(unwrappedError); diff --git a/src/environment.ts b/src/environment.ts index 75fc3a7de..03ac727f3 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -47,6 +47,9 @@ export enum EnvVar { /** Whether the init action has been run. */ INIT_ACTION_HAS_RUN = "CODEQL_ACTION_INIT_HAS_RUN", + /** Whether the deprecation warning for file coverage on PRs has been logged. */ + DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION = "CODEQL_ACTION_DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION", + /** Whether the error for a deprecated version of the CodeQL Action was logged. */ LOG_VERSION_DEPRECATION = "CODEQL_ACTION_DID_LOG_VERSION_DEPRECATION", diff --git a/src/init-action.ts b/src/init-action.ts index 6ca8d0c97..76dd0bdba 100644 --- a/src/init-action.ts +++ b/src/init-action.ts @@ -409,6 +409,23 @@ async function run(startedAt: Date) { ); } + if ( + fileCoverageResult.showDeprecationWarning && + !process.env[EnvVar.DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION] + ) { + logger.warning( + "Starting April 2026, the CodeQL Action will skip collecting file coverage information on pull requests " + + "to improve analysis performance. File coverage information will still be computed on non-PR analyses. " + + "Repositories owned by an organization can opt out of this change by creating a custom repository property " + + 'with the name `github-codeql-file-coverage-on-prs` and the type "True/false", then setting this property to ' + + "`true` in the repository's settings.", + ); + core.exportVariable( + EnvVar.DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION, + "true", + ); + } + await checkInstallPython311(config.languages, codeql); } catch (unwrappedError) { const error = wrapError(unwrappedError); diff --git a/src/init.test.ts b/src/init.test.ts index c37d1c1e6..0d5a5783c 100644 --- a/src/init.test.ts +++ b/src/init.test.ts @@ -460,6 +460,7 @@ test("file coverage information enabled when debugMode is true", async (t) => { ); t.true(result.enabled); t.false(result.enabledByRepositoryProperty); + t.false(result.showDeprecationWarning); }); test.serial( @@ -475,11 +476,12 @@ test.serial( ); t.true(result.enabled); t.false(result.enabledByRepositoryProperty); + t.false(result.showDeprecationWarning); }, ); test.serial( - "file coverage information enabled when feature flag is not enabled", + "file coverage information enabled when feature flag is not enabled, with deprecation warning", async (t) => { sinon.stub(actionsUtil, "isAnalyzingPullRequest").returns(true); @@ -491,6 +493,7 @@ test.serial( ); t.true(result.enabled); t.false(result.enabledByRepositoryProperty); + t.true(result.showDeprecationWarning); }, ); @@ -509,6 +512,7 @@ test.serial( ); t.true(result.enabled); t.true(result.enabledByRepositoryProperty); + t.false(result.showDeprecationWarning); }, ); @@ -525,5 +529,6 @@ test.serial( ); t.false(result.enabled); t.false(result.enabledByRepositoryProperty); + t.false(result.showDeprecationWarning); }, ); diff --git a/src/init.ts b/src/init.ts index a1c6b2108..c4b219afc 100644 --- a/src/init.ts +++ b/src/init.ts @@ -309,29 +309,52 @@ export async function getFileCoverageInformationEnabled( ): Promise<{ enabled: boolean; enabledByRepositoryProperty: boolean; + showDeprecationWarning: boolean; }> { // Always enable file coverage information in debug mode if (debugMode) { - return { enabled: true, enabledByRepositoryProperty: false }; + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: false, + }; } // We're most interested in speeding up PRs, and we want to keep // submitting file coverage information for the default branch since // it is used to populate the status page. if (!isAnalyzingPullRequest()) { - return { enabled: true, enabledByRepositoryProperty: false }; - } - // If the feature is disabled, then maintain the previous behavior of - // unconditionally computing file coverage information. - if (!(await features.getValue(Feature.SkipFileCoverageOnPrs, codeql))) { - return { enabled: true, enabledByRepositoryProperty: false }; + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: false, + }; } // Allow repositories to opt in to file coverage information on PRs - // using a repository property. + // using a repository property. In this case, don't show the deprecation + // warning since the repository has explicitly opted in. if ( repositoryProperties[RepositoryPropertyName.FILE_COVERAGE_ON_PRS] === true ) { - return { enabled: true, enabledByRepositoryProperty: true }; + return { + enabled: true, + enabledByRepositoryProperty: true, + showDeprecationWarning: false, + }; + } + // If the feature is disabled, then maintain the previous behavior of + // unconditionally computing file coverage information, but warn that + // file coverage on PRs will be disabled in a future release. + if (!(await features.getValue(Feature.SkipFileCoverageOnPrs, codeql))) { + return { + enabled: true, + enabledByRepositoryProperty: false, + showDeprecationWarning: true, + }; } // Otherwise, disable file coverage information on PRs to speed up analysis. - return { enabled: false, enabledByRepositoryProperty: false }; + return { + enabled: false, + enabledByRepositoryProperty: false, + showDeprecationWarning: false, + }; }