From 7ffd9f4ac2951a37bde4aed3d653457235ec6ae8 Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Sun, 9 May 2021 22:56:28 -0700 Subject: [PATCH 01/12] Share an imageId and extract the imageId from the docker output (#14804) * Added methods to share an image id and to extract the imageId from the docker output * bumped version to 2.0.4 --- .../docker-common-v2/containerimageutils.ts | 53 +++++++++++++++++++ .../docker-common-v2/package-lock.json | 2 +- .../docker-common-v2/package.json | 2 +- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/common-npm-packages/docker-common-v2/containerimageutils.ts b/common-npm-packages/docker-common-v2/containerimageutils.ts index ed4ac2ad50e3..80628246d172 100644 --- a/common-npm-packages/docker-common-v2/containerimageutils.ts +++ b/common-npm-packages/docker-common-v2/containerimageutils.ts @@ -188,3 +188,56 @@ function inspectImage(connection: ContainerConnection, imageName): any { } } +export function shareBuiltImageId(builtImageId: string) { + const IMAGE_SEPARATOR_CHAR: string = ";"; + const ENV_VARIABLE_MAX_SIZE = 32766; + let builtImages: string = tl.getVariable("DOCKER_TASK_BUILT_IMAGES"); + + if (builtImages && builtImages != "") { + const newImageId = `${IMAGE_SEPARATOR_CHAR}${builtImages}`; + + if (newImageId.length + builtImages.length > ENV_VARIABLE_MAX_SIZE) { + tl.debug("Images id truncated maximum environment variable size reached."); + return; + } + + builtImages += newImageId; + } + else { + builtImages = builtImageId; + } + + tl.setVariable("DOCKER_TASK_BUILT_IMAGES", builtImages); +} + +export function getImageIdFromBuildOutput(output: string): string { + const standardParser = (text: string): string => { + let parsedOutput: string[] = text.match(new RegExp("Successfully built ([0-9a-f]{12})", 'g')); + + return !parsedOutput || parsedOutput.length == 0 + ? "" + : parsedOutput[parsedOutput.length - 1].substring(19); // This remove the Succesfully built section + }; + + const buildKitParser = (text: string): string => { + let parsedOutput: string[] = text.match(new RegExp("writing image sha256:([0-9a-f]{64})", 'gi')); + + return !parsedOutput || parsedOutput.length == 0 + ? "" + : parsedOutput[parsedOutput.length - 1].substring(21, 33); // This remove the section Writing Image Sha256 and takes 12 characters from the Id. + } + + try { + let buildOutputParserFuncs = [standardParser, buildKitParser]; + for (let parserFunc of buildOutputParserFuncs) { + const builtImageId = parserFunc(output); + if (builtImageId) { + return builtImageId; + } + } + } catch (error) { + tl.debug(`An error occurred getting the image id from the docker ouput: ${error.message}`) + } + + return ""; +} diff --git a/common-npm-packages/docker-common-v2/package-lock.json b/common-npm-packages/docker-common-v2/package-lock.json index 10cbfd9c5bc2..064cf20acbda 100644 --- a/common-npm-packages/docker-common-v2/package-lock.json +++ b/common-npm-packages/docker-common-v2/package-lock.json @@ -1,6 +1,6 @@ { "name": "azure-pipelines-tasks-docker-common-v2", - "version": "2.0.3", + "version": "2.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common-npm-packages/docker-common-v2/package.json b/common-npm-packages/docker-common-v2/package.json index b7d05527ed0f..e1c31acfbccb 100644 --- a/common-npm-packages/docker-common-v2/package.json +++ b/common-npm-packages/docker-common-v2/package.json @@ -1,6 +1,6 @@ { "name": "azure-pipelines-tasks-docker-common-v2", - "version": "2.0.3", + "version": "2.0.4", "description": "Common Library for Azure Rest Calls", "repository": { "type": "git", From 3ddec2af96172c6da3b7d1bec52c671070ee86c1 Mon Sep 17 00:00:00 2001 From: Jyotsna Date: Tue, 11 May 2021 10:53:51 +0530 Subject: [PATCH 02/12] Updated Rm tasks owner (#14828) --- .github/CODEOWNERS | 66 +++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 83017ec5f8ef..26d81d47a0a8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,7 @@ ci/ @microsoft/akvelon-build-task-team -Tasks/ACRTaskV0/ @ammohant @Anumita +Tasks/ACRTaskV0/ @rohit-batra @Anumita Tasks/AndroidSigningV2/ @microsoft/akvelon-build-task-team @@ -41,27 +41,27 @@ Tasks/AzureFunctionAppV1/ @nadesu @chshrikh @pipeline-environment-team Tasks/AzureFunctionAppContainerV1/ @nadesu @chshrikh @pipeline-environment-team -Tasks/AzureFunctionOnKubernetesV0/ @ammohant @ajinkya599 +Tasks/AzureFunctionOnKubernetesV0/ @rohit-batra @ajinkya599 -Tasks/AzureFunctionV1/ @ammohant +Tasks/AzureFunctionV1/ @rohit-batra Tasks/AzureIoTEdgeV2/ @marianan @tameraw @pprovost -Tasks/AzureKeyVaultV1/ @ammohant +Tasks/AzureKeyVaultV1/ @rohit-batra -Tasks/AzureKeyVaultV2/ @ammohant @tauhid621 +Tasks/AzureKeyVaultV2/ @rohit-batra @tauhid621 Tasks/AzureMonitorAlertsV0/ @nadesu @chshrikh @pipeline-environment-team -Tasks/AzureMonitorV0/ @ammohant +Tasks/AzureMonitorV0/ @rohit-batra -Tasks/AzureMonitorV1/ @ammohant +Tasks/AzureMonitorV1/ @rohit-batra Tasks/AzureMysqlDeploymentV1/ @nadesu @chshrikh @pipeline-environment-team Tasks/AzureNLBManagementV1/ @nadesu @chshrikh @pipeline-environment-team -Tasks/AzurePolicyV0/ @ammohant +Tasks/AzurePolicyV0/ @rohit-batra Tasks/AzurePowerShellV2/ @nadesu @chshrikh @pipeline-environment-team @@ -139,7 +139,7 @@ Tasks/Common/codeanalysis-common/ @microsoft/akvelon-build-task-team Tasks/Common/coveragepublisher/ @nadesu @ganesp -Tasks/Common/docker-common/ @jikuma @ammohant +Tasks/Common/docker-common/ @jikuma @rohit-batra Tasks/Common/ios-signing-common/ @microsoft/akvelon-build-task-team @hashtagchris @@ -159,7 +159,7 @@ Tasks/CondaEnvironmentV0/ @microsoft/akvelon-build-task-team Tasks/CondaEnvironmentV1/ @microsoft/akvelon-build-task-team -Tasks/ContainerBuildV0/ @ammohant @prebansa +Tasks/ContainerBuildV0/ @rohit-batra @prebansa Tasks/CopyFilesV2/ @mjroghelia @@ -169,21 +169,21 @@ Tasks/CUrlUploaderV2/ @zachariahcox Tasks/DecryptFileV1/ @zachariahcox -Tasks/DelayV1/ @ammohant +Tasks/DelayV1/ @rohit-batra Tasks/DeleteFilesV1/ @mjroghelia Tasks/DeployVisualStudioTestAgentV2/ @nadesu @ankit-arora12 -Tasks/DockerV0/ @ammohant +Tasks/DockerV0/ @rohit-batra -Tasks/DockerV1/ @ammohant +Tasks/DockerV1/ @rohit-batra -Tasks/DockerV2/ @ammohant +Tasks/DockerV2/ @rohit-batra -Tasks/DockerComposeV0/ @ammohant +Tasks/DockerComposeV0/ @rohit-batra -Tasks/DockerInstallerV0/ @ammohant +Tasks/DockerInstallerV0/ @rohit-batra Tasks/DotNetCoreCLIV2/ @bishal-pdmsft @@ -213,7 +213,7 @@ Tasks/DownloadPipelineArtifactV2/ @mihaif @jahsu-MSFT @fadnavistanmay @owen Tasks/DownloadSecureFileV1/ @microsoft/akvelon-build-task-team -Tasks/DuffleInstallerV0/ @ammohant @ammohant +Tasks/DuffleInstallerV0/ @rohit-batra Tasks/ExtractFilesV1/ @mjroghelia @@ -225,13 +225,13 @@ Tasks/FtpUploadV1/ @zachariahcox Tasks/FtpUploadV2/ @zachariahcox -Tasks/FuncToolsInstallerV0/ @ammohant @ajinkya599 +Tasks/FuncToolsInstallerV0/ @rohit-batra @ajinkya599 Tasks/GitHubCommentV0/ @ds-ms -Tasks/GitHubReleaseV0/ @ammohant @mdmdakbar +Tasks/GitHubReleaseV0/ @rohit-batra @mdmdakbar -Tasks/GitHubReleaseV1/ @ammohant @mdmdakbar +Tasks/GitHubReleaseV1/ @rohit-batra @mdmdakbar Tasks/GoV0/ @bishal-pdmsft @@ -245,11 +245,11 @@ Tasks/GulpV0/ @microsoft/akvelon-build-task-team Tasks/GulpV1/ @microsoft/akvelon-build-task-team -Tasks/HelmDeployV0/ @ammohant +Tasks/HelmDeployV0/ @rohit-batra -Tasks/HelmInstallerV0/ @ammohant +Tasks/HelmInstallerV0/ @rohit-batra -Tasks/HelmInstallerV1/ @ammohant +Tasks/HelmInstallerV1/ @rohit-batra Tasks/IISWebAppDeployment/ @nadesu @chshrikh @pipeline-environment-team @@ -263,7 +263,7 @@ Tasks/InstallAppleProvisioningProfileV1/ @microsoft/akvelon-build-task-team Tasks/InstallSSHKeyV0/ @zachariahcox @microsoft/akvelon-build-task-team -Tasks/InvokeRestApiV1/ @ammohant +Tasks/InvokeRestApiV1/ @rohit-batra Tasks/JavaToolInstallerV0/ @microsoft/akvelon-build-task-team @@ -271,17 +271,17 @@ Tasks/JenkinsDownloadArtifactsV1/ @narula0781 @chandrasekharmudili Tasks/JenkinsQueueJobV2/ @microsoft/akvelon-build-task-team -Tasks/KubectlInstallerV0/ @ammohant +Tasks/KubectlInstallerV0/ @rohit-batra -Tasks/KubernetesV0/ @ammohant +Tasks/KubernetesV0/ @rohit-batra -Tasks/KubernetesV1/ @ammohant +Tasks/KubernetesV1/ @rohit-batra -Tasks/KubernetesManifestV0/ @ammohant +Tasks/KubernetesManifestV0/ @rohit-batra -Tasks/ManualInterventionV8/ @ammohant +Tasks/ManualInterventionV8/ @rohit-batra -Tasks/ManualValidationV0/ @ammohant +Tasks/ManualValidationV0/ @rohit-batra Tasks/MavenAuthenticateV0/ @phil-hodgson @aasim @satbai @@ -347,7 +347,7 @@ Tasks/PublishPipelineArtifactV0/ @mihaif @jahsu-MSFT @fadnavistanmay @owen Tasks/PublishPipelineArtifactV1/ @mihaif @jahsu-MSFT @fadnavistanmay @owenhuynMSFT @arunkm -Tasks/PublishPipelineMetadataV0/ @ammohant @nidabas +Tasks/PublishPipelineMetadataV0/ @rohit-batra @nidabas Tasks/PublishSymbolsV2/ @arunkm @mihaif @jahsu-MSFT @fadnavistanmay @owenhuynMSFT @@ -357,13 +357,13 @@ Tasks/PublishTestResultsV2/ @shailesh-sk Tasks/ContainerStructureTestV0/ @shailesh-sk @navin22 -Tasks/PublishToAzureServiceBusV1/ @ammohant +Tasks/PublishToAzureServiceBusV1/ @rohit-batra Tasks/PyPIPublisherV0/ @bishal-pdmsft @microsoft/akvelon-build-task-team Tasks/PythonScriptV0/ @microsoft/akvelon-build-task-team -Tasks/QueryWorkItemsV0/ @ammohant +Tasks/QueryWorkItemsV0/ @rohit-batra Tasks/QuickPerfTestV1/ @nadesu @ganesp From cc133589683226480b8da5f6b3c8dfb2006d994a Mon Sep 17 00:00:00 2001 From: shadargee1982 <25831260+shadargee1982@users.noreply.github.com> Date: Tue, 11 May 2021 09:40:30 -0700 Subject: [PATCH 03/12] Add support for retryOnNullOrException in MockHelper (#14818) * Add support for retryOnNullOrException in MockHelper * uprev packaging-common for MockHelper changes --- Tasks/Common/packaging-common/Tests/MockHelper.ts | 3 +++ common-npm-packages/packaging-common/package-lock.json | 2 +- common-npm-packages/packaging-common/package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Tasks/Common/packaging-common/Tests/MockHelper.ts b/Tasks/Common/packaging-common/Tests/MockHelper.ts index 172f674d2f27..6505f41af456 100644 --- a/Tasks/Common/packaging-common/Tests/MockHelper.ts +++ b/Tasks/Common/packaging-common/Tests/MockHelper.ts @@ -37,6 +37,9 @@ export function registerLocationHelpersMock(tmr: tmrm.TaskMockRunner) { retryOnExceptionHelper: async function(action: () => Promise, maxTries: number, retryIntervalInMilliseconds: number) { return await action(); }, + retryOnNullOrExceptionHelper: async function(action: () => Promise, maxTries: number, retryIntervalInMilliseconds: number) { + return await action(); + }, ProtocolType: {NuGet: 1, Npm: 2, Maven: 3, PyPi: 4}, RegistryType: {npm: 1, NuGetV2: 2, NuGetV3: 3, PyPiSimple: 4, PyPiUpload: 5} }; diff --git a/common-npm-packages/packaging-common/package-lock.json b/common-npm-packages/packaging-common/package-lock.json index a521d64d23de..4f6395d201f3 100644 --- a/common-npm-packages/packaging-common/package-lock.json +++ b/common-npm-packages/packaging-common/package-lock.json @@ -1,6 +1,6 @@ { "name": "azure-pipelines-tasks-packaging-common", - "version": "2.0.1", + "version": "2.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common-npm-packages/packaging-common/package.json b/common-npm-packages/packaging-common/package.json index 71d39240a842..8982df791350 100644 --- a/common-npm-packages/packaging-common/package.json +++ b/common-npm-packages/packaging-common/package.json @@ -1,6 +1,6 @@ { "name": "azure-pipelines-tasks-packaging-common", - "version": "2.0.2", + "version": "2.0.3", "description": "Azure Pipelines Packaging Tasks Common", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", From c9771bc064cd60f47587c68e5c871b7cd13f0f28 Mon Sep 17 00:00:00 2001 From: shadargee1982 <25831260+shadargee1982@users.noreply.github.com> Date: Tue, 11 May 2021 11:24:43 -0700 Subject: [PATCH 04/12] Users/shrverm/pickup new packaging common (#14832) * Update tasks to pick up packaging-common changes --- Tasks/DotNetCoreCLIV2/package-lock.json | 1713 ++++++++++++----------- Tasks/DotNetCoreCLIV2/package.json | 2 +- Tasks/DotNetCoreCLIV2/task.json | 2 +- Tasks/DotNetCoreCLIV2/task.loc.json | 2 +- Tasks/NpmV0/package-lock.json | 78 +- Tasks/NpmV0/package.json | 2 +- Tasks/NpmV0/task.json | 2 +- Tasks/NpmV0/task.loc.json | 2 +- Tasks/NpmV1/package-lock.json | 181 ++- Tasks/NpmV1/package.json | 2 +- Tasks/NpmV1/task.json | 2 +- Tasks/NpmV1/task.loc.json | 2 +- 12 files changed, 1073 insertions(+), 917 deletions(-) diff --git a/Tasks/DotNetCoreCLIV2/package-lock.json b/Tasks/DotNetCoreCLIV2/package-lock.json index 1f31521c567e..c7d1e1343c68 100644 --- a/Tasks/DotNetCoreCLIV2/package-lock.json +++ b/Tasks/DotNetCoreCLIV2/package-lock.json @@ -1,868 +1,879 @@ { - "name": "vsts-tasks-dotnetcoreexe", - "version": "2.129.4", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", - "requires": { - "@types/node": "*" - } - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "requires": { - "@types/node": "*" - } - }, - "@types/ini": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.30.tgz", - "integrity": "sha512-2+iF8zPSbpU83UKE+PNd4r/MhwNAdyGpk3H+VMgEH3EhjFZq1kouLgRoZrmIcmoGX97xFvqdS44DkICR5Nz3tQ==" - }, - "@types/ltx": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@types/ltx/-/ltx-2.8.0.tgz", - "integrity": "sha512-qHnPVD0FFquypl7Yy8qqvDjhnX3c7toUYjjALK+bug7MfR2WCRTIjw+GUMfehRi/Mbhj5rLAQerPTnTCUzSCWg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" - }, - "@types/mockery": { - "version": "1.4.29", - "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", - "integrity": "sha1-m6It838H43gP/4Ux0aOOYz+UV6U=" - }, - "@types/node": { - "version": "10.17.48", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.48.tgz", - "integrity": "sha512-Agl6xbYP6FOMDeAsr3QVZ+g7Yzg0uhPHWx0j5g4LFdUBHVtqtU+gH660k/lCEe506jJLOGbEzsnqPDTZGJQLag==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" - }, - "@types/uuid": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.9.tgz", - "integrity": "sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ==" - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" - }, - "archiver": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.2.0.tgz", - "integrity": "sha1-+1xq9UQ7P6akJjRHU7rSp7REqt0=", - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.1.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - } - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", - "requires": { - "lodash": "^4.14.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "azure-devops-node-api": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.1.2.tgz", - "integrity": "sha512-0oPwjVcV1IbzSx+rcT6clhmO8bQQazU/p6haErbRwAlPf2Oh+MK277TCqo4bFNL/8HS3LR4nDrNowMSmQDh//Q==", - "requires": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.0", - "underscore": "1.8.3" - }, - "dependencies": { - "typed-rest-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.0.tgz", - "integrity": "sha512-Nu1MrdH6ECrRW5gHoRAdubgCs4oH6q5/J76jsEC8bVDfvVoVPkigukPalhMHPwb7ZvpsZqPptd5zpt/QdtrdBw==", - "requires": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "1.8.3" - } - } - } - }, - "azure-pipelines-task-lib": { - "version": "3.0.6-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.0.6-preview.0.tgz", - "integrity": "sha512-Fx+7p5GzvYqVXOQI+LhPk56Pio9yBeEyypKZoPI9cQyti8WTVkmJ7YZwn9HRXurftcLumi2Xq+TC3PwnDq5U5Q==", - "requires": { - "minimatch": "3.0.4", - "mockery": "^1.7.0", - "q": "^1.5.1", - "semver": "^5.1.0", - "shelljs": "^0.8.4", - "sync-request": "6.1.0", - "uuid": "^3.0.1" - } - }, - "azure-pipelines-tasks-packaging-common": { - "version": "2.0.0-preview.1", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.0-preview.1.tgz", - "integrity": "sha512-T6TRjbYU5ahnU3gcHcL7T9dlt2ig2HtbZr9CuzjkZ9RjCanq8yTokkS4TYJ2GD50PcVK1+kYvjm+il4JQ1EI1g==", - "requires": { - "@types/ini": "1.3.30", - "@types/ltx": "2.8.0", - "@types/mocha": "^5.2.6", - "@types/mockery": "1.4.29", - "@types/node": "^10.17.0", - "@types/q": "1.5.2", - "adm-zip": "^0.4.11", - "azure-devops-node-api": "8.0.0", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tool-lib": "1.0.0-preview.0", - "ini": "^1.3.4", - "ip-address": "^5.8.9", - "ltx": "^2.6.2", - "q": "^1.5.0", - "semver": "^5.5.0", - "typed-rest-client": "1.2.0" - }, - "dependencies": { + "name": "vsts-tasks-dotnetcoreexe", + "version": "2.129.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/ini": { + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.30.tgz", + "integrity": "sha512-2+iF8zPSbpU83UKE+PNd4r/MhwNAdyGpk3H+VMgEH3EhjFZq1kouLgRoZrmIcmoGX97xFvqdS44DkICR5Nz3tQ==" + }, + "@types/ltx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@types/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-qHnPVD0FFquypl7Yy8qqvDjhnX3c7toUYjjALK+bug7MfR2WCRTIjw+GUMfehRi/Mbhj5rLAQerPTnTCUzSCWg==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/mockery": { + "version": "1.4.29", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", + "integrity": "sha1-m6It838H43gP/4Ux0aOOYz+UV6U=" + }, + "@types/node": { + "version": "10.17.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.59.tgz", + "integrity": "sha512-7Uc8IRrL8yZz5ti45RaFxpbU8TxlzdC3HvxV+hOWo1EyLsuKv/w7y0n+TwZzwL3vdx3oZ2k3ubxPq131hNtXyg==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.9.tgz", + "integrity": "sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ==" + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + }, + "archiver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha1-+1xq9UQ7P6akJjRHU7rSp7REqt0=", + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "azure-devops-node-api": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-8.0.0.tgz", - "integrity": "sha512-QkIzphuE3y/hZVMB6ONN0Dev5r9+CIAiopWulwoYx1Er0kYcsbXsKXKynuLSxsVPocMppbr4YPhTsX2eHY/Mjw==", - "requires": { - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.1.2.tgz", + "integrity": "sha512-0oPwjVcV1IbzSx+rcT6clhmO8bQQazU/p6haErbRwAlPf2Oh+MK277TCqo4bFNL/8HS3LR4nDrNowMSmQDh//Q==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.0", + "underscore": "1.8.3" + } }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" - } - } - }, - "azure-pipelines-tasks-utility-common": { - "version": "3.0.0-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.0.0-preview.0.tgz", - "integrity": "sha512-1MfpkIY7WzoqomufJ4lZf1j6LJiYzbTMqD5L3n90IhxORdmOnB65byYkz9OtuXfLdCmxXyQprMxNdhsLjjynYQ==", - "requires": { - "@types/node": "^10.17.0", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tool-lib": "1.0.0-preview.0", - "js-yaml": "3.6.1", - "semver": "^5.4.1" - }, - "dependencies": { - "azure-pipelines-tool-lib": { - "version": "1.0.0-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.0-preview.0.tgz", - "integrity": "sha512-Ao4A/r7q6qTTeDqa40U9/58kw5uC6r29cTJ7386uMSl7RgNu19ja+nN0Tnvl6dQTCjajMjqiT+UADuDi5zhucw==", - "requires": { - "@types/semver": "^5.3.0", - "@types/uuid": "^3.4.5", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "semver": "^5.7.0", - "semver-compare": "^1.0.0", - "typed-rest-client": "^1.7.3", - "uuid": "^3.3.2" - } + "azure-pipelines-task-lib": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", + "requires": { + "minimatch": "3.0.4", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.4", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } }, - "typed-rest-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.0.tgz", - "integrity": "sha512-Nu1MrdH6ECrRW5gHoRAdubgCs4oH6q5/J76jsEC8bVDfvVoVPkigukPalhMHPwb7ZvpsZqPptd5zpt/QdtrdBw==", - "requires": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "1.8.3" - } + "azure-pipelines-tasks-packaging-common": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.3.tgz", + "integrity": "sha512-wxLa1DzGiW4jFNu3qG9SXA7dMsCZBzMONQMtBKRgV14oQh98hzRbesbQ6r9ftYbpBBIE2akL2PcOf1vWvPLfmg==", + "requires": { + "@types/ini": "1.3.30", + "@types/ltx": "2.8.0", + "@types/mocha": "^5.2.6", + "@types/mockery": "1.4.29", + "@types/node": "^10.17.0", + "@types/q": "1.5.2", + "adm-zip": "^0.4.11", + "azure-devops-node-api": "8.0.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.1", + "ini": "^1.3.4", + "ip-address": "^5.8.9", + "ltx": "^2.6.2", + "q": "^1.5.0", + "semver": "^5.5.0", + "typed-rest-client": "1.2.0" + }, + "dependencies": { + "azure-devops-node-api": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-8.0.0.tgz", + "integrity": "sha512-QkIzphuE3y/hZVMB6ONN0Dev5r9+CIAiopWulwoYx1Er0kYcsbXsKXKynuLSxsVPocMppbr4YPhTsX2eHY/Mjw==", + "requires": { + "tunnel": "0.0.4", + "typed-rest-client": "1.2.0", + "underscore": "1.8.3" + } + }, + "tunnel": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", + "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + }, + "typed-rest-client": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", + "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", + "requires": { + "tunnel": "0.0.4", + "underscore": "1.8.3" + } + } + } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "azure-pipelines-tool-lib": { - "version": "1.0.0-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.0-preview.0.tgz", - "integrity": "sha512-Ao4A/r7q6qTTeDqa40U9/58kw5uC6r29cTJ7386uMSl7RgNu19ja+nN0Tnvl6dQTCjajMjqiT+UADuDi5zhucw==", - "requires": { - "@types/semver": "^5.3.0", - "@types/uuid": "^3.4.5", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "semver": "^5.7.0", - "semver-compare": "^1.0.0", - "typed-rest-client": "^1.7.3", - "uuid": "^3.3.2" - }, - "dependencies": { - "typed-rest-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.0.tgz", - "integrity": "sha512-Nu1MrdH6ECrRW5gHoRAdubgCs4oH6q5/J76jsEC8bVDfvVoVPkigukPalhMHPwb7ZvpsZqPptd5zpt/QdtrdBw==", - "requires": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "1.8.3" - } + "azure-pipelines-tasks-utility-common": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.0.2.tgz", + "integrity": "sha512-9L6ETcAGWrSEXBsPbbavwp3qi1WxWTbG6OeeYPyUsZsASn3HDc/QMAcmUfsyPmvteIeiIz7JN8DxGFVZlkUBbw==", + "requires": { + "@types/node": "^10.17.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.1", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + } + }, + "azure-pipelines-tool-lib": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.2.tgz", + "integrity": "sha512-0wWAqIY1n9UvcHP3AKLWIVd5fTPKaUOZJ50bNwW3NMpFlfpxZDAi8Ck9wvVm9oBdwHVYZsQy3WfK71DiBWQiHg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.4", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=" - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "^1.4.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } }, "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - } - }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "requires": { - "@types/node": "^10.0.3" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "ip-address": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-5.9.4.tgz", - "integrity": "sha512-dHkI3/YNJq4b/qQaz+c8LuarD3pY24JqZWfjB8aZx1gtpc2MDILu9L9jpZe1sHpzo/yWFweQVn+U//FhazUxmw==", - "requires": { - "jsbn": "1.1.0", - "lodash": "^4.17.15", - "sprintf-js": "1.1.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - } - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { - "has": "^1.0.3" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "ltx": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.10.0.tgz", - "integrity": "sha512-RB4zR6Mrp/0wTNS9WxMvpgfht/7u/8QAC9DpPD19opL/4OASPa28uoliFqeDkLUU8pQ4aeAfATBZmz1aSAHkMw==", - "requires": { - "inherits": "^2.0.4" - }, - "dependencies": { "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mockery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", - "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "requires": { - "asap": "~2.0.6" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "requires": { - "get-port": "^3.1.0" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - } - } - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" - }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - }, - "dependencies": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ip-address": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-5.9.4.tgz", + "integrity": "sha512-dHkI3/YNJq4b/qQaz+c8LuarD3pY24JqZWfjB8aZx1gtpc2MDILu9L9jpZe1sHpzo/yWFweQVn+U//FhazUxmw==", + "requires": { + "jsbn": "1.1.0", + "lodash": "^4.17.15", + "sprintf-js": "1.1.2" + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "ltx": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.10.0.tgz", + "integrity": "sha512-RB4zR6Mrp/0wTNS9WxMvpgfht/7u/8QAC9DpPD19opL/4OASPa28uoliFqeDkLUU8pQ4aeAfATBZmz1aSAHkMw==", + "requires": { + "inherits": "^2.0.4" + } + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "dependencies": { + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } } - } } diff --git a/Tasks/DotNetCoreCLIV2/package.json b/Tasks/DotNetCoreCLIV2/package.json index 9d8358772598..12b66fed300e 100644 --- a/Tasks/DotNetCoreCLIV2/package.json +++ b/Tasks/DotNetCoreCLIV2/package.json @@ -22,7 +22,7 @@ "@types/node": "^10.17.0", "azure-devops-node-api": "10.1.2", "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tasks-packaging-common": "^2.0.0-preview.0", + "azure-pipelines-tasks-packaging-common": "^2.0.3", "azure-pipelines-tasks-utility-common": "^3.0.0-preview.0", "uuid": "3.2.1" }, diff --git a/Tasks/DotNetCoreCLIV2/task.json b/Tasks/DotNetCoreCLIV2/task.json index 4e99876b95ea..8a7090d04634 100644 --- a/Tasks/DotNetCoreCLIV2/task.json +++ b/Tasks/DotNetCoreCLIV2/task.json @@ -17,7 +17,7 @@ "demands": [], "version": { "Major": 2, - "Minor": 181, + "Minor": 187, "Patch": 0 }, "minimumAgentVersion": "2.115.0", diff --git a/Tasks/DotNetCoreCLIV2/task.loc.json b/Tasks/DotNetCoreCLIV2/task.loc.json index f1cb4eeb668f..5d2f17fce455 100644 --- a/Tasks/DotNetCoreCLIV2/task.loc.json +++ b/Tasks/DotNetCoreCLIV2/task.loc.json @@ -17,7 +17,7 @@ "demands": [], "version": { "Major": 2, - "Minor": 181, + "Minor": 187, "Patch": 0 }, "minimumAgentVersion": "2.115.0", diff --git a/Tasks/NpmV0/package-lock.json b/Tasks/NpmV0/package-lock.json index 6e7eba90552e..7d3951bfb477 100644 --- a/Tasks/NpmV0/package-lock.json +++ b/Tasks/NpmV0/package-lock.json @@ -135,9 +135,9 @@ } }, "azure-pipelines-tasks-packaging-common": { - "version": "2.0.0-preview.1", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.0-preview.1.tgz", - "integrity": "sha512-T6TRjbYU5ahnU3gcHcL7T9dlt2ig2HtbZr9CuzjkZ9RjCanq8yTokkS4TYJ2GD50PcVK1+kYvjm+il4JQ1EI1g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.3.tgz", + "integrity": "sha512-wxLa1DzGiW4jFNu3qG9SXA7dMsCZBzMONQMtBKRgV14oQh98hzRbesbQ6r9ftYbpBBIE2akL2PcOf1vWvPLfmg==", "requires": { "@types/ini": "1.3.30", "@types/ltx": "2.8.0", @@ -147,14 +147,66 @@ "@types/q": "1.5.2", "adm-zip": "^0.4.11", "azure-devops-node-api": "8.0.0", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tool-lib": "1.0.0-preview.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.1", "ini": "^1.3.4", "ip-address": "^5.8.9", "ltx": "^2.6.2", "q": "^1.5.0", "semver": "^5.5.0", "typed-rest-client": "1.2.0" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", + "requires": { + "minimatch": "3.0.4", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.4", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tool-lib": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.2.tgz", + "integrity": "sha512-0wWAqIY1n9UvcHP3AKLWIVd5fTPKaUOZJ50bNwW3NMpFlfpxZDAi8Ck9wvVm9oBdwHVYZsQy3WfK71DiBWQiHg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.4", + "uuid": "^3.3.2" + }, + "dependencies": { + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + } } }, "azure-pipelines-tasks-utility-common": { @@ -390,9 +442,9 @@ "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "ltx": { "version": "2.10.0", @@ -520,6 +572,16 @@ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", diff --git a/Tasks/NpmV0/package.json b/Tasks/NpmV0/package.json index d02e939106c9..d80c4897a2b8 100644 --- a/Tasks/NpmV0/package.json +++ b/Tasks/NpmV0/package.json @@ -17,7 +17,7 @@ }, "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", "dependencies": { - "azure-pipelines-tasks-packaging-common": "2.0.0-preview.1", + "azure-pipelines-tasks-packaging-common": "2.0.3", "azure-pipelines-tasks-utility-common": "3.0.0-preview.0" }, "devDependencies": { diff --git a/Tasks/NpmV0/task.json b/Tasks/NpmV0/task.json index 9252b4037e08..fc2253def0b5 100644 --- a/Tasks/NpmV0/task.json +++ b/Tasks/NpmV0/task.json @@ -9,7 +9,7 @@ "author": "Microsoft Corporation", "version": { "Major": 0, - "Minor": 182, + "Minor": 187, "Patch": 0 }, "runsOn": [ diff --git a/Tasks/NpmV0/task.loc.json b/Tasks/NpmV0/task.loc.json index ed210a9540e6..dc0c3beb99a1 100644 --- a/Tasks/NpmV0/task.loc.json +++ b/Tasks/NpmV0/task.loc.json @@ -9,7 +9,7 @@ "author": "Microsoft Corporation", "version": { "Major": 0, - "Minor": 182, + "Minor": 187, "Patch": 0 }, "runsOn": [ diff --git a/Tasks/NpmV1/package-lock.json b/Tasks/NpmV1/package-lock.json index 74e0f832a446..dc1f2091927e 100644 --- a/Tasks/NpmV1/package-lock.json +++ b/Tasks/NpmV1/package-lock.json @@ -44,9 +44,9 @@ "integrity": "sha1-m6It838H43gP/4Ux0aOOYz+UV6U=" }, "@types/node": { - "version": "10.17.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.50.tgz", - "integrity": "sha512-vwX+/ija9xKc/z9VqMCdbf4WYcMTGsI0I/L/6shIF3qXURxZOhPQlPRHtjTpiNhAwn0paMJzlOQqw6mAGEQnTA==" + "version": "10.17.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.59.tgz", + "integrity": "sha512-7Uc8IRrL8yZz5ti45RaFxpbU8TxlzdC3HvxV+hOWo1EyLsuKv/w7y0n+TwZzwL3vdx3oZ2k3ubxPq131hNtXyg==" }, "@types/q": { "version": "1.5.2", @@ -54,9 +54,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" }, "@types/semver": { "version": "5.5.0", @@ -109,9 +109,9 @@ } }, "azure-pipelines-task-lib": { - "version": "3.0.6-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.0.6-preview.0.tgz", - "integrity": "sha512-Fx+7p5GzvYqVXOQI+LhPk56Pio9yBeEyypKZoPI9cQyti8WTVkmJ7YZwn9HRXurftcLumi2Xq+TC3PwnDq5U5Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -123,9 +123,9 @@ } }, "azure-pipelines-tasks-packaging-common": { - "version": "2.0.0-preview.1", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.0-preview.1.tgz", - "integrity": "sha512-T6TRjbYU5ahnU3gcHcL7T9dlt2ig2HtbZr9CuzjkZ9RjCanq8yTokkS4TYJ2GD50PcVK1+kYvjm+il4JQ1EI1g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-packaging-common/-/azure-pipelines-tasks-packaging-common-2.0.3.tgz", + "integrity": "sha512-wxLa1DzGiW4jFNu3qG9SXA7dMsCZBzMONQMtBKRgV14oQh98hzRbesbQ6r9ftYbpBBIE2akL2PcOf1vWvPLfmg==", "requires": { "@types/ini": "1.3.30", "@types/ltx": "2.8.0", @@ -135,8 +135,8 @@ "@types/q": "1.5.2", "adm-zip": "^0.4.11", "azure-devops-node-api": "8.0.0", - "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tool-lib": "1.0.0-preview.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.1", "ini": "^1.3.4", "ip-address": "^5.8.9", "ltx": "^2.6.2", @@ -155,19 +155,55 @@ "azure-pipelines-tool-lib": "1.0.0-preview.0", "js-yaml": "3.6.1", "semver": "^5.4.1" + }, + "dependencies": { + "azure-pipelines-tool-lib": { + "version": "1.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.0-preview.0.tgz", + "integrity": "sha512-Ao4A/r7q6qTTeDqa40U9/58kw5uC6r29cTJ7386uMSl7RgNu19ja+nN0Tnvl6dQTCjajMjqiT+UADuDi5zhucw==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.0.6-preview.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.7.3", + "uuid": "^3.3.2" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + } } }, "azure-pipelines-tool-lib": { - "version": "1.0.0-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.0-preview.0.tgz", - "integrity": "sha512-Ao4A/r7q6qTTeDqa40U9/58kw5uC6r29cTJ7386uMSl7RgNu19ja+nN0Tnvl6dQTCjajMjqiT+UADuDi5zhucw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.0.2.tgz", + "integrity": "sha512-0wWAqIY1n9UvcHP3AKLWIVd5fTPKaUOZJ50bNwW3NMpFlfpxZDAi8Ck9wvVm9oBdwHVYZsQy3WfK71DiBWQiHg==", "requires": { "@types/semver": "^5.3.0", "@types/uuid": "^3.4.5", - "azure-pipelines-task-lib": "^3.0.6-preview.0", + "azure-pipelines-task-lib": "^3.1.0", "semver": "^5.7.0", "semver-compare": "^1.0.0", - "typed-rest-client": "^1.7.3", + "typed-rest-client": "^1.8.4", "uuid": "^3.3.2" }, "dependencies": { @@ -177,21 +213,26 @@ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" }, "typed-rest-client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.0.tgz", - "integrity": "sha512-Nu1MrdH6ECrRW5gHoRAdubgCs4oH6q5/J76jsEC8bVDfvVoVPkigukPalhMHPwb7ZvpsZqPptd5zpt/QdtrdBw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", "requires": { "qs": "^6.9.1", "tunnel": "0.0.6", - "underscore": "1.8.3" + "underscore": "^1.12.1" } + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" } } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "brace-expansion": { "version": "1.1.11", @@ -207,6 +248,15 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -271,15 +321,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -297,6 +357,11 @@ "function-bind": "^1.1.1" } }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -351,9 +416,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } @@ -378,9 +443,9 @@ "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "ltx": { "version": "2.10.0", @@ -391,16 +456,16 @@ } }, "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.45.0" + "mime-db": "1.47.0" } }, "minimatch": { @@ -416,6 +481,11 @@ "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=" }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -458,9 +528,12 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "readable-stream": { "version": "2.3.7", @@ -485,11 +558,11 @@ } }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -518,6 +591,16 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", diff --git a/Tasks/NpmV1/package.json b/Tasks/NpmV1/package.json index 4a62e5d1cd5b..09cda867d8e3 100644 --- a/Tasks/NpmV1/package.json +++ b/Tasks/NpmV1/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", "dependencies": { "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tasks-packaging-common": "2.0.0-preview.1", + "azure-pipelines-tasks-packaging-common": "2.0.3", "ini": "^1.3.4", "mockery": "^1.7.0", "azure-pipelines-tasks-utility-common": "3.0.0-preview.0" diff --git a/Tasks/NpmV1/task.json b/Tasks/NpmV1/task.json index a389251f3946..48663db16c47 100644 --- a/Tasks/NpmV1/task.json +++ b/Tasks/NpmV1/task.json @@ -9,7 +9,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 182, + "Minor": 187, "Patch": 0 }, "runsOn": [ diff --git a/Tasks/NpmV1/task.loc.json b/Tasks/NpmV1/task.loc.json index 234096f78b92..6c8137fc9552 100644 --- a/Tasks/NpmV1/task.loc.json +++ b/Tasks/NpmV1/task.loc.json @@ -9,7 +9,7 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 182, + "Minor": 187, "Patch": 0 }, "runsOn": [ From 9cbf2fee3116fafb3a71a7fc585035893b9f7131 Mon Sep 17 00:00:00 2001 From: Anatoly Bolshakov Date: Wed, 12 May 2021 12:54:01 +0300 Subject: [PATCH 05/12] Reverted OSS dependencies update for DownloadBuildArtifactsV0 task due to breaking change in decompress-zip (#14835) * Revert "Updated OSS dependencies (#14703)" This reverts commit 392108a9a4d81b0d2f2765db1796330743fe2479. * Bumped patch version * Returned back changes for JavaToolInstaller --- Tasks/DownloadBuildArtifactsV0/package-lock.json | 12 ++++++------ Tasks/DownloadBuildArtifactsV0/package.json | 2 +- Tasks/DownloadBuildArtifactsV0/task.json | 2 +- Tasks/DownloadBuildArtifactsV0/task.loc.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Tasks/DownloadBuildArtifactsV0/package-lock.json b/Tasks/DownloadBuildArtifactsV0/package-lock.json index c6ecea01d3db..567112bc63e3 100644 --- a/Tasks/DownloadBuildArtifactsV0/package-lock.json +++ b/Tasks/DownloadBuildArtifactsV0/package-lock.json @@ -3551,9 +3551,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "decompress-zip": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.3.tgz", - "integrity": "sha512-/fy1L4s+4jujqj3kNptWjilFw3E6De8U6XUFvqmh4npN3Vsypm3oT2V0bXcmbBWS+5j5tr4okYaFrOmyZkszEg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", + "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=", "requires": { "binary": "^0.3.0", "graceful-fs": "^4.1.3", @@ -3618,9 +3618,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "has": { "version": "1.0.3", diff --git a/Tasks/DownloadBuildArtifactsV0/package.json b/Tasks/DownloadBuildArtifactsV0/package.json index 4ec26eff3ee2..5d80ba7b8509 100644 --- a/Tasks/DownloadBuildArtifactsV0/package.json +++ b/Tasks/DownloadBuildArtifactsV0/package.json @@ -22,7 +22,7 @@ "azure-pipelines-task-lib": "^3.1.0", "azure-devops-node-api": "7.2.0", "artifact-engine": "1.0.0-preview.0", - "decompress-zip": "0.3.3" + "decompress-zip": "0.3.0" }, "devDependencies": { "typescript": "4.0.2" diff --git a/Tasks/DownloadBuildArtifactsV0/task.json b/Tasks/DownloadBuildArtifactsV0/task.json index f7d1f3a7e6a1..fa49bb7030cd 100644 --- a/Tasks/DownloadBuildArtifactsV0/task.json +++ b/Tasks/DownloadBuildArtifactsV0/task.json @@ -10,7 +10,7 @@ "version": { "Major": 0, "Minor": 186, - "Patch": 2 + "Patch": 3 }, "groups": [ { diff --git a/Tasks/DownloadBuildArtifactsV0/task.loc.json b/Tasks/DownloadBuildArtifactsV0/task.loc.json index c60d4062178f..c74af05eb5eb 100644 --- a/Tasks/DownloadBuildArtifactsV0/task.loc.json +++ b/Tasks/DownloadBuildArtifactsV0/task.loc.json @@ -10,7 +10,7 @@ "version": { "Major": 0, "Minor": 186, - "Patch": 2 + "Patch": 3 }, "groups": [ { From 717d21280c3024411a1f1465781c24434639080a Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 11:48:50 -0700 Subject: [PATCH 06/12] Parse the build output and share the built image id (#14785) * Parse the build output and share the built image id * bumped task version * Modified test setup * Taking into consideration the maximum size for environment variables * Fixed IndexOutOfRangeException * Added try-catch to method getImageIdFromBuildOutput * Added testing for parsing logic * Using the functions from the containerUtils to share the build Imageid * removed redundant condition check Co-authored-by: Ajinkya <11447401+ajinkya599@users.noreply.github.com> --- Tasks/DockerV2/Tests/L0.ts | 32 +++++++++++++++++++++++++++++++ Tasks/DockerV2/Tests/TestSetup.ts | 10 ++++++++++ Tasks/DockerV2/dockerbuild.ts | 22 +++++++++++---------- Tasks/DockerV2/package-lock.json | 26 ++++++++++++------------- Tasks/DockerV2/package.json | 2 +- Tasks/DockerV2/task.json | 2 +- Tasks/DockerV2/task.loc.json | 2 +- 7 files changed, 70 insertions(+), 26 deletions(-) diff --git a/Tasks/DockerV2/Tests/L0.ts b/Tasks/DockerV2/Tests/L0.ts index 33434a526933..2cab0946499a 100644 --- a/Tasks/DockerV2/Tests/L0.ts +++ b/Tasks/DockerV2/Tests/L0.ts @@ -240,6 +240,38 @@ describe("DockerV2 Suite", function () { console.log(tr.stderr); done(); }); + + it('Docker build should store the id of the image that was built.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; + process.env[shared.TestEnvVars.repository] = "testuser/standardbuild"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=c834e0094587") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); + + it('Docker build should store the id of the image that was built with builkit.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; + process.env[shared.TestEnvVars.repository] = "testuser/buildkit"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); // // Docker build tests end // // Docker push tests begin diff --git a/Tasks/DockerV2/Tests/TestSetup.ts b/Tasks/DockerV2/Tests/TestSetup.ts index f57fd8970b21..246c38ccd97d 100644 --- a/Tasks/DockerV2/Tests/TestSetup.ts +++ b/Tasks/DockerV2/Tests/TestSetup.ts @@ -161,6 +161,16 @@ a.exec[`docker build -f ${DockerfilePath} ${shared.DockerCommandArgs.BuildLabels "stdout": "successfully built image and tagged testuser/testrepo:11." }; +a.exec[`docker build -f ${DockerfilePath} ${shared.DockerCommandArgs.BuildLabels} -t testuser/standardbuild:11 ${BuildContextPath}`] = { + "code": 0, + "stdout": "Successfully built c834e0094587\n Successfully tagged testuser/testrepo:11." +}; + +a.exec[`docker build -f ${DockerfilePath} ${shared.DockerCommandArgs.BuildLabels} -t testuser/buildkit:11 ${BuildContextPath}`] = { + "code": 0, + "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" +}; + a.exec[`docker push testuser/testrepo:11`] = { "code": 0, "stdout": "successfully pushed testuser/testrepo:11." diff --git a/Tasks/DockerV2/dockerbuild.ts b/Tasks/DockerV2/dockerbuild.ts index 01431c9ac85f..96ec4f7b0ff1 100644 --- a/Tasks/DockerV2/dockerbuild.ts +++ b/Tasks/DockerV2/dockerbuild.ts @@ -1,30 +1,28 @@ "use strict"; - -import * as fs from "fs"; -import * as path from "path"; import * as tl from "azure-pipelines-task-lib/task"; import ContainerConnection from "azure-pipelines-tasks-docker-common-v2/containerconnection"; import * as dockerCommandUtils from "azure-pipelines-tasks-docker-common-v2/dockercommandutils"; import * as fileUtils from "azure-pipelines-tasks-docker-common-v2/fileutils"; import * as pipelineUtils from "azure-pipelines-tasks-docker-common-v2/pipelineutils"; +import * as containerImageUtils from "azure-pipelines-tasks-docker-common-v2/containerimageutils"; import * as utils from "./utils"; export function run(connection: ContainerConnection, outputUpdate: (data: string) => any, isBuildAndPushCommand?: boolean): any { // find dockerfile path let dockerfilepath = tl.getInput("Dockerfile", true); let dockerFile = fileUtils.findDockerFile(dockerfilepath); - - if(!tl.exist(dockerFile)) { + + if (!tl.exist(dockerFile)) { throw new Error(tl.loc('ContainerDockerFileNotFound', dockerfilepath)); } // get command arguments // ignore the arguments input if the command is buildAndPush, as it is ambiguous let commandArguments = isBuildAndPushCommand ? "" : dockerCommandUtils.getCommandArguments(tl.getInput("arguments", false)); - + // get qualified image names by combining container registry(s) and repository let repositoryName = tl.getInput("repository"); - let imageNames: string[] = []; + let imageNames: string[] = []; // if container registry is provided, use that // else, use the currently logged in registries if (tl.getInput("containerRegistry")) { @@ -51,8 +49,7 @@ export function run(connection: ContainerConnection, outputUpdate: (data: string imageNames.forEach(imageName => { if (tags && tags.length > 0) { tags.forEach(tag => { - if(tag) - { + if (tag) { tagArguments.push(imageName + ":" + tag); } }); @@ -71,5 +68,10 @@ export function run(connection: ContainerConnection, outputUpdate: (data: string return dockerCommandUtils.build(connection, dockerFile, commandArguments, labelArguments, tagArguments, (data) => output += data).then(() => { let taskOutputPath = utils.writeTaskOutput("build", output); outputUpdate(taskOutputPath); + + const builtImageId = containerImageUtils.getImageIdFromBuildOutput(output); + if (builtImageId) { + containerImageUtils.shareBuiltImageId(builtImageId); + } }); -} +} \ No newline at end of file diff --git a/Tasks/DockerV2/package-lock.json b/Tasks/DockerV2/package-lock.json index e4d550c9d678..a53704063340 100644 --- a/Tasks/DockerV2/package-lock.json +++ b/Tasks/DockerV2/package-lock.json @@ -124,15 +124,15 @@ } }, "azure-pipelines-tasks-docker-common-v2": { - "version": "2.0.1-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.1-preview.0.tgz", - "integrity": "sha512-3hZQQdxY6DJEuM+vXq/UKX13XtPQv4HlTRZ39Ghw/+Q2aTLEFOvrLAYvMM+wS3YHG1ZUT0MXFJpHUlSITvmStg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.4.tgz", + "integrity": "sha512-wVio7xu7oPmkVcwlUmKby79MyCwmN0ookddLdwMI0RyWU/XR3LXALGYWSYf9x+ggr2OxJIzikJRV2wfPx9XCzw==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.5.4", "@types/uuid": "^8.3.0", - "azure-pipelines-task-lib": "3.0.6-preview.0", + "azure-pipelines-task-lib": "^3.1.0", "del": "2.2.0", "q": "1.4.1" }, @@ -143,9 +143,9 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "azure-pipelines-task-lib": { - "version": "3.0.6-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.0.6-preview.0.tgz", - "integrity": "sha512-Fx+7p5GzvYqVXOQI+LhPk56Pio9yBeEyypKZoPI9cQyti8WTVkmJ7YZwn9HRXurftcLumi2Xq+TC3PwnDq5U5Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -164,9 +164,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -213,9 +213,9 @@ "integrity": "sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ==" }, "azure-pipelines-task-lib": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-2.12.0.tgz", - "integrity": "sha512-Q1buvNUxrbW2QQ5FWzspyRxWxjtSMMt0x+yMhMncrrvxSKK0wBIAJgMlzBqlR1mUF6ChL1f0BxNtgtR6sp4MlA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-2.12.2.tgz", + "integrity": "sha512-ofAdVZcL90Qv6zYcKa1vK3Wnrl2kxoKX/Idvb7RWrqHQzcJlAEjCU4UCB5y6NnSKqRSyVTIhdS6hChphpOaiMQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", diff --git a/Tasks/DockerV2/package.json b/Tasks/DockerV2/package.json index b9eaf0bf4fdd..78150ea267ae 100644 --- a/Tasks/DockerV2/package.json +++ b/Tasks/DockerV2/package.json @@ -5,7 +5,7 @@ "@types/q": "^1.5.0", "@types/uuid": "^8.3.0", "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tasks-docker-common-v2": "2.0.1-preview.0", + "azure-pipelines-tasks-docker-common-v2": "2.0.4", "del": "2.2.0", "esprima": "2.7.1", "js-yaml": "3.6.1", diff --git a/Tasks/DockerV2/task.json b/Tasks/DockerV2/task.json index 5208ae22c35d..785c12ab12de 100644 --- a/Tasks/DockerV2/task.json +++ b/Tasks/DockerV2/task.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 185, + "Minor": 187, "Patch": 0 }, "minimumAgentVersion": "2.172.0", diff --git a/Tasks/DockerV2/task.loc.json b/Tasks/DockerV2/task.loc.json index 110a54a87f33..5da51562f4e5 100644 --- a/Tasks/DockerV2/task.loc.json +++ b/Tasks/DockerV2/task.loc.json @@ -13,7 +13,7 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 185, + "Minor": 187, "Patch": 0 }, "minimumAgentVersion": "2.172.0", From 7b9419323fdbed8dd739ff9bb2f1731bf8d4b79b Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 12:03:22 -0700 Subject: [PATCH 07/12] share the image id that was built V1 (#14834) * share the image id that was built * Condition simplified Co-authored-by: Ajinkya <11447401+ajinkya599@users.noreply.github.com> --- Tasks/DockerV1/Tests/L0.ts | 30 ++++++++++++++++++++++++++++++ Tasks/DockerV1/Tests/TestSetup.ts | 9 ++++++++- Tasks/DockerV1/containerbuild.ts | 15 ++++++++++----- Tasks/DockerV1/npm-shrinkwrap.json | 29 +++++++++++++++++++++++++---- Tasks/DockerV1/package.json | 2 +- Tasks/DockerV1/task.json | 2 +- Tasks/DockerV1/task.loc.json | 2 +- 7 files changed, 76 insertions(+), 13 deletions(-) diff --git a/Tasks/DockerV1/Tests/L0.ts b/Tasks/DockerV1/Tests/L0.ts index 8fc7f64bf243..4cf4a8caf39e 100644 --- a/Tasks/DockerV1/Tests/L0.ts +++ b/Tasks/DockerV1/Tests/L0.ts @@ -394,4 +394,34 @@ describe('Docker Suite', function() { console.log(tr.stderr); done(); }); + + it('Docker build should store the id of the image that was built.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/standardbuild:11"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=c834e0094587") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); + + it('Docker build should store the id of the image that was built with builkit.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/buildkit:11"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); }); diff --git a/Tasks/DockerV1/Tests/TestSetup.ts b/Tasks/DockerV1/Tests/TestSetup.ts index 44f92bf8321d..589c8e168000 100644 --- a/Tasks/DockerV1/Tests/TestSetup.ts +++ b/Tasks/DockerV1/Tests/TestSetup.ts @@ -153,7 +153,14 @@ a.exec[`docker images`] = { "code": 0, "stdout": "Listed images successfully." }; - +a.exec[`docker build -f ${DockerFilePath} -t testuser/standardbuild:11`] = { + "code": 0, + "stdout": "Successfully built c834e0094587\n Successfully tagged testuser/testrepo:11." +}; +a.exec[`docker build -f ${DockerFilePath} -t testuser/buildkit:11`] = { + "code": 0, + "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" +}; tr.setAnswers(a); // Create mock for fs module diff --git a/Tasks/DockerV1/containerbuild.ts b/Tasks/DockerV1/containerbuild.ts index 5e8f5b50a3aa..5fe775be5d70 100644 --- a/Tasks/DockerV1/containerbuild.ts +++ b/Tasks/DockerV1/containerbuild.ts @@ -16,23 +16,23 @@ export function run(connection: ContainerConnection): any { var dockerfilepath = tl.getInput("dockerFile", true); let dockerFile = fileUtils.findDockerFile(dockerfilepath); - - if(!tl.exist(dockerFile)) { + + if (!tl.exist(dockerFile)) { throw new Error(tl.loc('ContainerDockerFileNotFound', dockerfilepath)); } command.arg(["-f", dockerFile]); var addDefaultLabels = tl.getBoolInput("addDefaultLabels"); - if (addDefaultLabels) { + if (addDefaultLabels) { pipelineUtils.addDefaultLabelArgs(command); } var commandArguments = dockerCommandUtils.getCommandArguments(tl.getInput("arguments", false)); command.line(commandArguments); - - var imageName = utils.getImageName(); + + var imageName = utils.getImageName(); var qualifyImageName = tl.getBoolInput("qualifyImageName"); if (qualifyImageName) { imageName = connection.getQualifiedImageNameIfRequired(imageName); @@ -75,5 +75,10 @@ export function run(connection: ContainerConnection): any { return connection.execCommand(command).then(() => { let taskOutputPath = utils.writeTaskOutput("build", output); tl.setVariable("DockerOutputPath", taskOutputPath); + + const builtImageId = imageUtils.getImageIdFromBuildOutput(output); + if (builtImageId) { + imageUtils.shareBuiltImageId(builtImageId); + } }); } diff --git a/Tasks/DockerV1/npm-shrinkwrap.json b/Tasks/DockerV1/npm-shrinkwrap.json index 85bbef2ae62f..147be4c3dee7 100644 --- a/Tasks/DockerV1/npm-shrinkwrap.json +++ b/Tasks/DockerV1/npm-shrinkwrap.json @@ -101,15 +101,15 @@ } }, "azure-pipelines-tasks-docker-common-v2": { - "version": "2.0.1-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.1-preview.0.tgz", - "integrity": "sha512-3hZQQdxY6DJEuM+vXq/UKX13XtPQv4HlTRZ39Ghw/+Q2aTLEFOvrLAYvMM+wS3YHG1ZUT0MXFJpHUlSITvmStg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.4.tgz", + "integrity": "sha512-wVio7xu7oPmkVcwlUmKby79MyCwmN0ookddLdwMI0RyWU/XR3LXALGYWSYf9x+ggr2OxJIzikJRV2wfPx9XCzw==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.5.4", "@types/uuid": "^8.3.0", - "azure-pipelines-task-lib": "3.0.6-preview.0", + "azure-pipelines-task-lib": "^3.1.0", "del": "2.2.0", "q": "1.4.1" }, @@ -118,6 +118,27 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "azure-pipelines-task-lib": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", + "requires": { + "minimatch": "3.0.4", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.4", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } + } } } }, diff --git a/Tasks/DockerV1/package.json b/Tasks/DockerV1/package.json index db0e65371f1b..07a67fccece9 100644 --- a/Tasks/DockerV1/package.json +++ b/Tasks/DockerV1/package.json @@ -5,7 +5,7 @@ "@types/q": "^1.5.0", "del": "2.2.0", "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tasks-docker-common-v2": "2.0.1-preview.0", + "azure-pipelines-tasks-docker-common-v2": "2.0.4", "esprima": "2.7.1", "js-yaml": "3.6.1" }, diff --git a/Tasks/DockerV1/task.json b/Tasks/DockerV1/task.json index 4cab90d8a90f..e6aea3715351 100644 --- a/Tasks/DockerV1/task.json +++ b/Tasks/DockerV1/task.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 187, - "Patch": 0 + "Patch": 1 }, "demands": [], "releaseNotes": "Simplified the task by:
 - Providing an option to simply select or type a command.
 - Retaining the useful input fields and providing an option to pass the rest as an argument to the command.", diff --git a/Tasks/DockerV1/task.loc.json b/Tasks/DockerV1/task.loc.json index 745da36af2ca..c27d39463584 100644 --- a/Tasks/DockerV1/task.loc.json +++ b/Tasks/DockerV1/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 187, - "Patch": 0 + "Patch": 1 }, "demands": [], "releaseNotes": "ms-resource:loc.releaseNotes", From d93c2bad3a3699ec09f20d9d60d08b7846ac4a44 Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 12:10:50 -0700 Subject: [PATCH 08/12] Sharing the image id that was built V0 (#14833) * Sharing the image id that was built * Bumped version * Updating the version in loc file and updating condition Co-authored-by: Ajinkya <11447401+ajinkya599@users.noreply.github.com> --- Tasks/DockerV0/Tests/L0.ts | 30 ++++++++++++++++++++++++++++++ Tasks/DockerV0/Tests/TestSetup.ts | 8 ++++++++ Tasks/DockerV0/containerbuild.ts | 5 +++++ Tasks/DockerV0/npm-shrinkwrap.json | 29 +++++++++++++++++++++++++---- Tasks/DockerV0/package.json | 2 +- Tasks/DockerV0/task.json | 2 +- Tasks/DockerV0/task.loc.json | 2 +- 7 files changed, 71 insertions(+), 7 deletions(-) diff --git a/Tasks/DockerV0/Tests/L0.ts b/Tasks/DockerV0/Tests/L0.ts index c458a6600c47..32b6f605d917 100644 --- a/Tasks/DockerV0/Tests/L0.ts +++ b/Tasks/DockerV0/Tests/L0.ts @@ -250,4 +250,34 @@ describe('Docker Suite', function() { console.log(tr.stderr); done(); }); + + it('Docker build should store the id of the image that was built.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/standardbuild:11"; + process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=c834e0094587") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); + + it('Docker build should store the id of the image that was built with builkit.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/buildkit:11"; + process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); }); diff --git a/Tasks/DockerV0/Tests/TestSetup.ts b/Tasks/DockerV0/Tests/TestSetup.ts index 7aa20cf7c58c..63020a251789 100644 --- a/Tasks/DockerV0/Tests/TestSetup.ts +++ b/Tasks/DockerV0/Tests/TestSetup.ts @@ -115,7 +115,15 @@ a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test:6`] = { "code": 0, "stdout": "successfully build test/test:2 and test/test:6 image" }; +a.exec[`docker build -f ${DockerFilePath} -t testuser/standardbuild:11`] = { + "code": 0, + "stdout": "Successfully built c834e0094587\n Successfully tagged testuser/testrepo:11." +}; +a.exec[`docker build -f ${DockerFilePath} -t testuser/buildkit:11`] = { + "code": 0, + "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" +}; tr.setAnswers(a); // Create mock for fs module diff --git a/Tasks/DockerV0/containerbuild.ts b/Tasks/DockerV0/containerbuild.ts index 860e9897d33f..5e151c23f697 100644 --- a/Tasks/DockerV0/containerbuild.ts +++ b/Tasks/DockerV0/containerbuild.ts @@ -72,5 +72,10 @@ export function run(connection: ContainerConnection): any { return connection.execCommand(command).then(() => { let taskOutputPath = utils.writeTaskOutput("build", output); tl.setVariable("DockerOutputPath", taskOutputPath); + + const builtImageId = imageUtils.getImageIdFromBuildOutput(output); + if (builtImageId) { + imageUtils.shareBuiltImageId(builtImageId); + } }); } diff --git a/Tasks/DockerV0/npm-shrinkwrap.json b/Tasks/DockerV0/npm-shrinkwrap.json index 85bbef2ae62f..147be4c3dee7 100644 --- a/Tasks/DockerV0/npm-shrinkwrap.json +++ b/Tasks/DockerV0/npm-shrinkwrap.json @@ -101,15 +101,15 @@ } }, "azure-pipelines-tasks-docker-common-v2": { - "version": "2.0.1-preview.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.1-preview.0.tgz", - "integrity": "sha512-3hZQQdxY6DJEuM+vXq/UKX13XtPQv4HlTRZ39Ghw/+Q2aTLEFOvrLAYvMM+wS3YHG1ZUT0MXFJpHUlSITvmStg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common-v2/-/azure-pipelines-tasks-docker-common-v2-2.0.4.tgz", + "integrity": "sha512-wVio7xu7oPmkVcwlUmKby79MyCwmN0ookddLdwMI0RyWU/XR3LXALGYWSYf9x+ggr2OxJIzikJRV2wfPx9XCzw==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.5.4", "@types/uuid": "^8.3.0", - "azure-pipelines-task-lib": "3.0.6-preview.0", + "azure-pipelines-task-lib": "^3.1.0", "del": "2.2.0", "q": "1.4.1" }, @@ -118,6 +118,27 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "azure-pipelines-task-lib": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", + "requires": { + "minimatch": "3.0.4", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.4", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } + } } } }, diff --git a/Tasks/DockerV0/package.json b/Tasks/DockerV0/package.json index 5050b549fced..1f314b0c7350 100644 --- a/Tasks/DockerV0/package.json +++ b/Tasks/DockerV0/package.json @@ -6,7 +6,7 @@ "@types/uuid": "^8.3.0", "del": "2.2.0", "azure-pipelines-task-lib": "^3.0.6-preview.0", - "azure-pipelines-tasks-docker-common-v2": "2.0.1-preview.0", + "azure-pipelines-tasks-docker-common-v2": "2.0.4", "esprima": "2.7.1", "js-yaml": "3.6.1" }, diff --git a/Tasks/DockerV0/task.json b/Tasks/DockerV0/task.json index 3c7ee497aaa0..c2156913d91d 100644 --- a/Tasks/DockerV0/task.json +++ b/Tasks/DockerV0/task.json @@ -14,7 +14,7 @@ "version": { "Major": 0, "Minor": 187, - "Patch": 0 + "Patch": 1 }, "demands": [], "preview": "false", diff --git a/Tasks/DockerV0/task.loc.json b/Tasks/DockerV0/task.loc.json index 533c15ed33af..949ac76db0ae 100644 --- a/Tasks/DockerV0/task.loc.json +++ b/Tasks/DockerV0/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 0, "Minor": 187, - "Patch": 0 + "Patch": 1 }, "demands": [], "preview": "false", From 99708354ad0a6e5204757eda14f100cd73057ce8 Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 14:17:13 -0700 Subject: [PATCH 09/12] Annotate base image info in docker v1 (#14791) * Annotate base image info in docker v1 * Using functionality in pipeline utils to annotate base image info * Added input variable addBaseImageData * change where we add the base image labels * Fixing build * updating merged tests --- .../resources.resjson/en-US/resources.resjson | 2 + Tasks/DockerV1/Tests/L0.ts | 49 ++++++++++++++---- Tasks/DockerV1/Tests/TestSetup.ts | 50 ++++++++++++++----- Tasks/DockerV1/Tests/TestShared.ts | 14 +++++- Tasks/DockerV1/containerbuild.ts | 8 +++ Tasks/DockerV1/task.json | 8 +++ Tasks/DockerV1/task.loc.json | 8 +++ 7 files changed, 116 insertions(+), 23 deletions(-) diff --git a/Tasks/DockerV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/DockerV1/Strings/resources.resjson/en-US/resources.resjson index 039d6c505d66..461e71e6d4d2 100644 --- a/Tasks/DockerV1/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/DockerV1/Strings/resources.resjson/en-US/resources.resjson @@ -9,6 +9,8 @@ "loc.group.displayName.advanced": "Advanced Options", "loc.input.label.containerregistrytype": "Container registry type", "loc.input.help.containerregistrytype": "Select 'Azure Container Registry' to connect to it by using an Azure Service Connection. Select 'Container registry' to connect to Docker Hub or any other private container registry.", + "loc.input.label.addBaseImageData": "Add base image metadata to image(s)", + "loc.input.help.addBaseImageData": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input.", "loc.input.label.dockerRegistryEndpoint": "Docker registry service connection", "loc.input.help.dockerRegistryEndpoint": "Select a Docker registry service connection. Required for commands that need to authenticate with a registry.", "loc.input.label.azureSubscriptionEndpoint": "Azure subscription", diff --git a/Tasks/DockerV1/Tests/L0.ts b/Tasks/DockerV1/Tests/L0.ts index 4cf4a8caf39e..c9f19b840c47 100644 --- a/Tasks/DockerV1/Tests/L0.ts +++ b/Tasks/DockerV1/Tests/L0.ts @@ -24,6 +24,7 @@ describe('Docker Suite', function() { delete process.env[shared.TestEnvVars.tagMultipleImages]; delete process.env[shared.TestEnvVars.arguments]; delete process.env[shared.TestEnvVars.qualifySourceImageName]; + delete process.env[shared.TestEnvVars.addBaseImageData]; }); after(function () { }); @@ -32,12 +33,13 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -47,12 +49,13 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.memoryLimit] = "2GB"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2 -m 2GB`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2 -m 2GB`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -63,12 +66,13 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.imageName] = 'test/Te st:2'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'true'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -79,6 +83,7 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.imageName] = 'test/Te st:2'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'false'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -95,12 +100,13 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.imageName] = 'test/Test:2'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'true'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -111,12 +117,13 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.includeLatestTag] = "true"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2 -t test/test`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2 -t test/test`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -126,12 +133,13 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.arguments] = "-t test:testtag"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test:testtag -t test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test:testtag -t test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -141,12 +149,13 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.arguments] = "-t test:tag1\n-t test:tag2\n-t test:tag3"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test:tag1 -t test:tag2 -t test:tag3 -t test/test:2`) != -1, "docker build should run with correct arguments"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test:tag1 -t test:tag2 -t test:tag3 -t test/test:2`) != -1, "docker build should run with correct arguments"); console.log(tr.stderr); done(); }); @@ -354,13 +363,14 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; process.env[shared.TestEnvVars.containerType] = shared.ContainerTypes.AzureContainerRegistry; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -371,6 +381,7 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; process.env[shared.TestEnvVars.containerType] = shared.ContainerTypes.AzureContainerRegistry; process.env[shared.TestEnvVars.qualifyImageName] = "true"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); //console.log(tr.stdout); @@ -378,7 +389,7 @@ describe('Docker Suite', function() { assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t ajgtestacr1.azurecr.io/test/test:2`) != -1, "docker build should run"); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} -t ajgtestacr1.azurecr.io/test/test:2`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); @@ -387,6 +398,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.succeeded, 'task should have succeeded'); @@ -399,6 +411,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.imageName] = "testuser/standardbuild:11"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -414,13 +427,29 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.imageName] = "testuser/buildkit:11"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); - assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id.") + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id."); + console.log(tr.stderr); + done(); + }); + + it('Docker build should add labels with base image info', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/imagewithannotations:11"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have invoked tool three time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} ${shared.DockerCommandArgs.BuildLabels} --label ${shared.BaseImageLabels.name} --label ${shared.BaseImageLabels.digest} -t testuser/imagewithannotations:11`) != -1, "docker build should run"); console.log(tr.stderr); done(); }); diff --git a/Tasks/DockerV1/Tests/TestSetup.ts b/Tasks/DockerV1/Tests/TestSetup.ts index 589c8e168000..6a06d9feff27 100644 --- a/Tasks/DockerV1/Tests/TestSetup.ts +++ b/Tasks/DockerV1/Tests/TestSetup.ts @@ -6,6 +6,7 @@ import * as shared from './TestShared'; const DefaultWorkingDirectory: string = shared.formatPath("a/w"); const ImageNamesPath = shared.formatPath("dir/image_names.txt"); const DockerFilePath = shared.formatPath('dir1/DockerFile'); +const Dockerfile: string = `FROM ubuntu\nCMD ["echo","Hello World!"]` let taskPath = path.join(__dirname, '..', 'container.js'); let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); @@ -26,12 +27,14 @@ tr.setInput('memoryLimit', process.env[shared.TestEnvVars.memoryLimit] || ''); tr.setInput('pushMultipleImages', process.env[shared.TestEnvVars.pushMultipleImages] || "false"); tr.setInput('tagMultipleImages', process.env[shared.TestEnvVars.tagMultipleImages] || "false"); tr.setInput('arguments', process.env[shared.TestEnvVars.arguments] || ''); +tr.setInput ('addBaseImageData', process.env[shared.TestEnvVars.addBaseImageData] || "true"); console.log("Inputs have been set"); +process.env["SYSTEM_HOSTTYPE"] = "__hostType__"; process.env["RELEASE_RELEASENAME"] = "Release-1"; process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = DefaultWorkingDirectory; -process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = shared.teamFoundationCollectionURI; process.env["SYSTEM_SERVERTYPE"] = "hosted"; process.env["ENDPOINT_AUTH_dockerhubendpoint"] = "{\"parameters\":{\"username\":\"test\", \"password\":\"regpassword\", \"email\":\"test@microsoft.com\",\"registry\":\"https://index.docker.io/v1/\"},\"scheme\":\"UsernamePassword\"}"; process.env["ENDPOINT_AUTH_SCHEME_AzureRMSpn"] = "ServicePrincipal"; @@ -78,27 +81,27 @@ let a = { // Add extra answer definitions that need to be dynamically generated a.exist[DockerFilePath] = true; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2`] = { "code": 0, "stdout": "successfully build test/test:2 image" }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -m 2GB`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2 -m 2GB`] = { "code": 0, "stdout": "successfully build test/test:2 image" }; -a.exec[`docker build -f ${DockerFilePath} -t test/Te st:2`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test/Te st:2`] = { "code": 1, "stdout": "test/Te st:2 not valid imagename" }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2 -t test/test`] = { "code": 0, "stdout": "successfully build test/test image with latest tag" }; -a.exec[`docker build -f ${DockerFilePath} -t ajgtestacr1.azurecr.io/test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t ajgtestacr1.azurecr.io/test/test:2`] = { "code": 0, "stdout": "successfully build ajgtestacr1.azurecr.io/test/test image with latest tag" }; -a.exec[`docker build -f ${DockerFilePath} -t ${shared.ImageNamesFileImageName}`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t ${shared.ImageNamesFileImageName}`] = { "code": 0 }; a.exec[`docker tag test/test:2 ajgtestacr1.azurecr.io/test/test:2`] = { @@ -122,15 +125,15 @@ a.exec[`docker run --rm ${shared.ImageNamesFileImageName}`] = { a.exec[`docker push ${shared.ImageNamesFileImageName}`] = { "code": 0 }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test:6`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test/test:2 -t test/test:6`] = { "code": 0, "stdout": "successfully build test/test:2 and test/test:6 image" }; -a.exec[`docker build -f ${DockerFilePath} -t test:testtag -t test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test:testtag -t test/test:2`] = { "code": 0, "stdout": "successfully build test/test:2 and -t test:testtag image" }; -a.exec[`docker build -f ${DockerFilePath} -t test:tag1 -t test:tag2 -t test:tag3 -t test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t test:tag1 -t test:tag2 -t test:tag3 -t test/test:2`] = { "code": 0, "stdout": "successfully built and tagged test/test:2, test:tag1, test:tag2 and test:tag3" }; @@ -153,14 +156,35 @@ a.exec[`docker images`] = { "code": 0, "stdout": "Listed images successfully." }; -a.exec[`docker build -f ${DockerFilePath} -t testuser/standardbuild:11`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t testuser/standardbuild:11`] = { "code": 0, "stdout": "Successfully built c834e0094587\n Successfully tagged testuser/testrepo:11." }; -a.exec[`docker build -f ${DockerFilePath} -t testuser/buildkit:11`] = { +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} -t testuser/buildkit:11`] = { "code": 0, "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" }; +a.exec[`docker build -f ${DockerFilePath} ${shared.DockerCommandArgs.BuildLabels} --label ${shared.BaseImageLabels.name} --label ${shared.BaseImageLabels.digest} -t testuser/imagewithannotations:11`] = { + "code": 0, + "stdout": "successfully built image and tagged testuser/imagewithannotations:11." +}; +a.exec[`docker pull ${shared.BaseImageName}`] = { + "code":0, + "stdout": "Pull complete" +}; +a.exec[`docker inspect ${shared.BaseImageName}`] = { + "code":0, + "stdout": `[{ + "Id": "sha256:302aba9ce190db9e247d710f4794cc303b169035de2048e76b82c9edbddbef4e", + "RepoTags": [ + "alpine:latest" + ], + "RepoDigests": [ + "ubuntu@sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" + ] + }]` +}; + tr.setAnswers(a); // Create mock for fs module @@ -170,6 +194,8 @@ fsClone.readFileSync = function(filePath, options) { switch (filePath) { case ImageNamesPath: return shared.ImageNamesFileImageName; + case DockerFilePath: + return Dockerfile; default: return fs.readFileSync(filePath, options); } diff --git a/Tasks/DockerV1/Tests/TestShared.ts b/Tasks/DockerV1/Tests/TestShared.ts index 378beefa1fda..cb569d468336 100644 --- a/Tasks/DockerV1/Tests/TestShared.ts +++ b/Tasks/DockerV1/Tests/TestShared.ts @@ -12,7 +12,8 @@ export let TestEnvVars = { pushMultipleImages: "__pushMultipleImages__", tagMultipleImages: "__tagMultipleImages__", arguments: "__arguments__", - qualifySourceImageName: "__qualifySourceImageName__" + qualifySourceImageName: "__qualifySourceImageName__", + addBaseImageData: "addBaseImageData" }; export let OperatingSystems = { @@ -34,6 +35,17 @@ export let ContainerTypes = { export let ImageNamesFileImageName = "test_image"; +export let BaseImageName = "ubuntu"; +export let BaseImageLabels = { + name:"image.base.ref.name=ubuntu", + digest:"image.base.digest=sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" +}; + +export let teamFoundationCollectionURI = "https://abc.visualstudio.com/"; + +export let DockerCommandArgs = { + BuildLabels: `--label com.visualstudio.abc.image.system.teamfoundationcollectionuri=${teamFoundationCollectionURI}`, +} /** * Formats the given path to be appropriate for the operating system. * @param canonicalPath A non-rooted path using a forward slash (/) as a directory separator. diff --git a/Tasks/DockerV1/containerbuild.ts b/Tasks/DockerV1/containerbuild.ts index 5fe775be5d70..1375767d2e01 100644 --- a/Tasks/DockerV1/containerbuild.ts +++ b/Tasks/DockerV1/containerbuild.ts @@ -1,5 +1,6 @@ "use strict"; +import * as fs from "fs"; import * as path from "path"; import * as tl from "azure-pipelines-task-lib/task"; import * as dockerCommandUtils from "azure-pipelines-tasks-docker-common-v2/dockercommandutils"; @@ -28,6 +29,13 @@ export function run(connection: ContainerConnection): any { pipelineUtils.addDefaultLabelArgs(command); } + const addBaseImageInfo = tl.getBoolInput("addBaseImageData"); + const labelsArgument = pipelineUtils.getDefaultLabels(false, addBaseImageInfo, dockerFile, connection); + + labelsArgument.forEach(label => { + command.arg(["--label", label]); + }); + var commandArguments = dockerCommandUtils.getCommandArguments(tl.getInput("arguments", false)); command.line(commandArguments); diff --git a/Tasks/DockerV1/task.json b/Tasks/DockerV1/task.json index e6aea3715351..b4ed276190f5 100644 --- a/Tasks/DockerV1/task.json +++ b/Tasks/DockerV1/task.json @@ -51,6 +51,14 @@ "groupName": "containerRegistry", "helpMarkDown": "Select 'Azure Container Registry' to connect to it by using an Azure Service Connection. Select 'Container registry' to connect to Docker Hub or any other private container registry." }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "Add base image metadata to image(s)", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input." + }, { "name": "dockerRegistryEndpoint", "type": "connectedService:dockerregistry", diff --git a/Tasks/DockerV1/task.loc.json b/Tasks/DockerV1/task.loc.json index c27d39463584..6a281ce25ab5 100644 --- a/Tasks/DockerV1/task.loc.json +++ b/Tasks/DockerV1/task.loc.json @@ -51,6 +51,14 @@ "groupName": "containerRegistry", "helpMarkDown": "ms-resource:loc.input.help.containerregistrytype" }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "ms-resource:loc.input.label.addBaseImageData", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.addBaseImageData" + }, { "name": "dockerRegistryEndpoint", "type": "connectedService:dockerregistry", From 13ee7c2fa7896a326fe26cd4ef4d06a746a6d27e Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 21:59:24 -0700 Subject: [PATCH 10/12] Annotate base image info DockerV2 (#14695) * Added base image name label * Implemented the digest annotation * Mocked base image name label * Fixed condition that test that there is only 1 digest * Addapted tests to take into account the calls to pull and inspect commands * Added support for multi-stage builds * Exclude base image name if the name has arguments * Reverted changes in the containerimageutils.ts file * Update label names * Added env variable to deactivate the labels * Add tests to validate that the env variable work * Removed comment This is no longer a concern * Simplifying test * Adding underscores to addBaseImage variable * Setting the addBaseImageData as an input variable instead of an env variable. * Avoid failure when running inspect command * Added missing semicolons * Fixing typo * Rename ImageAnnotation to BaseImageAnnotation * Using the implmentation of the common packages to annotate the base image info * Added test for multistage builds * Updating tests after merge --- .../resources.resjson/en-US/resources.resjson | 2 + Tasks/DockerV2/Tests/L0.ts | 52 ++++++++++++++ Tasks/DockerV2/Tests/TestSetup.ts | 37 +++++++++- Tasks/DockerV2/Tests/TestShared.ts | 8 ++- Tasks/DockerV2/dockerbuild.ts | 68 ++++++++++++++++++- Tasks/DockerV2/task.json | 8 +++ Tasks/DockerV2/task.loc.json | 8 +++ 7 files changed, 179 insertions(+), 4 deletions(-) diff --git a/Tasks/DockerV2/Strings/resources.resjson/en-US/resources.resjson b/Tasks/DockerV2/Strings/resources.resjson/en-US/resources.resjson index 4041baf7acc9..f4b513cdee71 100644 --- a/Tasks/DockerV2/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/DockerV2/Strings/resources.resjson/en-US/resources.resjson @@ -22,6 +22,8 @@ "loc.input.help.arguments": "Docker command options. Ex:
For build command,
--build-arg HTTP_PROXY=http://10.20.30.2:1234 --quiet", "loc.input.label.addPipelineData": "Add Pipeline metadata to image(s)", "loc.input.help.addPipelineData": "By default pipeline data like source branch name, build id are added which helps with traceability. For example you can inspect an image to find out which pipeline built the image. You can opt out of this default behavior by using this input.", + "loc.input.label.addBaseImageData": "Add base image metadata to image(s)", + "loc.input.help.addBaseImageData": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input.", "loc.input.label.container": "Container", "loc.input.help.container": "Name of the container. For use with start and stop commands.", "loc.messages.AddingNewAuthToExistingConfig": "Adding auth data for registry to Docker config file. Registry: %s.", diff --git a/Tasks/DockerV2/Tests/L0.ts b/Tasks/DockerV2/Tests/L0.ts index 2cab0946499a..465cb8baf148 100644 --- a/Tasks/DockerV2/Tests/L0.ts +++ b/Tasks/DockerV2/Tests/L0.ts @@ -28,6 +28,7 @@ describe("DockerV2 Suite", function () { delete process.env[shared.TestEnvVars.tags]; delete process.env[shared.TestEnvVars.arguments]; delete process.env[shared.TestEnvVars.addPipelineData]; + delete process.env[shared.TestEnvVars.addBaseImageData]; }); after(function () { @@ -51,6 +52,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -68,6 +70,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.hostType] = shared.HostTypes.release; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -84,6 +87,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "acrendpoint"; process.env[shared.TestEnvVars.repository] = "testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -100,6 +104,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "acrendpoint2"; process.env[shared.TestEnvVars.repository] = "testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -115,6 +120,7 @@ describe("DockerV2 Suite", function () { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -129,6 +135,7 @@ describe("DockerV2 Suite", function () { it('Runs successfully for docker build without containerRegistry and repository inputs', (done:Mocha.Done) => { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -146,6 +153,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.dockerFile] = shared.formatPath("a/w/meta/Dockerfile"); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -163,6 +171,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.buildContext] = shared.formatPath("a/w/context"); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -180,6 +189,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.tags] = "tag1,tag2\ntag3"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -197,6 +207,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.arguments] = "--rm --queit"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -214,6 +225,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; process.env[shared.TestEnvVars.arguments] = "--rm\n--queit"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -230,6 +242,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; process.env[shared.TestEnvVars.repository] = "Test User/TEST repo"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -246,6 +259,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; process.env[shared.TestEnvVars.repository] = "testuser/standardbuild"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -262,6 +276,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; process.env[shared.TestEnvVars.repository] = "testuser/buildkit"; process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -272,6 +287,38 @@ describe("DockerV2 Suite", function () { console.log(tr.stderr); done(); }); + + it('Docker build should add labels with base image info', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.repository] = "testuser/imagewithannotations"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have invoked tool three times. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("a/w/Dockerfile")} ${shared.DockerCommandArgs.BuildLabelsWithImageAnnotation} -t testuser/imagewithannotations:11 ${shared.formatPath("a/w")}`) != -1, "docker build should run with expected arguments"); + console.log(tr.stderr); + done(); + }); + + it('Docker build should add labels with base image info for multistage builds', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.repository] = "testuser/dockermultistage"; + process.env[shared.TestEnvVars.command] = shared.CommandTypes.build; + process.env[shared.TestEnvVars.dockerFile] = shared.formatPath("a/w/multistage/Dockerfile"); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have invoked tool three times. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("a/w/multistage/Dockerfile")} ${shared.DockerCommandArgs.BuildLabelsWithImageAnnotation} -t testuser/dockermultistage:11 ${shared.formatPath("a/w")}`) != -1, "docker build should run with expected arguments"); + console.log(tr.stderr); + done(); + }); + // // Docker build tests end // // Docker push tests begin @@ -436,6 +483,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.containerRegistry] = "dockerhubendpoint"; process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 4, 'should have invoked tool four times. actual: ' + tr.invokedToolCount); @@ -454,6 +502,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.dockerFile] = shared.formatPath("a/w/meta/Dockerfile"); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 4, 'should have invoked tool four times. actual: ' + tr.invokedToolCount); @@ -472,6 +521,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.buildContext] = shared.formatPath("a/w/context"); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 4, 'should have invoked tool four times. actual: ' + tr.invokedToolCount); @@ -490,6 +540,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.tags] = "tag1\ntag2,tag3"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 8, 'should have invoked tool eight times. actual: ' + tr.invokedToolCount); @@ -512,6 +563,7 @@ describe("DockerV2 Suite", function () { process.env[shared.TestEnvVars.repository] = "testuser/testrepo"; process.env[shared.TestEnvVars.arguments] = "--rm --queit"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 4, 'should have invoked tool four times. actual: ' + tr.invokedToolCount); diff --git a/Tasks/DockerV2/Tests/TestSetup.ts b/Tasks/DockerV2/Tests/TestSetup.ts index 246c38ccd97d..269a8de22737 100644 --- a/Tasks/DockerV2/Tests/TestSetup.ts +++ b/Tasks/DockerV2/Tests/TestSetup.ts @@ -8,10 +8,13 @@ const DefaultDockerFileInput = shared.formatPath("a/w/**/Dockerfile"); const DefaultWorkingDirectory: string = shared.formatPath("a/w"); const DockerfilePath: string = shared.formatPath("a/w/Dockerfile"); const DockerfilePath2: string = shared.formatPath("a/w/meta/Dockerfile"); +const DockerfilePathMultiStage: string = shared.formatPath("a/w/multistage/Dockerfile"); const BuildContextPath: string = shared.formatPath("a/w"); const BuildContextPath2: string = shared.formatPath("a/w/meta"); const BuildContextPath3: string = shared.formatPath("a/w/context"); -const Dockerfile: string = `FROM ubuntu\nCMD ["echo","Hello World!"]` +const BuildContextPath4: string = shared.formatPath("a/w/multistage"); +const Dockerfile: string = `FROM ${shared.SharedValues.BaseImageName}\nCMD ["echo","Hello World!"]` +const MultiStageDockerFile: string = `FROM ${shared.SharedValues.BaseImageName} as builder\nCMD ["echo","Hello World!"]\n\nFROM builder as base \nCMD ["echo","Hello World!"]\n\n FROM base` let taskPath = path.join(__dirname, '..', 'docker.js'); let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); @@ -25,6 +28,7 @@ tr.setInput('tags', process.env[shared.TestEnvVars.tags] || "11"); tr.setInput('arguments', process.env[shared.TestEnvVars.arguments] || ""); tr.setInput('container', process.env[shared.TestEnvVars.container] || ""); tr.setInput ('addPipelineData', process.env[shared.TestEnvVars.addPipelineData] || "true"); +tr.setInput ('addBaseImageData', process.env[shared.TestEnvVars.addBaseImageData] || "true"); console.log("Inputs have been set"); @@ -101,6 +105,7 @@ let a = { // Add extra answer definitions that need to be dynamically generated a.exist[DockerfilePath] = true; a.exist[DockerfilePath2] = true; +a.exist[DockerfilePathMultiStage] = true; a.find[`${DefaultWorkingDirectory}`] = [ `${DockerfilePath}` @@ -171,6 +176,16 @@ a.exec[`docker build -f ${DockerfilePath} ${shared.DockerCommandArgs.BuildLabels "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" }; +a.exec[`docker build -f ${DockerfilePath} ${shared.DockerCommandArgs.BuildLabelsWithImageAnnotation} -t testuser/imagewithannotations:11 ${BuildContextPath}`] = { + "code": 0, + "stdout": "successfully built image and tagged testuser/imagewithannotations:11." +}; + +a.exec[`docker build -f ${DockerfilePathMultiStage} ${shared.DockerCommandArgs.BuildLabelsWithImageAnnotation} -t testuser/dockermultistage:11 ${BuildContextPath4}`] = { + "code": 0, + "stdout": "successfully built image and tagged testuser/dockermultistage:11." +}; + a.exec[`docker push testuser/testrepo:11`] = { "code": 0, "stdout": "successfully pushed testuser/testrepo:11." @@ -261,6 +276,24 @@ a.exec[`docker stop some_container_id`] = { "stdout": "some_container_id" }; +a.exec[`docker pull ${shared.SharedValues.BaseImageName}`] = { + "code":0, + "stdout": "Pull complete" +} + +a.exec[`docker inspect ${shared.SharedValues.BaseImageName}`] = { + "code":0, + "stdout": `[{ + "Id": "sha256:302aba9ce190db9e247d710f4794cc303b169035de2048e76b82c9edbddbef4e", + "RepoTags": [ + "alpine:latest" + ], + "RepoDigests": [ + "ubuntu@sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" + ] + }]` +} + tr.setAnswers(a); // Create mock for fs module. Required to make the base image name extraction (push command) work. @@ -271,6 +304,8 @@ fsClone.readFileSync = function(filePath, options) { case DockerfilePath: case DockerfilePath2: return Dockerfile; + case DockerfilePathMultiStage: + return MultiStageDockerFile; default: return fs.readFileSync(filePath, options); } diff --git a/Tasks/DockerV2/Tests/TestShared.ts b/Tasks/DockerV2/Tests/TestShared.ts index 4b3765b9e43b..6cb22141c871 100644 --- a/Tasks/DockerV2/Tests/TestShared.ts +++ b/Tasks/DockerV2/Tests/TestShared.ts @@ -9,7 +9,8 @@ export let TestEnvVars = { tags: "__tags__", arguments: "__arguments__", container: "__container__", - addPipelineData: "__addPipelineData__" + addPipelineData: "__addPipelineData__", + addBaseImageData: "__addBaseImageData__" }; export let OperatingSystems = { @@ -45,11 +46,14 @@ export let SharedValues = { RELEASE_RELEASEID: "21", RELEASE_RELEASEWEBURL: "https://dev.azure.com/abc/testrepo/_release?releaseId=21&_a=release-summary", containerRegistry: "dockerhubendpoint", - AGENT_CONTAINERMAPPING: "{\"test_container\": {\"id\": \"some_container_id\"}}" + AGENT_CONTAINERMAPPING: "{\"test_container\": {\"id\": \"some_container_id\"}}", + BaseImageName:"ubuntu:19.04", + BaseImageDigest:"sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" } export let DockerCommandArgs = { BuildLabels: `--label com.azure.dev.image.system.teamfoundationcollectionuri=${SharedValues.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI} --label com.azure.dev.image.system.teamproject=${SharedValues.SYSTEM_TEAMPROJECT} --label com.azure.dev.image.build.repository.name=${SharedValues.BUILD_REPOSITORY_NAME} --label com.azure.dev.image.build.sourceversion=${SharedValues.BUILD_SOURCEVERSION} --label com.azure.dev.image.build.repository.uri=${SharedValues.BUILD_REPOSITORY_URI} --label com.azure.dev.image.build.sourcebranchname=${SharedValues.BUILD_SOURCEBRANCHNAME} --label com.azure.dev.image.build.definitionname=${SharedValues.BUILD_DEFINITIONNAME} --label com.azure.dev.image.build.buildnumber=${SharedValues.BUILD_BUILDNUMBER} --label com.azure.dev.image.build.builduri=${SharedValues.BUILD_BUILDURI}`, + BuildLabelsWithImageAnnotation: `--label com.azure.dev.image.system.teamfoundationcollectionuri=${SharedValues.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI} --label com.azure.dev.image.system.teamproject=${SharedValues.SYSTEM_TEAMPROJECT} --label com.azure.dev.image.build.repository.name=${SharedValues.BUILD_REPOSITORY_NAME} --label com.azure.dev.image.build.sourceversion=${SharedValues.BUILD_SOURCEVERSION} --label com.azure.dev.image.build.repository.uri=${SharedValues.BUILD_REPOSITORY_URI} --label com.azure.dev.image.build.sourcebranchname=${SharedValues.BUILD_SOURCEBRANCHNAME} --label com.azure.dev.image.build.definitionname=${SharedValues.BUILD_DEFINITIONNAME} --label com.azure.dev.image.build.buildnumber=${SharedValues.BUILD_BUILDNUMBER} --label com.azure.dev.image.build.builduri=${SharedValues.BUILD_BUILDURI} --label image.base.ref.name=${SharedValues.BaseImageName} --label image.base.digest=${SharedValues.BaseImageDigest}`, ReleaseLabels: `--label com.azure.dev.image.system.teamfoundationcollectionuri=${SharedValues.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI} --label com.azure.dev.image.system.teamproject=${SharedValues.SYSTEM_TEAMPROJECT} --label com.azure.dev.image.release.releaseid=${SharedValues.RELEASE_RELEASEID} --label com.azure.dev.image.release.definitionname=${SharedValues.RELEASE_DEFINITIONNAME} --label com.azure.dev.image.release.releaseweburl=${SharedValues.RELEASE_RELEASEWEBURL}`, BuildLabelsWithAddPipelineFalse: `--label com.azure.dev.image.system.teamfoundationcollectionuri=${SharedValues.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI} --label com.azure.dev.image.build.sourceversion=${SharedValues.BUILD_SOURCEVERSION}` } diff --git a/Tasks/DockerV2/dockerbuild.ts b/Tasks/DockerV2/dockerbuild.ts index 96ec4f7b0ff1..7773b052a2a2 100644 --- a/Tasks/DockerV2/dockerbuild.ts +++ b/Tasks/DockerV2/dockerbuild.ts @@ -36,8 +36,9 @@ export function run(connection: ContainerConnection, outputUpdate: (data: string } const addPipelineData = tl.getBoolInput("addPipelineData"); + const addBaseImageInfo = tl.getBoolInput("addBaseImageData"); // get label arguments - let labelArguments = pipelineUtils.getDefaultLabels(addPipelineData); + let labelArguments = pipelineUtils.getDefaultLabels(addPipelineData, addBaseImageInfo, dockerFile, connection); // get tags input let tagsInput = tl.getInput("tags"); @@ -74,4 +75,69 @@ export function run(connection: ContainerConnection, outputUpdate: (data: string containerImageUtils.shareBuiltImageId(builtImageId); } }); +} + +function getImageDigest(connection: ContainerConnection, imageName: string,): string { + try { + pullImage(connection, imageName); + let inspectObj = inspectImage(connection, imageName); + + if (!inspectObj) { + return ""; + } + + let repoDigests: string[] = inspectObj.RepoDigests; + + if (repoDigests.length == 0) { + tl.debug(`No digests were found for image: ${imageName}`); + return ""; + } + + if (repoDigests.length > 1) { + tl.debug(`Multiple digests were found for image: ${imageName}`); + return ""; + } + + return repoDigests[0].split("@")[1]; + } catch (error) { + tl.debug(`An exception was thrown getting the image digest for ${imageName}, the error was ${error.message}`) + return ""; + } +} + +function pullImage(connection: ContainerConnection, imageName: string) { + let pullCommand = connection.createCommand(); + pullCommand.arg("pull"); + pullCommand.arg(imageName); + let pullResult = pullCommand.execSync(); + + if (pullResult.stderr && pullResult.stderr != "") { + tl.debug(`An error was found pulling the image ${imageName}, the command output was ${pullResult.stderr}`); + } +} + +function inspectImage(connection: ContainerConnection, imageName): any { + try { + let inspectCommand = connection.createCommand(); + inspectCommand.arg("inspect"); + inspectCommand.arg(imageName); + let inspectResult = inspectCommand.execSync(); + + if (inspectResult.stderr && inspectResult.stderr != "") { + tl.debug(`An error was found inspecting the image ${imageName}, the command output was ${inspectResult.stderr}`); + return null; + } + + let inspectObj = JSON.parse(inspectResult.stdout); + + if (!inspectObj || inspectObj.length == 0) { + tl.debug(`Inspecting the image ${imageName} produced no results.`); + return null; + } + + return inspectObj[0]; + } catch (error) { + tl.debug(`An error ocurred running the inspect command: ${error.message}`); + return null; + } } \ No newline at end of file diff --git a/Tasks/DockerV2/task.json b/Tasks/DockerV2/task.json index 785c12ab12de..40390e666ccb 100644 --- a/Tasks/DockerV2/task.json +++ b/Tasks/DockerV2/task.json @@ -120,6 +120,14 @@ "defaultValue": "true", "helpMarkDown": "By default pipeline data like source branch name, build id are added which helps with traceability. For example you can inspect an image to find out which pipeline built the image. You can opt out of this default behavior by using this input." }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "Add base image metadata to image(s)", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input." + }, { "name": "container", "type": "string", diff --git a/Tasks/DockerV2/task.loc.json b/Tasks/DockerV2/task.loc.json index 5da51562f4e5..af4acd2c4db6 100644 --- a/Tasks/DockerV2/task.loc.json +++ b/Tasks/DockerV2/task.loc.json @@ -120,6 +120,14 @@ "defaultValue": "true", "helpMarkDown": "ms-resource:loc.input.help.addPipelineData" }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "ms-resource:loc.input.label.addBaseImageData", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.addBaseImageData" + }, { "name": "container", "type": "string", From cdc83bb17057b22823b455c96ee227e3cb38d972 Mon Sep 17 00:00:00 2001 From: Juan Carlos Fiorenzano Date: Wed, 12 May 2021 22:14:13 -0700 Subject: [PATCH 11/12] Adding base image info as labels DockerV0 (#14788) * Adding base image info as labels * Simplifying testing * Removed debugging message * Using the the commons functions to annotate the base image info * Fixed bad merge * Removed unused import * Updated the setup for tests Co-authored-by: Ajinkya <11447401+ajinkya599@users.noreply.github.com> --- .../resources.resjson/en-US/resources.resjson | 2 + Tasks/DockerV0/Tests/L0.ts | 46 ++++++++++++++++++- Tasks/DockerV0/Tests/TestSetup.ts | 46 ++++++++++++++----- Tasks/DockerV0/Tests/TestShared.ts | 13 +++++- Tasks/DockerV0/containerbuild.ts | 16 +++++-- Tasks/DockerV0/task.json | 8 ++++ Tasks/DockerV0/task.loc.json | 8 ++++ 7 files changed, 121 insertions(+), 18 deletions(-) diff --git a/Tasks/DockerV0/Strings/resources.resjson/en-US/resources.resjson b/Tasks/DockerV0/Strings/resources.resjson/en-US/resources.resjson index 56ac99f02f9f..769fbb3187b3 100644 --- a/Tasks/DockerV0/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/DockerV0/Strings/resources.resjson/en-US/resources.resjson @@ -16,6 +16,8 @@ "loc.input.help.action": "Select a Docker action.", "loc.input.label.dockerFile": "Docker File", "loc.input.help.dockerFile": "Path to the Dockerfile.", + "loc.input.label.addBaseImageData": "Add base image metadata to image(s)", + "loc.input.help.addBaseImageData": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input.", "loc.input.label.buildArguments": "Build Arguments", "loc.input.help.buildArguments": "Build-time variables for the Docker file. Specify each name=value pair on a new line.", "loc.input.label.defaultContext": "Use Default Build Context", diff --git a/Tasks/DockerV0/Tests/L0.ts b/Tasks/DockerV0/Tests/L0.ts index 32b6f605d917..6292bf1e0a61 100644 --- a/Tasks/DockerV0/Tests/L0.ts +++ b/Tasks/DockerV0/Tests/L0.ts @@ -21,6 +21,7 @@ describe('Docker Suite', function() { delete process.env[shared.TestEnvVars.additionalImageTags]; delete process.env[shared.TestEnvVars.enforceDockerNamingConvention]; delete process.env[shared.TestEnvVars.memory]; + delete process.env[shared.TestEnvVars.addBaseImageData]; }); after(function () { }); @@ -29,6 +30,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -44,6 +46,7 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.memory] = "2GB"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -60,6 +63,7 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.imageName] = 'test/Te st:2'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'true'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -76,6 +80,7 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.imageName] = 'test/Te st:2'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'false'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -93,6 +98,7 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.imageName] = 'test/Test:2'; process.env[shared.TestEnvVars.additionalImageTags] = '6'; process.env[shared.TestEnvVars.enforceDockerNamingConvention] = 'true'; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -109,6 +115,7 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.includeLatestTag] = "true"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -168,6 +175,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.pushImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -211,6 +219,7 @@ describe('Docker Suite', function() { let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.containerType] = shared.ContainerTypes.AzureContainerRegistry; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); @@ -227,10 +236,9 @@ describe('Docker Suite', function() { process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; process.env[shared.TestEnvVars.containerType] = shared.ContainerTypes.AzureContainerRegistry; process.env[shared.TestEnvVars.qualifyImageName] = "true"; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); - //console.log(tr.stdout); - assert(tr.invokedToolCount == 1, 'should have invoked tool one times. actual: ' + tr.invokedToolCount); assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); assert(tr.succeeded, 'task should have succeeded'); @@ -243,6 +251,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; tr.run(); assert(tr.succeeded, 'task should have succeeded'); @@ -255,6 +264,7 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.imageName] = "testuser/standardbuild:11"; process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); @@ -270,6 +280,38 @@ describe('Docker Suite', function() { let tp = path.join(__dirname, 'TestSetup.js'); process.env[shared.TestEnvVars.imageName] = "testuser/buildkit:11"; process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have invoked tool one time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf("set DOCKER_TASK_BUILT_IMAGES=6c3ada3eb420") != -1, "docker build should have stored the image id.") + console.log(tr.stderr); + done(); + }); + + it('Docker build should add labels with base image info', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/imagewithannotations:11"; + process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have invoked tool three time. actual: ' + tr.invokedToolCount); + assert(tr.stderr.length == 0 || tr.errorIssues.length, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + assert(tr.stdout.indexOf(`[command]docker build -f ${shared.formatPath("dir1/DockerFile")} -t testuser/imagewithannotations:11 ${shared.DockerCommandArgs.BuildLabels} --label ${shared.BaseImageLabels.name} --label ${shared.BaseImageLabels.digest}`) != -1, "docker build should run"); + console.log(tr.stderr); + done(); + }); + + it('Docker build should store the id of the image that was built with builkit.', (done:Mocha.Done) => { + let tp = path.join(__dirname, 'TestSetup.js'); + process.env[shared.TestEnvVars.imageName] = "testuser/buildkit:11"; + process.env[shared.TestEnvVars.action] = shared.ActionTypes.buildImage; + process.env[shared.TestEnvVars.addBaseImageData] = "false"; let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); diff --git a/Tasks/DockerV0/Tests/TestSetup.ts b/Tasks/DockerV0/Tests/TestSetup.ts index 63020a251789..eb6c857f9e87 100644 --- a/Tasks/DockerV0/Tests/TestSetup.ts +++ b/Tasks/DockerV0/Tests/TestSetup.ts @@ -6,6 +6,7 @@ import * as shared from './TestShared'; const DefaultWorkingDirectory: string = shared.formatPath("a/w"); const ImageNamesPath = shared.formatPath("dir/image_names.txt"); const DockerFilePath = shared.formatPath('dir1/DockerFile'); +const Dockerfile: string = `FROM ubuntu\nCMD ["echo","Hello World!"]` let taskPath = path.join(__dirname, '..', 'container.js'); let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); @@ -24,12 +25,14 @@ tr.setInput('azureContainerRegistry', '{"loginServer":"ajgtestacr1.azurecr.io", tr.setInput('additionalImageTags', process.env[shared.TestEnvVars.additionalImageTags] || ''); tr.setInput('enforceDockerNamingConvention', process.env[shared.TestEnvVars.enforceDockerNamingConvention]); tr.setInput('memory', process.env[shared.TestEnvVars.memory] || ''); +tr.setInput ('addBaseImageData', process.env[shared.TestEnvVars.addBaseImageData] || "true"); console.log("Inputs have been set"); +process.env["SYSTEM_HOSTTYPE"] = "__hostType__"; process.env["RELEASE_RELEASENAME"] = "Release-1"; process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = DefaultWorkingDirectory; -process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = shared.teamFoundationCollectionURI; process.env["SYSTEM_SERVERTYPE"] = "hosted"; process.env["ENDPOINT_AUTH_dockerhubendpoint"] = "{\"parameters\":{\"username\":\"test\", \"password\":\"regpassword\", \"email\":\"test@microsoft.com\",\"registry\":\"https://index.docker.io/v1/\"},\"scheme\":\"UsernamePassword\"}"; process.env["ENDPOINT_AUTH_SCHEME_AzureRMSpn"] = "ServicePrincipal"; @@ -76,27 +79,27 @@ let a = { // Add extra answer definitions that need to be dynamically generated a.exist[DockerFilePath] = true; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} -t test/test:2 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "successfully build test/test:2 image" }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -m 2GB`] = { +a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -m 2GB ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "successfully build test/test:2 image" }; -a.exec[`docker build -f ${DockerFilePath} -t test/Te st:2`] = { +a.exec[`docker build -f ${DockerFilePath} -t test/Te st:2 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 1, "stdout": "test/Te st:2 not valid imagename" }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test`] = { +a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "successfully build test/test image with latest tag" }; -a.exec[`docker build -f ${DockerFilePath} -t ajgtestacr1.azurecr.io/test/test:2`] = { +a.exec[`docker build -f ${DockerFilePath} -t ajgtestacr1.azurecr.io/test/test:2 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "successfully build ajgtestacr1.azurecr.io/test/test image with latest tag" }; -a.exec[`docker build -f ${DockerFilePath} -t ${shared.ImageNamesFileImageName}`] = { +a.exec[`docker build -f ${DockerFilePath} -t ${shared.ImageNamesFileImageName} ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0 }; a.exec[`docker tag test/test:2 ajgtestacr1.azurecr.io/test/test:2`] = { @@ -111,19 +114,38 @@ a.exec[`docker run --rm ${shared.ImageNamesFileImageName}`] = { a.exec[`docker push ${shared.ImageNamesFileImageName}:latest`] = { "code": 0 }; -a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test:6`] = { +a.exec[`docker build -f ${DockerFilePath} -t test/test:2 -t test/test:6 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "successfully build test/test:2 and test/test:6 image" }; -a.exec[`docker build -f ${DockerFilePath} -t testuser/standardbuild:11`] = { +a.exec[`docker build -f ${DockerFilePath} -t testuser/standardbuild:11 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": "Successfully built c834e0094587\n Successfully tagged testuser/testrepo:11." }; - -a.exec[`docker build -f ${DockerFilePath} -t testuser/buildkit:11`] = { +a.exec[`docker build -f ${DockerFilePath} -t testuser/buildkit:11 ${shared.DockerCommandArgs.BuildLabels}`] = { "code": 0, "stdout": " => => writing image sha256:6c3ada3eb42094510e0083bba6ae805540e36c96871d7be0c926b2f8cbeea68c\n => => naming to docker.io/library/testuser/buildkit:11" }; +a.exec[`docker build -f ${DockerFilePath} -t testuser/imagewithannotations:11 ${shared.DockerCommandArgs.BuildLabels} --label ${shared.BaseImageLabels.name} --label ${shared.BaseImageLabels.digest}`] = { + "code": 0, + "stdout": "successfully built image and tagged testuser/imagewithannotations:11." +}; +a.exec[`docker pull ${shared.BaseImageName}`] = { + "code":0, + "stdout": "Pull complete" +}; +a.exec[`docker inspect ${shared.BaseImageName}`] = { + "code":0, + "stdout": `[{ + "Id": "sha256:302aba9ce190db9e247d710f4794cc303b169035de2048e76b82c9edbddbef4e", + "RepoTags": [ + "alpine:latest" + ], + "RepoDigests": [ + "ubuntu@sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" + ] + }]` +}; tr.setAnswers(a); // Create mock for fs module @@ -133,6 +155,8 @@ fsClone.readFileSync = function(filePath, options) { switch (filePath) { case ImageNamesPath: return shared.ImageNamesFileImageName; + case DockerFilePath: + return Dockerfile; default: return fs.readFileSync(filePath, options); } diff --git a/Tasks/DockerV0/Tests/TestShared.ts b/Tasks/DockerV0/Tests/TestShared.ts index 8e0162480738..bffba8aea18d 100644 --- a/Tasks/DockerV0/Tests/TestShared.ts +++ b/Tasks/DockerV0/Tests/TestShared.ts @@ -9,7 +9,8 @@ export let TestEnvVars = { imageName: "__imageName__", additionalImageTags: "__additionalImageTags__", enforceDockerNamingConvention: "__enforceDockerNamingConvention__", - memory: "__memory__" + memory: "__memory__", + addBaseImageData: "__addBaseImageData__" }; export let OperatingSystems = { @@ -32,7 +33,17 @@ export let ContainerTypes = { } export let ImageNamesFileImageName = "test_image"; +export let BaseImageName = "ubuntu"; +export let BaseImageLabels = { + name:"image.base.ref.name=ubuntu", + digest:"image.base.digest=sha256:826f70e0ac33e99a72cf20fb0571245a8fee52d68cb26d8bc58e53bfa65dcdfa" +}; + +export let teamFoundationCollectionURI = "https://abc.visualstudio.com/"; +export let DockerCommandArgs = { + BuildLabels: `--label com.visualstudio.abc.image.system.teamfoundationcollectionuri=${teamFoundationCollectionURI}`, +} /** * Formats the given path to be appropriate for the operating system. * @param canonicalPath A non-rooted path using a forward slash (/) as a directory separator. diff --git a/Tasks/DockerV0/containerbuild.ts b/Tasks/DockerV0/containerbuild.ts index 5e151c23f697..705ba5af9598 100644 --- a/Tasks/DockerV0/containerbuild.ts +++ b/Tasks/DockerV0/containerbuild.ts @@ -1,8 +1,8 @@ "use strict"; - import * as path from "path"; import * as tl from "azure-pipelines-task-lib/task"; import ContainerConnection from "azure-pipelines-tasks-docker-common-v2/containerconnection"; +import * as pipelineUtils from "azure-pipelines-tasks-docker-common-v2/pipelineutils"; import * as fileUtils from "azure-pipelines-tasks-docker-common-v2/fileutils"; import * as sourceUtils from "azure-pipelines-tasks-docker-common-v2/sourceutils"; import * as imageUtils from "azure-pipelines-tasks-docker-common-v2/containerimageutils"; @@ -14,8 +14,8 @@ export function run(connection: ContainerConnection): any { var dockerfilepath = tl.getInput("dockerFile", true); let dockerFile = fileUtils.findDockerFile(dockerfilepath); - - if(!tl.exist(dockerFile)) { + + if (!tl.exist(dockerFile)) { throw new Error(tl.loc('ContainerDockerFileNotFound', dockerfilepath)); } @@ -25,7 +25,7 @@ export function run(connection: ContainerConnection): any { command.arg(["--build-arg", buildArgument]); }); - var imageName = utils.getImageName(); + var imageName = utils.getImageName(); var qualifyImageName = tl.getBoolInput("qualifyImageName"); if (qualifyImageName) { imageName = connection.getQualifiedImageNameIfRequired(imageName); @@ -55,6 +55,13 @@ export function run(connection: ContainerConnection): any { command.arg(["-m", memory]); } + const addBaseImageInfo = tl.getBoolInput("addBaseImageData"); + const labelsArgument = pipelineUtils.getDefaultLabels(false, addBaseImageInfo, dockerFile, connection); + + labelsArgument.forEach(label => { + command.arg(["--label", label]); + }); + var context: string; var defaultContext = tl.getBoolInput("defaultContext"); if (defaultContext) { @@ -62,6 +69,7 @@ export function run(connection: ContainerConnection): any { } else { context = tl.getPathInput("context"); } + command.arg(context); let output: string = ""; diff --git a/Tasks/DockerV0/task.json b/Tasks/DockerV0/task.json index c2156913d91d..0792373c6f27 100644 --- a/Tasks/DockerV0/task.json +++ b/Tasks/DockerV0/task.json @@ -94,6 +94,14 @@ "visibleRule": "action = Build an image", "helpMarkDown": "Path to the Dockerfile." }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "Add base image metadata to image(s)", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "By default base image data like base image name and digest are added which helps with traceability. You can opt out of this default behavior by using this input." + }, { "name": "buildArguments", "type": "multiLine", diff --git a/Tasks/DockerV0/task.loc.json b/Tasks/DockerV0/task.loc.json index 949ac76db0ae..718aa8bfb2a8 100644 --- a/Tasks/DockerV0/task.loc.json +++ b/Tasks/DockerV0/task.loc.json @@ -94,6 +94,14 @@ "visibleRule": "action = Build an image", "helpMarkDown": "ms-resource:loc.input.help.dockerFile" }, + { + "name": "addBaseImageData", + "type": "boolean", + "label": "ms-resource:loc.input.label.addBaseImageData", + "groupName": "commands", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.addBaseImageData" + }, { "name": "buildArguments", "type": "multiLine", From 744e2b70a3a58d2a7fb160343628466d2f793003 Mon Sep 17 00:00:00 2001 From: Amruta Kawade <65217380+AmrutaKawade@users.noreply.github.com> Date: Thu, 13 May 2021 11:09:33 +0530 Subject: [PATCH 12/12] Updating common package version for wrong annotaton category fix (#14829) Co-authored-by: Chaitanya Shrikhande --- .../package-lock.json | 92 ++++++++++++++----- Tasks/AzureAppServiceSettingsV1/package.json | 2 +- Tasks/AzureAppServiceSettingsV1/task.json | 4 +- Tasks/AzureAppServiceSettingsV1/task.loc.json | 4 +- .../package-lock.json | 92 ++++++++++++++----- .../AzureFunctionAppContainerV1/package.json | 2 +- Tasks/AzureFunctionAppContainerV1/task.json | 4 +- .../AzureFunctionAppContainerV1/task.loc.json | 4 +- Tasks/AzureFunctionAppV1/package-lock.json | 78 ++++++++++++---- Tasks/AzureFunctionAppV1/package.json | 2 +- Tasks/AzureFunctionAppV1/task.json | 4 +- Tasks/AzureFunctionAppV1/task.loc.json | 4 +- .../AzureWebAppContainerV1/package-lock.json | 92 ++++++++++++++----- Tasks/AzureWebAppContainerV1/package.json | 2 +- Tasks/AzureWebAppContainerV1/task.json | 4 +- Tasks/AzureWebAppContainerV1/task.loc.json | 4 +- Tasks/AzureWebAppV1/package-lock.json | 6 +- Tasks/AzureWebAppV1/package.json | 2 +- Tasks/AzureWebAppV1/task.json | 4 +- Tasks/AzureWebAppV1/task.loc.json | 4 +- 20 files changed, 289 insertions(+), 121 deletions(-) diff --git a/Tasks/AzureAppServiceSettingsV1/package-lock.json b/Tasks/AzureAppServiceSettingsV1/package-lock.json index 2054f1ca3638..6f66071305d8 100644 --- a/Tasks/AzureAppServiceSettingsV1/package-lock.json +++ b/Tasks/AzureAppServiceSettingsV1/package-lock.json @@ -97,9 +97,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "azure-pipelines-task-lib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.0.tgz", - "integrity": "sha512-9L+uG3dxwr/orjFy8tWa2fti+2weiRAdsKVtXINfIpLKFSAHS9tKOpupS53CgBJzQxFf5HfZwNeiUTv+/dBPpA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -118,9 +118,9 @@ } }, "azure-pipelines-tasks-azurermdeploycommon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.3.tgz", - "integrity": "sha512-D2HoAZl4rUFej+7lRv3HxdDBGNltJ/Y3U7dESWV6XOKRnN7IiidxpxC4aVOmq+EIYJqT03t538oQZWD71CZHCg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.4.tgz", + "integrity": "sha512-zzuvXYjMM1Nw0RSgxGU11mg6bKtNHGf/6BzEU696UfiaoO+taf5O6PiJdPKRCxO2w/6SjVbDBiWnnhP4uf92KA==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", @@ -145,9 +145,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -229,6 +229,15 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -382,15 +391,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -413,6 +432,11 @@ "function-bind": "^1.1.1" } }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", @@ -462,9 +486,9 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } @@ -548,16 +572,16 @@ } }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.47.0" } }, "minimatch": { @@ -609,6 +633,11 @@ "remove-trailing-separator": "^1.0.1" } }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -651,9 +680,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "readable-stream": { "version": "2.3.7", @@ -716,6 +748,16 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", diff --git a/Tasks/AzureAppServiceSettingsV1/package.json b/Tasks/AzureAppServiceSettingsV1/package.json index 7fc9d9cf816a..77a542802439 100644 --- a/Tasks/AzureAppServiceSettingsV1/package.json +++ b/Tasks/AzureAppServiceSettingsV1/package.json @@ -21,7 +21,7 @@ "@types/node": "^10.17.0", "@types/q": "1.0.7", "@types/uuid": "^8.3.0", - "azure-pipelines-tasks-azurermdeploycommon": "^2.0.3", + "azure-pipelines-tasks-azurermdeploycommon": "^2.0.4", "moment": "2.21.0", "q": "1.4.1", "xml2js": "0.4.13" diff --git a/Tasks/AzureAppServiceSettingsV1/task.json b/Tasks/AzureAppServiceSettingsV1/task.json index 35f7ee19b8c6..51bd3f4c1170 100644 --- a/Tasks/AzureAppServiceSettingsV1/task.json +++ b/Tasks/AzureAppServiceSettingsV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureAppServiceSettingsV1/task.loc.json b/Tasks/AzureAppServiceSettingsV1/task.loc.json index b9f317dcebbe..afecd1d4a18b 100644 --- a/Tasks/AzureAppServiceSettingsV1/task.loc.json +++ b/Tasks/AzureAppServiceSettingsV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureFunctionAppContainerV1/package-lock.json b/Tasks/AzureFunctionAppContainerV1/package-lock.json index 0ab179268e7e..1696b1d49062 100644 --- a/Tasks/AzureFunctionAppContainerV1/package-lock.json +++ b/Tasks/AzureFunctionAppContainerV1/package-lock.json @@ -92,9 +92,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "azure-pipelines-task-lib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.0.tgz", - "integrity": "sha512-9L+uG3dxwr/orjFy8tWa2fti+2weiRAdsKVtXINfIpLKFSAHS9tKOpupS53CgBJzQxFf5HfZwNeiUTv+/dBPpA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -113,9 +113,9 @@ } }, "azure-pipelines-tasks-azurermdeploycommon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.3.tgz", - "integrity": "sha512-D2HoAZl4rUFej+7lRv3HxdDBGNltJ/Y3U7dESWV6XOKRnN7IiidxpxC4aVOmq+EIYJqT03t538oQZWD71CZHCg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.4.tgz", + "integrity": "sha512-zzuvXYjMM1Nw0RSgxGU11mg6bKtNHGf/6BzEU696UfiaoO+taf5O6PiJdPKRCxO2w/6SjVbDBiWnnhP4uf92KA==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", @@ -140,9 +140,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -224,6 +224,15 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -377,15 +386,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -408,6 +427,11 @@ "function-bind": "^1.1.1" } }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", @@ -457,9 +481,9 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } @@ -543,16 +567,16 @@ } }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.47.0" } }, "minimatch": { @@ -604,6 +628,11 @@ "remove-trailing-separator": "^1.0.1" } }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -646,9 +675,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "readable-stream": { "version": "2.3.7", @@ -711,6 +743,16 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", diff --git a/Tasks/AzureFunctionAppContainerV1/package.json b/Tasks/AzureFunctionAppContainerV1/package.json index 1e600dd0c1a2..a75e6e85805b 100644 --- a/Tasks/AzureFunctionAppContainerV1/package.json +++ b/Tasks/AzureFunctionAppContainerV1/package.json @@ -20,7 +20,7 @@ "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.0.7", - "azure-pipelines-tasks-azurermdeploycommon": "^2.0.3", + "azure-pipelines-tasks-azurermdeploycommon": "^2.0.4", "moment": "2.21.0", "q": "1.4.1", "uuid": "3.1.0", diff --git a/Tasks/AzureFunctionAppContainerV1/task.json b/Tasks/AzureFunctionAppContainerV1/task.json index 229381074868..3eceb5a02d27 100644 --- a/Tasks/AzureFunctionAppContainerV1/task.json +++ b/Tasks/AzureFunctionAppContainerV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureFunctionAppContainerV1/task.loc.json b/Tasks/AzureFunctionAppContainerV1/task.loc.json index 2960e75a6589..8bdaa3a5e463 100644 --- a/Tasks/AzureFunctionAppContainerV1/task.loc.json +++ b/Tasks/AzureFunctionAppContainerV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureFunctionAppV1/package-lock.json b/Tasks/AzureFunctionAppV1/package-lock.json index 82049b369b79..ce5b136ec532 100644 --- a/Tasks/AzureFunctionAppV1/package-lock.json +++ b/Tasks/AzureFunctionAppV1/package-lock.json @@ -125,9 +125,9 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "azure-pipelines-task-lib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.0.tgz", - "integrity": "sha512-9L+uG3dxwr/orjFy8tWa2fti+2weiRAdsKVtXINfIpLKFSAHS9tKOpupS53CgBJzQxFf5HfZwNeiUTv+/dBPpA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -146,9 +146,9 @@ } }, "azure-pipelines-tasks-azurermdeploycommon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.3.tgz", - "integrity": "sha512-D2HoAZl4rUFej+7lRv3HxdDBGNltJ/Y3U7dESWV6XOKRnN7IiidxpxC4aVOmq+EIYJqT03t538oQZWD71CZHCg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.4.tgz", + "integrity": "sha512-zzuvXYjMM1Nw0RSgxGU11mg6bKtNHGf/6BzEU696UfiaoO+taf5O6PiJdPKRCxO2w/6SjVbDBiWnnhP4uf92KA==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", @@ -229,9 +229,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -348,6 +348,15 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caseless": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", @@ -581,6 +590,16 @@ "is-property": "^1.0.0" } }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", @@ -602,9 +621,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -646,6 +665,11 @@ "ansi-regex": "^2.0.0" } }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -732,9 +756,9 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } @@ -976,6 +1000,11 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1161,6 +1190,16 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", @@ -1286,9 +1325,12 @@ } }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } } } }, diff --git a/Tasks/AzureFunctionAppV1/package.json b/Tasks/AzureFunctionAppV1/package.json index 7baf6a5778d2..562c5b6c3598 100644 --- a/Tasks/AzureFunctionAppV1/package.json +++ b/Tasks/AzureFunctionAppV1/package.json @@ -20,7 +20,7 @@ "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.0.7", - "azure-pipelines-tasks-azurermdeploycommon": "^2.0.3", + "azure-pipelines-tasks-azurermdeploycommon": "^2.0.4", "azure-storage": "2.2.1", "moment": "2.21.0", "q": "1.4.1", diff --git a/Tasks/AzureFunctionAppV1/task.json b/Tasks/AzureFunctionAppV1/task.json index 5c17b9ee886b..32951518e459 100644 --- a/Tasks/AzureFunctionAppV1/task.json +++ b/Tasks/AzureFunctionAppV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 3 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureFunctionAppV1/task.loc.json b/Tasks/AzureFunctionAppV1/task.loc.json index 76cebfc5c673..c6c1c48f3c42 100644 --- a/Tasks/AzureFunctionAppV1/task.loc.json +++ b/Tasks/AzureFunctionAppV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 3 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureWebAppContainerV1/package-lock.json b/Tasks/AzureWebAppContainerV1/package-lock.json index 36905b53a5db..905310d30500 100644 --- a/Tasks/AzureWebAppContainerV1/package-lock.json +++ b/Tasks/AzureWebAppContainerV1/package-lock.json @@ -97,9 +97,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "azure-pipelines-task-lib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.0.tgz", - "integrity": "sha512-9L+uG3dxwr/orjFy8tWa2fti+2weiRAdsKVtXINfIpLKFSAHS9tKOpupS53CgBJzQxFf5HfZwNeiUTv+/dBPpA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.1.2.tgz", + "integrity": "sha512-ZafpInsnjHKGemA5l3jwfeaI8jARrIv5aYCn3KPP4iNJHgMG2RtwyFGynIfpkUsHMfzC/370iyLru0NGAuSVWQ==", "requires": { "minimatch": "3.0.4", "mockery": "^1.7.0", @@ -118,9 +118,9 @@ } }, "azure-pipelines-tasks-azurermdeploycommon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.3.tgz", - "integrity": "sha512-D2HoAZl4rUFej+7lRv3HxdDBGNltJ/Y3U7dESWV6XOKRnN7IiidxpxC4aVOmq+EIYJqT03t538oQZWD71CZHCg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.4.tgz", + "integrity": "sha512-zzuvXYjMM1Nw0RSgxGU11mg6bKtNHGf/6BzEU696UfiaoO+taf5O6PiJdPKRCxO2w/6SjVbDBiWnnhP4uf92KA==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", @@ -145,9 +145,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -229,6 +229,15 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -382,15 +391,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -413,6 +432,11 @@ "function-bind": "^1.1.1" } }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", @@ -462,9 +486,9 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" } @@ -548,16 +572,16 @@ } }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.47.0" } }, "minimatch": { @@ -609,6 +633,11 @@ "remove-trailing-separator": "^1.0.1" } }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -651,9 +680,12 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "readable-stream": { "version": "2.3.7", @@ -716,6 +748,16 @@ "rechoir": "^0.6.2" } }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", diff --git a/Tasks/AzureWebAppContainerV1/package.json b/Tasks/AzureWebAppContainerV1/package.json index 4687aaa0d07a..cd5469b1f5e2 100644 --- a/Tasks/AzureWebAppContainerV1/package.json +++ b/Tasks/AzureWebAppContainerV1/package.json @@ -21,7 +21,7 @@ "@types/node": "^10.17.0", "@types/q": "1.0.7", "@types/uuid": "^8.3.0", - "azure-pipelines-tasks-azurermdeploycommon": "^2.0.3", + "azure-pipelines-tasks-azurermdeploycommon": "^2.0.4", "moment": "2.21.0", "q": "1.4.1", "xml2js": "0.4.13" diff --git a/Tasks/AzureWebAppContainerV1/task.json b/Tasks/AzureWebAppContainerV1/task.json index f2df93a99da3..1b0b5afaebec 100644 --- a/Tasks/AzureWebAppContainerV1/task.json +++ b/Tasks/AzureWebAppContainerV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureWebAppContainerV1/task.loc.json b/Tasks/AzureWebAppContainerV1/task.loc.json index 73a7128a83c2..7999d9b4b6fc 100644 --- a/Tasks/AzureWebAppContainerV1/task.loc.json +++ b/Tasks/AzureWebAppContainerV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 2 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureWebAppV1/package-lock.json b/Tasks/AzureWebAppV1/package-lock.json index 62391a64eb3f..fbe3f9538cc2 100644 --- a/Tasks/AzureWebAppV1/package-lock.json +++ b/Tasks/AzureWebAppV1/package-lock.json @@ -131,9 +131,9 @@ } }, "azure-pipelines-tasks-azurermdeploycommon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.3.tgz", - "integrity": "sha512-D2HoAZl4rUFej+7lRv3HxdDBGNltJ/Y3U7dESWV6XOKRnN7IiidxpxC4aVOmq+EIYJqT03t538oQZWD71CZHCg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azurermdeploycommon/-/azure-pipelines-tasks-azurermdeploycommon-2.0.4.tgz", + "integrity": "sha512-zzuvXYjMM1Nw0RSgxGU11mg6bKtNHGf/6BzEU696UfiaoO+taf5O6PiJdPKRCxO2w/6SjVbDBiWnnhP4uf92KA==", "requires": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", diff --git a/Tasks/AzureWebAppV1/package.json b/Tasks/AzureWebAppV1/package.json index 3414442ce5fc..4c39569f2833 100644 --- a/Tasks/AzureWebAppV1/package.json +++ b/Tasks/AzureWebAppV1/package.json @@ -20,7 +20,7 @@ "@types/mocha": "^5.2.7", "@types/node": "^10.17.0", "@types/q": "1.0.7", - "azure-pipelines-tasks-azurermdeploycommon": "^2.0.3", + "azure-pipelines-tasks-azurermdeploycommon": "^2.0.4", "azure-pipelines-tasks-utility-common": "^3.0.1", "moment": "2.21.0", "q": "1.4.1", diff --git a/Tasks/AzureWebAppV1/task.json b/Tasks/AzureWebAppV1/task.json index ee0add9a89ac..399d7b7027a9 100644 --- a/Tasks/AzureWebAppV1/task.json +++ b/Tasks/AzureWebAppV1/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 4 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureWebAppV1/task.loc.json b/Tasks/AzureWebAppV1/task.loc.json index feabaa915b1d..149ebd5eb0e4 100644 --- a/Tasks/AzureWebAppV1/task.loc.json +++ b/Tasks/AzureWebAppV1/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 184, - "Patch": 4 + "Minor": 187, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [