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 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": [ 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/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 c458a6600c47..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'); @@ -250,4 +259,67 @@ 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; + 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=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; + 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(); + + 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..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,11 +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 ${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 ${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 @@ -125,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 860e9897d33f..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 = ""; @@ -72,5 +80,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..0792373c6f27 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", @@ -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 533c15ed33af..718aa8bfb2a8 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", @@ -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", 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 8fc7f64bf243..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'); @@ -394,4 +406,51 @@ 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; + 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=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; + 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.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 44f92bf8321d..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,6 +156,34 @@ a.exec[`docker images`] = { "code": 0, "stdout": "Listed images successfully." }; +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} ${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); @@ -163,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 5e8f5b50a3aa..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"; @@ -16,23 +17,30 @@ 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); } + 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); - - var imageName = utils.getImageName(); + + var imageName = utils.getImageName(); var qualifyImageName = tl.getBoolInput("qualifyImageName"); if (qualifyImageName) { imageName = connection.getQualifiedImageNameIfRequired(imageName); @@ -75,5 +83,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..b4ed276190f5 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.", @@ -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 745da36af2ca..6a281ce25ab5 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", @@ -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", 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 33434a526933..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(); @@ -240,6 +253,72 @@ 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; + 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=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; + 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.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 @@ -404,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); @@ -422,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); @@ -440,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); @@ -458,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); @@ -480,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 f57fd8970b21..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}` @@ -161,6 +166,26 @@ 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 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." @@ -251,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. @@ -261,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 01431c9ac85f..7773b052a2a2 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")) { @@ -38,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"); @@ -51,8 +50,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 +69,75 @@ 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); + } }); } + +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/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..40390e666ccb 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", @@ -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 110a54a87f33..af4acd2c4db6 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", @@ -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", 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/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": [ { 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": [ 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", 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",