Override CODEQL_EXTRACTOR_GO_BUILD_TRACING with on when it's true

This commit is contained in:
Henry Mercer 2022-08-24 11:34:00 +01:00
parent 3069613ebd
commit e195431677
33 changed files with 162 additions and 95 deletions

View file

@ -128,7 +128,7 @@ export async function createdDBForScannedLanguages(
for (const language of config.languages) {
if (
isScannedLanguage(language) &&
isScannedLanguage(language, logger) &&
!dbIsFinalized(config, language, logger)
) {
logger.startGroup(`Extracting ${language}`);
@ -522,7 +522,7 @@ export async function runFinalize(
// step.
if (await util.codeQlVersionAbove(codeql, CODEQL_VERSION_NEW_TRACING)) {
// Delete variables as specified by the end-tracing script
await endTracingForCluster(config);
await endTracingForCluster(config, logger);
} else {
// Delete the tracer config env var to avoid tracing ourselves
delete process.env[sharedEnv.ODASA_TRACER_CONFIGURATION];

View file

@ -11,7 +11,9 @@ export function determineAutobuildLanguage(
// We want pick the dominant language in the repo from the ones we're able to build
// The languages are sorted in order specified by user or by lines of code if we got
// them from the GitHub API, so try to build the first language on the list.
const autobuildLanguages = config.languages.filter(isTracedLanguage);
const autobuildLanguages = config.languages.filter((l) =>
isTracedLanguage(l, logger)
);
const language = autobuildLanguages[0];
if (!language) {

View file

@ -450,7 +450,8 @@ test("databaseInitCluster() Lua feature flag enabled, but old CLI", async (t) =>
"",
undefined,
undefined,
createFeatureFlags([FeatureFlag.LuaTracerConfigEnabled])
createFeatureFlags([FeatureFlag.LuaTracerConfigEnabled]),
getRunnerLogger(true)
);
t.false(
runnerConstructorStub.firstCall.args[1].includes(
@ -476,7 +477,8 @@ test("databaseInitCluster() Lua feature flag disabled, with old CLI", async (t)
"",
undefined,
undefined,
createFeatureFlags([])
createFeatureFlags([]),
getRunnerLogger(true)
);
t.false(
runnerConstructorStub.firstCall.args[1].includes(
@ -502,7 +504,8 @@ test("databaseInitCluster() Lua feature flag enabled, compatible CLI", async (t)
"",
undefined,
undefined,
createFeatureFlags([FeatureFlag.LuaTracerConfigEnabled])
createFeatureFlags([FeatureFlag.LuaTracerConfigEnabled]),
getRunnerLogger(true)
);
t.true(
runnerConstructorStub.firstCall.args[1].includes(
@ -522,7 +525,8 @@ test("databaseInitCluster() Lua feature flag disabled, compatible CLI", async (t
"",
undefined,
undefined,
createFeatureFlags([])
createFeatureFlags([]),
getRunnerLogger(true)
);
t.true(
runnerConstructorStub.firstCall.args[1].includes(
@ -553,7 +557,8 @@ test("databaseInitCluster() without injected codescanning config", async (t) =>
"",
undefined,
undefined,
createFeatureFlags([])
createFeatureFlags([]),
getRunnerLogger(true)
);
const args = runnerConstructorStub.firstCall.args[1];
@ -595,7 +600,8 @@ const injectedConfigMacro = test.macro({
"",
undefined,
undefined,
createFeatureFlags([])
createFeatureFlags([]),
getRunnerLogger(true)
);
const args = runnerConstructorStub.firstCall.args[1];
@ -904,7 +910,8 @@ test("does not use injected config", async (t: ExecutionContext<unknown>) => {
"",
undefined,
undefined,
createFeatureFlags([])
createFeatureFlags([]),
getRunnerLogger(true)
);
const args = runnerConstructorStub.firstCall.args[1];

View file

@ -91,7 +91,8 @@ export interface CodeQL {
sourceRoot: string,
processName: string | undefined,
processLevel: number | undefined,
featureFlags: FeatureFlags
featureFlags: FeatureFlags,
logger: Logger
): Promise<void>;
/**
* Runs the autobuilder for the given language.
@ -770,12 +771,15 @@ async function getCodeQLForCmd(
sourceRoot: string,
processName: string | undefined,
processLevel: number | undefined,
featureFlags: FeatureFlags
featureFlags: FeatureFlags,
logger: Logger
) {
const extraArgs = config.languages.map(
(language) => `--language=${language}`
);
if (config.languages.filter(isTracedLanguage).length > 0) {
if (
config.languages.filter((l) => isTracedLanguage(l, logger)).length > 0
) {
extraArgs.push("--begin-tracing");
extraArgs.push(...(await getTrapCachingExtractorConfigArgs(config)));
if (processName !== undefined) {
@ -796,7 +800,7 @@ async function getCodeQLForCmd(
// Once we've released a fix, we should add a version gate based on the fixed version.
!(
config.languages.includes(Language.go) &&
isTracedLanguage(Language.go) &&
isTracedLanguage(Language.go, logger) &&
process.platform === "win32"
)
) {

View file

@ -275,7 +275,8 @@ async function run() {
sourceRoot,
"Runner.Worker.exe",
undefined,
featureFlags
featureFlags,
logger
);
if (tracerConfig !== undefined) {
for (const [key, value] of Object.entries(tracerConfig.env)) {

View file

@ -88,7 +88,8 @@ export async function runInit(
sourceRoot: string,
processName: string | undefined,
processLevel: number | undefined,
featureFlags: FeatureFlags
featureFlags: FeatureFlags,
logger: Logger
): Promise<TracerConfig | undefined> {
fs.mkdirSync(config.dbLocation, { recursive: true });
@ -100,7 +101,8 @@ export async function runInit(
sourceRoot,
processName,
processLevel,
featureFlags
featureFlags,
logger
);
} else {
for (const language of config.languages) {
@ -132,7 +134,7 @@ export async function runInit(
throw e;
}
}
return await getCombinedTracerConfig(config, codeql);
return await getCombinedTracerConfig(config, codeql, logger);
}
// Runs a powershell script to inject the tracer into a parent process

View file

@ -6,6 +6,7 @@ import {
isTracedLanguage,
parseLanguage,
} from "./languages";
import { getRunnerLogger } from "./logging";
import { setupTests } from "./testing-utils";
setupTests(test);
@ -32,21 +33,25 @@ test("parseLanguage", async (t) => {
});
test("isTracedLanguage", async (t) => {
t.true(isTracedLanguage(Language.cpp));
t.true(isTracedLanguage(Language.java));
t.true(isTracedLanguage(Language.csharp));
const logger = getRunnerLogger(true);
t.false(isTracedLanguage(Language.go));
t.false(isTracedLanguage(Language.javascript));
t.false(isTracedLanguage(Language.python));
t.true(isTracedLanguage(Language.cpp, logger));
t.true(isTracedLanguage(Language.java, logger));
t.true(isTracedLanguage(Language.csharp, logger));
t.false(isTracedLanguage(Language.go, logger));
t.false(isTracedLanguage(Language.javascript, logger));
t.false(isTracedLanguage(Language.python, logger));
});
test("isScannedLanguage", async (t) => {
t.false(isScannedLanguage(Language.cpp));
t.false(isScannedLanguage(Language.java));
t.false(isScannedLanguage(Language.csharp));
const logger = getRunnerLogger(true);
t.true(isScannedLanguage(Language.go));
t.true(isScannedLanguage(Language.javascript));
t.true(isScannedLanguage(Language.python));
t.false(isScannedLanguage(Language.cpp, logger));
t.false(isScannedLanguage(Language.java, logger));
t.false(isScannedLanguage(Language.csharp, logger));
t.true(isScannedLanguage(Language.go, logger));
t.true(isScannedLanguage(Language.javascript, logger));
t.true(isScannedLanguage(Language.python, logger));
});

View file

@ -1,3 +1,7 @@
import * as core from "@actions/core";
import { Logger } from "./logging";
// All the languages supported by CodeQL
export enum Language {
csharp = "csharp",
@ -36,12 +40,14 @@ export function parseLanguage(language: string): Language | undefined {
return undefined;
}
export function isTracedLanguage(language: Language): boolean {
export function isTracedLanguage(language: Language, logger: Logger): boolean {
if (process.env["CODEQL_EXTRACTOR_GO_BUILD_TRACING"] === "true") {
throw new Error(
"The CODEQL_EXTRACTOR_GO_BUILD_TRACING environment variable is set to an invalid value. " +
"To enable Go build tracing, please set it to 'on'."
logger.warning(
"The CODEQL_EXTRACTOR_GO_BUILD_TRACING environment variable was set to 'true', but it must " +
"be 'on' to enable Go build tracing. Setting it to 'on'."
);
process.env["CODEQL_EXTRACTOR_GO_BUILD_TRACING"] = "on";
core.exportVariable("CODEQL_EXTRACTOR_GO_BUILD_TRACING", "on");
}
return (
@ -51,6 +57,6 @@ export function isTracedLanguage(language: Language): boolean {
);
}
export function isScannedLanguage(language: Language): boolean {
return !isTracedLanguage(language);
export function isScannedLanguage(language: Language, logger: Logger): boolean {
return !isTracedLanguage(language, logger);
}

View file

@ -263,7 +263,8 @@ program
sourceRoot,
parseTraceProcessName(),
parseTraceProcessLevel(),
createFeatureFlags([])
createFeatureFlags([]),
logger
);
if (tracerConfig === undefined) {
return;

View file

@ -6,6 +6,7 @@ import test from "ava";
import { setCodeQL } from "./codeql";
import * as configUtils from "./config-utils";
import { Language } from "./languages";
import { getRunnerLogger } from "./logging";
import { setupTests } from "./testing-utils";
import {
concatTracerConfigs,
@ -329,7 +330,10 @@ test("getCombinedTracerConfig - return undefined when no languages are traced la
},
});
t.deepEqual(await getCombinedTracerConfig(config, codeQL), undefined);
t.deepEqual(
await getCombinedTracerConfig(config, codeQL, getRunnerLogger(true)),
undefined
);
});
});
@ -359,7 +363,11 @@ test("getCombinedTracerConfig - valid spec file", async (t) => {
},
});
const result = await getCombinedTracerConfig(config, codeQL);
const result = await getCombinedTracerConfig(
config,
codeQL,
getRunnerLogger(true)
);
t.notDeepEqual(result, undefined);
const expectedEnv = {

View file

@ -4,6 +4,7 @@ import * as path from "path";
import { CodeQL, CODEQL_VERSION_NEW_TRACING } from "./codeql";
import * as configUtils from "./config-utils";
import { Language, isTracedLanguage } from "./languages";
import { Logger } from "./logging";
import * as util from "./util";
import { codeQlVersionAbove } from "./util";
@ -21,10 +22,11 @@ const CRITICAL_TRACER_VARS = new Set([
]);
export async function endTracingForCluster(
config: configUtils.Config
config: configUtils.Config,
logger: Logger
): Promise<void> {
// If there are no traced languages, we don't need to do anything.
if (!config.languages.some(isTracedLanguage)) return;
if (!config.languages.some((l) => isTracedLanguage(l, logger))) return;
const envVariablesFile = path.resolve(
config.dbLocation,
@ -223,10 +225,13 @@ export function concatTracerConfigs(
export async function getCombinedTracerConfig(
config: configUtils.Config,
codeql: CodeQL
codeql: CodeQL,
logger: Logger
): Promise<TracerConfig | undefined> {
// Abort if there are no traced languages as there's nothing to do
const tracedLanguages = config.languages.filter(isTracedLanguage);
const tracedLanguages = config.languages.filter((l) =>
isTracedLanguage(l, logger)
);
if (tracedLanguages.length === 0) {
return undefined;
}