Compare commits

...

7 Commits

Author SHA1 Message Date
Michael B. Gale 8041026692 Add NODE_ENV as safe environment variable 2026-05-22 15:14:24 +01:00
Michael B. Gale d3b3ffb888 Add basic eslint enforcement 2026-05-22 15:03:52 +01:00
Michael B. Gale dc5f2b964a Add wrapper around core.exportVariable 2026-05-22 15:03:52 +01:00
Michael B. Gale ffebdc8cf8 Move isInTestMode to environment.ts 2026-05-22 13:45:07 +01:00
Óscar San José 0fb8a6672b Merge pull request #3928 from github/mergeback/v4.36.0-to-main-7211b7c8
Mergeback v4.36.0 refs/heads/releases/v4 into main
2026-05-22 11:28:10 +00:00
github-actions[bot] 80795fb0d4 Rebuild 2026-05-22 11:08:00 +00:00
github-actions[bot] 0cd24d8654 Update changelog and version after v4.36.0 2026-05-22 11:07:48 +00:00
23 changed files with 564 additions and 521 deletions
+4
View File
@@ -2,6 +2,10 @@
See the [releases page](https://github.com/github/codeql-action/releases) for the relevant changes to the CodeQL CLI and language packs. See the [releases page](https://github.com/github/codeql-action/releases) for the relevant changes to the CodeQL CLI and language packs.
## [UNRELEASED]
No user facing changes.
## 4.36.0 - 22 May 2026 ## 4.36.0 - 22 May 2026
- _Breaking change_: Bump the minimum required CodeQL bundle version to 2.19.4. [#3894](https://github.com/github/codeql-action/pull/3894) - _Breaking change_: Bump the minimum required CodeQL bundle version to 2.19.4. [#3894](https://github.com/github/codeql-action/pull/3894)
+21
View File
@@ -140,6 +140,18 @@ export default [
"no-async-foreach/no-async-foreach": "error", "no-async-foreach/no-async-foreach": "error",
"no-sequences": "error", "no-sequences": "error",
"no-shadow": "off", "no-shadow": "off",
// A basic check that we don't use `exportVariable` from `@actions/core`. This rule depends on
// the module being imported as `core`, but that is a good enough check for us.
"no-restricted-syntax": [
"error",
{
selector:
"MemberExpression[object.name='core'][property.name='exportVariable']",
message: "Use `exportVariable` from `environment.ts` instead.",
},
],
// This is overly restrictive with unsetting `EnvVar`s // This is overly restrictive with unsetting `EnvVar`s
"@typescript-eslint/no-dynamic-delete": "off", "@typescript-eslint/no-dynamic-delete": "off",
"@typescript-eslint/no-shadow": "error", "@typescript-eslint/no-shadow": "error",
@@ -157,6 +169,15 @@ export default [
], ],
}, },
}, },
{
files: ["src/environment.ts"],
// We allow `exportVariable` from `@actions/core` to be used in this file
// since it defines the wrapper around it that other modules use.
rules: {
"no-restricted-syntax": "off",
},
},
{ {
files: ["**/*.ts", "**/*.js"], files: ["**/*.ts", "**/*.js"],
+436 -434
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.36.0", "version": "4.36.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "codeql", "name": "codeql",
"version": "4.36.0", "version": "4.36.1",
"license": "MIT", "license": "MIT",
"workspaces": [ "workspaces": [
"pr-checks" "pr-checks"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "codeql", "name": "codeql",
"version": "4.36.0", "version": "4.36.1",
"private": true, "private": true,
"description": "CodeQL action", "description": "CodeQL action",
"scripts": { "scripts": {
@@ -23,7 +23,8 @@ predicate isSafeForDefaultSetup(string envVar) {
"GITHUB_BASE_REF", "GITHUB_EVENT_NAME", "GITHUB_JOB", "GITHUB_RUN_ATTEMPT", "GITHUB_RUN_ID", "GITHUB_BASE_REF", "GITHUB_EVENT_NAME", "GITHUB_JOB", "GITHUB_RUN_ATTEMPT", "GITHUB_RUN_ID",
"GITHUB_SHA", "GITHUB_REPOSITORY", "GITHUB_SERVER_URL", "GITHUB_TOKEN", "GITHUB_WORKFLOW", "GITHUB_SHA", "GITHUB_REPOSITORY", "GITHUB_SERVER_URL", "GITHUB_TOKEN", "GITHUB_WORKFLOW",
"GITHUB_WORKSPACE", "GOFLAGS", "ImageVersion", "JAVA_TOOL_OPTIONS", "RUNNER_ARCH", "GITHUB_WORKSPACE", "GOFLAGS", "ImageVersion", "JAVA_TOOL_OPTIONS", "RUNNER_ARCH",
"RUNNER_ENVIRONMENT", "RUNNER_NAME", "RUNNER_OS", "RUNNER_TEMP", "RUNNER_TOOL_CACHE" "RUNNER_ENVIRONMENT", "RUNNER_NAME", "RUNNER_OS", "RUNNER_TEMP", "RUNNER_TOOL_CACHE",
"NODE_ENV"
] ]
} }
+3 -3
View File
@@ -28,7 +28,7 @@ import {
DependencyCacheUploadStatusReport, DependencyCacheUploadStatusReport,
uploadDependencyCaches, uploadDependencyCaches,
} from "./dependency-caching"; } from "./dependency-caching";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { initFeatures } from "./feature-flags"; import { initFeatures } from "./feature-flags";
import { BuiltInLanguage } from "./languages"; import { BuiltInLanguage } from "./languages";
import { getActionsLogger, Logger } from "./logging"; import { getActionsLogger, Logger } from "./logging";
@@ -284,7 +284,7 @@ async function run(startedAt: Date) {
const apiDetails = getApiDetails(); const apiDetails = getApiDetails();
const outputDir = actionsUtil.getRequiredInput("output"); const outputDir = actionsUtil.getRequiredInput("output");
core.exportVariable(EnvVar.SARIF_RESULTS_OUTPUT_DIR, outputDir); exportVariable(EnvVar.SARIF_RESULTS_OUTPUT_DIR, outputDir);
const threads = util.getThreadsFlag( const threads = util.getThreadsFlag(
actionsUtil.getOptionalInput("threads") || process.env["CODEQL_THREADS"], actionsUtil.getOptionalInput("threads") || process.env["CODEQL_THREADS"],
logger, logger,
@@ -444,7 +444,7 @@ async function run(startedAt: Date) {
`expect-error input was set to true but no error was thrown.`, `expect-error input was set to true but no error was thrown.`,
); );
} }
core.exportVariable(EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY, "true"); exportVariable(EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY, "true");
} catch (unwrappedError) { } catch (unwrappedError) {
const error = util.wrapError(unwrappedError); const error = util.wrapError(unwrappedError);
if ( if (
+2 -2
View File
@@ -3,7 +3,7 @@ import * as githubUtils from "@actions/github/lib/utils";
import * as retry from "@octokit/plugin-retry"; import * as retry from "@octokit/plugin-retry";
import { getActionVersion, getRequiredInput } from "./actions-util"; import { getActionVersion, getRequiredInput } from "./actions-util";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { Logger } from "./logging"; import { Logger } from "./logging";
import { getRepositoryNwo, RepositoryNwo } from "./repository"; import { getRepositoryNwo, RepositoryNwo } from "./repository";
import { import {
@@ -216,7 +216,7 @@ export async function getAnalysisKey(): Promise<string> {
const jobName = getRequiredEnvParam("GITHUB_JOB"); const jobName = getRequiredEnvParam("GITHUB_JOB");
analysisKey = `${workflowPath}:${jobName}`; analysisKey = `${workflowPath}:${jobName}`;
core.exportVariable(EnvVar.ANALYSIS_KEY, analysisKey); exportVariable(EnvVar.ANALYSIS_KEY, analysisKey);
return analysisKey; return analysisKey;
} }
+2 -2
View File
@@ -9,7 +9,7 @@ import { getGitHubVersion } from "./api-client";
import { determineAutobuildLanguages, runAutobuild } from "./autobuild"; import { determineAutobuildLanguages, runAutobuild } from "./autobuild";
import { getCodeQL } from "./codeql"; import { getCodeQL } from "./codeql";
import { Config, getConfig } from "./config-utils"; import { Config, getConfig } from "./config-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { Language } from "./languages"; import { Language } from "./languages";
import { Logger, getActionsLogger } from "./logging"; import { Logger, getActionsLogger } from "./logging";
import { import {
@@ -137,7 +137,7 @@ async function run(startedAt: Date) {
return; return;
} }
core.exportVariable(EnvVar.AUTOBUILD_DID_COMPLETE_SUCCESSFULLY, "true"); exportVariable(EnvVar.AUTOBUILD_DID_COMPLETE_SUCCESSFULLY, "true");
await sendCompletedStatusReport(config, logger, startedAt, languages ?? []); await sendCompletedStatusReport(config, logger, startedAt, languages ?? []);
} }
+5 -7
View File
@@ -1,11 +1,9 @@
import * as core from "@actions/core";
import { getTemporaryDirectory, getWorkflowEventName } from "./actions-util"; import { getTemporaryDirectory, getWorkflowEventName } from "./actions-util";
import { getGitHubVersion } from "./api-client"; import { getGitHubVersion } from "./api-client";
import { CodeQL, getCodeQL } from "./codeql"; import { CodeQL, getCodeQL } from "./codeql";
import * as configUtils from "./config-utils"; import * as configUtils from "./config-utils";
import { DocUrl } from "./doc-url"; import { DocUrl } from "./doc-url";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { Feature, featureConfig, initFeatures } from "./feature-flags"; import { Feature, featureConfig, initFeatures } from "./feature-flags";
import { BuiltInLanguage, Language } from "./languages"; import { BuiltInLanguage, Language } from "./languages";
import { Logger } from "./logging"; import { Logger } from "./logging";
@@ -136,16 +134,16 @@ export async function setupCppAutobuild(codeql: CodeQL, logger: Logger) {
: "" : ""
}`, }`,
); );
core.exportVariable(envVar, "false"); exportVariable(envVar, "false");
} else { } else {
logger.info( logger.info(
`Enabling ${featureName}. This can be disabled by setting the ${envVar} environment variable to 'false'. See ${DocUrl.DEFINE_ENV_VARIABLES} for more information.`, `Enabling ${featureName}. This can be disabled by setting the ${envVar} environment variable to 'false'. See ${DocUrl.DEFINE_ENV_VARIABLES} for more information.`,
); );
core.exportVariable(envVar, "true"); exportVariable(envVar, "true");
} }
} else { } else {
logger.info(`Disabling ${featureName}.`); logger.info(`Disabling ${featureName}.`);
core.exportVariable(envVar, "false"); exportVariable(envVar, "false");
} }
} }
@@ -165,7 +163,7 @@ export async function runAutobuild(
await codeQL.runAutobuild(config, language); await codeQL.runAutobuild(config, language);
} }
if (language === BuiltInLanguage.go) { if (language === BuiltInLanguage.go) {
core.exportVariable(EnvVar.DID_AUTOBUILD_GOLANG, "true"); exportVariable(EnvVar.DID_AUTOBUILD_GOLANG, "true");
} }
logger.endGroup(); logger.endGroup();
} }
+2 -2
View File
@@ -15,7 +15,7 @@ import * as api from "./api-client";
import { CliError, wrapCliConfigurationError } from "./cli-errors"; import { CliError, wrapCliConfigurationError } from "./cli-errors";
import { appendExtraQueryExclusions, type Config } from "./config-utils"; import { appendExtraQueryExclusions, type Config } from "./config-utils";
import { DocUrl } from "./doc-url"; import { DocUrl } from "./doc-url";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { import {
CodeQLDefaultVersionInfo, CodeQLDefaultVersionInfo,
Feature, Feature,
@@ -1096,7 +1096,7 @@ async function getCodeQLForCmd(
}' by 'github/codeql-action/*@v${getActionVersion()}' in your code scanning workflow to ` + }' by 'github/codeql-action/*@v${getActionVersion()}' in your code scanning workflow to ` +
"continue using this version of the CodeQL Action.", "continue using this version of the CodeQL Action.",
); );
core.exportVariable(EnvVar.SUPPRESS_DEPRECATED_SOON_WARNING, "true"); exportVariable(EnvVar.SUPPRESS_DEPRECATED_SOON_WARNING, "true");
} }
return codeql; return codeql;
} }
+3 -4
View File
@@ -2,7 +2,6 @@ import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import { performance } from "perf_hooks"; import { performance } from "perf_hooks";
import * as core from "@actions/core";
import * as yaml from "js-yaml"; import * as yaml from "js-yaml";
import { import {
@@ -32,7 +31,7 @@ import {
makeTelemetryDiagnostic, makeTelemetryDiagnostic,
} from "./diagnostics"; } from "./diagnostics";
import { prepareDiffInformedAnalysis } from "./diff-informed-analysis-utils"; import { prepareDiffInformedAnalysis } from "./diff-informed-analysis-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import * as errorMessages from "./error-messages"; import * as errorMessages from "./error-messages";
import { Feature, FeatureEnablement } from "./feature-flags"; import { Feature, FeatureEnablement } from "./feature-flags";
import { import {
@@ -1045,10 +1044,10 @@ async function setCppTrapCachingEnvironmentVariables(
); );
} else if (config.trapCaches[BuiltInLanguage.cpp]) { } else if (config.trapCaches[BuiltInLanguage.cpp]) {
logger.info("Enabling TRAP caching for C/C++."); logger.info("Enabling TRAP caching for C/C++.");
core.exportVariable(envVar, "true"); exportVariable(envVar, "true");
} else { } else {
logger.debug(`Disabling TRAP caching for C/C++.`); logger.debug(`Disabling TRAP caching for C/C++.`);
core.exportVariable(envVar, "false"); exportVariable(envVar, "false");
} }
} }
} }
+2 -2
View File
@@ -11,7 +11,7 @@ import { dbIsFinalized } from "./analyze";
import { scanArtifactsForTokens } from "./artifact-scanner"; import { scanArtifactsForTokens } from "./artifact-scanner";
import { type CodeQL } from "./codeql"; import { type CodeQL } from "./codeql";
import { Config } from "./config-utils"; import { Config } from "./config-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import * as json from "./json"; import * as json from "./json";
import { Language } from "./languages"; import { Language } from "./languages";
import { Logger, withGroup } from "./logging"; import { Logger, withGroup } from "./logging";
@@ -330,7 +330,7 @@ export async function uploadArtifacts(
// some issues early. // some issues early.
if (isInTestMode()) { if (isInTestMode()) {
await scanArtifactsForTokens(toUpload, logger); await scanArtifactsForTokens(toUpload, logger);
core.exportVariable("CODEQL_ACTION_ARTIFACT_SCAN_FINISHED", "true"); exportVariable("CODEQL_ACTION_ARTIFACT_SCAN_FINISHED", "true");
} }
const suffix = getArtifactSuffix(getOptionalInput("matrix")); const suffix = getArtifactSuffix(getOptionalInput("matrix"));
+28
View File
@@ -1,3 +1,5 @@
import * as core from "@actions/core";
/** /**
* Environment variables used by the CodeQL Action. * Environment variables used by the CodeQL Action.
* *
@@ -154,3 +156,29 @@ export enum EnvVar {
/** Used by Code Scanning Risk Assessment to communicate the assessment ID to the CodeQL Action. */ /** Used by Code Scanning Risk Assessment to communicate the assessment ID to the CodeQL Action. */
RISK_ASSESSMENT_ID = "CODEQL_ACTION_RISK_ASSESSMENT_ID", RISK_ASSESSMENT_ID = "CODEQL_ACTION_RISK_ASSESSMENT_ID",
} }
/**
* Returns whether we are in test mode. This is used by CodeQL Action PR checks.
*
* In test mode, we skip several uploads (SARIF results, status reports, DBs, ...).
*/
export function isInTestMode(): boolean {
return process.env[EnvVar.TEST_MODE] === "true";
}
/**
* Wrapper around `core.exportVariable` which does not call `core.exportVariable`
* when running unit tests. This is important, because otherwise `core.exportVariable`
* sets environment variables for other steps in a workflow when we run unit tests in CI.
*/
export function exportVariable(name: string, val: any): void {
if (process.env["NODE_ENV"] === "test") {
// Setting the environment variable for the current process is OK since we reset
// those at the end of each test. This allows tests to pass that rely on that
// part of the `core.exportVariable` behaviour.
process.env[name] = val;
} else {
// Call `core.exportVariable` whenever we are not in a test environment.
core.exportVariable(name, val);
}
}
+3 -3
View File
@@ -20,7 +20,7 @@ import {
DependencyCachingUsageReport, DependencyCachingUsageReport,
getDependencyCacheUsage, getDependencyCacheUsage,
} from "./dependency-caching"; } from "./dependency-caching";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { initFeatures } from "./feature-flags"; import { initFeatures } from "./feature-flags";
import * as gitUtils from "./git-utils"; import * as gitUtils from "./git-utils";
import * as initActionPostHelper from "./init-action-post-helper"; import * as initActionPostHelper from "./init-action-post-helper";
@@ -157,7 +157,7 @@ function getFinalJobStatus(config: Config | undefined): JobStatus {
let jobStatus: JobStatus; let jobStatus: JobStatus;
if (process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] === "true") { if (process.env[EnvVar.ANALYZE_DID_COMPLETE_SUCCESSFULLY] === "true") {
core.exportVariable(EnvVar.JOB_STATUS, JobStatus.SuccessStatus); exportVariable(EnvVar.JOB_STATUS, JobStatus.SuccessStatus);
jobStatus = JobStatus.SuccessStatus; jobStatus = JobStatus.SuccessStatus;
} else if (config !== undefined) { } else if (config !== undefined) {
// - We have computed a CodeQL config // - We have computed a CodeQL config
@@ -182,7 +182,7 @@ function getFinalJobStatus(config: Config | undefined): JobStatus {
// This shouldn't be necessary, but in the odd case that we run more than one // This shouldn't be necessary, but in the odd case that we run more than one
// `init` post step, ensure the job status is consistent between them. // `init` post step, ensure the job status is consistent between them.
core.exportVariable(EnvVar.JOB_STATUS, jobStatus); exportVariable(EnvVar.JOB_STATUS, jobStatus);
return jobStatus; return jobStatus;
} }
+14 -17
View File
@@ -37,7 +37,7 @@ import {
makeDiagnostic, makeDiagnostic,
makeTelemetryDiagnostic, makeTelemetryDiagnostic,
} from "./diagnostics"; } from "./diagnostics";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { Feature, FeatureEnablement, initFeatures } from "./feature-flags"; import { Feature, FeatureEnablement, initFeatures } from "./feature-flags";
import { import {
loadPropertiesFromApi, loadPropertiesFromApi,
@@ -255,9 +255,9 @@ async function run(startedAt: Date) {
// Create a unique identifier for this run. // Create a unique identifier for this run.
const jobRunUuid = uuidV4(); const jobRunUuid = uuidV4();
logger.info(`Job run UUID is ${jobRunUuid}.`); logger.info(`Job run UUID is ${jobRunUuid}.`);
core.exportVariable(EnvVar.JOB_RUN_UUID, jobRunUuid); exportVariable(EnvVar.JOB_RUN_UUID, jobRunUuid);
core.exportVariable(EnvVar.INIT_ACTION_HAS_RUN, "true"); exportVariable(EnvVar.INIT_ACTION_HAS_RUN, "true");
configFile = getOptionalInput("config-file"); configFile = getOptionalInput("config-file");
@@ -343,7 +343,7 @@ async function run(startedAt: Date) {
); );
} }
if (semver.lt(actualVer, publicPreview)) { if (semver.lt(actualVer, publicPreview)) {
core.exportVariable(EnvVar.EXPERIMENTAL_FEATURES, "true"); exportVariable(EnvVar.EXPERIMENTAL_FEATURES, "true");
logger.info("Experimental Rust analysis enabled"); logger.info("Experimental Rust analysis enabled");
} }
} }
@@ -508,7 +508,7 @@ async function run(startedAt: Date) {
// Forward Go flags // Forward Go flags
const goFlags = process.env["GOFLAGS"]; const goFlags = process.env["GOFLAGS"];
if (goFlags) { if (goFlags) {
core.exportVariable("GOFLAGS", goFlags); exportVariable("GOFLAGS", goFlags);
core.warning( core.warning(
"Passing the GOFLAGS env parameter to the init action is deprecated. Please move this to the analyze action.", "Passing the GOFLAGS env parameter to the init action is deprecated. Please move this to the analyze action.",
); );
@@ -554,7 +554,7 @@ async function run(startedAt: Date) {
// Store the original location of our wrapper script somewhere where we can // Store the original location of our wrapper script somewhere where we can
// later retrieve it from and cross-check that it hasn't been changed. // later retrieve it from and cross-check that it hasn't been changed.
core.exportVariable(EnvVar.GO_BINARY_LOCATION, goWrapperPath); exportVariable(EnvVar.GO_BINARY_LOCATION, goWrapperPath);
} catch (e) { } catch (e) {
logger.warning( logger.warning(
`Analyzing Go on Linux, but failed to install wrapper script. Tracing custom builds may fail: ${e}`, `Analyzing Go on Linux, but failed to install wrapper script. Tracing custom builds may fail: ${e}`,
@@ -563,7 +563,7 @@ async function run(startedAt: Date) {
} else { } else {
// Store the location of the original Go binary, so we can check that no setup tasks were performed after the // Store the location of the original Go binary, so we can check that no setup tasks were performed after the
// `init` Action ran. // `init` Action ran.
core.exportVariable(EnvVar.GO_BINARY_LOCATION, goBinaryPath); exportVariable(EnvVar.GO_BINARY_LOCATION, goBinaryPath);
} }
} catch (e) { } catch (e) {
logger.warning( logger.warning(
@@ -598,12 +598,12 @@ async function run(startedAt: Date) {
// threads it would ask extractors to use. See help text for the "--ram" and "--threads" // threads it would ask extractors to use. See help text for the "--ram" and "--threads"
// options at https://codeql.github.com/docs/codeql-cli/manual/database-trace-command/ // options at https://codeql.github.com/docs/codeql-cli/manual/database-trace-command/
// for details. // for details.
core.exportVariable( exportVariable(
"CODEQL_RAM", "CODEQL_RAM",
process.env["CODEQL_RAM"] || process.env["CODEQL_RAM"] ||
getCodeQLMemoryLimit(getOptionalInput("ram"), logger).toString(), getCodeQLMemoryLimit(getOptionalInput("ram"), logger).toString(),
); );
core.exportVariable( exportVariable(
"CODEQL_THREADS", "CODEQL_THREADS",
process.env["CODEQL_THREADS"] || process.env["CODEQL_THREADS"] ||
getThreadsFlagValue(getOptionalInput("threads"), logger).toString(), getThreadsFlagValue(getOptionalInput("threads"), logger).toString(),
@@ -611,7 +611,7 @@ async function run(startedAt: Date) {
// Disable Kotlin extractor if feature flag set // Disable Kotlin extractor if feature flag set
if (await features.getValue(Feature.DisableKotlinAnalysisEnabled)) { if (await features.getValue(Feature.DisableKotlinAnalysisEnabled)) {
core.exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true"); exportVariable("CODEQL_EXTRACTOR_JAVA_AGENT_DISABLE_KOTLIN", "true");
} }
const kotlinLimitVar = const kotlinLimitVar =
@@ -620,7 +620,7 @@ async function run(startedAt: Date) {
(await codeQlVersionAtLeast(codeql, "2.20.3")) && (await codeQlVersionAtLeast(codeql, "2.20.3")) &&
!(await codeQlVersionAtLeast(codeql, "2.20.4")) !(await codeQlVersionAtLeast(codeql, "2.20.4"))
) { ) {
core.exportVariable(kotlinLimitVar, "2.1.20"); exportVariable(kotlinLimitVar, "2.1.20");
} }
// Restore dependency cache(s), if they exist. // Restore dependency cache(s), if they exist.
@@ -669,10 +669,7 @@ async function run(startedAt: Date) {
config.buildMode === BuildMode.None && config.buildMode === BuildMode.None &&
config.languages.includes(BuiltInLanguage.java) config.languages.includes(BuiltInLanguage.java)
) { ) {
core.exportVariable( exportVariable(EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS, "true");
EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS,
"true",
);
} }
const { registriesAuthTokens, qlconfigFile } = const { registriesAuthTokens, qlconfigFile } =
@@ -729,7 +726,7 @@ async function run(startedAt: Date) {
const tracerConfig = await getCombinedTracerConfig(codeql, config); const tracerConfig = await getCombinedTracerConfig(codeql, config);
if (tracerConfig !== undefined) { if (tracerConfig !== undefined) {
for (const [key, value] of Object.entries(tracerConfig.env)) { for (const [key, value] of Object.entries(tracerConfig.env)) {
core.exportVariable(key, value); exportVariable(key, value);
} }
} }
@@ -740,7 +737,7 @@ async function run(startedAt: Date) {
getOptionalEnvVar(JavaEnvVars.JAVA_TOOL_OPTIONS) || ""; getOptionalEnvVar(JavaEnvVars.JAVA_TOOL_OPTIONS) || "";
// Add the network debugging options. // Add the network debugging options.
core.exportVariable( exportVariable(
JavaEnvVars.JAVA_TOOL_OPTIONS, JavaEnvVars.JAVA_TOOL_OPTIONS,
`${existingJavaToolOptions} -Djavax.net.debug=all`, `${existingJavaToolOptions} -Djavax.net.debug=all`,
); );
+8 -8
View File
@@ -1,13 +1,13 @@
import * as fs from "fs"; import * as fs from "fs";
import path from "path"; import path from "path";
import * as core from "@actions/core";
import * as github from "@actions/github"; import * as github from "@actions/github";
import test, { ExecutionContext } from "ava"; import test, { ExecutionContext } from "ava";
import * as sinon from "sinon"; import * as sinon from "sinon";
import * as actionsUtil from "./actions-util"; import * as actionsUtil from "./actions-util";
import { createStubCodeQL } from "./codeql"; import { createStubCodeQL } from "./codeql";
import * as environment from "./environment";
import { Feature } from "./feature-flags"; import { Feature } from "./feature-flags";
import { import {
checkPacksForOverlayCompatibility, checkPacksForOverlayCompatibility,
@@ -545,7 +545,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for org-owned repo with default setup recommends repo property", "file coverage deprecation warning for org-owned repo with default setup recommends repo property",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(true); sinon.stub(actionsUtil, "isDefaultSetup").returns(true);
github.context.payload = { github.context.payload = {
repository: { repository: {
@@ -572,7 +572,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for org-owned repo with advanced setup recommends env var and repo property", "file coverage deprecation warning for org-owned repo with advanced setup recommends env var and repo property",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(false); sinon.stub(actionsUtil, "isDefaultSetup").returns(false);
github.context.payload = { github.context.payload = {
repository: { repository: {
@@ -600,7 +600,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for user-owned repo with default setup recommends advanced setup", "file coverage deprecation warning for user-owned repo with default setup recommends advanced setup",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(true); sinon.stub(actionsUtil, "isDefaultSetup").returns(true);
github.context.payload = { github.context.payload = {
repository: { repository: {
@@ -626,7 +626,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for user-owned repo with advanced setup recommends env var", "file coverage deprecation warning for user-owned repo with advanced setup recommends env var",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(false); sinon.stub(actionsUtil, "isDefaultSetup").returns(false);
github.context.payload = { github.context.payload = {
repository: { repository: {
@@ -651,7 +651,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for unknown owner type with default setup recommends advanced setup", "file coverage deprecation warning for unknown owner type with default setup recommends advanced setup",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(true); sinon.stub(actionsUtil, "isDefaultSetup").returns(true);
github.context.payload = { repository: undefined }; github.context.payload = { repository: undefined };
const messages: LoggedMessage[] = []; const messages: LoggedMessage[] = [];
@@ -672,7 +672,7 @@ test.serial(
test.serial( test.serial(
"file coverage deprecation warning for unknown owner type with advanced setup recommends env var", "file coverage deprecation warning for unknown owner type with advanced setup recommends env var",
(t) => { (t) => {
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
sinon.stub(actionsUtil, "isDefaultSetup").returns(false); sinon.stub(actionsUtil, "isDefaultSetup").returns(false);
github.context.payload = { repository: undefined }; github.context.payload = { repository: undefined };
const messages: LoggedMessage[] = []; const messages: LoggedMessage[] = [];
@@ -694,7 +694,7 @@ test.serial(
(t) => { (t) => {
process.env["CODEQL_ACTION_DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION"] = process.env["CODEQL_ACTION_DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION"] =
"true"; "true";
const exportVariableStub = sinon.stub(core, "exportVariable"); const exportVariableStub = sinon.stub(environment, "exportVariable");
const messages: LoggedMessage[] = []; const messages: LoggedMessage[] = [];
logFileCoverageOnPrsDeprecationWarning(getRecordingLogger(messages)); logFileCoverageOnPrsDeprecationWarning(getRecordingLogger(messages));
t.is(messages.length, 0); t.is(messages.length, 0);
+2 -3
View File
@@ -1,7 +1,6 @@
import * as fs from "fs"; import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import * as core from "@actions/core";
import * as toolrunner from "@actions/exec/lib/toolrunner"; import * as toolrunner from "@actions/exec/lib/toolrunner";
import * as github from "@actions/github"; import * as github from "@actions/github";
import * as io from "@actions/io"; import * as io from "@actions/io";
@@ -16,7 +15,7 @@ import {
import { GitHubApiDetails } from "./api-client"; import { GitHubApiDetails } from "./api-client";
import { CodeQL, setupCodeQL } from "./codeql"; import { CodeQL, setupCodeQL } from "./codeql";
import * as configUtils from "./config-utils"; import * as configUtils from "./config-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { import {
CodeQLDefaultVersionInfo, CodeQLDefaultVersionInfo,
Feature, Feature,
@@ -418,5 +417,5 @@ export function logFileCoverageOnPrsDeprecationWarning(logger: Logger): void {
} }
logger.warning(message); logger.warning(message);
core.exportVariable(EnvVar.DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION, "true"); exportVariable(EnvVar.DID_LOG_FILE_COVERAGE_ON_PRS_DEPRECATION, "true");
} }
+2 -1
View File
@@ -8,6 +8,7 @@ import * as sinon from "sinon";
import * as actionsUtil from "../actions-util"; import * as actionsUtil from "../actions-util";
import * as apiClient from "../api-client"; import * as apiClient from "../api-client";
import type { ResolveDatabaseOutput } from "../codeql"; import type { ResolveDatabaseOutput } from "../codeql";
import * as environment from "../environment";
import * as gitUtils from "../git-utils"; import * as gitUtils from "../git-utils";
import { BuiltInLanguage } from "../languages"; import { BuiltInLanguage } from "../languages";
import { getRunnerLogger } from "../logging"; import { getRunnerLogger } from "../logging";
@@ -82,7 +83,7 @@ const testDownloadOverlayBaseDatabaseFromCache = makeMacro({
sinon.stub(apiClient, "getAutomationID").resolves("test-automation-id/"); sinon.stub(apiClient, "getAutomationID").resolves("test-automation-id/");
sinon.stub(utils, "isInTestMode").returns(testCase.isInTestMode); sinon.stub(environment, "isInTestMode").returns(testCase.isInTestMode);
if (testCase.restoreCacheResult instanceof Error) { if (testCase.restoreCacheResult instanceof Error) {
sinon sinon
+3 -3
View File
@@ -11,7 +11,7 @@ import { AnalysisKind, getAnalysisKinds } from "./analyses";
import { getGitHubVersion } from "./api-client"; import { getGitHubVersion } from "./api-client";
import { CodeQL } from "./codeql"; import { CodeQL } from "./codeql";
import { getRawLanguagesNoAutodetect } from "./config-utils"; import { getRawLanguagesNoAutodetect } from "./config-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { initFeatures } from "./feature-flags"; import { initFeatures } from "./feature-flags";
import { initCodeQL } from "./init"; import { initCodeQL } from "./init";
import { getActionsLogger, Logger } from "./logging"; import { getActionsLogger, Logger } from "./logging";
@@ -125,7 +125,7 @@ async function run(startedAt: Date): Promise<void> {
const jobRunUuid = uuidV4(); const jobRunUuid = uuidV4();
logger.info(`Job run UUID is ${jobRunUuid}.`); logger.info(`Job run UUID is ${jobRunUuid}.`);
core.exportVariable(EnvVar.JOB_RUN_UUID, jobRunUuid); exportVariable(EnvVar.JOB_RUN_UUID, jobRunUuid);
const statusReportBase = await createStatusReportBase( const statusReportBase = await createStatusReportBase(
ActionName.SetupCodeQL, ActionName.SetupCodeQL,
@@ -165,7 +165,7 @@ async function run(startedAt: Date): Promise<void> {
core.setOutput("codeql-path", codeql.getPath()); core.setOutput("codeql-path", codeql.getPath());
core.setOutput("codeql-version", (await codeql.getVersion()).version); core.setOutput("codeql-version", (await codeql.getVersion()).version);
core.exportVariable(EnvVar.SETUP_CODEQL_ACTION_HAS_RUN, "true"); exportVariable(EnvVar.SETUP_CODEQL_ACTION_HAS_RUN, "true");
} catch (unwrappedError) { } catch (unwrappedError) {
const error = wrapError(unwrappedError); const error = wrapError(unwrappedError);
core.setFailed(error.message); core.setFailed(error.message);
+5 -5
View File
@@ -15,7 +15,7 @@ import { getAnalysisKey, getApiClient } from "./api-client";
import { parseRegistriesWithoutCredentials, type Config } from "./config-utils"; import { parseRegistriesWithoutCredentials, type Config } from "./config-utils";
import { DependencyCacheRestoreStatusReport } from "./dependency-caching"; import { DependencyCacheRestoreStatusReport } from "./dependency-caching";
import { DocUrl } from "./doc-url"; import { DocUrl } from "./doc-url";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { getRef } from "./git-utils"; import { getRef } from "./git-utils";
import { Logger } from "./logging"; import { Logger } from "./logging";
import { OverlayBaseDatabaseDownloadStats } from "./overlay/caching"; import { OverlayBaseDatabaseDownloadStats } from "./overlay/caching";
@@ -216,12 +216,12 @@ export function getJobStatusDisplayName(status: JobStatus): string {
*/ */
function setJobStatusIfUnsuccessful(actionStatus: ActionStatus) { function setJobStatusIfUnsuccessful(actionStatus: ActionStatus) {
if (actionStatus === "user-error") { if (actionStatus === "user-error") {
core.exportVariable( exportVariable(
EnvVar.JOB_STATUS, EnvVar.JOB_STATUS,
process.env[EnvVar.JOB_STATUS] ?? JobStatus.ConfigErrorStatus, process.env[EnvVar.JOB_STATUS] ?? JobStatus.ConfigErrorStatus,
); );
} else if (actionStatus === "failure" || actionStatus === "aborted") { } else if (actionStatus === "failure" || actionStatus === "aborted") {
core.exportVariable( exportVariable(
EnvVar.JOB_STATUS, EnvVar.JOB_STATUS,
process.env[EnvVar.JOB_STATUS] ?? JobStatus.FailureStatus, process.env[EnvVar.JOB_STATUS] ?? JobStatus.FailureStatus,
); );
@@ -280,7 +280,7 @@ export async function createStatusReportBase(
let workflowStartedAt = process.env[EnvVar.WORKFLOW_STARTED_AT]; let workflowStartedAt = process.env[EnvVar.WORKFLOW_STARTED_AT];
if (workflowStartedAt === undefined) { if (workflowStartedAt === undefined) {
workflowStartedAt = actionStartedAt.toISOString(); workflowStartedAt = actionStartedAt.toISOString();
core.exportVariable(EnvVar.WORKFLOW_STARTED_AT, workflowStartedAt); exportVariable(EnvVar.WORKFLOW_STARTED_AT, workflowStartedAt);
} }
const runnerOs = getRequiredEnvParam("RUNNER_OS"); const runnerOs = getRequiredEnvParam("RUNNER_OS");
const codeQlCliVersion = getCachedCodeQlVersion(); const codeQlCliVersion = getCachedCodeQlVersion();
@@ -289,7 +289,7 @@ export async function createStatusReportBase(
// re-export the testing environment variable so that it is available to subsequent steps, // re-export the testing environment variable so that it is available to subsequent steps,
// even if it was only set for this step // even if it was only set for this step
if (testingEnvironment) { if (testingEnvironment) {
core.exportVariable(EnvVar.TESTING_ENVIRONMENT, testingEnvironment); exportVariable(EnvVar.TESTING_ENVIRONMENT, testingEnvironment);
} }
const isSteadyStateDefaultSetupRun = const isSteadyStateDefaultSetupRun =
process.env["CODE_SCANNING_IS_STEADY_STATE_DEFAULT_SETUP"] === "true"; process.env["CODE_SCANNING_IS_STEADY_STATE_DEFAULT_SETUP"] === "true";
+3 -3
View File
@@ -14,7 +14,7 @@ import { getGitHubVersion, wrapApiConfigurationError } from "./api-client";
import { CodeQL, getCodeQL } from "./codeql"; import { CodeQL, getCodeQL } from "./codeql";
import { getConfig } from "./config-utils"; import { getConfig } from "./config-utils";
import { readDiffRangesJsonFile } from "./diff-informed-analysis-utils"; import { readDiffRangesJsonFile } from "./diff-informed-analysis-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable } from "./environment";
import { FeatureEnablement } from "./feature-flags"; import { FeatureEnablement } from "./feature-flags";
import * as fingerprints from "./fingerprints"; import * as fingerprints from "./fingerprints";
import * as gitUtils from "./git-utils"; import * as gitUtils from "./git-utils";
@@ -126,7 +126,7 @@ async function combineSarifFilesUsingCLI(
logger.warning( logger.warning(
`Uploading multiple SARIF runs with the same category is deprecated ${deprecationWarningMessage}. Please update your workflow to upload a single run per category. ${deprecationMoreInformationMessage}`, `Uploading multiple SARIF runs with the same category is deprecated ${deprecationWarningMessage}. Please update your workflow to upload a single run per category. ${deprecationMoreInformationMessage}`,
); );
core.exportVariable("CODEQL_MERGE_SARIF_DEPRECATION_WARNING", "true"); exportVariable("CODEQL_MERGE_SARIF_DEPRECATION_WARNING", "true");
} }
// If not, use the naive method of combining the files. // If not, use the naive method of combining the files.
@@ -1023,7 +1023,7 @@ export function validateUniqueCategory(
`Category: (${id ? id : "none"}) Tool: (${tool ? tool : "none"})`, `Category: (${id ? id : "none"}) Tool: (${tool ? tool : "none"})`,
); );
} }
core.exportVariable(sentinelEnvVar, sentinelEnvVar); exportVariable(sentinelEnvVar, sentinelEnvVar);
} }
} }
+11 -18
View File
@@ -13,11 +13,13 @@ import * as apiCompatibility from "./api-compatibility.json";
import type { CodeQL, VersionInfo } from "./codeql"; import type { CodeQL, VersionInfo } from "./codeql";
import type { Pack } from "./config/db-config"; import type { Pack } from "./config/db-config";
import type { Config } from "./config-utils"; import type { Config } from "./config-utils";
import { EnvVar } from "./environment"; import { EnvVar, exportVariable, isInTestMode } from "./environment";
import * as json from "./json"; import * as json from "./json";
import { Language } from "./languages"; import { Language } from "./languages";
import { Logger } from "./logging"; import { Logger } from "./logging";
export { isInTestMode } from "./environment";
/** /**
* The name of the file containing the base database OIDs, as stored in the * The name of the file containing the base database OIDs, as stored in the
* root of the database location. * root of the database location.
@@ -515,7 +517,7 @@ export function checkGitHubVersionInRange(
); );
} }
hasBeenWarnedAboutVersion = true; hasBeenWarnedAboutVersion = true;
core.exportVariable(CODEQL_ACTION_WARNED_ABOUT_VERSION_ENV_VAR, true); exportVariable(CODEQL_ACTION_WARNED_ABOUT_VERSION_ENV_VAR, true);
} }
export enum DisallowedAPIVersionReason { export enum DisallowedAPIVersionReason {
@@ -559,11 +561,11 @@ export function assertNever(value: never): never {
* knowing what version of CodeQL we're running. * knowing what version of CodeQL we're running.
*/ */
export function initializeEnvironment(version: string) { export function initializeEnvironment(version: string) {
core.exportVariable(EnvVar.FEATURE_MULTI_LANGUAGE, "false"); exportVariable(EnvVar.FEATURE_MULTI_LANGUAGE, "false");
core.exportVariable(EnvVar.FEATURE_SANDWICH, "false"); exportVariable(EnvVar.FEATURE_SANDWICH, "false");
core.exportVariable(EnvVar.FEATURE_SARIF_COMBINE, "true"); exportVariable(EnvVar.FEATURE_SARIF_COMBINE, "true");
core.exportVariable(EnvVar.FEATURE_WILL_UPLOAD, "true"); exportVariable(EnvVar.FEATURE_WILL_UPLOAD, "true");
core.exportVariable(EnvVar.VERSION, version); exportVariable(EnvVar.VERSION, version);
} }
/** /**
@@ -708,15 +710,6 @@ export function isGoodVersion(versionSpec: string) {
return !BROKEN_VERSIONS.includes(versionSpec); return !BROKEN_VERSIONS.includes(versionSpec);
} }
/**
* Returns whether we are in test mode. This is used by CodeQL Action PR checks.
*
* In test mode, we skip several uploads (SARIF results, status reports, DBs, ...).
*/
export function isInTestMode(): boolean {
return process.env[EnvVar.TEST_MODE] === "true";
}
/** /**
* Returns whether we specifically want to skip uploading SARIF files. * Returns whether we specifically want to skip uploading SARIF files.
*/ */
@@ -935,7 +928,7 @@ export async function checkDiskUsage(
} else { } else {
logger.debug(message); logger.debug(message);
} }
core.exportVariable(EnvVar.HAS_WARNED_ABOUT_DISK_SPACE, "true"); exportVariable(EnvVar.HAS_WARNED_ABOUT_DISK_SPACE, "true");
} }
return { return {
numAvailableBytes: diskUsage.bavail * blockSizeInBytes, numAvailableBytes: diskUsage.bavail * blockSizeInBytes,
@@ -984,7 +977,7 @@ export function checkActionVersion(
"https://github.blog/changelog/2025-10-28-upcoming-deprecation-of-codeql-action-v3/", "https://github.blog/changelog/2025-10-28-upcoming-deprecation-of-codeql-action-v3/",
); );
// set LOG_VERSION_DEPRECATION env var to prevent the warning from being logged multiple times // set LOG_VERSION_DEPRECATION env var to prevent the warning from being logged multiple times
core.exportVariable(EnvVar.LOG_VERSION_DEPRECATION, "true"); exportVariable(EnvVar.LOG_VERSION_DEPRECATION, "true");
} }
} }
} }