Merge pull request #3055 from github/mbg/cq/telemetry

Report which analysis kinds are enabled in status reports
This commit is contained in:
Michael B. Gale
2025-08-28 12:16:38 +01:00
committed by GitHub
15 changed files with 73 additions and 12 deletions
+9
View File
@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnalysisKind = void 0;
var AnalysisKind;
(function (AnalysisKind) {
AnalysisKind["CodeScanning"] = "code-scanning";
AnalysisKind["CodeQuality"] = "code-quality";
})(AnalysisKind || (exports.AnalysisKind = AnalysisKind = {}));
//# sourceMappingURL=analyses.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"analyses.js","sourceRoot":"","sources":["../src/analyses.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,8CAA8B,CAAA;IAC9B,4CAA4B,CAAA;AAC9B,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB"}
+1 -1
View File
@@ -219,7 +219,7 @@ async function run() {
if (runStats && actionsUtil.getUploadValue(uploadInput) === "always") {
uploadResult = await uploadLib.uploadFiles(outputDir, actionsUtil.getRequiredInput("checkout_path"), actionsUtil.getOptionalInput("category"), features, logger, uploadLib.CodeScanningTarget);
core.setOutput("sarif-id", uploadResult.sarifID);
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if ((0, config_utils_1.isCodeQualityEnabled)(config)) {
const qualityUploadResult = await uploadLib.uploadFiles(outputDir, actionsUtil.getRequiredInput("checkout_path"), actionsUtil.fixCodeQualityCategory(logger, actionsUtil.getOptionalInput("category")), features, logger, uploadLib.CodeQualityTarget);
core.setOutput("quality-sarif-id", qualityUploadResult.sarifID);
}
File diff suppressed because one or more lines are too long
+3 -2
View File
@@ -53,6 +53,7 @@ const yaml = __importStar(require("js-yaml"));
const actions_util_1 = require("./actions-util");
const api_client_1 = require("./api-client");
const autobuild_1 = require("./autobuild");
const configUtils = __importStar(require("./config-utils"));
const dependency_caching_1 = require("./dependency-caching");
const diagnostics_1 = require("./diagnostics");
const diff_informed_analysis_utils_1 = require("./diff-informed-analysis-utils");
@@ -441,7 +442,7 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag,
try {
const sarifFile = path.join(sarifFolder, `${language}.sarif`);
const queries = [];
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if (configUtils.isCodeQualityEnabled(config)) {
queries.push(util.getGeneratedSuitePath(config, language));
for (const qualityQuery of config.augmentationProperties
.qualityQueriesInput) {
@@ -465,7 +466,7 @@ async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag,
const startTimeInterpretResults = new Date();
const analysisSummary = await runInterpretResults(language, undefined, sarifFile, config.debugMode, automationDetailsId);
let qualityAnalysisSummary;
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if (configUtils.isCodeQualityEnabled(config)) {
logger.info(`Interpreting quality results for ${language}`);
const qualityCategory = (0, actions_util_1.fixCodeQualityCategory)(logger, automationDetailsId);
const qualitySarifFile = path.join(sarifFolder, `${language}.quality.sarif`);
+1 -1
View File
File diff suppressed because one or more lines are too long
+7
View File
@@ -62,6 +62,7 @@ exports.generateRegistries = generateRegistries;
exports.wrapEnvironment = wrapEnvironment;
exports.parseBuildModeInput = parseBuildModeInput;
exports.generateCodeScanningConfig = generateCodeScanningConfig;
exports.isCodeQualityEnabled = isCodeQualityEnabled;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const perf_hooks_1 = require("perf_hooks");
@@ -920,4 +921,10 @@ function generateCodeScanningConfig(originalUserInput, augmentationProperties) {
}
return augmentedConfig;
}
/**
* Returns `true` if Code Quality analysis is enabled, or `false` if not.
*/
function isCodeQualityEnabled(config) {
return config.augmentationProperties.qualityQueriesInput !== undefined;
}
//# sourceMappingURL=config-utils.js.map
File diff suppressed because one or more lines are too long
+13
View File
@@ -43,7 +43,9 @@ exports.sendStatusReport = sendStatusReport;
const os = __importStar(require("os"));
const core = __importStar(require("@actions/core"));
const actions_util_1 = require("./actions-util");
const analyses_1 = require("./analyses");
const api_client_1 = require("./api-client");
const config_utils_1 = require("./config-utils");
const doc_url_1 = require("./doc-url");
const environment_1 = require("./environment");
const git_utils_1 = require("./git-utils");
@@ -156,12 +158,23 @@ async function createStatusReportBase(actionName, status, actionStartedAt, confi
core.exportVariable(environment_1.EnvVar.TESTING_ENVIRONMENT, testingEnvironment);
}
const isSteadyStateDefaultSetupRun = process.env["CODE_SCANNING_IS_STEADY_STATE_DEFAULT_SETUP"] === "true";
// We leave `analyses` empty if we don't have a `config`, so that we don't
// accidentally report only `code-scanning` when we can't tell whether `code-quality`
// is enabled or not.
const analysisKinds = [];
if (config !== undefined) {
analysisKinds.push(analyses_1.AnalysisKind.CodeScanning);
if ((0, config_utils_1.isCodeQualityEnabled)(config)) {
analysisKinds.push(analyses_1.AnalysisKind.CodeQuality);
}
}
const statusReport = {
action_name: actionName,
action_oid: "unknown", // TODO decide if it's possible to fill this in
action_ref: actionRef,
action_started_at: actionStartedAt.toISOString(),
action_version: (0, actions_util_1.getActionVersion)(),
analysis_kinds: analysisKinds.join(","),
analysis_key,
build_mode: config?.buildMode,
commit_oid: commitOid,
File diff suppressed because one or more lines are too long
+4
View File
@@ -0,0 +1,4 @@
export enum AnalysisKind {
CodeScanning = "code-scanning",
CodeQuality = "code-quality",
}
+2 -2
View File
@@ -18,7 +18,7 @@ import { getApiDetails, getGitHubVersion } from "./api-client";
import { runAutobuild } from "./autobuild";
import { getTotalCacheSize, shouldStoreCache } from "./caching-utils";
import { getCodeQL } from "./codeql";
import { Config, getConfig } from "./config-utils";
import { Config, getConfig, isCodeQualityEnabled } from "./config-utils";
import { uploadDatabases } from "./database-upload";
import { uploadDependencyCaches } from "./dependency-caching";
import { getDiffInformedAnalysisBranches } from "./diff-informed-analysis-utils";
@@ -336,7 +336,7 @@ async function run() {
);
core.setOutput("sarif-id", uploadResult.sarifID);
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if (isCodeQualityEnabled(config)) {
const qualityUploadResult = await uploadLib.uploadFiles(
outputDir,
actionsUtil.getRequiredInput("checkout_path"),
+2 -2
View File
@@ -662,7 +662,7 @@ export async function runQueries(
const sarifFile = path.join(sarifFolder, `${language}.sarif`);
const queries: string[] = [];
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if (configUtils.isCodeQualityEnabled(config)) {
queries.push(util.getGeneratedSuitePath(config, language));
for (const qualityQuery of config.augmentationProperties
.qualityQueriesInput) {
@@ -695,7 +695,7 @@ export async function runQueries(
);
let qualityAnalysisSummary: string | undefined;
if (config.augmentationProperties.qualityQueriesInput !== undefined) {
if (configUtils.isCodeQualityEnabled(config)) {
logger.info(`Interpreting quality results for ${language}`);
const qualityCategory = fixCodeQualityCategory(
logger,
+9
View File
@@ -1468,3 +1468,12 @@ export function generateCodeScanningConfig(
}
return augmentedConfig;
}
/**
* Returns `true` if Code Quality analysis is enabled, or `false` if not.
*/
export function isCodeQualityEnabled(config: Config): config is Config & {
augmentationProperties: { qualityQueriesInput: string };
} {
return config.augmentationProperties.qualityQueriesInput !== undefined;
}
+18 -1
View File
@@ -11,8 +11,9 @@ import {
getRequiredInput,
isSelfHostedRunner,
} from "./actions-util";
import { AnalysisKind } from "./analyses";
import { getAnalysisKey, getApiClient } from "./api-client";
import { type Config } from "./config-utils";
import { isCodeQualityEnabled, type Config } from "./config-utils";
import { DocUrl } from "./doc-url";
import { EnvVar } from "./environment";
import { getRef } from "./git-utils";
@@ -91,6 +92,8 @@ export interface StatusReportBase {
action_version: string;
/** The name of the Actions event that triggered the workflow. */
actions_event_name?: string;
/** Comma-separated list of the kinds of analyses we are performing. */
analysis_kinds?: string;
/** Analysis key, normally composed from the workflow path and job name. */
analysis_key: string;
/** Build mode, if specified. */
@@ -287,12 +290,26 @@ export async function createStatusReportBase(
const isSteadyStateDefaultSetupRun =
process.env["CODE_SCANNING_IS_STEADY_STATE_DEFAULT_SETUP"] === "true";
// We leave `analyses` empty if we don't have a `config`, so that we don't
// accidentally report only `code-scanning` when we can't tell whether `code-quality`
// is enabled or not.
const analysisKinds: AnalysisKind[] = [];
if (config !== undefined) {
analysisKinds.push(AnalysisKind.CodeScanning);
if (isCodeQualityEnabled(config)) {
analysisKinds.push(AnalysisKind.CodeQuality);
}
}
const statusReport: StatusReportBase = {
action_name: actionName,
action_oid: "unknown", // TODO decide if it's possible to fill this in
action_ref: actionRef,
action_started_at: actionStartedAt.toISOString(),
action_version: getActionVersion(),
analysis_kinds: analysisKinds.join(","),
analysis_key,
build_mode: config?.buildMode,
commit_oid: commitOid,