mirror of
https://github.com/github/codeql-action.git
synced 2025-12-27 01:30:10 +08:00
202 lines
9.3 KiB
JavaScript
Generated
202 lines
9.3 KiB
JavaScript
Generated
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || (function () {
|
|
var ownKeys = function(o) {
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
var ar = [];
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
return ar;
|
|
};
|
|
return ownKeys(o);
|
|
};
|
|
return function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
})();
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.initCodeQL = initCodeQL;
|
|
exports.initConfig = initConfig;
|
|
exports.runDatabaseInitCluster = runDatabaseInitCluster;
|
|
exports.checkPacksForOverlayCompatibility = checkPacksForOverlayCompatibility;
|
|
exports.checkInstallPython311 = checkInstallPython311;
|
|
exports.cleanupDatabaseClusterDirectory = cleanupDatabaseClusterDirectory;
|
|
const fs = __importStar(require("fs"));
|
|
const path = __importStar(require("path"));
|
|
const toolrunner = __importStar(require("@actions/exec/lib/toolrunner"));
|
|
const io = __importStar(require("@actions/io"));
|
|
const yaml = __importStar(require("js-yaml"));
|
|
const actions_util_1 = require("./actions-util");
|
|
const codeql_1 = require("./codeql");
|
|
const configUtils = __importStar(require("./config-utils"));
|
|
const languages_1 = require("./languages");
|
|
const logging_1 = require("./logging");
|
|
const util = __importStar(require("./util"));
|
|
async function initCodeQL(toolsInput, apiDetails, tempDir, variant, defaultCliVersion, logger) {
|
|
logger.startGroup("Setup CodeQL tools");
|
|
const { codeql, toolsDownloadStatusReport, toolsSource, toolsVersion, zstdAvailability, } = await (0, codeql_1.setupCodeQL)(toolsInput, apiDetails, tempDir, variant, defaultCliVersion, logger, true);
|
|
await codeql.printVersion();
|
|
logger.endGroup();
|
|
return {
|
|
codeql,
|
|
toolsDownloadStatusReport,
|
|
toolsSource,
|
|
toolsVersion,
|
|
zstdAvailability,
|
|
};
|
|
}
|
|
async function initConfig(inputs) {
|
|
return await (0, logging_1.withGroupAsync)("Load language configuration", async () => {
|
|
return await configUtils.initConfig(inputs);
|
|
});
|
|
}
|
|
async function runDatabaseInitCluster(databaseInitEnvironment, codeql, config, sourceRoot, processName, qlconfigFile, logger) {
|
|
fs.mkdirSync(config.dbLocation, { recursive: true });
|
|
await configUtils.wrapEnvironment(databaseInitEnvironment, async () => await codeql.databaseInitCluster(config, sourceRoot, processName, qlconfigFile, logger));
|
|
}
|
|
/**
|
|
* Check whether all query packs are compatible with the overlay analysis
|
|
* support in the CodeQL CLI. If the check fails, this function will log a
|
|
* warning and returns false.
|
|
*
|
|
* @param codeql A CodeQL instance.
|
|
* @param logger A logger.
|
|
* @returns `true` if all query packs are compatible with overlay analysis,
|
|
* `false` otherwise.
|
|
*/
|
|
async function checkPacksForOverlayCompatibility(codeql, config, logger) {
|
|
const codeQlOverlayVersion = (await codeql.getVersion()).overlayVersion;
|
|
if (codeQlOverlayVersion === undefined) {
|
|
logger.warning("The CodeQL CLI does not support overlay analysis.");
|
|
return false;
|
|
}
|
|
for (const language of config.languages) {
|
|
const suitePath = util.getGeneratedSuitePath(config, language);
|
|
const packDirs = await codeql.resolveQueriesStartingPacks([suitePath]);
|
|
if (packDirs.some((packDir) => !checkPackForOverlayCompatibility(packDir, codeQlOverlayVersion, logger))) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Check a single pack for its overlay compatibility. If the check fails, this
|
|
* function will log a warning and returns false.
|
|
*
|
|
* @param packDir Path to the directory containing the pack.
|
|
* @param codeQlOverlayVersion The overlay version of the CodeQL CLI.
|
|
* @param logger A logger.
|
|
* @returns `true` if the pack is compatible with overlay analysis, `false`
|
|
* otherwise.
|
|
*/
|
|
function checkPackForOverlayCompatibility(packDir, codeQlOverlayVersion, logger) {
|
|
try {
|
|
let qlpackPath = path.join(packDir, "qlpack.yml");
|
|
if (!fs.existsSync(qlpackPath)) {
|
|
qlpackPath = path.join(packDir, "codeql-pack.yml");
|
|
}
|
|
const qlpackContents = yaml.load(fs.readFileSync(qlpackPath, "utf8"));
|
|
if (!qlpackContents.buildMetadata) {
|
|
// This is a source-only pack, and overlay compatibility checks apply only
|
|
// to precompiled packs.
|
|
return true;
|
|
}
|
|
const packInfoPath = path.join(packDir, ".packinfo");
|
|
if (!fs.existsSync(packInfoPath)) {
|
|
logger.warning(`The query pack at ${packDir} does not have a .packinfo file, ` +
|
|
"so it cannot support overlay analysis. Recompiling the query pack " +
|
|
"with the latest CodeQL CLI should solve this problem.");
|
|
return false;
|
|
}
|
|
const packInfoFileContents = JSON.parse(fs.readFileSync(packInfoPath, "utf8"));
|
|
const packOverlayVersion = packInfoFileContents.overlayVersion;
|
|
if (typeof packOverlayVersion !== "number") {
|
|
logger.warning(`The .packinfo file for the query pack at ${packDir} ` +
|
|
"does not have the overlayVersion field, which indicates that " +
|
|
"the pack is not compatible with overlay analysis.");
|
|
return false;
|
|
}
|
|
if (packOverlayVersion !== codeQlOverlayVersion) {
|
|
logger.warning(`The query pack at ${packDir} was compiled with ` +
|
|
`overlay version ${packOverlayVersion}, but the CodeQL CLI ` +
|
|
`supports overlay version ${codeQlOverlayVersion}. The ` +
|
|
"query pack needs to be recompiled to support overlay analysis.");
|
|
return false;
|
|
}
|
|
}
|
|
catch (e) {
|
|
logger.warning(`Error while checking pack at ${packDir} ` +
|
|
`for overlay compatibility: ${util.getErrorMessage(e)}`);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* If we are running python 3.12+ on windows, we need to switch to python 3.11.
|
|
* This check happens in a powershell script.
|
|
*/
|
|
async function checkInstallPython311(languages, codeql) {
|
|
if (languages.includes(languages_1.KnownLanguage.python) &&
|
|
process.platform === "win32" &&
|
|
!(await codeql.getVersion()).features?.supportsPython312) {
|
|
const script = path.resolve(__dirname, "../python-setup", "check_python12.ps1");
|
|
await new toolrunner.ToolRunner(await io.which("powershell", true), [
|
|
script,
|
|
]).exec();
|
|
}
|
|
}
|
|
function cleanupDatabaseClusterDirectory(config, logger, options = {},
|
|
// We can't stub the fs module in tests, so we allow the caller to override the rmSync function
|
|
// for testing.
|
|
rmSync = fs.rmSync) {
|
|
if (fs.existsSync(config.dbLocation) &&
|
|
(fs.statSync(config.dbLocation).isFile() ||
|
|
fs.readdirSync(config.dbLocation).length > 0)) {
|
|
if (!options.disableExistingDirectoryWarning) {
|
|
logger.warning(`The database cluster directory ${config.dbLocation} must be empty. Attempting to clean it up.`);
|
|
}
|
|
try {
|
|
rmSync(config.dbLocation, {
|
|
force: true,
|
|
maxRetries: 3,
|
|
recursive: true,
|
|
});
|
|
logger.info(`Cleaned up database cluster directory ${config.dbLocation}.`);
|
|
}
|
|
catch (e) {
|
|
const blurb = `The CodeQL Action requires an empty database cluster directory. ${(0, actions_util_1.getOptionalInput)("db-location")
|
|
? `This is currently configured to be ${config.dbLocation}. `
|
|
: `By default, this is located at ${config.dbLocation}. ` +
|
|
"You can customize it using the 'db-location' input to the init Action. "}An attempt was made to clean up the directory, but this failed.`;
|
|
// Hosted runners are automatically cleaned up, so this error should not occur for hosted runners.
|
|
if ((0, actions_util_1.isSelfHostedRunner)()) {
|
|
throw new util.ConfigurationError(`${blurb} This can happen if another process is using the directory or the directory is owned by a different user. ` +
|
|
`Please clean up the directory manually and rerun the job. Details: ${util.getErrorMessage(e)}`);
|
|
}
|
|
else {
|
|
throw new Error(`${blurb} This shouldn't typically happen on hosted runners. ` +
|
|
"If you are using an advanced setup, please check your workflow, otherwise we " +
|
|
`recommend rerunning the job. Details: ${util.getErrorMessage(e)}`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=init.js.map
|