Add warn-on-failure

Some users might not want their workflow jobs to die just because an
artifact isn't available...
This commit is contained in:
Josh Soref 2024-01-30 14:58:20 -05:00
parent c3c8e4145a
commit bd6ef4177a
6 changed files with 77 additions and 9 deletions

View File

@ -118,6 +118,29 @@ jobs:
path: single/directory path: single/directory
merge-multiple: true merge-multiple: true
- name: Request missing Artifact
id: request-missing-artifact
uses: ./
with:
name: nonexistent
warn-on-failure: true
- name: Check missing warning
env:
output: ${{ steps.request-missing-artifact.outputs.failure }}
if: ${{ !contains(env.output, 'Unable to download artifact(s):') }}
run: |
false
shell: bash
- name: Log missing warning
env:
output: ${{ steps.request-missing-artifact.outputs.failure }}
run_os: ${{ matrix.runs-on }}
run: |
echo "::notice title=This message is expected::[$run_os] $output"
shell: bash
- name: Verify successful download - name: Verify successful download
run: | run: |
$fileA = "single/directory/file-A.txt" $fileA = "single/directory/file-A.txt"

View File

@ -82,6 +82,10 @@ For assistance with breaking changes, see [MIGRATION.md](docs/MIGRATION.md).
# If github-token is specified, this is the run that artifacts will be downloaded from. # If github-token is specified, this is the run that artifacts will be downloaded from.
# Optional. Default is ${{ github.run_id }} # Optional. Default is ${{ github.run_id }}
run-id: run-id:
# Map failure result to an output instead of failing the job.
# Optional. Default is `false`
warn-on-failure:
``` ```
### Outputs ### Outputs
@ -89,6 +93,7 @@ For assistance with breaking changes, see [MIGRATION.md](docs/MIGRATION.md).
| Name | Description | Example | | Name | Description | Example |
| - | - | - | | - | - | - |
| `download-path` | Absolute path where the artifact(s) were downloaded | `/tmp/my/download/path` | | `download-path` | Absolute path where the artifact(s) were downloaded | `/tmp/my/download/path` |
| `failure` | Failure message (if using `warn-on-failure`) | `Unable to download artifact(s): ...` |
## Examples ## Examples

View File

@ -32,9 +32,15 @@ inputs:
If github-token is specified, this is the run that artifacts will be downloaded from.' If github-token is specified, this is the run that artifacts will be downloaded from.'
required: false required: false
default: ${{ github.run_id }} default: ${{ github.run_id }}
warn-on-failure:
description: 'Map failure result to an output instead of failing the job'
required: false
default: false
outputs: outputs:
download-path: download-path:
description: 'Path of artifact download' description: 'Path of artifact download'
failure:
description: 'Failure message (if warn-on-failure is set)'
runs: runs:
using: 'node20' using: 'node20'
main: 'dist/index.js' main: 'dist/index.js'

21
dist/index.js vendored
View File

@ -121005,6 +121005,7 @@ var Inputs;
Inputs["RunID"] = "run-id"; Inputs["RunID"] = "run-id";
Inputs["Pattern"] = "pattern"; Inputs["Pattern"] = "pattern";
Inputs["MergeMultiple"] = "merge-multiple"; Inputs["MergeMultiple"] = "merge-multiple";
Inputs["WarnOnFailure"] = "warn-on-failure";
})(Inputs || (exports.Inputs = Inputs = {})); })(Inputs || (exports.Inputs = Inputs = {}));
var Outputs; var Outputs;
(function (Outputs) { (function (Outputs) {
@ -121069,7 +121070,7 @@ const chunk = (arr, n) => arr.reduce((acc, cur, i) => {
return acc; return acc;
}, []); }, []);
exports.chunk = chunk; exports.chunk = chunk;
function run() { function run(flags) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const inputs = { const inputs = {
name: core.getInput(constants_1.Inputs.Name, { required: false }), name: core.getInput(constants_1.Inputs.Name, { required: false }),
@ -121078,8 +121079,12 @@ function run() {
repository: core.getInput(constants_1.Inputs.Repository, { required: false }), repository: core.getInput(constants_1.Inputs.Repository, { required: false }),
runID: parseInt(core.getInput(constants_1.Inputs.RunID, { required: false })), runID: parseInt(core.getInput(constants_1.Inputs.RunID, { required: false })),
pattern: core.getInput(constants_1.Inputs.Pattern, { required: false }), pattern: core.getInput(constants_1.Inputs.Pattern, { required: false }),
mergeMultiple: core.getBooleanInput(constants_1.Inputs.MergeMultiple, { required: false }) mergeMultiple: core.getBooleanInput(constants_1.Inputs.MergeMultiple, {
required: false
}),
warnOnFailure: core.getBooleanInput(constants_1.Inputs.WarnOnFailure, { required: false })
}; };
flags.warnOnFailure = inputs.warnOnFailure;
if (!inputs.path) { if (!inputs.path) {
inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd(); inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd();
} }
@ -121147,7 +121152,17 @@ function run() {
core.info('Download artifact has finished successfully'); core.info('Download artifact has finished successfully');
}); });
} }
run().catch(err => core.setFailed(`Unable to download artifact(s): ${err.message}`)); {
const flags = { warnOnFailure: false };
run(flags).catch(err => {
if (flags.warnOnFailure) {
core.setOutput('failure', `Unable to download artifact(s): ${err.message}`);
}
else {
core.setFailed(`Unable to download artifact(s): ${err.message}`);
}
});
}
/***/ }), /***/ }),

View File

@ -5,7 +5,8 @@ export enum Inputs {
Repository = 'repository', Repository = 'repository',
RunID = 'run-id', RunID = 'run-id',
Pattern = 'pattern', Pattern = 'pattern',
MergeMultiple = 'merge-multiple' MergeMultiple = 'merge-multiple',
WarnOnFailure = 'warn-on-failure'
} }
export enum Outputs { export enum Outputs {

View File

@ -8,6 +8,10 @@ import {Inputs, Outputs} from './constants'
const PARALLEL_DOWNLOADS = 5 const PARALLEL_DOWNLOADS = 5
interface Flags {
warnOnFailure: boolean
}
export const chunk = <T>(arr: T[], n: number): T[][] => export const chunk = <T>(arr: T[], n: number): T[][] =>
arr.reduce((acc, cur, i) => { arr.reduce((acc, cur, i) => {
const index = Math.floor(i / n) const index = Math.floor(i / n)
@ -15,7 +19,7 @@ export const chunk = <T>(arr: T[], n: number): T[][] =>
return acc return acc
}, [] as T[][]) }, [] as T[][])
async function run(): Promise<void> { async function run(flags: Flags): Promise<void> {
const inputs = { const inputs = {
name: core.getInput(Inputs.Name, {required: false}), name: core.getInput(Inputs.Name, {required: false}),
path: core.getInput(Inputs.Path, {required: false}), path: core.getInput(Inputs.Path, {required: false}),
@ -23,8 +27,12 @@ async function run(): Promise<void> {
repository: core.getInput(Inputs.Repository, {required: false}), repository: core.getInput(Inputs.Repository, {required: false}),
runID: parseInt(core.getInput(Inputs.RunID, {required: false})), runID: parseInt(core.getInput(Inputs.RunID, {required: false})),
pattern: core.getInput(Inputs.Pattern, {required: false}), pattern: core.getInput(Inputs.Pattern, {required: false}),
mergeMultiple: core.getBooleanInput(Inputs.MergeMultiple, {required: false}) mergeMultiple: core.getBooleanInput(Inputs.MergeMultiple, {
required: false
}),
warnOnFailure: core.getBooleanInput(Inputs.WarnOnFailure, {required: false})
} }
flags.warnOnFailure = inputs.warnOnFailure
if (!inputs.path) { if (!inputs.path) {
inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd() inputs.path = process.env['GITHUB_WORKSPACE'] || process.cwd()
@ -131,6 +139,16 @@ async function run(): Promise<void> {
core.info('Download artifact has finished successfully') core.info('Download artifact has finished successfully')
} }
run().catch(err => {
core.setFailed(`Unable to download artifact(s): ${err.message}`) const flags = {warnOnFailure: false}
) run(flags).catch(err => {
if (flags.warnOnFailure) {
core.setOutput(
'failure',
`Unable to download artifact(s): ${err.message}`
)
} else {
core.setFailed(`Unable to download artifact(s): ${err.message}`)
}
})
}