split hash-database into multiple actions

This commit is contained in:
Esben Sparre Andreasen
2020-12-10 09:52:02 +01:00
parent b4d4b0b74a
commit b8222a4e48
12 changed files with 145 additions and 44 deletions
+5 -1
View File
@@ -1,5 +1,5 @@
name: 'CodeQL: Finish'
description: 'Finalize CodeQL database'
description: 'Analyze CodeQL database'
author: 'GitHub'
inputs:
check_name:
@@ -23,6 +23,10 @@ inputs:
threads:
description: The number of threads to be used by CodeQL.
required: false
database-is-finalized:
description: True iff the database is finalized
required: false
default: "false"
checkout_path:
description: "The path at which the analyzed repository was checked out. Used to relativize any absolute paths in the uploaded SARIF file."
required: false
+14
View File
@@ -0,0 +1,14 @@
name: 'CodeQL: Create Database'
description: 'Create CodeQL database,'
author: 'GitHub'
inputs:
token:
default: ${{ github.token }}
matrix:
default: ${{ toJson(matrix) }}
threads:
description: The number of threads to be used by CodeQL.
required: false
runs:
using: 'node12'
main: '../lib/create-database-action.js'
+3 -3
View File
@@ -6,10 +6,10 @@ inputs:
default: ${{ github.token }}
matrix:
default: ${{ toJson(matrix) }}
threads:
description: The number of threads to be used by CodeQL.
mode:
description: The hashing strategy (currently supports ".rel")
required: false
default: 1 # a surgical way of forcing all `util.getThreadsFlag(...)` to resolve to 1 for our purposes
default: ".rel"
outputs:
hash:
description: the stable hash of the database
+6 -2
View File
@@ -11,6 +11,7 @@ const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const toolrunner = __importStar(require("@actions/exec/lib/toolrunner"));
const analysisPaths = __importStar(require("./analysis-paths"));
const actionsUtil = __importStar(require("./actions-util"));
const codeql_1 = require("./codeql");
const languages_1 = require("./languages");
const sharedEnv = __importStar(require("./shared-environment"));
@@ -66,6 +67,7 @@ async function createdDBForScannedLanguages(config, logger) {
}
}
async function finalizeDatabaseCreation(config, threadsFlag, logger) {
logger.info("Finalizing database creation");
await createdDBForScannedLanguages(config, logger);
const codeql = codeql_1.getCodeQL(config.codeQLCmd);
for (const language of config.languages) {
@@ -74,6 +76,7 @@ async function finalizeDatabaseCreation(config, threadsFlag, logger) {
logger.endGroup();
}
}
exports.finalizeDatabaseCreation = finalizeDatabaseCreation;
// Runs queries and creates sarif files in the given folder
async function runQueries(sarifFolder, memoryFlag, addSnippetsFlag, threadsFlag, config, logger) {
const statusReport = {};
@@ -121,8 +124,9 @@ async function runAnalyze(repositoryNwo, commitOid, ref, analysisKey, analysisNa
// Delete the tracer config env var to avoid tracing ourselves
delete process.env[sharedEnv.ODASA_TRACER_CONFIGURATION];
fs.mkdirSync(outputDir, { recursive: true });
logger.info("Finalizing database creation");
await finalizeDatabaseCreation(config, threadsFlag, logger);
if (!actionsUtil.getOptionalInput("database-is-finalized")) {
await finalizeDatabaseCreation(config, threadsFlag, logger);
}
logger.info("Analyzing database");
const queriesStats = await runQueries(outputDir, memoryFlag, addSnippetsFlag, threadsFlag, config, logger);
if (!doUpload) {
+1 -1
View File
File diff suppressed because one or more lines are too long
+42
View File
@@ -0,0 +1,42 @@
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(require("@actions/core"));
const actionsUtil = __importStar(require("./actions-util"));
const analyze_1 = require("./analyze");
const config_utils = __importStar(require("./config-utils"));
const logging_1 = require("./logging");
const util = __importStar(require("./util"));
async function run() {
const logger = logging_1.getActionsLogger();
try {
actionsUtil.prepareLocalRunEnvironment();
const config = await config_utils.getConfig(actionsUtil.getRequiredEnvParam("RUNNER_TEMP"), logger);
if (config === undefined) {
throw new Error("Config file could not be found at expected location. Has the 'init' action been called?");
}
await analyze_1.finalizeDatabaseCreation(config, util.getThreadsFlag(actionsUtil.getOptionalInput("threads"), logger), logger);
}
catch (error) {
core.setFailed(`We were unable to create the database. ${error.message}`);
console.log(error);
return;
}
}
async function runWrapper() {
try {
await run();
}
catch (error) {
core.setFailed(`create-database action failed. ${error}`);
console.log(error);
}
}
void runWrapper();
//# sourceMappingURL=create-database-action.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"create-database-action.js","sourceRoot":"","sources":["../src/create-database-action.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAsC;AACtC,4DAA8C;AAC9C,uCAAqD;AACrD,6DAA+C;AAC/C,uCAA6C;AAC7C,6CAA+B;AAE/B,KAAK,UAAU,GAAG;IAChB,MAAM,MAAM,GAAG,0BAAgB,EAAE,CAAC;IAClC,IAAI;QACF,WAAW,CAAC,0BAA0B,EAAE,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CACzC,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAC9C,MAAM,CACP,CAAC;QACF,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;SACH;QAED,MAAM,kCAAwB,CAC5B,MAAM,EACN,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EACpE,MAAM,CACP,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,SAAS,CAAC,2CAA2C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO;KACR;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI;QACF,MAAM,GAAG,EAAE,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,SAAS,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACpB;AACH,CAAC;AAED,KAAK,UAAU,EAAE,CAAC"}
+8 -12
View File
@@ -11,7 +11,6 @@ const core = __importStar(require("@actions/core"));
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const crypto = __importStar(require("crypto"));
const codeql_1 = require("./codeql");
const actionsUtil = __importStar(require("./actions-util"));
const config_utils = __importStar(require("./config-utils"));
const logging_1 = require("./logging");
@@ -24,29 +23,26 @@ async function run() {
if (config === undefined) {
throw new Error("Config file could not be found at expected location. Has the 'init' action been called?");
}
let codeql = codeql_1.getCodeQL(config.codeQLCmd);
for (const language of config.languages) {
logger.startGroup(`Extracting ${language}`);
await codeql.extractScannedLanguage(util.getCodeQLDatabasePath(config.tempDir, language), language);
logger.endGroup();
logger.startGroup(`Finalizing ${language}`);
await codeql.finalizeDatabase(util.getCodeQLDatabasePath(config.tempDir, language), util.getThreadsFlag(actionsUtil.getOptionalInput("threads"), logger));
logger.endGroup();
// XXX this early extraction may break the subsequent analyze action step - do we need a bailout there?
const dbPath = util.getCodeQLDatabasePath(config.tempDir, language);
let relDir = path.join(dbPath, `db-${language}`, "default");
let combined_all = crypto.createHash("sha256");
let combined_noExtractionTime = crypto.createHash("sha256");
let files = {};
for (const relFile of fs
let relFiles = fs
.readdirSync(relDir)
.filter((n) => n.endsWith(".rel"))
.map((n) => path.join(relDir, n))) {
.map((n) => path.join(relDir, n));
if (relFiles.length === 0) {
throw new Error(`No '.rel' files found in ${relDir}. Has the 'create-database' action been called?`);
}
for (const relFile of relFiles) {
let content = fs.readFileSync(relFile); // XXX this ought to be chunked for large tables!
let solo = crypto.createHash("sha256");
solo.update(content);
files[path.relative(dbPath, relFile)] = solo.digest("hex");
if (path.basename(relFile) !== "extraction_time.rel") {
if (language === "javascript" &&
path.basename(relFile) !== "extraction_time.rel") {
combined_noExtractionTime.update(content);
}
combined_all.update(content);
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"hash-database-action.js","sourceRoot":"","sources":["../src/hash-database-action.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"hash-database-action.js","sourceRoot":"","sources":["../src/hash-database-action.ts"],"names":[],"mappings":"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"}
+7 -3
View File
@@ -4,6 +4,7 @@ import * as path from "path";
import * as toolrunner from "@actions/exec/lib/toolrunner";
import * as analysisPaths from "./analysis-paths";
import * as actionsUtil from "./actions-util";
import { GitHubApiDetails } from "./api-client";
import { getCodeQL } from "./codeql";
import * as configUtils from "./config-utils";
@@ -121,11 +122,13 @@ async function createdDBForScannedLanguages(
}
}
async function finalizeDatabaseCreation(
export async function finalizeDatabaseCreation(
config: configUtils.Config,
threadsFlag: string,
logger: Logger
) {
logger.info("Finalizing database creation");
await createdDBForScannedLanguages(config, logger);
const codeql = getCodeQL(config.codeQLCmd);
@@ -240,8 +243,9 @@ export async function runAnalyze(
fs.mkdirSync(outputDir, { recursive: true });
logger.info("Finalizing database creation");
await finalizeDatabaseCreation(config, threadsFlag, logger);
if (!actionsUtil.getOptionalInput("database-is-finalized")) {
await finalizeDatabaseCreation(config, threadsFlag, logger);
}
logger.info("Analyzing database");
const queriesStats = await runQueries(
+44
View File
@@ -0,0 +1,44 @@
import * as core from "@actions/core";
import * as actionsUtil from "./actions-util";
import { finalizeDatabaseCreation } from "./analyze";
import * as config_utils from "./config-utils";
import { getActionsLogger } from "./logging";
import * as util from "./util";
async function run() {
const logger = getActionsLogger();
try {
actionsUtil.prepareLocalRunEnvironment();
const config = await config_utils.getConfig(
actionsUtil.getRequiredEnvParam("RUNNER_TEMP"),
logger
);
if (config === undefined) {
throw new Error(
"Config file could not be found at expected location. Has the 'init' action been called?"
);
}
await finalizeDatabaseCreation(
config,
util.getThreadsFlag(actionsUtil.getOptionalInput("threads"), logger),
logger
);
} catch (error) {
core.setFailed(`We were unable to create the database. ${error.message}`);
console.log(error);
return;
}
}
async function runWrapper() {
try {
await run();
} catch (error) {
core.setFailed(`create-database action failed. ${error}`);
console.log(error);
}
}
void runWrapper();
+13 -21
View File
@@ -4,8 +4,6 @@ import * as fs from "fs";
import * as path from "path";
import * as crypto from "crypto";
import { getCodeQL } from "./codeql";
import * as actionsUtil from "./actions-util";
import * as config_utils from "./config-utils";
import { getActionsLogger } from "./logging";
@@ -25,23 +23,8 @@ async function run() {
"Config file could not be found at expected location. Has the 'init' action been called?"
);
}
let codeql = getCodeQL(config.codeQLCmd);
for (const language of config.languages) {
logger.startGroup(`Extracting ${language}`);
await codeql.extractScannedLanguage(
util.getCodeQLDatabasePath(config.tempDir, language),
language
);
logger.endGroup();
logger.startGroup(`Finalizing ${language}`);
await codeql.finalizeDatabase(
util.getCodeQLDatabasePath(config.tempDir, language),
util.getThreadsFlag(actionsUtil.getOptionalInput("threads"), logger)
);
logger.endGroup();
// XXX this early extraction may break the subsequent analyze action step - do we need a bailout there?
const dbPath = util.getCodeQLDatabasePath(config.tempDir, language);
let relDir = path.join(dbPath, `db-${language}`, "default");
let combined_all = crypto.createHash("sha256");
@@ -49,15 +32,24 @@ async function run() {
let files: {
[name: string]: string;
} = {};
for (const relFile of fs
let relFiles = fs
.readdirSync(relDir)
.filter((n) => n.endsWith(".rel"))
.map((n) => path.join(relDir, n))) {
.map((n) => path.join(relDir, n));
if (relFiles.length === 0) {
throw new Error(
`No '.rel' files found in ${relDir}. Has the 'create-database' action been called?`
);
}
for (const relFile of relFiles) {
let content = fs.readFileSync(relFile); // XXX this ought to be chunked for large tables!
let solo = crypto.createHash("sha256");
solo.update(content);
files[path.relative(dbPath, relFile)] = solo.digest("hex");
if (path.basename(relFile) !== "extraction_time.rel") {
if (
language === "javascript" &&
path.basename(relFile) !== "extraction_time.rel"
) {
combined_noExtractionTime.update(content);
}
combined_all.update(content);