Consolidate error processing in actions

This commit is contained in:
daz 2024-04-11 10:18:07 -06:00
parent 1c25312b02
commit ba79f71e36
No known key found for this signature in database
6 changed files with 42 additions and 52 deletions

View File

@ -1,5 +1,3 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle' import * as setupGradle from '../setup-gradle'
import * as gradle from '../execution/gradle' import * as gradle from '../execution/gradle'
import * as dependencyGraph from '../dependency-graph' import * as dependencyGraph from '../dependency-graph'
@ -14,6 +12,7 @@ import {
setActionId setActionId
} from '../configuration' } from '../configuration'
import {saveDeprecationState} from '../deprecation-collector' import {saveDeprecationState} from '../deprecation-collector'
import {handleMainActionError} from '../errors'
/** /**
* The main entry point for the action, called by Github Actions for the step. * The main entry point for the action, called by Github Actions for the step.
@ -56,10 +55,7 @@ export async function run(): Promise<void> {
saveDeprecationState() saveDeprecationState()
} catch (error) { } catch (error) {
core.setFailed(String(error)) handleMainActionError(error)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
} }
// Explicit process.exit() to prevent waiting for hanging promises. // Explicit process.exit() to prevent waiting for hanging promises.

View File

@ -1,13 +1,12 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle' import * as setupGradle from '../setup-gradle'
import {CacheConfig, SummaryConfig} from '../configuration' import {CacheConfig, SummaryConfig} from '../configuration'
import {PostActionJobFailure} from '../errors' import {handlePostActionError} from '../errors'
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in // Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to // @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
// throw an uncaught exception. Instead of failing this action, just warn. // throw an uncaught exception. Instead of failing this action, just warn.
process.on('uncaughtException', e => handleFailure(e)) process.on('uncaughtException', e => handlePostActionError(e))
/** /**
* The post-execution entry point for the action, called by Github Actions after completing all steps for the Job. * The post-execution entry point for the action, called by Github Actions after completing all steps for the Job.
@ -16,22 +15,11 @@ export async function run(): Promise<void> {
try { try {
await setupGradle.complete(new CacheConfig(), new SummaryConfig()) await setupGradle.complete(new CacheConfig(), new SummaryConfig())
} catch (error) { } catch (error) {
if (error instanceof PostActionJobFailure) { handlePostActionError(error)
core.setFailed(String(error))
} else {
handleFailure(error)
}
} }
// Explicit process.exit() to prevent waiting for promises left hanging by `@actions/cache` on save. // Explicit process.exit() to prevent waiting for promises left hanging by `@actions/cache` on save.
process.exit() process.exit()
} }
function handleFailure(error: unknown): void {
core.warning(`Unhandled error in Gradle post-action - job will continue: ${error}`)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
run() run()

View File

@ -1,3 +1,5 @@
import * as core from '@actions/core'
export class PostActionJobFailure extends Error { export class PostActionJobFailure extends Error {
constructor(error: unknown) { constructor(error: unknown) {
if (error instanceof Error) { if (error instanceof Error) {
@ -9,3 +11,31 @@ export class PostActionJobFailure extends Error {
} }
} }
} }
export function handleMainActionError(error: unknown): void {
if (error instanceof AggregateError) {
core.setFailed(`Multiple errors returned`)
for (const err of error.errors) {
core.error(`Error ${error.errors.indexOf(err)}: ${err.message}`)
if (err.stack) {
core.info(err.stack)
}
}
} else {
core.setFailed(String(error))
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
}
export function handlePostActionError(error: unknown): void {
if (error instanceof PostActionJobFailure) {
core.setFailed(String(error))
} else {
core.warning(`Unhandled error in Gradle post-action - job will continue: ${error}`)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
}

View File

@ -1,5 +1,3 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle' import * as setupGradle from '../setup-gradle'
import * as gradle from '../execution/gradle' import * as gradle from '../execution/gradle'
import * as dependencyGraph from '../dependency-graph' import * as dependencyGraph from '../dependency-graph'
@ -12,6 +10,7 @@ import {
setActionId setActionId
} from '../configuration' } from '../configuration'
import {recordDeprecation, saveDeprecationState} from '../deprecation-collector' import {recordDeprecation, saveDeprecationState} from '../deprecation-collector'
import {handleMainActionError} from '../errors'
/** /**
* The main entry point for the action, called by Github Actions for the step. * The main entry point for the action, called by Github Actions for the step.
@ -41,10 +40,7 @@ export async function run(): Promise<void> {
saveDeprecationState() saveDeprecationState()
} catch (error) { } catch (error) {
core.setFailed(String(error)) handleMainActionError(error)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
} }
// Explicit process.exit() to prevent waiting for hanging promises. // Explicit process.exit() to prevent waiting for hanging promises.

View File

@ -1,15 +1,14 @@
import * as core from '@actions/core'
import * as setupGradle from '../setup-gradle' import * as setupGradle from '../setup-gradle'
import * as dependencyGraph from '../dependency-graph' import * as dependencyGraph from '../dependency-graph'
import {CacheConfig, DependencyGraphConfig, SummaryConfig} from '../configuration' import {CacheConfig, DependencyGraphConfig, SummaryConfig} from '../configuration'
import {PostActionJobFailure} from '../errors' import {handlePostActionError} from '../errors'
import {emitDeprecationWarnings, restoreDeprecationState} from '../deprecation-collector' import {emitDeprecationWarnings, restoreDeprecationState} from '../deprecation-collector'
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in // Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to // @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
// throw an uncaught exception. Instead of failing this action, just warn. // throw an uncaught exception. Instead of failing this action, just warn.
process.on('uncaughtException', e => handleFailure(e)) process.on('uncaughtException', e => handlePostActionError(e))
/** /**
* The post-execution entry point for the action, called by Github Actions after completing all steps for the Job. * The post-execution entry point for the action, called by Github Actions after completing all steps for the Job.
@ -24,22 +23,11 @@ export async function run(): Promise<void> {
await dependencyGraph.complete(new DependencyGraphConfig()) await dependencyGraph.complete(new DependencyGraphConfig())
} }
} catch (error) { } catch (error) {
if (error instanceof PostActionJobFailure) { handlePostActionError(error)
core.setFailed(String(error))
} else {
handleFailure(error)
}
} }
// Explicit process.exit() to prevent waiting for promises left hanging by `@actions/cache` on save. // Explicit process.exit() to prevent waiting for promises left hanging by `@actions/cache` on save.
process.exit() process.exit()
} }
function handleFailure(error: unknown): void {
core.warning(`Unhandled error in Gradle post-action - job will continue: ${error}`)
if (error instanceof Error && error.stack) {
core.info(error.stack)
}
}
run() run()

View File

@ -2,6 +2,7 @@ import * as path from 'path'
import * as core from '@actions/core' import * as core from '@actions/core'
import * as validate from './validate' import * as validate from './validate'
import {handleMainActionError} from '../errors'
export async function run(): Promise<void> { export async function run(): Promise<void> {
try { try {
@ -22,16 +23,7 @@ export async function run(): Promise<void> {
} }
} }
} catch (error) { } catch (error) {
if (error instanceof AggregateError) { handleMainActionError(error)
core.setFailed(`Multiple errors returned`)
for (const err of error.errors) {
core.error(`Error ${error.errors.indexOf(err)}: ${err.message}`)
}
} else if (error instanceof Error) {
core.setFailed(error.message)
} else {
core.setFailed(`Unknown object was thrown: ${error}`)
}
} }
} }