Send tools telemetry to init status report (#1497)
Co-authored-by: Henry Mercer <henry.mercer@me.com>
This commit is contained in:
parent
ebf6415a7d
commit
24ca6b0400
22 changed files with 399 additions and 164 deletions
|
|
@ -303,7 +303,7 @@ type ActionName =
|
|||
| "finish"
|
||||
| "upload-sarif"
|
||||
| "init-post";
|
||||
type ActionStatus =
|
||||
export type ActionStatus =
|
||||
| "starting"
|
||||
| "aborted"
|
||||
| "success"
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import {
|
|||
Feature,
|
||||
featureConfig,
|
||||
} from "./feature-flags";
|
||||
import { ToolsSource } from "./init";
|
||||
import { Language } from "./languages";
|
||||
import { getRunnerLogger } from "./logging";
|
||||
import { setupTests, createFeatures, setupActionsVars } from "./testing-utils";
|
||||
|
|
@ -203,8 +204,11 @@ test("downloads and caches explicitly requested bundles that aren't in the toolc
|
|||
getRunnerLogger(true),
|
||||
false
|
||||
);
|
||||
|
||||
t.assert(toolcache.find("CodeQL", `0.0.0-${version}`));
|
||||
t.is(result.toolsVersion, `0.0.0-${version}`);
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.is(typeof result.toolsDownloadDurationMs, "number");
|
||||
}
|
||||
|
||||
t.is(toolcache.findAllVersions("CodeQL").length, 2);
|
||||
|
|
@ -236,6 +240,8 @@ test("downloads an explicitly requested bundle even if a different version is ca
|
|||
);
|
||||
t.assert(toolcache.find("CodeQL", "0.0.0-20200610"));
|
||||
t.deepEqual(result.toolsVersion, "0.0.0-20200610");
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.not(result.toolsDownloadDurationMs, undefined);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -286,6 +292,8 @@ for (const {
|
|||
t.assert(releaseApiMock.isDone(), "Releases API should have been called");
|
||||
t.assert(toolcache.find("CodeQL", expectedToolcacheVersion));
|
||||
t.deepEqual(result.toolsVersion, cliVersion);
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.not(result.toolsDownloadDurationMs, undefined);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
@ -354,6 +362,14 @@ for (const { isCached, tagName, toolcacheCliVersion } of [
|
|||
false
|
||||
);
|
||||
t.is(result.toolsVersion, SAMPLE_DEFAULT_CLI_VERSION.cliVersion);
|
||||
|
||||
if (isCached) {
|
||||
t.is(result.toolsSource, ToolsSource.Toolcache);
|
||||
t.is(result.toolsDownloadDurationMs, undefined);
|
||||
} else {
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.is(typeof result.toolsDownloadDurationMs, "number");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
@ -384,6 +400,8 @@ for (const variant of [util.GitHubVariant.GHAE, util.GitHubVariant.GHES]) {
|
|||
false
|
||||
);
|
||||
t.deepEqual(result.toolsVersion, "0.0.0-20200601");
|
||||
t.is(result.toolsSource, ToolsSource.Toolcache);
|
||||
t.is(result.toolsDownloadDurationMs, undefined);
|
||||
|
||||
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||
t.is(cachedVersions.length, 1);
|
||||
|
|
@ -418,6 +436,8 @@ for (const variant of [util.GitHubVariant.GHAE, util.GitHubVariant.GHES]) {
|
|||
false
|
||||
);
|
||||
t.deepEqual(result.toolsVersion, defaults.cliVersion);
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.is(typeof result.toolsDownloadDurationMs, "number");
|
||||
|
||||
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||
t.is(cachedVersions.length, 2);
|
||||
|
|
@ -449,6 +469,8 @@ test('downloads bundle if "latest" tools specified but not cached', async (t) =>
|
|||
false
|
||||
);
|
||||
t.deepEqual(result.toolsVersion, defaults.cliVersion);
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.is(typeof result.toolsDownloadDurationMs, "number");
|
||||
|
||||
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||
t.is(cachedVersions.length, 2);
|
||||
|
|
@ -498,7 +520,7 @@ test("download codeql bundle from github ae endpoint", async (t) => {
|
|||
sinon.stub(actionsUtil, "isRunningLocalAction").returns(false);
|
||||
process.env["GITHUB_ACTION_REPOSITORY"] = "github/codeql-action";
|
||||
|
||||
await codeql.setupCodeQL(
|
||||
const result = await codeql.setupCodeQL(
|
||||
undefined,
|
||||
sampleGHAEApiDetails,
|
||||
tmpDir,
|
||||
|
|
@ -513,6 +535,9 @@ test("download codeql bundle from github ae endpoint", async (t) => {
|
|||
false
|
||||
);
|
||||
|
||||
t.is(result.toolsSource, ToolsSource.Download);
|
||||
t.is(typeof result.toolsDownloadDurationMs, "number");
|
||||
|
||||
const cachedVersions = toolcache.findAllVersions("CodeQL");
|
||||
t.is(cachedVersions.length, 1);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import * as api from "./api-client";
|
|||
import { Config } from "./config-utils";
|
||||
import { errorMatchers } from "./error-matcher";
|
||||
import { CodeQLDefaultVersionInfo, FeatureEnablement } from "./feature-flags";
|
||||
import { ToolsSource } from "./init";
|
||||
import { isTracedLanguage, Language } from "./languages";
|
||||
import { Logger } from "./logging";
|
||||
import * as setupCodeql from "./setup-codeql";
|
||||
|
|
@ -300,17 +301,23 @@ export async function setupCodeQL(
|
|||
defaultCliVersion: CodeQLDefaultVersionInfo,
|
||||
logger: Logger,
|
||||
checkVersion: boolean
|
||||
): Promise<{ codeql: CodeQL; toolsVersion: string }> {
|
||||
): Promise<{
|
||||
codeql: CodeQL;
|
||||
toolsDownloadDurationMs?: number;
|
||||
toolsSource: ToolsSource;
|
||||
toolsVersion: string;
|
||||
}> {
|
||||
try {
|
||||
const { codeqlFolder, toolsVersion } = await setupCodeql.setupCodeQLBundle(
|
||||
toolsInput,
|
||||
apiDetails,
|
||||
tempDir,
|
||||
variant,
|
||||
bypassToolcache,
|
||||
defaultCliVersion,
|
||||
logger
|
||||
);
|
||||
const { codeqlFolder, toolsDownloadDurationMs, toolsSource, toolsVersion } =
|
||||
await setupCodeql.setupCodeQLBundle(
|
||||
toolsInput,
|
||||
apiDetails,
|
||||
tempDir,
|
||||
variant,
|
||||
bypassToolcache,
|
||||
defaultCliVersion,
|
||||
logger
|
||||
);
|
||||
let codeqlCmd = path.join(codeqlFolder, "codeql", "codeql");
|
||||
if (process.platform === "win32") {
|
||||
codeqlCmd += ".exe";
|
||||
|
|
@ -319,7 +326,12 @@ export async function setupCodeQL(
|
|||
}
|
||||
|
||||
cachedCodeQL = await getCodeQLForCmd(codeqlCmd, checkVersion);
|
||||
return { codeql: cachedCodeQL, toolsVersion };
|
||||
return {
|
||||
codeql: cachedCodeQL,
|
||||
toolsDownloadDurationMs,
|
||||
toolsSource,
|
||||
toolsVersion,
|
||||
};
|
||||
} catch (e) {
|
||||
logger.error(e instanceof Error ? e : new Error(String(e)));
|
||||
throw new Error("Unable to download and extract CodeQL CLI");
|
||||
|
|
|
|||
|
|
@ -376,7 +376,9 @@ for (const variant of [GitHubVariant.GHAE, GitHubVariant.GHES]) {
|
|||
test(`selects CLI from defaults.json on ${GitHubVariant[variant]}`, async (t) => {
|
||||
await withTmpDir(async (tmpDir) => {
|
||||
const features = setUpFeatureFlagTests(tmpDir);
|
||||
t.deepEqual(await features.getDefaultCliVersion(variant), {
|
||||
|
||||
const defaultCliVersion = await features.getDefaultCliVersion(variant);
|
||||
t.deepEqual(defaultCliVersion, {
|
||||
cliVersion: defaults.cliVersion,
|
||||
tagName: defaults.bundleVersion,
|
||||
variant,
|
||||
|
|
@ -397,13 +399,14 @@ test("selects CLI v2.12.1 on Dotcom when feature flags enable v2.12.0 and v2.12.
|
|||
expectedFeatureEnablement["default_codeql_version_2_12_5_enabled"] = false;
|
||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||
|
||||
t.deepEqual(
|
||||
await featureEnablement.getDefaultCliVersion(GitHubVariant.DOTCOM),
|
||||
{
|
||||
cliVersion: "2.12.1",
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
}
|
||||
const defaultCliVersion = await featureEnablement.getDefaultCliVersion(
|
||||
GitHubVariant.DOTCOM
|
||||
);
|
||||
t.deepEqual(defaultCliVersion, {
|
||||
cliVersion: "2.12.1",
|
||||
toolsFeatureFlagsValid: true,
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -413,13 +416,14 @@ test(`selects CLI from defaults.json on Dotcom when no default version feature f
|
|||
const expectedFeatureEnablement = initializeFeatures(true);
|
||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||
|
||||
t.deepEqual(
|
||||
await featureEnablement.getDefaultCliVersion(GitHubVariant.DOTCOM),
|
||||
{
|
||||
cliVersion: defaults.cliVersion,
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
}
|
||||
const defaultCliVersion = await featureEnablement.getDefaultCliVersion(
|
||||
GitHubVariant.DOTCOM
|
||||
);
|
||||
t.deepEqual(defaultCliVersion, {
|
||||
cliVersion: defaults.cliVersion,
|
||||
toolsFeatureFlagsValid: false,
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -437,13 +441,15 @@ test("ignores invalid version numbers in default version feature flags", async (
|
|||
true;
|
||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||
|
||||
t.deepEqual(
|
||||
await featureEnablement.getDefaultCliVersion(GitHubVariant.DOTCOM),
|
||||
{
|
||||
cliVersion: "2.12.1",
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
}
|
||||
const defaultCliVersion = await featureEnablement.getDefaultCliVersion(
|
||||
GitHubVariant.DOTCOM
|
||||
);
|
||||
t.deepEqual(defaultCliVersion, {
|
||||
cliVersion: "2.12.1",
|
||||
toolsFeatureFlagsValid: true,
|
||||
variant: GitHubVariant.DOTCOM,
|
||||
});
|
||||
|
||||
t.assert(
|
||||
loggedMessages.find(
|
||||
(v: LoggedMessage) =>
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ const DEFAULT_VERSION_FEATURE_FLAG_SUFFIX = "_enabled";
|
|||
export type CodeQLDefaultVersionInfo =
|
||||
| {
|
||||
cliVersion: string;
|
||||
toolsFeatureFlagsValid?: boolean;
|
||||
variant: util.GitHubVariant.DOTCOM;
|
||||
}
|
||||
| {
|
||||
|
|
@ -207,8 +208,10 @@ class GitHubFeatureFlags implements FeatureEnablement {
|
|||
variant: util.GitHubVariant
|
||||
): Promise<CodeQLDefaultVersionInfo> {
|
||||
if (variant === util.GitHubVariant.DOTCOM) {
|
||||
const defaultDotComCliVersion = await this.getDefaultDotcomCliVersion();
|
||||
return {
|
||||
cliVersion: await this.getDefaultDotcomCliVersion(),
|
||||
cliVersion: defaultDotComCliVersion.version,
|
||||
toolsFeatureFlagsValid: defaultDotComCliVersion.toolsFeatureFlagsValid,
|
||||
variant,
|
||||
};
|
||||
}
|
||||
|
|
@ -219,7 +222,10 @@ class GitHubFeatureFlags implements FeatureEnablement {
|
|||
};
|
||||
}
|
||||
|
||||
async getDefaultDotcomCliVersion(): Promise<string> {
|
||||
async getDefaultDotcomCliVersion(): Promise<{
|
||||
version: string;
|
||||
toolsFeatureFlagsValid: boolean;
|
||||
}> {
|
||||
const response = await this.getAllFeatures();
|
||||
|
||||
const enabledFeatureFlagCliVersions = Object.entries(response)
|
||||
|
|
@ -244,7 +250,10 @@ class GitHubFeatureFlags implements FeatureEnablement {
|
|||
"Feature flags do not specify a default CLI version. Falling back to the CLI version " +
|
||||
`shipped with the Action. This is ${defaults.cliVersion}.`
|
||||
);
|
||||
return defaults.cliVersion;
|
||||
return {
|
||||
version: defaults.cliVersion,
|
||||
toolsFeatureFlagsValid: false,
|
||||
};
|
||||
}
|
||||
|
||||
const maxCliVersion = enabledFeatureFlagCliVersions.reduce(
|
||||
|
|
@ -255,7 +264,7 @@ class GitHubFeatureFlags implements FeatureEnablement {
|
|||
this.logger.debug(
|
||||
`Derived default CLI version of ${maxCliVersion} from feature flags.`
|
||||
);
|
||||
return maxCliVersion;
|
||||
return { version: maxCliVersion, toolsFeatureFlagsValid: true };
|
||||
}
|
||||
|
||||
async getValue(feature: Feature): Promise<boolean> {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import * as path from "path";
|
|||
import * as core from "@actions/core";
|
||||
|
||||
import {
|
||||
ActionStatus,
|
||||
createStatusReportBase,
|
||||
getActionsStatus,
|
||||
getActionVersion,
|
||||
|
|
@ -22,6 +23,7 @@ import {
|
|||
injectWindowsTracer,
|
||||
installPythonDeps,
|
||||
runInit,
|
||||
ToolsSource,
|
||||
} from "./init";
|
||||
import { Language } from "./languages";
|
||||
import { getActionsLogger, Logger } from "./logging";
|
||||
|
|
@ -38,13 +40,27 @@ import {
|
|||
getMlPoweredJsQueriesStatus,
|
||||
getRequiredEnvParam,
|
||||
getThreadsFlagValue,
|
||||
GitHubVariant,
|
||||
initializeEnvironment,
|
||||
isHostedRunner,
|
||||
shouldBypassToolcache,
|
||||
} from "./util";
|
||||
import { validateWorkflow } from "./workflow";
|
||||
|
||||
interface InitSuccessStatusReport extends StatusReportBase {
|
||||
/** Fields of the init status report that can be sent before `config` is populated. */
|
||||
interface InitStatusReport extends StatusReportBase {
|
||||
/** Value given by the user as the "tools" input. */
|
||||
tools_input: string;
|
||||
/** Version of the bundle used. */
|
||||
tools_resolved_version: string;
|
||||
/** Where the bundle originated from. */
|
||||
tools_source: ToolsSource;
|
||||
/** Comma-separated list of languages specified explicitly in the workflow file. */
|
||||
workflow_languages: string;
|
||||
}
|
||||
|
||||
/** Fields of the init status report that are populated using values from `config`. */
|
||||
interface InitWithConfigStatusReport extends InitStatusReport {
|
||||
/** Comma-separated list of languages where the default queries are disabled. */
|
||||
disable_default_queries: string;
|
||||
/**
|
||||
|
|
@ -59,12 +75,6 @@ interface InitSuccessStatusReport extends StatusReportBase {
|
|||
paths_ignore: string;
|
||||
/** Comma-separated list of queries sources, from the 'queries' config field or workflow input. */
|
||||
queries: string;
|
||||
/** Value given by the user as the "tools" input. */
|
||||
tools_input: string;
|
||||
/** Version of the bundle used. */
|
||||
tools_resolved_version: string;
|
||||
/** Comma-separated list of languages specified explicitly in the workflow file. */
|
||||
workflow_languages: string;
|
||||
/** Comma-separated list of languages for which we are using TRAP caching. */
|
||||
trap_cache_languages: string;
|
||||
/** Size of TRAP caches that we downloaded, in bytes. */
|
||||
|
|
@ -73,63 +83,97 @@ interface InitSuccessStatusReport extends StatusReportBase {
|
|||
trap_cache_download_duration_ms: number;
|
||||
}
|
||||
|
||||
async function sendSuccessStatusReport(
|
||||
/** Fields of the init status report populated when the tools source is `download`. */
|
||||
interface InitToolsDownloadFields {
|
||||
/** Time taken to download the bundle, in milliseconds. */
|
||||
tools_download_duration_ms?: number;
|
||||
/** Whether the relevant tools dotcom feature flags have been misconfigured. Only populated if we attempt to determine the default version based on the dotcom feature flags. */
|
||||
tools_feature_flags_valid?: boolean;
|
||||
}
|
||||
|
||||
async function sendInitStatusReport(
|
||||
actionStatus: ActionStatus,
|
||||
startedAt: Date,
|
||||
config: configUtils.Config,
|
||||
config: configUtils.Config | undefined,
|
||||
toolsDownloadDurationMs: number | undefined,
|
||||
toolsFeatureFlagsValid: boolean | undefined,
|
||||
toolsSource: ToolsSource,
|
||||
toolsVersion: string,
|
||||
logger: Logger
|
||||
) {
|
||||
const statusReportBase = await createStatusReportBase(
|
||||
"init",
|
||||
"success",
|
||||
actionStatus,
|
||||
startedAt
|
||||
);
|
||||
|
||||
const languages = config.languages.join(",");
|
||||
const workflowLanguages = getOptionalInput("languages");
|
||||
const paths = (config.originalUserInput.paths || []).join(",");
|
||||
const pathsIgnore = (config.originalUserInput["paths-ignore"] || []).join(
|
||||
","
|
||||
);
|
||||
const disableDefaultQueries = config.originalUserInput[
|
||||
"disable-default-queries"
|
||||
]
|
||||
? languages
|
||||
: "";
|
||||
|
||||
const queries: string[] = [];
|
||||
let queriesInput = getOptionalInput("queries")?.trim();
|
||||
if (queriesInput === undefined || queriesInput.startsWith("+")) {
|
||||
queries.push(
|
||||
...(config.originalUserInput.queries || []).map((q) => q.uses)
|
||||
);
|
||||
}
|
||||
if (queriesInput !== undefined) {
|
||||
queriesInput = queriesInput.startsWith("+")
|
||||
? queriesInput.slice(1)
|
||||
: queriesInput;
|
||||
queries.push(...queriesInput.split(","));
|
||||
}
|
||||
|
||||
const statusReport: InitSuccessStatusReport = {
|
||||
const initStatusReport: InitStatusReport = {
|
||||
...statusReportBase,
|
||||
disable_default_queries: disableDefaultQueries,
|
||||
languages,
|
||||
ml_powered_javascript_queries: getMlPoweredJsQueriesStatus(config),
|
||||
paths,
|
||||
paths_ignore: pathsIgnore,
|
||||
queries: queries.join(","),
|
||||
tools_input: getOptionalInput("tools") || "",
|
||||
tools_resolved_version: toolsVersion,
|
||||
tools_source: toolsSource || ToolsSource.Unknown,
|
||||
workflow_languages: workflowLanguages || "",
|
||||
trap_cache_languages: Object.keys(config.trapCaches).join(","),
|
||||
trap_cache_download_size_bytes: Math.round(
|
||||
await getTotalCacheSize(config.trapCaches, logger)
|
||||
),
|
||||
trap_cache_download_duration_ms: Math.round(config.trapCacheDownloadTime),
|
||||
};
|
||||
|
||||
await sendStatusReport(statusReport);
|
||||
let initToolsDownloadFields: InitToolsDownloadFields = {};
|
||||
|
||||
if (toolsSource === ToolsSource.Download) {
|
||||
initToolsDownloadFields = {
|
||||
tools_download_duration_ms: toolsDownloadDurationMs,
|
||||
tools_feature_flags_valid: toolsFeatureFlagsValid,
|
||||
};
|
||||
}
|
||||
|
||||
if (config !== undefined) {
|
||||
const languages = config.languages.join(",");
|
||||
const paths = (config.originalUserInput.paths || []).join(",");
|
||||
const pathsIgnore = (config.originalUserInput["paths-ignore"] || []).join(
|
||||
","
|
||||
);
|
||||
const disableDefaultQueries = config.originalUserInput[
|
||||
"disable-default-queries"
|
||||
]
|
||||
? languages
|
||||
: "";
|
||||
|
||||
const queries: string[] = [];
|
||||
let queriesInput = getOptionalInput("queries")?.trim();
|
||||
if (queriesInput === undefined || queriesInput.startsWith("+")) {
|
||||
queries.push(
|
||||
...(config.originalUserInput.queries || []).map((q) => q.uses)
|
||||
);
|
||||
}
|
||||
if (queriesInput !== undefined) {
|
||||
queriesInput = queriesInput.startsWith("+")
|
||||
? queriesInput.slice(1)
|
||||
: queriesInput;
|
||||
queries.push(...queriesInput.split(","));
|
||||
}
|
||||
|
||||
// Append fields that are dependent on `config`
|
||||
const initWithConfigStatusReport: InitWithConfigStatusReport = {
|
||||
...initStatusReport,
|
||||
disable_default_queries: disableDefaultQueries,
|
||||
languages,
|
||||
ml_powered_javascript_queries: getMlPoweredJsQueriesStatus(config),
|
||||
paths,
|
||||
paths_ignore: pathsIgnore,
|
||||
queries: queries.join(","),
|
||||
trap_cache_languages: Object.keys(config.trapCaches).join(","),
|
||||
trap_cache_download_size_bytes: Math.round(
|
||||
await getTotalCacheSize(config.trapCaches, logger)
|
||||
),
|
||||
trap_cache_download_duration_ms: Math.round(config.trapCacheDownloadTime),
|
||||
};
|
||||
await sendStatusReport({
|
||||
...initWithConfigStatusReport,
|
||||
...initToolsDownloadFields,
|
||||
});
|
||||
} else {
|
||||
await sendStatusReport({ ...initStatusReport, ...initToolsDownloadFields });
|
||||
}
|
||||
}
|
||||
|
||||
async function run() {
|
||||
|
|
@ -139,6 +183,9 @@ async function run() {
|
|||
|
||||
let config: configUtils.Config;
|
||||
let codeql: CodeQL;
|
||||
let toolsDownloadDurationMs: number | undefined;
|
||||
let toolsFeatureFlagsValid: boolean | undefined;
|
||||
let toolsSource: ToolsSource;
|
||||
let toolsVersion: string;
|
||||
|
||||
const apiDetails = {
|
||||
|
|
@ -178,9 +225,12 @@ async function run() {
|
|||
return;
|
||||
}
|
||||
|
||||
const defaultCliVersion = await features.getDefaultCliVersion(
|
||||
const codeQLDefaultVersionInfo = await features.getDefaultCliVersion(
|
||||
gitHubVersion.type
|
||||
);
|
||||
if (codeQLDefaultVersionInfo.variant === GitHubVariant.DOTCOM) {
|
||||
toolsFeatureFlagsValid = codeQLDefaultVersionInfo.toolsFeatureFlagsValid;
|
||||
}
|
||||
const initCodeQLResult = await initCodeQL(
|
||||
getOptionalInput("tools"),
|
||||
apiDetails,
|
||||
|
|
@ -193,11 +243,13 @@ async function run() {
|
|||
repositoryNwo,
|
||||
logger
|
||||
),
|
||||
defaultCliVersion,
|
||||
codeQLDefaultVersionInfo,
|
||||
logger
|
||||
);
|
||||
codeql = initCodeQLResult.codeql;
|
||||
toolsDownloadDurationMs = initCodeQLResult.toolsDownloadDurationMs;
|
||||
toolsVersion = initCodeQLResult.toolsVersion;
|
||||
toolsSource = initCodeQLResult.toolsSource;
|
||||
await enrichEnvironment(codeql);
|
||||
|
||||
config = await initConfig(
|
||||
|
|
@ -315,18 +367,28 @@ async function run() {
|
|||
core.setFailed(String(error));
|
||||
|
||||
console.log(error);
|
||||
await sendStatusReport(
|
||||
await createStatusReportBase(
|
||||
"init",
|
||||
getActionsStatus(error),
|
||||
startedAt,
|
||||
String(error),
|
||||
error instanceof Error ? error.stack : undefined
|
||||
)
|
||||
await sendInitStatusReport(
|
||||
getActionsStatus(error),
|
||||
startedAt,
|
||||
config,
|
||||
toolsDownloadDurationMs,
|
||||
toolsFeatureFlagsValid,
|
||||
toolsSource,
|
||||
toolsVersion,
|
||||
logger
|
||||
);
|
||||
return;
|
||||
}
|
||||
await sendSuccessStatusReport(startedAt, config, toolsVersion, logger);
|
||||
await sendInitStatusReport(
|
||||
"success",
|
||||
startedAt,
|
||||
config,
|
||||
toolsDownloadDurationMs,
|
||||
toolsFeatureFlagsValid,
|
||||
toolsSource,
|
||||
toolsVersion,
|
||||
logger
|
||||
);
|
||||
}
|
||||
|
||||
async function getTrapCachingEnabled(
|
||||
|
|
|
|||
37
src/init.ts
37
src/init.ts
|
|
@ -15,6 +15,13 @@ import { TracerConfig, getCombinedTracerConfig } from "./tracer-config";
|
|||
import * as util from "./util";
|
||||
import { codeQlVersionAbove } from "./util";
|
||||
|
||||
export enum ToolsSource {
|
||||
Unknown = "UNKNOWN",
|
||||
Local = "LOCAL",
|
||||
Toolcache = "TOOLCACHE",
|
||||
Download = "DOWNLOAD",
|
||||
}
|
||||
|
||||
export async function initCodeQL(
|
||||
toolsInput: string | undefined,
|
||||
apiDetails: GitHubApiDetails,
|
||||
|
|
@ -23,21 +30,27 @@ export async function initCodeQL(
|
|||
bypassToolcache: boolean,
|
||||
defaultCliVersion: CodeQLDefaultVersionInfo,
|
||||
logger: Logger
|
||||
): Promise<{ codeql: CodeQL; toolsVersion: string }> {
|
||||
): Promise<{
|
||||
codeql: CodeQL;
|
||||
toolsDownloadDurationMs?: number;
|
||||
toolsSource: ToolsSource;
|
||||
toolsVersion: string;
|
||||
}> {
|
||||
logger.startGroup("Setup CodeQL tools");
|
||||
const { codeql, toolsVersion } = await setupCodeQL(
|
||||
toolsInput,
|
||||
apiDetails,
|
||||
tempDir,
|
||||
variant,
|
||||
bypassToolcache,
|
||||
defaultCliVersion,
|
||||
logger,
|
||||
true
|
||||
);
|
||||
const { codeql, toolsDownloadDurationMs, toolsSource, toolsVersion } =
|
||||
await setupCodeQL(
|
||||
toolsInput,
|
||||
apiDetails,
|
||||
tempDir,
|
||||
variant,
|
||||
bypassToolcache,
|
||||
defaultCliVersion,
|
||||
logger,
|
||||
true
|
||||
);
|
||||
await codeql.printVersion();
|
||||
logger.endGroup();
|
||||
return { codeql, toolsVersion };
|
||||
return { codeql, toolsDownloadDurationMs, toolsSource, toolsVersion };
|
||||
}
|
||||
|
||||
export async function initConfig(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import * as fs from "fs";
|
||||
import { OutgoingHttpHeaders } from "http";
|
||||
import * as path from "path";
|
||||
import { performance } from "perf_hooks";
|
||||
|
||||
import * as toolcache from "@actions/tool-cache";
|
||||
import { default as deepEqual } from "fast-deep-equal";
|
||||
|
|
@ -14,6 +15,7 @@ import * as api from "./api-client";
|
|||
// these dependents.
|
||||
import * as defaults from "./defaults.json";
|
||||
import { CodeQLDefaultVersionInfo } from "./feature-flags";
|
||||
import { ToolsSource } from "./init";
|
||||
import { Logger } from "./logging";
|
||||
import * as util from "./util";
|
||||
import { isGoodVersion } from "./util";
|
||||
|
|
@ -514,7 +516,11 @@ export async function downloadCodeQL(
|
|||
variant: util.GitHubVariant,
|
||||
tempDir: string,
|
||||
logger: Logger
|
||||
): Promise<{ toolsVersion: string; codeqlFolder: string }> {
|
||||
): Promise<{
|
||||
toolsVersion: string;
|
||||
codeqlFolder: string;
|
||||
toolsDownloadDurationMs: number;
|
||||
}> {
|
||||
const parsedCodeQLURL = new URL(codeqlURL);
|
||||
const searchParams = new URLSearchParams(parsedCodeQLURL.search);
|
||||
const headers: OutgoingHttpHeaders = {
|
||||
|
|
@ -541,12 +547,16 @@ export async function downloadCodeQL(
|
|||
{ "User-Agent": "CodeQL Action" },
|
||||
headers
|
||||
);
|
||||
|
||||
const toolsDownloadStart = performance.now();
|
||||
const codeqlPath = await toolcache.downloadTool(
|
||||
codeqlURL,
|
||||
dest,
|
||||
undefined,
|
||||
finalHeaders
|
||||
);
|
||||
const toolsDownloadDurationMs = performance.now() - toolsDownloadStart;
|
||||
|
||||
logger.debug(`CodeQL bundle download to ${codeqlPath} complete.`);
|
||||
|
||||
const codeqlExtracted = await toolcache.extractTar(codeqlPath);
|
||||
|
|
@ -581,6 +591,7 @@ export async function downloadCodeQL(
|
|||
"CodeQL",
|
||||
toolcacheVersion
|
||||
),
|
||||
toolsDownloadDurationMs,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -616,7 +627,12 @@ export async function setupCodeQLBundle(
|
|||
bypassToolcache: boolean,
|
||||
defaultCliVersion: CodeQLDefaultVersionInfo,
|
||||
logger: Logger
|
||||
): Promise<{ codeqlFolder: string; toolsVersion: string }> {
|
||||
): Promise<{
|
||||
codeqlFolder: string;
|
||||
toolsDownloadDurationMs?: number;
|
||||
toolsSource: ToolsSource;
|
||||
toolsVersion: string;
|
||||
}> {
|
||||
const source = await getCodeQLSource(
|
||||
toolsInput,
|
||||
bypassToolcache,
|
||||
|
|
@ -628,13 +644,17 @@ export async function setupCodeQLBundle(
|
|||
|
||||
let codeqlFolder: string;
|
||||
let toolsVersion = source.toolsVersion;
|
||||
let toolsDownloadDurationMs: number | undefined;
|
||||
let toolsSource: ToolsSource;
|
||||
switch (source.sourceType) {
|
||||
case "local":
|
||||
codeqlFolder = await toolcache.extractTar(source.codeqlTarPath);
|
||||
toolsSource = ToolsSource.Local;
|
||||
break;
|
||||
case "toolcache":
|
||||
codeqlFolder = source.codeqlFolder;
|
||||
logger.debug(`CodeQL found in cache ${codeqlFolder}`);
|
||||
toolsSource = ToolsSource.Toolcache;
|
||||
break;
|
||||
case "download": {
|
||||
const result = await downloadCodeQL(
|
||||
|
|
@ -647,10 +667,12 @@ export async function setupCodeQLBundle(
|
|||
);
|
||||
toolsVersion = result.toolsVersion;
|
||||
codeqlFolder = result.codeqlFolder;
|
||||
toolsDownloadDurationMs = result.toolsDownloadDurationMs;
|
||||
toolsSource = ToolsSource.Download;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
util.assertNever(source);
|
||||
}
|
||||
return { codeqlFolder, toolsVersion };
|
||||
return { codeqlFolder, toolsDownloadDurationMs, toolsSource, toolsVersion };
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue