From 0b90c2eee6c2b66775e5fd9daef43da324e58528 Mon Sep 17 00:00:00 2001 From: BToersche Date: Wed, 5 May 2021 00:43:01 +0200 Subject: [PATCH] Added support for uploading multiple artifacts --- dist/index.js | 114 ++++++++++++++++++++++++--------------- src/input-helper.ts | 50 +++++++++++++++--- src/upload-artifact.ts | 117 ++++++++++++++++++++++------------------- src/upload-inputs.ts | 6 +-- 4 files changed, 178 insertions(+), 109 deletions(-) diff --git a/dist/index.js b/dist/index.js index 343b4bf..d2d85be 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4028,44 +4028,49 @@ function run() { return __awaiter(this, void 0, void 0, function* () { try { const inputs = input_helper_1.getInputs(); - const searchResult = yield search_1.findFilesToUpload(inputs.searchPath); - if (searchResult.filesToUpload.length === 0) { - // No files were found, different use cases warrant different types of behavior if nothing is found - switch (inputs.ifNoFilesFound) { - case constants_1.NoFileOptions.warn: { - core.warning(`No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.`); - break; + for (let i = 0; i < inputs.searchPath.length; i++) { + const searchPath = inputs.searchPath[i]; + const artifactName = inputs.artifactName[i]; + const retentionDays = inputs.retentionDays[i]; + const searchResult = yield search_1.findFilesToUpload(searchPath); + if (searchResult.filesToUpload.length === 0) { + // No files were found, different use cases warrant different types of behavior if nothing is found + switch (inputs.ifNoFilesFound) { + case constants_1.NoFileOptions.warn: { + core.warning(`No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.`); + break; + } + case constants_1.NoFileOptions.error: { + core.setFailed(`No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.`); + break; + } + case constants_1.NoFileOptions.ignore: { + core.info(`No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.`); + break; + } } - case constants_1.NoFileOptions.error: { - core.setFailed(`No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.`); - break; - } - case constants_1.NoFileOptions.ignore: { - core.info(`No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.`); - break; - } - } - } - else { - const s = searchResult.filesToUpload.length === 1 ? '' : 's'; - core.info(`With the provided path, there will be ${searchResult.filesToUpload.length} file${s} uploaded`); - core.debug(`Root artifact directory is ${searchResult.rootDirectory}`); - if (searchResult.filesToUpload.length > 10000) { - core.warning(`There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.`); - } - const artifactClient = artifact_1.create(); - const options = { - continueOnError: false - }; - if (inputs.retentionDays) { - options.retentionDays = inputs.retentionDays; - } - const uploadResponse = yield artifactClient.uploadArtifact(inputs.artifactName, searchResult.filesToUpload, searchResult.rootDirectory, options); - if (uploadResponse.failedItems.length > 0) { - core.setFailed(`An error was encountered when uploading ${uploadResponse.artifactName}. There were ${uploadResponse.failedItems.length} items that failed to upload.`); } else { - core.info(`Artifact ${uploadResponse.artifactName} has been successfully uploaded!`); + const s = searchResult.filesToUpload.length === 1 ? '' : 's'; + core.info(`With the provided path, there will be ${searchResult.filesToUpload.length} file${s} uploaded`); + core.debug(`Root artifact directory is ${searchResult.rootDirectory}`); + if (searchResult.filesToUpload.length > 10000) { + core.warning(`There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.`); + } + const artifactClient = artifact_1.create(); + const options = { + continueOnError: false + }; + if (retentionDays) { + options.retentionDays = retentionDays; + } + const uploadResponse = yield artifactClient.uploadArtifact(artifactName, searchResult.filesToUpload, searchResult.rootDirectory, options); + if (uploadResponse.failedItems.length > 0) { + core.setFailed(`An error was encountered when uploading ${uploadResponse.artifactName}. There were ${uploadResponse.failedItems.length} items that failed to upload.`); + } + else { + core.info(`Artifact ${uploadResponse.artifactName} has been successfully uploaded!`); + } } } } @@ -6576,26 +6581,49 @@ const constants_1 = __webpack_require__(694); function getInputs() { const name = core.getInput(constants_1.Inputs.Name); const path = core.getInput(constants_1.Inputs.Path, { required: true }); + const searchPath = Array.isArray(path) ? path : [path]; + const defaultArtifactName = 'artifact'; + // Accepts an individual value or an array as input, if array sizes don't match, use default value instead + const artifactName = Array.isArray(name) + ? name.concat(new Array(Math.max(0, searchPath.length - name.length)).fill(defaultArtifactName)) + : new Array(searchPath.length).fill(name || defaultArtifactName); const ifNoFilesFound = core.getInput(constants_1.Inputs.IfNoFilesFound); const noFileBehavior = constants_1.NoFileOptions[ifNoFilesFound]; if (!noFileBehavior) { core.setFailed(`Unrecognized ${constants_1.Inputs.IfNoFilesFound} input. Provided: ${ifNoFilesFound}. Available options: ${Object.keys(constants_1.NoFileOptions)}`); } const inputs = { - artifactName: name, - searchPath: path, + artifactName, + searchPath, ifNoFilesFound: noFileBehavior }; - const retentionDaysStr = core.getInput(constants_1.Inputs.RetentionDays); - if (retentionDaysStr) { - inputs.retentionDays = parseInt(retentionDaysStr); - if (isNaN(inputs.retentionDays)) { - core.setFailed('Invalid retention-days'); - } + // Accepts an individual value or an array as input + const retentionDays = core.getInput(constants_1.Inputs.RetentionDays); + if (Array.isArray(retentionDays)) { + // If array sizes don't match, use default value instead + inputs.retentionDays = retentionDays + .map(parseRetentionDays) + .concat(new Array(Math.max(0, searchPath.length - retentionDays.length)).fill(undefined)); + } + else { + const retention = parseRetentionDays(retentionDays); + inputs.retentionDays = new Array(searchPath.length).fill(retention); } return inputs; } exports.getInputs = getInputs; +function parseRetentionDays(retentionDaysStr) { + if (retentionDaysStr) { + const retentionDays = parseInt(retentionDaysStr); + if (isNaN(retentionDays)) { + core.setFailed('Invalid retention-days'); + } + return retentionDays; + } + else { + return undefined; + } +} /***/ }), diff --git a/src/input-helper.ts b/src/input-helper.ts index 8344823..2397ca1 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -9,6 +9,18 @@ export function getInputs(): UploadInputs { const name = core.getInput(Inputs.Name) const path = core.getInput(Inputs.Path, {required: true}) + const searchPath = Array.isArray(path) ? path : [path] + + const defaultArtifactName = 'artifact' + // Accepts an individual value or an array as input, if array sizes don't match, use default value instead + const artifactName = Array.isArray(name) + ? name.concat( + new Array(Math.max(0, searchPath.length - name.length)).fill( + defaultArtifactName + ) + ) + : new Array(searchPath.length).fill(name || defaultArtifactName) + const ifNoFilesFound = core.getInput(Inputs.IfNoFilesFound) const noFileBehavior: NoFileOptions = NoFileOptions[ifNoFilesFound] @@ -23,18 +35,40 @@ export function getInputs(): UploadInputs { } const inputs = { - artifactName: name, - searchPath: path, + artifactName, + searchPath, ifNoFilesFound: noFileBehavior } as UploadInputs - const retentionDaysStr = core.getInput(Inputs.RetentionDays) - if (retentionDaysStr) { - inputs.retentionDays = parseInt(retentionDaysStr) - if (isNaN(inputs.retentionDays)) { - core.setFailed('Invalid retention-days') - } + // Accepts an individual value or an array as input + const retentionDays = core.getInput(Inputs.RetentionDays) + if (Array.isArray(retentionDays)) { + // If array sizes don't match, use default value instead + inputs.retentionDays = retentionDays + .map(parseRetentionDays) + .concat( + new Array(Math.max(0, searchPath.length - retentionDays.length)).fill( + undefined + ) + ) + } else { + const retention = parseRetentionDays(retentionDays) + inputs.retentionDays = new Array(searchPath.length).fill(retention) } return inputs } + +function parseRetentionDays( + retentionDaysStr: string | undefined +): number | undefined { + if (retentionDaysStr) { + const retentionDays = parseInt(retentionDaysStr) + if (isNaN(retentionDays)) { + core.setFailed('Invalid retention-days') + } + return retentionDays + } else { + return undefined + } +} diff --git a/src/upload-artifact.ts b/src/upload-artifact.ts index 3add259..5c4501b 100644 --- a/src/upload-artifact.ts +++ b/src/upload-artifact.ts @@ -7,65 +7,72 @@ import {NoFileOptions} from './constants' async function run(): Promise { try { const inputs = getInputs() - const searchResult = await findFilesToUpload(inputs.searchPath) - if (searchResult.filesToUpload.length === 0) { - // No files were found, different use cases warrant different types of behavior if nothing is found - switch (inputs.ifNoFilesFound) { - case NoFileOptions.warn: { - core.warning( - `No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.` - ) - break + + for (let i = 0; i < inputs.searchPath.length; i++) { + const searchPath = inputs.searchPath[i] + const artifactName = inputs.artifactName[i] + const retentionDays = inputs.retentionDays[i] + + const searchResult = await findFilesToUpload(searchPath) + if (searchResult.filesToUpload.length === 0) { + // No files were found, different use cases warrant different types of behavior if nothing is found + switch (inputs.ifNoFilesFound) { + case NoFileOptions.warn: { + core.warning( + `No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.` + ) + break + } + case NoFileOptions.error: { + core.setFailed( + `No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.` + ) + break + } + case NoFileOptions.ignore: { + core.info( + `No files were found with the provided path: ${searchPath}. No artifacts will be uploaded.` + ) + break + } } - case NoFileOptions.error: { - core.setFailed( - `No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.` - ) - break - } - case NoFileOptions.ignore: { - core.info( - `No files were found with the provided path: ${inputs.searchPath}. No artifacts will be uploaded.` - ) - break - } - } - } else { - const s = searchResult.filesToUpload.length === 1 ? '' : 's' - core.info( - `With the provided path, there will be ${searchResult.filesToUpload.length} file${s} uploaded` - ) - core.debug(`Root artifact directory is ${searchResult.rootDirectory}`) - - if (searchResult.filesToUpload.length > 10000) { - core.warning( - `There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.` - ) - } - - const artifactClient = create() - const options: UploadOptions = { - continueOnError: false - } - if (inputs.retentionDays) { - options.retentionDays = inputs.retentionDays - } - - const uploadResponse = await artifactClient.uploadArtifact( - inputs.artifactName, - searchResult.filesToUpload, - searchResult.rootDirectory, - options - ) - - if (uploadResponse.failedItems.length > 0) { - core.setFailed( - `An error was encountered when uploading ${uploadResponse.artifactName}. There were ${uploadResponse.failedItems.length} items that failed to upload.` - ) } else { + const s = searchResult.filesToUpload.length === 1 ? '' : 's' core.info( - `Artifact ${uploadResponse.artifactName} has been successfully uploaded!` + `With the provided path, there will be ${searchResult.filesToUpload.length} file${s} uploaded` ) + core.debug(`Root artifact directory is ${searchResult.rootDirectory}`) + + if (searchResult.filesToUpload.length > 10000) { + core.warning( + `There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.` + ) + } + + const artifactClient = create() + const options: UploadOptions = { + continueOnError: false + } + if (retentionDays) { + options.retentionDays = retentionDays + } + + const uploadResponse = await artifactClient.uploadArtifact( + artifactName, + searchResult.filesToUpload, + searchResult.rootDirectory, + options + ) + + if (uploadResponse.failedItems.length > 0) { + core.setFailed( + `An error was encountered when uploading ${uploadResponse.artifactName}. There were ${uploadResponse.failedItems.length} items that failed to upload.` + ) + } else { + core.info( + `Artifact ${uploadResponse.artifactName} has been successfully uploaded!` + ) + } } } } catch (err) { diff --git a/src/upload-inputs.ts b/src/upload-inputs.ts index 37325df..4f0e0af 100644 --- a/src/upload-inputs.ts +++ b/src/upload-inputs.ts @@ -4,12 +4,12 @@ export interface UploadInputs { /** * The name of the artifact that will be uploaded */ - artifactName: string + artifactName: string[] /** * The search path used to describe what to upload as part of the artifact */ - searchPath: string + searchPath: string[] /** * The desired behavior if no files are found with the provided search path @@ -19,5 +19,5 @@ export interface UploadInputs { /** * Duration after which artifact will expire in days */ - retentionDays: number + retentionDays: (number | undefined)[] }