Recognize internal fatal errors too
This commit is contained in:
parent
8dba596f10
commit
01bde733fb
6 changed files with 56 additions and 14 deletions
9
lib/cli-errors.js
generated
9
lib/cli-errors.js
generated
|
|
@ -19,7 +19,7 @@ class CommandInvocationError extends Error {
|
||||||
if (fatalErrors) {
|
if (fatalErrors) {
|
||||||
message =
|
message =
|
||||||
`Encountered a fatal error while running "${prettyCommand}". ` +
|
`Encountered a fatal error while running "${prettyCommand}". ` +
|
||||||
`Exit code was ${exitCode} and error was: ${fatalErrors.trim()} See the logs for more details.`;
|
`Exit code was ${exitCode} and error was: ${ensureEndsInPeriod(fatalErrors.trim())} See the logs for more details.`;
|
||||||
}
|
}
|
||||||
else if (autobuildErrors) {
|
else if (autobuildErrors) {
|
||||||
const autobuildHelpLink = "https://docs.github.com/en/code-security/code-scanning/troubleshooting-code-scanning/automatic-build-failed";
|
const autobuildHelpLink = "https://docs.github.com/en/code-security/code-scanning/troubleshooting-code-scanning/automatic-build-failed";
|
||||||
|
|
@ -29,10 +29,7 @@ class CommandInvocationError extends Error {
|
||||||
`Encountered the following error: ${autobuildErrors}`;
|
`Encountered the following error: ${autobuildErrors}`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let lastLine = stderr.trim().split("\n").pop()?.trim() || "";
|
const lastLine = ensureEndsInPeriod(stderr.trim().split("\n").pop()?.trim() || "n/a");
|
||||||
if (lastLine[lastLine.length - 1] !== ".") {
|
|
||||||
lastLine += ".";
|
|
||||||
}
|
|
||||||
message =
|
message =
|
||||||
`Encountered a fatal error while running "${prettyCommand}". ` +
|
`Encountered a fatal error while running "${prettyCommand}". ` +
|
||||||
`Exit code was ${exitCode} and last log line was: ${lastLine} See the logs for more details.`;
|
`Exit code was ${exitCode} and last log line was: ${lastLine} See the logs for more details.`;
|
||||||
|
|
@ -74,7 +71,7 @@ exports.CommandInvocationError = CommandInvocationError;
|
||||||
* the Actions UI.
|
* the Actions UI.
|
||||||
*/
|
*/
|
||||||
function extractFatalErrors(error) {
|
function extractFatalErrors(error) {
|
||||||
const fatalErrorRegex = /.*fatal error occurred:/gi;
|
const fatalErrorRegex = /.*fatal (internal )?error occurr?ed(. Details)?:/gi;
|
||||||
let fatalErrors = [];
|
let fatalErrors = [];
|
||||||
let lastFatalErrorIndex;
|
let lastFatalErrorIndex;
|
||||||
let match;
|
let match;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
19
lib/codeql.test.js
generated
19
lib/codeql.test.js
generated
|
|
@ -601,6 +601,25 @@ for (const { codeqlVersion, flagPassed, githubVersion, negativeFlagPassed, } of
|
||||||
`${Array.from({ length: 10 }, (_, i) => `line${i + 1}`).join("\n")}\n(truncated)`,
|
`${Array.from({ length: 10 }, (_, i) => `line${i + 1}`).join("\n")}\n(truncated)`,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
(0, ava_1.default)("runTool recognizes fatal internal errors", async (t) => {
|
||||||
|
const stderr = `
|
||||||
|
[11/31 eval 8m19s] Evaluation done; writing results to codeql/go-queries/Security/CWE-020/MissingRegexpAnchor.bqrs.
|
||||||
|
Oops! A fatal internal error occurred. Details:
|
||||||
|
com.semmle.util.exception.CatastrophicError: An error occurred while evaluating ControlFlowGraph::ControlFlow::Root.isRootOf/1#dispred#f610e6ed/2@86282cc8
|
||||||
|
Severe disk cache trouble (corruption or out of space) at /home/runner/work/_temp/codeql_databases/go/db-go/default/cache/pages/28/33.pack: Failed to write item to disk`;
|
||||||
|
stubToolRunnerConstructor(1, stderr);
|
||||||
|
const codeqlObject = await codeql.getCodeQLForTesting();
|
||||||
|
sinon.stub(codeqlObject, "getVersion").resolves((0, testing_utils_1.makeVersionInfo)("2.12.6"));
|
||||||
|
sinon.stub(codeqlObject, "resolveExtractor").resolves("/path/to/extractor");
|
||||||
|
// safeWhich throws because of the test CodeQL object.
|
||||||
|
sinon.stub(safeWhich, "safeWhich").resolves("");
|
||||||
|
await t.throwsAsync(async () => await codeqlObject.databaseRunQueries(stubConfig.dbLocation, []), {
|
||||||
|
instanceOf: cli_errors_1.CommandInvocationError,
|
||||||
|
message: `Encountered a fatal error while running "codeql-for-testing database run-queries --expect-discarded-cache --min-disk-free=1024 -v". Exit code was 1 and error was: Oops! A fatal internal error occurred. Details:
|
||||||
|
com.semmle.util.exception.CatastrophicError: An error occurred while evaluating ControlFlowGraph::ControlFlow::Root.isRootOf/1#dispred#f610e6ed/2@86282cc8
|
||||||
|
Severe disk cache trouble (corruption or out of space) at /home/runner/work/_temp/codeql_databases/go/db-go/default/cache/pages/28/33.pack: Failed to write item to disk. See the logs for more details.`,
|
||||||
|
});
|
||||||
|
});
|
||||||
(0, ava_1.default)("runTool outputs last line of stderr if fatal error could not be found", async (t) => {
|
(0, ava_1.default)("runTool outputs last line of stderr if fatal error could not be found", async (t) => {
|
||||||
const cliStderr = "line1\nline2\nline3\nline4\nline5";
|
const cliStderr = "line1\nline2\nline3\nline4\nline5";
|
||||||
stubToolRunnerConstructor(32, cliStderr);
|
stubToolRunnerConstructor(32, cliStderr);
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -23,7 +23,9 @@ export class CommandInvocationError extends Error {
|
||||||
if (fatalErrors) {
|
if (fatalErrors) {
|
||||||
message =
|
message =
|
||||||
`Encountered a fatal error while running "${prettyCommand}". ` +
|
`Encountered a fatal error while running "${prettyCommand}". ` +
|
||||||
`Exit code was ${exitCode} and error was: ${fatalErrors.trim()} See the logs for more details.`;
|
`Exit code was ${exitCode} and error was: ${ensureEndsInPeriod(
|
||||||
|
fatalErrors.trim(),
|
||||||
|
)} See the logs for more details.`;
|
||||||
} else if (autobuildErrors) {
|
} else if (autobuildErrors) {
|
||||||
const autobuildHelpLink =
|
const autobuildHelpLink =
|
||||||
"https://docs.github.com/en/code-security/code-scanning/troubleshooting-code-scanning/automatic-build-failed";
|
"https://docs.github.com/en/code-security/code-scanning/troubleshooting-code-scanning/automatic-build-failed";
|
||||||
|
|
@ -32,10 +34,9 @@ export class CommandInvocationError extends Error {
|
||||||
`For more information, see ${autobuildHelpLink}. ` +
|
`For more information, see ${autobuildHelpLink}. ` +
|
||||||
`Encountered the following error: ${autobuildErrors}`;
|
`Encountered the following error: ${autobuildErrors}`;
|
||||||
} else {
|
} else {
|
||||||
let lastLine = stderr.trim().split("\n").pop()?.trim() || "";
|
const lastLine = ensureEndsInPeriod(
|
||||||
if (lastLine[lastLine.length - 1] !== ".") {
|
stderr.trim().split("\n").pop()?.trim() || "n/a",
|
||||||
lastLine += ".";
|
);
|
||||||
}
|
|
||||||
message =
|
message =
|
||||||
`Encountered a fatal error while running "${prettyCommand}". ` +
|
`Encountered a fatal error while running "${prettyCommand}". ` +
|
||||||
`Exit code was ${exitCode} and last log line was: ${lastLine} See the logs for more details.`;
|
`Exit code was ${exitCode} and last log line was: ${lastLine} See the logs for more details.`;
|
||||||
|
|
@ -75,7 +76,7 @@ export class CommandInvocationError extends Error {
|
||||||
* the Actions UI.
|
* the Actions UI.
|
||||||
*/
|
*/
|
||||||
function extractFatalErrors(error: string): string | undefined {
|
function extractFatalErrors(error: string): string | undefined {
|
||||||
const fatalErrorRegex = /.*fatal error occurred:/gi;
|
const fatalErrorRegex = /.*fatal (internal )?error occurr?ed(. Details)?:/gi;
|
||||||
let fatalErrors: string[] = [];
|
let fatalErrors: string[] = [];
|
||||||
let lastFatalErrorIndex: number | undefined;
|
let lastFatalErrorIndex: number | undefined;
|
||||||
let match: RegExpMatchArray | null;
|
let match: RegExpMatchArray | null;
|
||||||
|
|
|
||||||
|
|
@ -950,6 +950,31 @@ test("runTool truncates long autobuilder errors", async (t) => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("runTool recognizes fatal internal errors", async (t) => {
|
||||||
|
const stderr = `
|
||||||
|
[11/31 eval 8m19s] Evaluation done; writing results to codeql/go-queries/Security/CWE-020/MissingRegexpAnchor.bqrs.
|
||||||
|
Oops! A fatal internal error occurred. Details:
|
||||||
|
com.semmle.util.exception.CatastrophicError: An error occurred while evaluating ControlFlowGraph::ControlFlow::Root.isRootOf/1#dispred#f610e6ed/2@86282cc8
|
||||||
|
Severe disk cache trouble (corruption or out of space) at /home/runner/work/_temp/codeql_databases/go/db-go/default/cache/pages/28/33.pack: Failed to write item to disk`;
|
||||||
|
stubToolRunnerConstructor(1, stderr);
|
||||||
|
const codeqlObject = await codeql.getCodeQLForTesting();
|
||||||
|
sinon.stub(codeqlObject, "getVersion").resolves(makeVersionInfo("2.12.6"));
|
||||||
|
sinon.stub(codeqlObject, "resolveExtractor").resolves("/path/to/extractor");
|
||||||
|
// safeWhich throws because of the test CodeQL object.
|
||||||
|
sinon.stub(safeWhich, "safeWhich").resolves("");
|
||||||
|
|
||||||
|
await t.throwsAsync(
|
||||||
|
async () =>
|
||||||
|
await codeqlObject.databaseRunQueries(stubConfig.dbLocation, []),
|
||||||
|
{
|
||||||
|
instanceOf: CommandInvocationError,
|
||||||
|
message: `Encountered a fatal error while running "codeql-for-testing database run-queries --expect-discarded-cache --min-disk-free=1024 -v". Exit code was 1 and error was: Oops! A fatal internal error occurred. Details:
|
||||||
|
com.semmle.util.exception.CatastrophicError: An error occurred while evaluating ControlFlowGraph::ControlFlow::Root.isRootOf/1#dispred#f610e6ed/2@86282cc8
|
||||||
|
Severe disk cache trouble (corruption or out of space) at /home/runner/work/_temp/codeql_databases/go/db-go/default/cache/pages/28/33.pack: Failed to write item to disk. See the logs for more details.`,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test("runTool outputs last line of stderr if fatal error could not be found", async (t) => {
|
test("runTool outputs last line of stderr if fatal error could not be found", async (t) => {
|
||||||
const cliStderr = "line1\nline2\nline3\nline4\nline5";
|
const cliStderr = "line1\nline2\nline3\nline4\nline5";
|
||||||
stubToolRunnerConstructor(32, cliStderr);
|
stubToolRunnerConstructor(32, cliStderr);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue