diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index efbb246fc..cc7d3de99 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -79,7 +79,6 @@ jobs: - ubuntu-24.04 - windows-2022 - windows-2025 - - macos-14-xlarge - macos-15-xlarge tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ${{ matrix.os }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aa6b37e6..091c04cd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ See the [releases page](https://github.com/github/codeql-action/releases) for th No user facing changes. +## 4.39.3 - 04 Nov 2026 + +- Fixed diff-informed alert filtering incorrectly removing alerts in changed files whose paths contain spaces, special characters, or non-ASCII characters. [#4283](https://github.com/github/codeql-action/pull/4283) + ## 4.39.2 - 03 Nov 2026 - Update default CodeQL bundle version to [2.27.4](https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.4). [#4284](https://github.com/github/codeql-action/pull/4284) diff --git a/lib/entry-points.js b/lib/entry-points.js index 18350f0b3..619139253 100644 --- a/lib/entry-points.js +++ b/lib/entry-points.js @@ -178722,7 +178722,7 @@ function getDiffRangesJsonFilePath(env = getEnv()) { return path2.join(getTemporaryDirectory(env), PR_DIFF_RANGE_JSON_FILENAME); } function getActionVersion() { - return "4.39.3"; + return "4.39.4"; } function getWorkflowEventName(env = getEnv()) { return env.getRequired("GITHUB_EVENT_NAME" /* GITHUB_EVENT_NAME */); @@ -184862,13 +184862,16 @@ async function deleteToolcacheBundles({ } const versionDirectory = path12.join(toolDirectory, entry.name); try { + const deletionStart = import_perf_hooks3.performance.now(); await fs15.promises.rm(versionDirectory, { force: true, recursive: true }); deletedVersions.push(entry.name); logger2.info( - `Deleted the CodeQL tools at '${versionDirectory}' from the toolcache to free up disk space.` + `Deleted the CodeQL tools at '${versionDirectory}' from the toolcache to free up disk space (${formatDuration( + durationMsSince(deletionStart) + )}).` ); } catch (e) { failed = true; @@ -185367,13 +185370,14 @@ async function tryDeleteToolcacheBundles({ if (!isGitHubHostedRunner(env) || !isToolcacheOnWorkspaceFilesystem(logger2)) { return; } + const startTime = import_perf_hooks4.performance.now(); const result = await deleteToolcacheBundles({ env, logger: logger2 }); addNoLanguageDiagnostic( void 0, makeTelemetryDiagnostic( "codeql-action/toolcache-bundle-cleanup", "Toolcache CodeQL bundle cleanup", - { ...result } + { ...result, durationMs: durationMsSince(startTime) } ) ); } diff --git a/package-lock.json b/package-lock.json index 322b31992..a564ad8e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codeql", - "version": "4.39.3", + "version": "4.39.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codeql", - "version": "4.39.3", + "version": "4.39.4", "license": "MIT", "workspaces": [ "pr-checks" diff --git a/package.json b/package.json index 86e45e9be..ecdad56ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codeql", - "version": "4.39.3", + "version": "4.39.4", "private": true, "description": "CodeQL action", "scripts": { diff --git a/src/setup-codeql.test.ts b/src/setup-codeql.test.ts index a244501c3..e8c64c616 100644 --- a/src/setup-codeql.test.ts +++ b/src/setup-codeql.test.ts @@ -1821,7 +1821,8 @@ function createToolcacheEntry( /** * Stubs out the download and the diagnostic sink, then downloads the CodeQL tools. * - * @returns the extraction directory and the toolcache cleanup diagnostic, if emitted. + * @returns the extraction directory and, if the toolcache cleanup diagnostic was emitted, the + * cleanup duration it reports and its other attributes. */ async function runDownloadCodeQL( toolcacheRoot: string, @@ -1837,6 +1838,7 @@ async function runDownloadCodeQL( ): Promise<{ codeqlFolder: string; cleanupDiagnostic: toolsDownload.ToolcacheCleanupResult | undefined; + cleanupDurationMs: number | undefined; }> { stubDownloadAndExtract(); const addDiagnostic = sinon.stub(diagnostics, "addNoLanguageDiagnostic"); @@ -1866,11 +1868,21 @@ async function runDownloadCodeQL( .map((call) => call.args[1]) .find((d) => d.source?.id === "codeql-action/toolcache-bundle-cleanup"); - return { - codeqlFolder, - cleanupDiagnostic: diagnostic?.attributes as - toolsDownload.ToolcacheCleanupResult | undefined, - }; + if (diagnostic === undefined) { + return { + codeqlFolder, + cleanupDiagnostic: undefined, + cleanupDurationMs: undefined, + }; + } + + // The duration varies between runs, so split it out to let tests compare the other attributes + // exactly. + const { durationMs, ...cleanupDiagnostic } = + diagnostic.attributes as toolsDownload.ToolcacheCleanupResult & { + durationMs: number; + }; + return { codeqlFolder, cleanupDiagnostic, cleanupDurationMs: durationMs }; } /** @@ -1991,6 +2003,35 @@ test.serial( }, ); +test.serial( + "downloadCodeQLBundle reports the total time taken to clean up the toolcache", + async (t) => { + await withTmpDir(async (tmpDir) => { + setupActionsVars(tmpDir, tmpDir); + + createToolcacheEntry(tmpDir, "CodeQL", CLEANUP_CLI_VERSION); + createToolcacheEntry(tmpDir, "CodeQL", CLEANUP_STALE_VERSION); + + // Advance the clock by 1.5s each time a path is deleted, so that deleting both versions + // takes 3s. + let elapsedMs = 1000; + sinon.stub(performance, "now").callsFake(() => elapsedMs); + const rm = fs.promises.rm; + sinon.stub(fs.promises, "rm").callsFake(async (...args) => { + elapsedMs += 1500; + await rm(...args); + }); + + const { cleanupDurationMs } = await runDownloadCodeQL( + tmpDir, + CLEANUP_BUNDLE_VERSION, + ); + + t.is(cleanupDurationMs, 3000); + }); + }, +); + test.serial( "downloadCodeQLBundle reports no deleted versions when the toolcache has no CodeQL bundles", async (t) => { diff --git a/src/setup-codeql.ts b/src/setup-codeql.ts index d70e1f508..b87b81bdc 100644 --- a/src/setup-codeql.ts +++ b/src/setup-codeql.ts @@ -814,6 +814,7 @@ async function tryDeleteToolcacheBundles({ return; } + const startTime = performance.now(); const result = await deleteToolcacheBundles({ env, logger }); addNoLanguageDiagnostic( @@ -821,7 +822,7 @@ async function tryDeleteToolcacheBundles({ makeTelemetryDiagnostic( "codeql-action/toolcache-bundle-cleanup", "Toolcache CodeQL bundle cleanup", - { ...result }, + { ...result, durationMs: util.durationMsSince(startTime) }, ), ); } diff --git a/src/tools-download.ts b/src/tools-download.ts index a92dad0ac..a5b5a5a0d 100644 --- a/src/tools-download.ts +++ b/src/tools-download.ts @@ -342,13 +342,16 @@ export async function deleteToolcacheBundles({ const versionDirectory = path.join(toolDirectory, entry.name); try { + const deletionStart = performance.now(); await fs.promises.rm(versionDirectory, { force: true, recursive: true, }); deletedVersions.push(entry.name); logger.info( - `Deleted the CodeQL tools at '${versionDirectory}' from the toolcache to free up disk space.`, + `Deleted the CodeQL tools at '${versionDirectory}' from the toolcache to free up disk space (${formatDuration( + durationMsSince(deletionStart), + )}).`, ); } catch (e) { failed = true; diff --git a/unreleased-change-notes/decode-diff-informed-sarif-uris.md b/unreleased-change-notes/decode-diff-informed-sarif-uris.md deleted file mode 100644 index b233ef437..000000000 --- a/unreleased-change-notes/decode-diff-informed-sarif-uris.md +++ /dev/null @@ -1 +0,0 @@ -- Fixed diff-informed alert filtering incorrectly removing alerts in changed files whose paths contain spaces, special characters, or non-ASCII characters. [#4283](https://github.com/github/codeql-action/pull/4283)