Added fail-mode input

This commit is contained in:
Kir_Antipov 2022-07-05 18:08:11 +03:00
parent 58a1f9bab8
commit 3f02162129
5 changed files with 84 additions and 11 deletions

View file

@ -123,6 +123,7 @@ jobs:
| [java](#user-content-java) | A list of supported Java versions | *empty string* | `Java 8` <br> `Java 1.8` <br> `8` | | [java](#user-content-java) | A list of supported Java versions | *empty string* | `Java 8` <br> `Java 1.8` <br> `8` |
| [retry-attempts](#user-content-retry-attempts) | The maximum number of attempts to publish assets | `2` | `2` <br> `10` <br> `-1` | | [retry-attempts](#user-content-retry-attempts) | The maximum number of attempts to publish assets | `2` | `2` <br> `10` <br> `-1` |
| [retry-delay](#user-content-retry-delay) | Time delay between attempts to publish assets (in milliseconds) | `10000` | `10000` <br> `60000` <br> `0` | | [retry-delay](#user-content-retry-delay) | Time delay between attempts to publish assets (in milliseconds) | `10000` | `10000` <br> `60000` <br> `0` |
| [fail-mode](#user-content-fail-mode) | Determines how errors that occur during mod publishing process are handled | `fail` | `fail` <br> `warn` <br> `skip` |
Note, that you can use any top-level property *(`name`, `version`, `dependencies`, `files`, etc.)* as a target-specific one. This can help you fine-tune `mc-publish` to suit your tastes and needs. For example, consider the following configuration: Note, that you can use any top-level property *(`name`, `version`, `dependencies`, `files`, etc.)* as a target-specific one. This can help you fine-tune `mc-publish` to suit your tastes and needs. For example, consider the following configuration:
@ -718,3 +719,17 @@ Time delay between attempts to publish assets (in milliseconds).
```yaml ```yaml
retry-delay: 10000 retry-delay: 10000
``` ```
#### fail-mode
Determines how errors that occur during mod publishing process are handled. Default value is `fail`.
```yaml
fail-mode: fail
```
Available values:
- `fail` - immediately sets the action status to **failed** and terminates its execution
- `warn` - warns about errors. The action won't be terminated, nor its status will be set to **failed**
- `skip` - warns about errors. The action won't be terminated, but its status will be set to **failed** after all specified targets have been processed

View file

@ -77,6 +77,8 @@ inputs:
retry-delay: retry-delay:
description: Time delay between attempts to publish assets (in milliseconds) description: Time delay between attempts to publish assets (in milliseconds)
default: 10000 default: 10000
fail-mode:
description: Determines how errors that occur during mod publishing process are handled
runs: runs:
using: node12 using: node12
main: dist/index.js main: dist/index.js

29
package-lock.json generated
View file

@ -2796,6 +2796,15 @@
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true "dev": true
}, },
"aggregate-error": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz",
"integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==",
"requires": {
"clean-stack": "^4.0.0",
"indent-string": "^5.0.0"
}
},
"ajv": { "ajv": {
"version": "6.12.6", "version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@ -3147,6 +3156,21 @@
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
"dev": true "dev": true
}, },
"clean-stack": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz",
"integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==",
"requires": {
"escape-string-regexp": "5.0.0"
},
"dependencies": {
"escape-string-regexp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="
}
}
},
"cliui": { "cliui": {
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@ -3928,6 +3952,11 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true "dev": true
}, },
"indent-string": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="
},
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",

View file

@ -45,6 +45,7 @@
"dependencies": { "dependencies": {
"@actions/core": "^1.8.2", "@actions/core": "^1.8.2",
"@actions/github": "^5.0.3", "@actions/github": "^5.0.3",
"aggregate-error": "^4.0.1",
"fast-glob": "^3.2.11", "fast-glob": "^3.2.11",
"form-data": "^3.0.1", "form-data": "^3.0.1",
"node-fetch": "^2.6.7", "node-fetch": "^2.6.7",

View file

@ -1,16 +1,24 @@
import { getRequiredFiles, gradleOutputSelector } from "./utils/file-utils"; import { getRequiredFiles, gradleOutputSelector } from "./utils/file-utils";
import PublisherFactory from "./publishing/publisher-factory"; import PublisherFactory from "./publishing/publisher-factory";
import PublisherTarget from "./publishing/publisher-target"; import PublisherTarget from "./publishing/publisher-target";
import { getInputAsObject, mapNumberInput } from "./utils/input-utils"; import { getInputAsObject, mapEnumInput, mapNumberInput } from "./utils/input-utils";
import { getDefaultLogger } from "./utils/logger-utils"; import { getDefaultLogger } from "./utils/logger-utils";
import { retry } from "./utils/function-utils"; import { retry } from "./utils/function-utils";
import LoggingStopwatch from "./utils/logging-stopwatch"; import LoggingStopwatch from "./utils/logging-stopwatch";
import AggregateError from "aggregate-error";
enum FailMode {
Fail,
Warn,
Skip,
}
async function main() { async function main() {
const commonOptions = getInputAsObject(); const commonOptions = getInputAsObject();
const publisherFactory = new PublisherFactory(); const publisherFactory = new PublisherFactory();
const logger = getDefaultLogger(); const logger = getDefaultLogger();
const publishedTo = new Array<string>(); const publishedTo = new Array<string>();
const errors = new Array<Error>();
for (const target of PublisherTarget.getValues()) { for (const target of PublisherTarget.getValues()) {
const targetName = PublisherTarget.toString(target); const targetName = PublisherTarget.toString(target);
@ -24,29 +32,47 @@ async function main() {
const files = await getRequiredFiles(fileSelector); const files = await getRequiredFiles(fileSelector);
const retryAttempts = mapNumberInput(options.retryAttempts); const retryAttempts = mapNumberInput(options.retryAttempts);
const retryDelay = mapNumberInput(options.retryDelay); const retryDelay = mapNumberInput(options.retryDelay);
const failMode = mapEnumInput(options.failMode, FailMode, FailMode.Fail as FailMode);
const publisher = publisherFactory.create(target, logger); const publisher = publisherFactory.create(target, logger);
const stopwatch = LoggingStopwatch.startNew(logger, `Publishing assets to ${targetName}...`, ms => `Successfully published assets to ${targetName} (in ${ms} ms)`); const func = {
await retry({
func: () => publisher.publish(files, options), func: () => publisher.publish(files, options),
maxAttempts: retryAttempts, maxAttempts: retryAttempts,
delay: retryDelay, delay: retryDelay,
errorCallback: e => { errorCallback: (e: Error) => {
logger.error(`${e}`); logger.error(e);
logger.info(`Retrying to publish assets to ${targetName} in ${retryDelay} ms...`); logger.info(`Retrying to publish assets to ${targetName} in ${retryDelay} ms...`);
} }
}); };
const stopwatch = LoggingStopwatch.startNew(logger, `Publishing assets to ${targetName}...`, ms => `Successfully published assets to ${targetName} (in ${ms} ms)`);
try {
await retry(func);
} catch(e: any) {
switch (failMode) {
case FailMode.Warn:
logger.warn(e);
continue;
case FailMode.Skip:
logger.warn(`An error occurred while uploading assets to ${targetName}`);
errors.push(e);
continue;
default:
throw e;
}
}
stopwatch.stop(); stopwatch.stop();
publishedTo.push(targetName); publishedTo.push(targetName);
} }
if (publishedTo.length) { if (publishedTo.length) {
logger.info(`Your assets have been successfully published to: ${publishedTo.join(", ")}`); logger.info(`Your assets have been successfully published to: ${publishedTo.join(", ")}`);
} else { } else if (!errors.length) {
logger.warn("You didn't specify any targets, your assets have not been published"); logger.warn("You didn't specify any targets, your assets have not been published");
} }
if (errors.length) {
throw new AggregateError(errors);
}
} }
main().catch(error => getDefaultLogger().fatal(error instanceof Error ? `${error}` : `Something went horribly wrong: ${error}`)); main().catch(error => getDefaultLogger().fatal(error instanceof Error ? error : `Something went horribly wrong: ${error}`));