diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson index c4f997f7275d..419545e0304f 100644 --- a/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson @@ -36,6 +36,8 @@ "loc.input.help.chartName": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", "loc.input.label.chartPath": "Chart Path", "loc.input.help.chartPath": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "loc.input.label.remoteRepo": "Remote Repo", + "loc.input.help.remoteRepo": "The remote repository where the chart will be pushed.", "loc.input.label.version": "Version", "loc.input.help.version": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", "loc.input.label.releaseName": "Release Name", diff --git a/Tasks/HelmDeployV1/package-lock.json b/Tasks/HelmDeployV1/package-lock.json index 64b744b3f074..c12cabacf21e 100644 --- a/Tasks/HelmDeployV1/package-lock.json +++ b/Tasks/HelmDeployV1/package-lock.json @@ -274,6 +274,71 @@ }, "engines": { "node": ">= 16.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.4.tgz", + "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=" + }, + "azure-devops-node-api": { + "version": "14.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-14.1.0.tgz", + "integrity": "sha1-7FOT3p+hRjmd6qtpBOQdoD7c4YA=", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "2.1.0" + } + }, + "msalv1": { + "version": "npm:@azure/msal-node@1.18.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-1.18.4.tgz", + "integrity": "sha1-ySGwRHyS+zsMsev1qadvytLsfCE=", + "requires": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, + "msalv2": { + "version": "npm:@azure/msal-node@2.16.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.16.2.tgz", + "integrity": "sha1-Prdo02iD6m+ak5wLW0Z7UY54//w=", + "requires": { + "@azure/msal-common": "14.16.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "dependencies": { + "@azure/msal-common": { + "version": "14.16.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.16.0.tgz", + "integrity": "sha1-80cPyux4jb5QhZlSzUmTQL2iPXo=" + } + } + }, + "typed-rest-client": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.1.0.tgz", + "integrity": "sha1-8Exs/KvGASwtA2uAbqrEVWBPFZg=", + "requires": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" + } } }, "node_modules/azure-pipelines-tasks-docker-common": { @@ -1119,6 +1184,7 @@ } }, "node_modules/node-fetch": { + "node-fetch": { "version": "2.7.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", diff --git a/Tasks/HelmDeployV1/src/helm.ts b/Tasks/HelmDeployV1/src/helm.ts index 92d6a8858ce3..2db5469c158b 100644 --- a/Tasks/HelmDeployV1/src/helm.ts +++ b/Tasks/HelmDeployV1/src/helm.ts @@ -145,7 +145,11 @@ async function runHelm(helmCli: helmcli, command: string, kubectlCli: kubernetes "package": "./helmcommands/helmpackage", "push": "./helmcommands/helmpush", "registry": "./helmcommands/helmregistrylogin", - "upgrade": "./helmcommands/helmupgrade" + "upgrade": "./helmcommands/helmupgrade", + "rollback": "./helmcommands/helmrollback", + "uninstall": "./helmcommands/helmuninstall", + "delete": "./helmcommands/helmuninstall", + "create": "./helmcommands/helmcreate", } var commandImplementation = require("./helmcommands/uinotimplementedcommands"); diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmcreate.ts b/Tasks/HelmDeployV1/src/helmcommands/helmcreate.ts new file mode 100644 index 000000000000..c9a659327bb1 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmcreate.ts @@ -0,0 +1,11 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var chartName = tl.getInput("chartName", true); + + helmCli.addArgument(chartName); +} diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmpush.ts b/Tasks/HelmDeployV1/src/helmcommands/helmpush.ts index 8e377d89c4a3..1977fd957355 100644 --- a/Tasks/HelmDeployV1/src/helmcommands/helmpush.ts +++ b/Tasks/HelmDeployV1/src/helmcommands/helmpush.ts @@ -8,7 +8,10 @@ Pushes a helm chart to ACR */ export async function addArguments(helmCli: helmcli): Promise { - helmCli.addArgument("push"); + helmCli.setCommand("push"); helmCli.addArgument(tl.getVariable("helmChartRef")); + helmCli.addArgument(tl.getInput("chartPath" , true)); + helmCli.addArgument(tl.getInput("remoteRepo" , true)); + } \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmrollback.ts b/Tasks/HelmDeployV1/src/helmcommands/helmrollback.ts new file mode 100644 index 000000000000..96f629d6b129 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmrollback.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace", true); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } +} diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmuninstall.ts b/Tasks/HelmDeployV1/src/helmcommands/helmuninstall.ts new file mode 100644 index 000000000000..12b40e446ed1 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmuninstall.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli): Promise { + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace" , false); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + +} diff --git a/Tasks/HelmDeployV1/task.json b/Tasks/HelmDeployV1/task.json index 7416b98db730..fb002d99f998 100644 --- a/Tasks/HelmDeployV1/task.json +++ b/Tasks/HelmDeployV1/task.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 252, - "Patch": 1 + "Patch": 2 }, "demands": [], "groups": [ @@ -180,6 +180,7 @@ "login": "login", "logout": "logout", "ls": "ls", + "push": "push", "package": "package", "rollback": "rollback", "upgrade": "upgrade", @@ -214,7 +215,7 @@ "type": "string", "helpMarkDown": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", "defaultValue": "", - "visibleRule": "chartType == Name", + "visibleRule": "chartType == Name || command == create ", "required": "true", "groupName": "commands" }, @@ -224,7 +225,17 @@ "type": "filePath", "helpMarkDown": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", "defaultValue": "", - "visibleRule": "chartType == FilePath || command == package", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "Remote Repo", + "type": "string", + "helpMarkDown": "The remote repository where the chart will be pushed.", + "defaultValue": "", + "visibleRule": "command == push", "required": "true", "groupName": "commands" }, @@ -246,7 +257,7 @@ "type": "string", "helpMarkDown": "Release name. If unspecified, it will autogenerate one for you.", "defaultValue": "", - "visibleRule": "command == install || command == upgrade", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", "groupName": "commands" }, { diff --git a/Tasks/HelmDeployV1/task.loc.json b/Tasks/HelmDeployV1/task.loc.json index 2d20cf3540ed..08d69732700d 100644 --- a/Tasks/HelmDeployV1/task.loc.json +++ b/Tasks/HelmDeployV1/task.loc.json @@ -14,7 +14,7 @@ "version": { "Major": 1, "Minor": 252, - "Patch": 1 + "Patch": 2 }, "demands": [], "groups": [ @@ -180,6 +180,7 @@ "login": "login", "logout": "logout", "ls": "ls", + "push": "push", "package": "package", "rollback": "rollback", "upgrade": "upgrade", @@ -214,7 +215,7 @@ "type": "string", "helpMarkDown": "ms-resource:loc.input.help.chartName", "defaultValue": "", - "visibleRule": "chartType == Name", + "visibleRule": "chartType == Name || command == create ", "required": "true", "groupName": "commands" }, @@ -224,7 +225,17 @@ "type": "filePath", "helpMarkDown": "ms-resource:loc.input.help.chartPath", "defaultValue": "", - "visibleRule": "chartType == FilePath || command == package", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "ms-resource:loc.input.label.remoteRepo", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.remoteRepo", + "defaultValue": "", + "visibleRule": "command == push", "required": "true", "groupName": "commands" }, @@ -246,7 +257,7 @@ "type": "string", "helpMarkDown": "ms-resource:loc.input.help.releaseName", "defaultValue": "", - "visibleRule": "command == install || command == upgrade", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", "groupName": "commands" }, { diff --git a/_generated/HelmDeployV1.versionmap.txt b/_generated/HelmDeployV1.versionmap.txt new file mode 100644 index 000000000000..f184b6b34104 --- /dev/null +++ b/_generated/HelmDeployV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.252.2 +Node20_229_3|1.252.3 diff --git a/_generated/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..419545e0304f --- /dev/null +++ b/_generated/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,112 @@ +{ + "loc.friendlyName": "Package and deploy Helm charts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "loc.description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes Cluster", + "loc.group.displayName.commands": "Commands", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.connectionType": "Connection Type", + "loc.input.help.connectionType": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "loc.input.label.azureSubscriptionEndpoint": "Azure subscription", + "loc.input.help.azureSubscriptionEndpoint": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Resource group", + "loc.input.help.azureResourceGroup": "Select an Azure Resource Group.", + "loc.input.label.kubernetesCluster": "Kubernetes cluster", + "loc.input.help.kubernetesCluster": "Select an Azure Managed Cluster.", + "loc.input.label.useClusterAdmin": "Use cluster admin credentials", + "loc.input.help.useClusterAdmin": "Use cluster administrator credentials instead of default cluster user credentials.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes Service Connection", + "loc.input.help.kubernetesServiceEndpoint": "Select a Kubernetes service connection.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure subscription for Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Resource group", + "loc.input.help.azureResourceGroupForACR": "Select an Azure Resource Group, which has your Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Select an Azure Container Registry which will be used for pushing helm charts.", + "loc.input.label.command": "Command", + "loc.input.help.command": "Select a helm command.", + "loc.input.label.chartType": "Chart Type", + "loc.input.help.chartType": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "loc.input.label.chartName": "Chart Name", + "loc.input.help.chartName": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chart Path", + "loc.input.help.chartPath": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "loc.input.label.remoteRepo": "Remote Repo", + "loc.input.help.remoteRepo": "The remote repository where the chart will be pushed.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "loc.input.label.releaseName": "Release Name", + "loc.input.help.releaseName": "Release name. If unspecified, it will autogenerate one for you.", + "loc.input.label.overrideValues": "Set Values", + "loc.input.help.overrideValues": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Value File", + "loc.input.help.valueFile": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Specify values in a YAML file or a URL.", + "loc.input.label.canaryimage": "Use canary image version.", + "loc.input.help.canaryimage": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "loc.input.label.upgradetiller": "Upgrade Tiller", + "loc.input.help.upgradetiller": "Upgrade if Tiller is already installed.", + "loc.input.label.updatedependency": "Update Dependency", + "loc.input.help.updatedependency": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "loc.input.label.save": "Save", + "loc.input.help.save": "Save packaged chart to local chart repository (default true)​", + "loc.input.label.install": "Install if release not present.", + "loc.input.help.install": "If a release by this name doesn't already exist, run an install​.", + "loc.input.label.recreate": "Recreate Pods.", + "loc.input.help.recreate": "Performs pods restart for the resource if applicable.", + "loc.input.label.resetValues": "Reset Values.", + "loc.input.help.resetValues": "Reset the values to the ones built into the chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Force resource update through delete/recreate if needed​", + "loc.input.label.waitForExecution": "Wait", + "loc.input.help.waitForExecution": "Block till command execution completes.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Helm command options.", + "loc.input.label.enableTls": "Enable TLS", + "loc.input.help.enableTls": "Enables using SSL between Helm and Tiller.", + "loc.input.label.caCert": "CA certificate", + "loc.input.help.caCert": "CA cert used to issue certificate for tiller and helm client.", + "loc.input.label.certificate": "Certificate", + "loc.input.help.certificate": "Specify Tiller certificate or Helm client certificate", + "loc.input.label.privatekey": "Key", + "loc.input.help.privatekey": "Specify Tiller Key or Helm client key", + "loc.input.label.tillernamespace": "Tiller namespace", + "loc.input.help.tillernamespace": "Specify K8 namespace of tiller.", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "loc.input.label.publishPipelineMetadata": "Publish pipeline metadata", + "loc.input.help.publishPipelineMetadata": "If this is true, the task will collect and publish deployment metadata", + "loc.input.label.chartNameForACR": "Chart Name For Azure Container Registry", + "loc.input.help.chartNameForACR": "Chart name with which the chart will be stored in Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chart Path for Azure Container Registry", + "loc.input.help.chartPathForACR": "Path to the chart directory.", + "loc.messages.CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig file path: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "loc.messages.ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "loc.messages.ClusterNotFound": "%s cluster does not exists", + "loc.messages.FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "loc.messages.RetryingRequest": "Retrying request after %s seconds.", + "loc.messages.PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "loc.messages.CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "loc.messages.PatternFoundInPath": "Pattern found in file path %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "loc.messages.SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "loc.messages.FileNotFound": "File not found at %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "loc.messages.PackageSupportedInHelmsV37Only": "Helm package to Azure Container Registry is only supported in Helms V3.7+.", + "loc.messages.OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "loc.messages.KubeloginFailed": "Kubelogin authentication failed. Exception: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1/package-lock.json b/_generated/HelmDeployV1/package-lock.json new file mode 100644 index 000000000000..596b989080b5 --- /dev/null +++ b/_generated/HelmDeployV1/package-lock.json @@ -0,0 +1,1267 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@azure/msal-common": { + "version": "13.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-13.3.1.tgz", + "integrity": "sha1-ASRlv5QNEjddxHOHt1TM+da5IYA=" + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha1-LAZOywsxKNg30nZKoLEXsP9uRYY=", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/mockery": { + "version": "1.4.30", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mockery/-/mockery-1.4.30.tgz", + "integrity": "sha512-uv53RrNdhbkV/3VmVCtfImfYCWC3GTTRn3R11Whni3EJ+gb178tkZBVNj2edLY5CMrB749dQi+SJkg87jsN8UQ==" + }, + "@types/node": { + "version": "16.18.39", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-16.18.39.tgz", + "integrity": "sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ==" + }, + "@types/node-forge": { + "version": "1.3.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-SWpOXtqCNKaDO4xY+ZHrU5ih7UeEeo6frW468B/G7eJ3d9t2r9Vi/9iLHUuuvdZdv5l2yvZ10R2NlY3cV/CuWQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "adm-zip": { + "version": "0.5.14", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/adm-zip/-/adm-zip-0.5.14.tgz", + "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "async-mutex": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha1-vM9VuW8rr435DteYy1VEofbuTCw=", + "requires": { + "tslib": "^2.4.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-devops-node-api": { + "version": "12.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-12.1.0.tgz", + "integrity": "sha512-VY+G45eNKVJfMIO0uyZfbi4PzUR8JHEfsHQjEUAXUGRkYhhBbhGHjy8cpiyYFxLXc3a4PL5cqgqqV/YD1SaCXg==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "requires": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.250.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.250.0.tgz", + "integrity": "sha1-3+Grbhv3dvaTSTOXcmd9QscYz7w=", + "requires": { + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^14.0.1", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^9.0.0", + "msalv1": "npm:@azure/msal-node@^1.18.4", + "msalv2": "npm:@azure/msal-node@^2.7.0", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^2.0.1", + "xml2js": "0.6.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.4.tgz", + "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=" + }, + "azure-devops-node-api": { + "version": "14.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-14.1.0.tgz", + "integrity": "sha1-7FOT3p+hRjmd6qtpBOQdoD7c4YA=", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "2.1.0" + } + }, + "msalv1": { + "version": "npm:@azure/msal-node@1.18.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-1.18.4.tgz", + "integrity": "sha1-ySGwRHyS+zsMsev1qadvytLsfCE=", + "requires": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, + "msalv2": { + "version": "npm:@azure/msal-node@2.16.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.16.2.tgz", + "integrity": "sha1-Prdo02iD6m+ak5wLW0Z7UY54//w=", + "requires": { + "@azure/msal-common": "14.16.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "dependencies": { + "@azure/msal-common": { + "version": "14.16.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.16.0.tgz", + "integrity": "sha1-80cPyux4jb5QhZlSzUmTQL2iPXo=" + } + } + }, + "typed-rest-client": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.1.0.tgz", + "integrity": "sha1-8Exs/KvGASwtA2uAbqrEVWBPFZg=", + "requires": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" + } + } + }, + "azure-pipelines-tasks-docker-common": { + "version": "2.242.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-docker-common/-/azure-pipelines-tasks-docker-common-2.242.0.tgz", + "integrity": "sha512-GkXAljKFJoHOp6sH4Jqii5btzAcJfRnck8UleT868iND64nX8o1zzbLbknAJGvduBS7bE+nEppb+Km5fAdBoYg==", + "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": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.242.2", + "del": "2.2.0", + "q": "1.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==" + } + } + }, + "azure-pipelines-tasks-kubernetes-common": { + "version": "2.224.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-kubernetes-common/-/azure-pipelines-tasks-kubernetes-common-2.224.1.tgz", + "integrity": "sha512-UwVeSD1hZcPW9Z4CwAuNp6wmczdBCoWOa0saVv0DNejGVbOi0Nu7xBl+J3/N8xhcLnkD5G00LDY29G69yZFXUA==", + "requires": { + "@types/mocha": "5.2.7", + "@types/node": "10.17.0", + "@types/node-forge": "^1.3.2", + "@types/uuid": "8.3.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "node-forge": "^1.3.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.0.tgz", + "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.219.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.219.0.tgz", + "integrity": "sha512-S+ec/Qdz9WYL9UbEFYWY2UFkVL2Es43GGcYYE9DhIfRuRZ02Wm2ycR29uSq3QVOQvO01daGJX3Y/ZFpRZerdfQ==", + "requires": { + "@types/mocha": "^5.2.7", + "@types/mockery": "^1.4.30", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0", + "mockery": "^2.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.225.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.225.0.tgz", + "integrity": "sha512-Na7g1+zcsQpYogyex457QT6o9EB2+WQYwLUXPiszhTdf83hKJUmDMqvl2qm/mHqYuP1zg5KkRfJaPy4/09M8pA==", + "requires": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tool-lib": "^2.0.0-preview", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-tool-lib": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.4.tgz", + "integrity": "sha512-LgAelZKJe3k/t3NsKSKzjeRviphns0w0p5tgwz8uHN70I9m2TToiOKl+fogrdXcM6+jiLBk5KTqrcRBqPpv/XA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "del": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/del/-/del-2.2.0.tgz", + "integrity": "sha1-mlDwS/NzJeKDtPROmFM2wlJFa9U=", + "requires": { + "globby": "^4.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "des.js": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha1-HTf1dm87v/Tuljjocah2jBc7gdo=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "globby": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/globby/-/globby-4.1.0.tgz", + "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha1-cCtx+1UgoTKmbeH2dUHZ5iFU2Cs=", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha1-6Ps/JClZ20TWO+Zl23qOc5U3oyw=" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-md4": { + "version": "0.3.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha1-zTs9wEWwxARVbIHdtXVsI+WdfPU=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha1-Zf+R9KvvF4RpfUCVK7GZjFBMqvM=", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.3.tgz", + "integrity": "sha1-mA97VVC8F1+03AlAMIVif56zMUM=" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jws/-/jws-3.2.2.tgz", + "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=" + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha512-nI2fKnmJWWFZF6SgMPe1iBodKhfpztLKJTtCtNYGhm/9QXmWa/Pk9Sv00qHgzEvNLe1x7hjGDRor7gcm/ChaIQ==", + "requires": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + }, + "dependencies": { + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sax/-/sax-1.4.1.tgz", + "integrity": "sha1-RMyJiDd/EmME07P8EBDHM7kp7w8=" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tslib": { + "version": "2.8.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha1-YS7+TtI11Wfoq6Xypfq3AoCt6D8=" + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/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" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha1-3QtjAIOqCcFh4lpNCQHisqkptJk=", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=" + } + } +} diff --git a/_generated/HelmDeployV1/src/helm.ts b/_generated/HelmDeployV1/src/helm.ts new file mode 100644 index 000000000000..2db5469c158b --- /dev/null +++ b/_generated/HelmDeployV1/src/helm.ts @@ -0,0 +1,260 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +import * as commonCommandOptions from "./commoncommandoption"; +import * as helmutil from "./utils" + +import { AKSCluster, AKSClusterAccessProfile, AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { WebRequest, WebResponse, sendRequest } from 'azure-pipelines-tasks-utility-common/restutilities'; +import { extractManifestsFromHelmOutput, getDeploymentMetadata, getManifestFileUrlsFromHelmOutput, getPublishDeploymentRequestUrl, isDeploymentEntity } from 'azure-pipelines-tasks-kubernetes-common/image-metadata-helper'; + +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { Kubelogin } from 'azure-pipelines-tasks-kubernetes-common/kubelogin'; +import helmcli from "./helmcli"; +import kubernetescli from "./kubernetescli" + +import fs = require('fs'); +import { fail } from 'assert'; + +const environmentVariableMaximumSize = 32766; + +tl.setResourcePath(path.join(__dirname, '..', 'task.json')); +tl.setResourcePath(path.join(__dirname, '../node_modules/azure-pipelines-tasks-azure-arm-rest/module.json')); + +function getKubeConfigFilePath(): string { + var userdir = helmutil.getTaskTempDir(); + return path.join(userdir, "config"); +} + +function getClusterType(): any { + var connectionType = tl.getInput("connectionType", true); + var endpoint = tl.getInput("azureSubscriptionEndpoint") + if (connectionType === "Azure Resource Manager" && endpoint) { + return require("azure-pipelines-tasks-azure-arm-rest/aksUtility") + } + + return require("./clusters/generickubernetescluster") +} + +function isKubConfigSetupRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && connectionType !== "None"; +} + +function isKubConfigLogoutRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "login" && connectionType !== "None"; +} + +// get kubeconfig file path +async function getKubeConfigFile(): Promise { + const connectionType = tl.getInput("connectionType", true) + const azureSubscriptionEndpoint : string = tl.getInput("azureSubscriptionEndpoint"); + let result + if (connectionType === "Azure Resource Manager" && azureSubscriptionEndpoint) { + const clusterName : string = tl.getInput("kubernetesCluster", true); + const resourceGroup : string = tl.getInput("azureResourceGroup", true); + const useClusterAdmin: boolean = tl.getBoolInput('useClusterAdmin'); + result = await getClusterType().getKubeConfig(azureSubscriptionEndpoint, resourceGroup, clusterName, useClusterAdmin) + } else { + result = await getClusterType().getKubeConfig() + } + let configFilePath = getKubeConfigFilePath(); + tl.debug(tl.loc("KubeConfigFilePath", configFilePath)); + fs.writeFileSync(configFilePath, result); + fs.chmodSync(configFilePath, '600'); + return configFilePath; +} + +async function run() { + var command = tl.getInput("command", true).toLowerCase(); + var connectionType = tl.getInput("connectionType", true); + var isKubConfigRequired = isKubConfigSetupRequired(command); + var kubectlCli: kubernetescli; + var externalAuth = connectionType === "None" && (command === "install" || command === "upgrade"); + if (externalAuth && !tl.getVariable("KUBECONFIG")) { + const kubeConfigPath = path.join(process.env.HOME, '.kube', 'config'); + if (fs.existsSync(kubeConfigPath)) { + tl.setVariable("KUBECONFIG", kubeConfigPath); + } else { + tl.error("KUBECONFIG kube configuration file path must be set when connectionType is none and command is install or upgrade."); + } + } + if (isKubConfigRequired || externalAuth) { + var kubeconfigfilePath = (command === "logout" || externalAuth) ? tl.getVariable("KUBECONFIG") : await getKubeConfigFile(); + kubectlCli = new kubernetescli(kubeconfigfilePath); + kubectlCli.login(); + } + + const kubelogin = new Kubelogin(helmutil.getTaskTempDir()); + if (kubelogin.isAvailable() && !externalAuth) { + tl.debug('Kubelogin is installed. Converting kubeconfig.'); + const serviceConnection: string = tl.getInput('azureSubscriptionEndpoint', false); + try { + await kubelogin.login(serviceConnection); + } catch (err) { + tl.debug(tl.loc('KubeloginFailed', err)); + } + } + + var helmCli: helmcli = new helmcli(); + helmCli.login(); + var telemetry = { + connectionType: connectionType, + command: command, + jobId: tl.getVariable('SYSTEM_JOBID') + }; + var failOnStderr = tl.getBoolInput("failOnStderr"); + + console.log("##vso[telemetry.publish area=%s;feature=%s]%s", + "TaskEndpointId", + "HelmDeployV1", + JSON.stringify(telemetry)); + + try { + switch (command) { + case "login": + kubectlCli.setKubeConfigEnvVariable(); + break; + case "logout": + kubectlCli.unsetKubeConfigEnvVariable(); + break; + default: + await runHelm(helmCli, command, kubectlCli, failOnStderr); + } + } catch (err) { + // not throw error so that we can logout from helm and kubernetes + tl.setResult(tl.TaskResult.Failed, err.message); + } + finally { + if (isKubConfigLogoutRequired(command)) { + kubectlCli.logout(); + } + + helmCli.logout(); + } +} + +async function runHelm(helmCli: helmcli, command: string, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + var helmCommandMap = { + "init": "./helmcommands/helminit", + "install": "./helmcommands/helminstall", + "package": "./helmcommands/helmpackage", + "push": "./helmcommands/helmpush", + "registry": "./helmcommands/helmregistrylogin", + "upgrade": "./helmcommands/helmupgrade", + "rollback": "./helmcommands/helmrollback", + "uninstall": "./helmcommands/helmuninstall", + "delete": "./helmcommands/helmuninstall", + "create": "./helmcommands/helmcreate", + } + + var commandImplementation = require("./helmcommands/uinotimplementedcommands"); + if (command in helmCommandMap) { + commandImplementation = require(helmCommandMap[command]); + } + + //set command + helmCli.setCommand(command); + + // add arguments + commonCommandOptions.addArguments(helmCli); + await commandImplementation.addArguments(helmCli); + + const execResult = helmCli.execHelmCommand(); + tl.setVariable('helmExitCode', execResult.code.toString()); + + if (execResult.stdout) { + var commandOutputLength = execResult.stdout.length; + if (commandOutputLength > environmentVariableMaximumSize) { + tl.warning(tl.loc('OutputVariableDataSizeExceeded', commandOutputLength, environmentVariableMaximumSize)); + } else { + tl.setVariable("helmOutput", execResult.stdout); + } + } + + var publishPipelineMetadata = tl.getBoolInput("publishPipelineMetadata"); + + if (execResult.code != tl.TaskResult.Succeeded || !!execResult.error || (failOnStderr && !!execResult.stderr)) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else if (publishPipelineMetadata && (command === "install" || command === "upgrade")) { + try { + let output = execResult.stdout; + let releaseName = helmutil.extractReleaseNameFromHelmOutput(output); + let manifests = helmutil.getManifestsFromRelease(helmCli, releaseName); + if (manifests && manifests.length > 0) { + const manifestUrls = getManifestFileUrlsFromHelmOutput(output); + const allPods = JSON.parse(kubectlCli.getAllPods().stdout); + const clusterInfo = kubectlCli.getClusterInfo().stdout; + + manifests.forEach(manifest => { + //Check if the manifest object contains a deployment entity + if (manifest.kind && isDeploymentEntity(manifest.kind)) { + try { + pushDeploymentDataToEvidenceStore(allPods, clusterInfo, manifest, manifestUrls).then((result) => { + tl.debug("DeploymentDetailsApiResponse: " + JSON.stringify(result)); + }, (error) => { + tl.warning("publishToImageMetadataStore failed with error: " + error); + }); + } + catch (e) { + tl.warning("publishToImageMetadataStore failed with error: " + e); + } + } + }); + } + } + catch (e) { + tl.error("Capturing deployment metadata failed with error: " + e); + } + } +} + +run().then(() => { + // do nothing +}, (reason) => { + tl.setResult(tl.TaskResult.Failed, reason); +}); + +async function pushDeploymentDataToEvidenceStore(allPods: any, clusterInfo: any, deploymentObject: any, manifestUrls: string[]): Promise { + const metadata = getDeploymentMetadata(deploymentObject, allPods, "None", clusterInfo, manifestUrls); + const requestUrl = getPublishDeploymentRequestUrl(); + const request = new WebRequest(); + const accessToken: string = tl.getEndpointAuthorizationParameter('SYSTEMVSSCONNECTION', 'ACCESSTOKEN', false); + + request.uri = requestUrl; + request.method = 'POST'; + request.body = JSON.stringify(metadata); + request.headers = { + "Content-Type": "application/json", + "Authorization": "Bearer " + accessToken + }; + + tl.debug("requestUrl: " + requestUrl); + tl.debug("requestBody: " + JSON.stringify(metadata)); + + try { + tl.debug("Sending request for pushing deployment data to Image meta data store"); + const response = await sendRequest(request); + return response; + } + catch (error) { + tl.debug("Unable to push to deployment details to Artifact Store, Error: " + error); + } + + return Promise.resolve(); +} + +function getHelmChartRef(helmOutput: string): string { + const refMarker = "ref:"; + const refIndex = helmOutput.indexOf(refMarker); + const lineEndingIndex = helmOutput.indexOf("\n", refIndex); + let helmRef = helmOutput.substring(refIndex + refMarker.length, lineEndingIndex); + helmRef.trim(); + return helmRef; +} diff --git a/_generated/HelmDeployV1/src/helmcommands/helmcreate.ts b/_generated/HelmDeployV1/src/helmcommands/helmcreate.ts new file mode 100644 index 000000000000..c9a659327bb1 --- /dev/null +++ b/_generated/HelmDeployV1/src/helmcommands/helmcreate.ts @@ -0,0 +1,11 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var chartName = tl.getInput("chartName", true); + + helmCli.addArgument(chartName); +} diff --git a/_generated/HelmDeployV1/src/helmcommands/helmpush.ts b/_generated/HelmDeployV1/src/helmcommands/helmpush.ts new file mode 100644 index 000000000000..1977fd957355 --- /dev/null +++ b/_generated/HelmDeployV1/src/helmcommands/helmpush.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Pushes a helm chart to ACR +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.setCommand("push"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); + helmCli.addArgument(tl.getInput("chartPath" , true)); + helmCli.addArgument(tl.getInput("remoteRepo" , true)); + +} \ No newline at end of file diff --git a/_generated/HelmDeployV1/src/helmcommands/helmrollback.ts b/_generated/HelmDeployV1/src/helmcommands/helmrollback.ts new file mode 100644 index 000000000000..96f629d6b129 --- /dev/null +++ b/_generated/HelmDeployV1/src/helmcommands/helmrollback.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace", true); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } +} diff --git a/_generated/HelmDeployV1/src/helmcommands/helmuninstall.ts b/_generated/HelmDeployV1/src/helmcommands/helmuninstall.ts new file mode 100644 index 000000000000..12b40e446ed1 --- /dev/null +++ b/_generated/HelmDeployV1/src/helmcommands/helmuninstall.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli): Promise { + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace" , false); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + +} diff --git a/_generated/HelmDeployV1/task.json b/_generated/HelmDeployV1/task.json new file mode 100644 index 000000000000..b7f7a37b486c --- /dev/null +++ b/_generated/HelmDeployV1/task.json @@ -0,0 +1,579 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "Package and deploy Helm charts", + "description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 252, + "Patch": 2 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "Kubernetes Cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package" + }, + { + "name": "commands", + "displayName": "Commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "Azure Container Registry", + "isExpanded": true, + "visibleRule": "command == login || command == package || command == push" + }, + { + "name": "tls", + "displayName": "TLS", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "Connection Type", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "Kubernetes cluster", + "type": "pickList", + "helpMarkDown": "Select an Azure Managed Cluster.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "Use cluster admin credentials", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "Use cluster administrator credentials instead of default cluster user credentials." + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "Kubernetes Service Connection", + "helpMarkDown": "Select a Kubernetes service connection.", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "Namespace", + "type": "string", + "helpMarkDown": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription for Container Registry", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group, which has your Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "Azure Container Registry", + "type": "pickList", + "helpMarkDown": "Select an Azure Container Registry which will be used for pushing helm charts.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "Command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "push": "push", + "package": "package", + "rollback": "rollback", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "Select a helm command.", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "Chart Type", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "Chart Name", + "type": "string", + "helpMarkDown": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "defaultValue": "", + "visibleRule": "chartType == Name || command == create ", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "Chart Path", + "type": "filePath", + "helpMarkDown": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "Remote Repo", + "type": "string", + "helpMarkDown": "The remote repository where the chart will be pushed.", + "defaultValue": "", + "visibleRule": "command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "Version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "Release Name", + "type": "string", + "helpMarkDown": "Release name. If unspecified, it will autogenerate one for you.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "Set Values", + "type": "string", + "helpMarkDown": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "Value File", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "Destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "Specify values in a YAML file or a URL.", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "Use canary image version.", + "defaultValue": "false", + "helpMarkDown": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "Upgrade Tiller", + "defaultValue": "true", + "helpMarkDown": "Upgrade if Tiller is already installed.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "Update Dependency", + "defaultValue": "false", + "helpMarkDown": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "Save", + "defaultValue": "true", + "helpMarkDown": "Save packaged chart to local chart repository (default true)​", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "Install if release not present.", + "defaultValue": "true", + "helpMarkDown": "If a release by this name doesn't already exist, run an install​.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "Recreate Pods.", + "defaultValue": "false", + "helpMarkDown": "Performs pods restart for the resource if applicable.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "Reset Values.", + "defaultValue": "false", + "helpMarkDown": "Reset the values to the ones built into the chart.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "Force", + "defaultValue": "false", + "helpMarkDown": "Force resource update through delete/recreate if needed​", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "Wait", + "defaultValue": "true", + "helpMarkDown": "Block till command execution completes.", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "Arguments", + "helpMarkDown": "Helm command options.", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "Enable TLS", + "defaultValue": "false", + "helpMarkDown": "Enables using SSL between Helm and Tiller.", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "CA certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "CA cert used to issue certificate for tiller and helm client.", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "Certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller certificate or Helm client certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "Key", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller Key or Helm client key", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "Tiller namespace", + "helpMarkDown": "Specify K8 namespace of tiller.", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "helpMarkDown": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "Publish pipeline metadata", + "defaultValue": "true", + "helpMarkDown": "If this is true, the task will collect and publish deployment metadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "Chart Name For Azure Container Registry", + "type": "string", + "helpMarkDown": "Chart name with which the chart will be stored in Azure Container Registry.", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "Chart Path for Azure Container Registry", + "type": "filePath", + "helpMarkDown": "Path to the chart directory.", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?$skipToken={{{skipToken}}}&api-version=2017-08-31", + "callbackContextTemplate": "{\"skipToken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skipToken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skipToken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "helm $(command)", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + } + }, + "messages": { + "CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "KubeConfigFilePath": "Kubeconfig file path: %s", + "KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "ClusterNotFound": "%s cluster does not exists", + "FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "RetryingRequest": "Retrying request after %s seconds.", + "PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "PatternFoundInPath": "Pattern found in file path %s.", + "CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "FileNotFound": "File not found at %s", + "KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "PackageSupportedInHelmsV37Only": "Helm package to Azure Container Registry is only supported in Helms V3.7+.", + "OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "KubeloginFailed": "Kubelogin authentication failed. Exception: %s" + }, + "_buildConfigMapping": { + "Default": "1.252.2", + "LocalPackages": "1.249.4", + "Node20_229_3": "1.252.3" + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1/task.loc.json b/_generated/HelmDeployV1/task.loc.json new file mode 100644 index 000000000000..ad0ed94cc59e --- /dev/null +++ b/_generated/HelmDeployV1/task.loc.json @@ -0,0 +1,579 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 252, + "Patch": 2 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "ms-resource:loc.group.displayName.cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package" + }, + { + "name": "commands", + "displayName": "ms-resource:loc.group.displayName.commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "ms-resource:loc.group.displayName.azureContainerRegistry", + "isExpanded": true, + "visibleRule": "command == login || command == package || command == push" + }, + { + "name": "tls", + "displayName": "ms-resource:loc.group.displayName.tls", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.connectionType", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "ms-resource:loc.input.help.connectionType", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpoint", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "ms-resource:loc.input.label.azureResourceGroup", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroup", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "ms-resource:loc.input.label.kubernetesCluster", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesCluster", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "ms-resource:loc.input.label.useClusterAdmin", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "ms-resource:loc.input.help.useClusterAdmin" + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "ms-resource:loc.input.label.kubernetesServiceEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesServiceEndpoint", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "ms-resource:loc.input.label.namespace", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.namespace", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpointForACR", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpointForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "ms-resource:loc.input.label.azureResourceGroupForACR", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroupForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "ms-resource:loc.input.label.azureContainerRegistry", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureContainerRegistry", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "ms-resource:loc.input.label.command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "push": "push", + "package": "package", + "rollback": "rollback", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "ms-resource:loc.input.help.command", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "ms-resource:loc.input.label.chartType", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "ms-resource:loc.input.help.chartType", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "ms-resource:loc.input.label.chartName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartName", + "defaultValue": "", + "visibleRule": "chartType == Name || command == create ", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "ms-resource:loc.input.label.chartPath", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPath", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "ms-resource:loc.input.label.remoteRepo", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.remoteRepo", + "defaultValue": "", + "visibleRule": "command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "ms-resource:loc.input.label.version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.version", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "ms-resource:loc.input.label.releaseName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.releaseName", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "ms-resource:loc.input.label.overrideValues", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.overrideValues", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "ms-resource:loc.input.label.valueFile", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.valueFile", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "ms-resource:loc.input.label.destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "ms-resource:loc.input.help.destination", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.canaryimage", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.canaryimage", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.upgradetiller", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.upgradetiller", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.updatedependency", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.updatedependency", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "ms-resource:loc.input.label.save", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.save", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "ms-resource:loc.input.label.install", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.install", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "ms-resource:loc.input.label.recreate", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.recreate", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "ms-resource:loc.input.label.resetValues", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.resetValues", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "ms-resource:loc.input.label.force", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.force", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "ms-resource:loc.input.label.waitForExecution", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.waitForExecution", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "ms-resource:loc.input.label.arguments", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableTls", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.enableTls", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "ms-resource:loc.input.label.caCert", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.caCert", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "ms-resource:loc.input.label.certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "ms-resource:loc.input.label.privatekey", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.privatekey", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "ms-resource:loc.input.label.tillernamespace", + "helpMarkDown": "ms-resource:loc.input.help.tillernamespace", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishPipelineMetadata", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.publishPipelineMetadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "ms-resource:loc.input.label.chartNameForACR", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartNameForACR", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "ms-resource:loc.input.label.chartPathForACR", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPathForACR", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?$skipToken={{{skipToken}}}&api-version=2017-08-31", + "callbackContextTemplate": "{\"skipToken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skipToken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skipToken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + } + }, + "messages": { + "CantDownloadAccessProfile": "ms-resource:loc.messages.CantDownloadAccessProfile", + "KubeConfigFilePath": "ms-resource:loc.messages.KubeConfigFilePath", + "KubernetesClusterInfo": "ms-resource:loc.messages.KubernetesClusterInfo", + "KubernetesClusterResourceGroup": "ms-resource:loc.messages.KubernetesClusterResourceGroup", + "ClusterNotProvisioned": "ms-resource:loc.messages.ClusterNotProvisioned", + "ClusterNotFound": "ms-resource:loc.messages.ClusterNotFound", + "FailedToListClusters": "ms-resource:loc.messages.FailedToListClusters", + "RetryingRequest": "ms-resource:loc.messages.RetryingRequest", + "PatternNotFoundInFilePath": "ms-resource:loc.messages.PatternNotFoundInFilePath", + "CantResolvePatternInPath": "ms-resource:loc.messages.CantResolvePatternInPath", + "PatternFoundInPath": "ms-resource:loc.messages.PatternFoundInPath", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "SkipDeleteSecureFiles": "ms-resource:loc.messages.SkipDeleteSecureFiles", + "SkipDownloadSecureFiles": "ms-resource:loc.messages.SkipDownloadSecureFiles", + "FileNotFound": "ms-resource:loc.messages.FileNotFound", + "KubernetesServiceConnectionNotFound": "ms-resource:loc.messages.KubernetesServiceConnectionNotFound", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "SaveSupportedInHelmsV3Only": "ms-resource:loc.messages.SaveSupportedInHelmsV3Only", + "PackageSupportedInHelmsV37Only": "ms-resource:loc.messages.PackageSupportedInHelmsV37Only", + "OutputVariableDataSizeExceeded": "ms-resource:loc.messages.OutputVariableDataSizeExceeded", + "KubeloginFailed": "ms-resource:loc.messages.KubeloginFailed" + }, + "_buildConfigMapping": { + "Default": "1.252.2", + "LocalPackages": "1.249.4", + "Node20_229_3": "1.252.3" + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..419545e0304f --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,112 @@ +{ + "loc.friendlyName": "Package and deploy Helm charts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "loc.description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes Cluster", + "loc.group.displayName.commands": "Commands", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.connectionType": "Connection Type", + "loc.input.help.connectionType": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "loc.input.label.azureSubscriptionEndpoint": "Azure subscription", + "loc.input.help.azureSubscriptionEndpoint": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Resource group", + "loc.input.help.azureResourceGroup": "Select an Azure Resource Group.", + "loc.input.label.kubernetesCluster": "Kubernetes cluster", + "loc.input.help.kubernetesCluster": "Select an Azure Managed Cluster.", + "loc.input.label.useClusterAdmin": "Use cluster admin credentials", + "loc.input.help.useClusterAdmin": "Use cluster administrator credentials instead of default cluster user credentials.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes Service Connection", + "loc.input.help.kubernetesServiceEndpoint": "Select a Kubernetes service connection.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure subscription for Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Resource group", + "loc.input.help.azureResourceGroupForACR": "Select an Azure Resource Group, which has your Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Select an Azure Container Registry which will be used for pushing helm charts.", + "loc.input.label.command": "Command", + "loc.input.help.command": "Select a helm command.", + "loc.input.label.chartType": "Chart Type", + "loc.input.help.chartType": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "loc.input.label.chartName": "Chart Name", + "loc.input.help.chartName": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chart Path", + "loc.input.help.chartPath": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "loc.input.label.remoteRepo": "Remote Repo", + "loc.input.help.remoteRepo": "The remote repository where the chart will be pushed.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "loc.input.label.releaseName": "Release Name", + "loc.input.help.releaseName": "Release name. If unspecified, it will autogenerate one for you.", + "loc.input.label.overrideValues": "Set Values", + "loc.input.help.overrideValues": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Value File", + "loc.input.help.valueFile": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Specify values in a YAML file or a URL.", + "loc.input.label.canaryimage": "Use canary image version.", + "loc.input.help.canaryimage": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "loc.input.label.upgradetiller": "Upgrade Tiller", + "loc.input.help.upgradetiller": "Upgrade if Tiller is already installed.", + "loc.input.label.updatedependency": "Update Dependency", + "loc.input.help.updatedependency": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "loc.input.label.save": "Save", + "loc.input.help.save": "Save packaged chart to local chart repository (default true)​", + "loc.input.label.install": "Install if release not present.", + "loc.input.help.install": "If a release by this name doesn't already exist, run an install​.", + "loc.input.label.recreate": "Recreate Pods.", + "loc.input.help.recreate": "Performs pods restart for the resource if applicable.", + "loc.input.label.resetValues": "Reset Values.", + "loc.input.help.resetValues": "Reset the values to the ones built into the chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Force resource update through delete/recreate if needed​", + "loc.input.label.waitForExecution": "Wait", + "loc.input.help.waitForExecution": "Block till command execution completes.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Helm command options.", + "loc.input.label.enableTls": "Enable TLS", + "loc.input.help.enableTls": "Enables using SSL between Helm and Tiller.", + "loc.input.label.caCert": "CA certificate", + "loc.input.help.caCert": "CA cert used to issue certificate for tiller and helm client.", + "loc.input.label.certificate": "Certificate", + "loc.input.help.certificate": "Specify Tiller certificate or Helm client certificate", + "loc.input.label.privatekey": "Key", + "loc.input.help.privatekey": "Specify Tiller Key or Helm client key", + "loc.input.label.tillernamespace": "Tiller namespace", + "loc.input.help.tillernamespace": "Specify K8 namespace of tiller.", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "loc.input.label.publishPipelineMetadata": "Publish pipeline metadata", + "loc.input.help.publishPipelineMetadata": "If this is true, the task will collect and publish deployment metadata", + "loc.input.label.chartNameForACR": "Chart Name For Azure Container Registry", + "loc.input.help.chartNameForACR": "Chart name with which the chart will be stored in Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chart Path for Azure Container Registry", + "loc.input.help.chartPathForACR": "Path to the chart directory.", + "loc.messages.CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig file path: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "loc.messages.ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "loc.messages.ClusterNotFound": "%s cluster does not exists", + "loc.messages.FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "loc.messages.RetryingRequest": "Retrying request after %s seconds.", + "loc.messages.PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "loc.messages.CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "loc.messages.PatternFoundInPath": "Pattern found in file path %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "loc.messages.SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "loc.messages.FileNotFound": "File not found at %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "loc.messages.PackageSupportedInHelmsV37Only": "Helm package to Azure Container Registry is only supported in Helms V3.7+.", + "loc.messages.OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "loc.messages.KubeloginFailed": "Kubelogin authentication failed. Exception: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helm.ts b/_generated/HelmDeployV1_Node20/src/helm.ts new file mode 100644 index 000000000000..2db5469c158b --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helm.ts @@ -0,0 +1,260 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +import * as commonCommandOptions from "./commoncommandoption"; +import * as helmutil from "./utils" + +import { AKSCluster, AKSClusterAccessProfile, AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { WebRequest, WebResponse, sendRequest } from 'azure-pipelines-tasks-utility-common/restutilities'; +import { extractManifestsFromHelmOutput, getDeploymentMetadata, getManifestFileUrlsFromHelmOutput, getPublishDeploymentRequestUrl, isDeploymentEntity } from 'azure-pipelines-tasks-kubernetes-common/image-metadata-helper'; + +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { Kubelogin } from 'azure-pipelines-tasks-kubernetes-common/kubelogin'; +import helmcli from "./helmcli"; +import kubernetescli from "./kubernetescli" + +import fs = require('fs'); +import { fail } from 'assert'; + +const environmentVariableMaximumSize = 32766; + +tl.setResourcePath(path.join(__dirname, '..', 'task.json')); +tl.setResourcePath(path.join(__dirname, '../node_modules/azure-pipelines-tasks-azure-arm-rest/module.json')); + +function getKubeConfigFilePath(): string { + var userdir = helmutil.getTaskTempDir(); + return path.join(userdir, "config"); +} + +function getClusterType(): any { + var connectionType = tl.getInput("connectionType", true); + var endpoint = tl.getInput("azureSubscriptionEndpoint") + if (connectionType === "Azure Resource Manager" && endpoint) { + return require("azure-pipelines-tasks-azure-arm-rest/aksUtility") + } + + return require("./clusters/generickubernetescluster") +} + +function isKubConfigSetupRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && connectionType !== "None"; +} + +function isKubConfigLogoutRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "login" && connectionType !== "None"; +} + +// get kubeconfig file path +async function getKubeConfigFile(): Promise { + const connectionType = tl.getInput("connectionType", true) + const azureSubscriptionEndpoint : string = tl.getInput("azureSubscriptionEndpoint"); + let result + if (connectionType === "Azure Resource Manager" && azureSubscriptionEndpoint) { + const clusterName : string = tl.getInput("kubernetesCluster", true); + const resourceGroup : string = tl.getInput("azureResourceGroup", true); + const useClusterAdmin: boolean = tl.getBoolInput('useClusterAdmin'); + result = await getClusterType().getKubeConfig(azureSubscriptionEndpoint, resourceGroup, clusterName, useClusterAdmin) + } else { + result = await getClusterType().getKubeConfig() + } + let configFilePath = getKubeConfigFilePath(); + tl.debug(tl.loc("KubeConfigFilePath", configFilePath)); + fs.writeFileSync(configFilePath, result); + fs.chmodSync(configFilePath, '600'); + return configFilePath; +} + +async function run() { + var command = tl.getInput("command", true).toLowerCase(); + var connectionType = tl.getInput("connectionType", true); + var isKubConfigRequired = isKubConfigSetupRequired(command); + var kubectlCli: kubernetescli; + var externalAuth = connectionType === "None" && (command === "install" || command === "upgrade"); + if (externalAuth && !tl.getVariable("KUBECONFIG")) { + const kubeConfigPath = path.join(process.env.HOME, '.kube', 'config'); + if (fs.existsSync(kubeConfigPath)) { + tl.setVariable("KUBECONFIG", kubeConfigPath); + } else { + tl.error("KUBECONFIG kube configuration file path must be set when connectionType is none and command is install or upgrade."); + } + } + if (isKubConfigRequired || externalAuth) { + var kubeconfigfilePath = (command === "logout" || externalAuth) ? tl.getVariable("KUBECONFIG") : await getKubeConfigFile(); + kubectlCli = new kubernetescli(kubeconfigfilePath); + kubectlCli.login(); + } + + const kubelogin = new Kubelogin(helmutil.getTaskTempDir()); + if (kubelogin.isAvailable() && !externalAuth) { + tl.debug('Kubelogin is installed. Converting kubeconfig.'); + const serviceConnection: string = tl.getInput('azureSubscriptionEndpoint', false); + try { + await kubelogin.login(serviceConnection); + } catch (err) { + tl.debug(tl.loc('KubeloginFailed', err)); + } + } + + var helmCli: helmcli = new helmcli(); + helmCli.login(); + var telemetry = { + connectionType: connectionType, + command: command, + jobId: tl.getVariable('SYSTEM_JOBID') + }; + var failOnStderr = tl.getBoolInput("failOnStderr"); + + console.log("##vso[telemetry.publish area=%s;feature=%s]%s", + "TaskEndpointId", + "HelmDeployV1", + JSON.stringify(telemetry)); + + try { + switch (command) { + case "login": + kubectlCli.setKubeConfigEnvVariable(); + break; + case "logout": + kubectlCli.unsetKubeConfigEnvVariable(); + break; + default: + await runHelm(helmCli, command, kubectlCli, failOnStderr); + } + } catch (err) { + // not throw error so that we can logout from helm and kubernetes + tl.setResult(tl.TaskResult.Failed, err.message); + } + finally { + if (isKubConfigLogoutRequired(command)) { + kubectlCli.logout(); + } + + helmCli.logout(); + } +} + +async function runHelm(helmCli: helmcli, command: string, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + var helmCommandMap = { + "init": "./helmcommands/helminit", + "install": "./helmcommands/helminstall", + "package": "./helmcommands/helmpackage", + "push": "./helmcommands/helmpush", + "registry": "./helmcommands/helmregistrylogin", + "upgrade": "./helmcommands/helmupgrade", + "rollback": "./helmcommands/helmrollback", + "uninstall": "./helmcommands/helmuninstall", + "delete": "./helmcommands/helmuninstall", + "create": "./helmcommands/helmcreate", + } + + var commandImplementation = require("./helmcommands/uinotimplementedcommands"); + if (command in helmCommandMap) { + commandImplementation = require(helmCommandMap[command]); + } + + //set command + helmCli.setCommand(command); + + // add arguments + commonCommandOptions.addArguments(helmCli); + await commandImplementation.addArguments(helmCli); + + const execResult = helmCli.execHelmCommand(); + tl.setVariable('helmExitCode', execResult.code.toString()); + + if (execResult.stdout) { + var commandOutputLength = execResult.stdout.length; + if (commandOutputLength > environmentVariableMaximumSize) { + tl.warning(tl.loc('OutputVariableDataSizeExceeded', commandOutputLength, environmentVariableMaximumSize)); + } else { + tl.setVariable("helmOutput", execResult.stdout); + } + } + + var publishPipelineMetadata = tl.getBoolInput("publishPipelineMetadata"); + + if (execResult.code != tl.TaskResult.Succeeded || !!execResult.error || (failOnStderr && !!execResult.stderr)) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else if (publishPipelineMetadata && (command === "install" || command === "upgrade")) { + try { + let output = execResult.stdout; + let releaseName = helmutil.extractReleaseNameFromHelmOutput(output); + let manifests = helmutil.getManifestsFromRelease(helmCli, releaseName); + if (manifests && manifests.length > 0) { + const manifestUrls = getManifestFileUrlsFromHelmOutput(output); + const allPods = JSON.parse(kubectlCli.getAllPods().stdout); + const clusterInfo = kubectlCli.getClusterInfo().stdout; + + manifests.forEach(manifest => { + //Check if the manifest object contains a deployment entity + if (manifest.kind && isDeploymentEntity(manifest.kind)) { + try { + pushDeploymentDataToEvidenceStore(allPods, clusterInfo, manifest, manifestUrls).then((result) => { + tl.debug("DeploymentDetailsApiResponse: " + JSON.stringify(result)); + }, (error) => { + tl.warning("publishToImageMetadataStore failed with error: " + error); + }); + } + catch (e) { + tl.warning("publishToImageMetadataStore failed with error: " + e); + } + } + }); + } + } + catch (e) { + tl.error("Capturing deployment metadata failed with error: " + e); + } + } +} + +run().then(() => { + // do nothing +}, (reason) => { + tl.setResult(tl.TaskResult.Failed, reason); +}); + +async function pushDeploymentDataToEvidenceStore(allPods: any, clusterInfo: any, deploymentObject: any, manifestUrls: string[]): Promise { + const metadata = getDeploymentMetadata(deploymentObject, allPods, "None", clusterInfo, manifestUrls); + const requestUrl = getPublishDeploymentRequestUrl(); + const request = new WebRequest(); + const accessToken: string = tl.getEndpointAuthorizationParameter('SYSTEMVSSCONNECTION', 'ACCESSTOKEN', false); + + request.uri = requestUrl; + request.method = 'POST'; + request.body = JSON.stringify(metadata); + request.headers = { + "Content-Type": "application/json", + "Authorization": "Bearer " + accessToken + }; + + tl.debug("requestUrl: " + requestUrl); + tl.debug("requestBody: " + JSON.stringify(metadata)); + + try { + tl.debug("Sending request for pushing deployment data to Image meta data store"); + const response = await sendRequest(request); + return response; + } + catch (error) { + tl.debug("Unable to push to deployment details to Artifact Store, Error: " + error); + } + + return Promise.resolve(); +} + +function getHelmChartRef(helmOutput: string): string { + const refMarker = "ref:"; + const refIndex = helmOutput.indexOf(refMarker); + const lineEndingIndex = helmOutput.indexOf("\n", refIndex); + let helmRef = helmOutput.substring(refIndex + refMarker.length, lineEndingIndex); + helmRef.trim(); + return helmRef; +} diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmcreate.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmcreate.ts new file mode 100644 index 000000000000..c9a659327bb1 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmcreate.ts @@ -0,0 +1,11 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var chartName = tl.getInput("chartName", true); + + helmCli.addArgument(chartName); +} diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmpush.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmpush.ts new file mode 100644 index 000000000000..1977fd957355 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmpush.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Pushes a helm chart to ACR +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.setCommand("push"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); + helmCli.addArgument(tl.getInput("chartPath" , true)); + helmCli.addArgument(tl.getInput("remoteRepo" , true)); + +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmrollback.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmrollback.ts new file mode 100644 index 000000000000..96f629d6b129 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmrollback.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli) : Promise { + + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace", true); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } +} diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmuninstall.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmuninstall.ts new file mode 100644 index 000000000000..12b40e446ed1 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmuninstall.ts @@ -0,0 +1,16 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +export async function addArguments(helmCli: helmcli): Promise { + var releaseName = tl.getInput("releaseName", true); + var namespace = tl.getInput("namespace" , false); + + helmCli.addArgument(releaseName); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + +} diff --git a/_generated/HelmDeployV1_Node20/task.json b/_generated/HelmDeployV1_Node20/task.json new file mode 100644 index 000000000000..49fed2f27705 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/task.json @@ -0,0 +1,591 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "Package and deploy Helm charts", + "description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 252, + "Patch": 3 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "Kubernetes Cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package" + }, + { + "name": "commands", + "displayName": "Commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "Azure Container Registry", + "isExpanded": true, + "visibleRule": "command == login || command == package || command == push" + }, + { + "name": "tls", + "displayName": "TLS", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "Connection Type", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "Kubernetes cluster", + "type": "pickList", + "helpMarkDown": "Select an Azure Managed Cluster.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "Use cluster admin credentials", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "Use cluster administrator credentials instead of default cluster user credentials." + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "Kubernetes Service Connection", + "helpMarkDown": "Select a Kubernetes service connection.", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "Namespace", + "type": "string", + "helpMarkDown": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription for Container Registry", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group, which has your Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "Azure Container Registry", + "type": "pickList", + "helpMarkDown": "Select an Azure Container Registry which will be used for pushing helm charts.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "Command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "push": "push", + "package": "package", + "rollback": "rollback", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "Select a helm command.", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "Chart Type", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "Chart Name", + "type": "string", + "helpMarkDown": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "defaultValue": "", + "visibleRule": "chartType == Name || command == create ", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "Chart Path", + "type": "filePath", + "helpMarkDown": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "Remote Repo", + "type": "string", + "helpMarkDown": "The remote repository where the chart will be pushed.", + "defaultValue": "", + "visibleRule": "command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "Version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "Release Name", + "type": "string", + "helpMarkDown": "Release name. If unspecified, it will autogenerate one for you.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "Set Values", + "type": "string", + "helpMarkDown": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "Value File", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "Destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "Specify values in a YAML file or a URL.", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "Use canary image version.", + "defaultValue": "false", + "helpMarkDown": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "Upgrade Tiller", + "defaultValue": "true", + "helpMarkDown": "Upgrade if Tiller is already installed.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "Update Dependency", + "defaultValue": "false", + "helpMarkDown": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "Save", + "defaultValue": "true", + "helpMarkDown": "Save packaged chart to local chart repository (default true)​", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "Install if release not present.", + "defaultValue": "true", + "helpMarkDown": "If a release by this name doesn't already exist, run an install​.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "Recreate Pods.", + "defaultValue": "false", + "helpMarkDown": "Performs pods restart for the resource if applicable.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "Reset Values.", + "defaultValue": "false", + "helpMarkDown": "Reset the values to the ones built into the chart.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "Force", + "defaultValue": "false", + "helpMarkDown": "Force resource update through delete/recreate if needed​", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "Wait", + "defaultValue": "true", + "helpMarkDown": "Block till command execution completes.", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "Arguments", + "helpMarkDown": "Helm command options.", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "Enable TLS", + "defaultValue": "false", + "helpMarkDown": "Enables using SSL between Helm and Tiller.", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "CA certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "CA cert used to issue certificate for tiller and helm client.", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "Certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller certificate or Helm client certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "Key", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller Key or Helm client key", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "Tiller namespace", + "helpMarkDown": "Specify K8 namespace of tiller.", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "helpMarkDown": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "Publish pipeline metadata", + "defaultValue": "true", + "helpMarkDown": "If this is true, the task will collect and publish deployment metadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "Chart Name For Azure Container Registry", + "type": "string", + "helpMarkDown": "Chart name with which the chart will be stored in Azure Container Registry.", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "Chart Path for Azure Container Registry", + "type": "filePath", + "helpMarkDown": "Path to the chart directory.", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?$skipToken={{{skipToken}}}&api-version=2017-08-31", + "callbackContextTemplate": "{\"skipToken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skipToken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skipToken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "helm $(command)", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + }, + "Node20_1": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + }, + "Node20_1": { + "target": "src//helm.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + }, + "Node20_1": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + } + }, + "messages": { + "CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "KubeConfigFilePath": "Kubeconfig file path: %s", + "KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "ClusterNotFound": "%s cluster does not exists", + "FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "RetryingRequest": "Retrying request after %s seconds.", + "PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "PatternFoundInPath": "Pattern found in file path %s.", + "CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "FileNotFound": "File not found at %s", + "KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "PackageSupportedInHelmsV37Only": "Helm package to Azure Container Registry is only supported in Helms V3.7+.", + "OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "KubeloginFailed": "Kubelogin authentication failed. Exception: %s" + }, + "_buildConfigMapping": { + "Default": "1.252.2", + "LocalPackages": "1.249.4", + "Node20_229_3": "1.252.3" + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/task.loc.json b/_generated/HelmDeployV1_Node20/task.loc.json new file mode 100644 index 000000000000..f8cc9eaad810 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/task.loc.json @@ -0,0 +1,591 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 252, + "Patch": 3 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "ms-resource:loc.group.displayName.cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package" + }, + { + "name": "commands", + "displayName": "ms-resource:loc.group.displayName.commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "ms-resource:loc.group.displayName.azureContainerRegistry", + "isExpanded": true, + "visibleRule": "command == login || command == package || command == push" + }, + { + "name": "tls", + "displayName": "ms-resource:loc.group.displayName.tls", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.connectionType", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "ms-resource:loc.input.help.connectionType", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpoint", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "ms-resource:loc.input.label.azureResourceGroup", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroup", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "ms-resource:loc.input.label.kubernetesCluster", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesCluster", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "ms-resource:loc.input.label.useClusterAdmin", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "ms-resource:loc.input.help.useClusterAdmin" + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "ms-resource:loc.input.label.kubernetesServiceEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesServiceEndpoint", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "ms-resource:loc.input.label.namespace", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.namespace", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpointForACR", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpointForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "ms-resource:loc.input.label.azureResourceGroupForACR", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroupForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "ms-resource:loc.input.label.azureContainerRegistry", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureContainerRegistry", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "ms-resource:loc.input.label.command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "push": "push", + "package": "package", + "rollback": "rollback", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "ms-resource:loc.input.help.command", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "ms-resource:loc.input.label.chartType", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "ms-resource:loc.input.help.chartType", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "ms-resource:loc.input.label.chartName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartName", + "defaultValue": "", + "visibleRule": "chartType == Name || command == create ", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "ms-resource:loc.input.label.chartPath", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPath", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "remoteRepo", + "label": "ms-resource:loc.input.label.remoteRepo", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.remoteRepo", + "defaultValue": "", + "visibleRule": "command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "ms-resource:loc.input.label.version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.version", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "ms-resource:loc.input.label.releaseName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.releaseName", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade || command == rollback || command == uninstall || command == delete", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "ms-resource:loc.input.label.overrideValues", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.overrideValues", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "ms-resource:loc.input.label.valueFile", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.valueFile", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "ms-resource:loc.input.label.destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "ms-resource:loc.input.help.destination", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.canaryimage", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.canaryimage", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.upgradetiller", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.upgradetiller", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.updatedependency", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.updatedependency", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "ms-resource:loc.input.label.save", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.save", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "ms-resource:loc.input.label.install", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.install", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "ms-resource:loc.input.label.recreate", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.recreate", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "ms-resource:loc.input.label.resetValues", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.resetValues", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "ms-resource:loc.input.label.force", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.force", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "ms-resource:loc.input.label.waitForExecution", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.waitForExecution", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "ms-resource:loc.input.label.arguments", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableTls", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.enableTls", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "ms-resource:loc.input.label.caCert", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.caCert", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "ms-resource:loc.input.label.certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "ms-resource:loc.input.label.privatekey", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.privatekey", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "ms-resource:loc.input.label.tillernamespace", + "helpMarkDown": "ms-resource:loc.input.help.tillernamespace", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishPipelineMetadata", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.publishPipelineMetadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "ms-resource:loc.input.label.chartNameForACR", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartNameForACR", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "ms-resource:loc.input.label.chartPathForACR", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPathForACR", + "defaultValue": "", + "visibleRule": "command == package || command == push", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?$skipToken={{{skipToken}}}&api-version=2017-08-31", + "callbackContextTemplate": "{\"skipToken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skipToken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skipToken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + }, + "Node20_1": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + }, + "Node20_1": { + "target": "src//helm.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + }, + "Node20_1": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + } + }, + "messages": { + "CantDownloadAccessProfile": "ms-resource:loc.messages.CantDownloadAccessProfile", + "KubeConfigFilePath": "ms-resource:loc.messages.KubeConfigFilePath", + "KubernetesClusterInfo": "ms-resource:loc.messages.KubernetesClusterInfo", + "KubernetesClusterResourceGroup": "ms-resource:loc.messages.KubernetesClusterResourceGroup", + "ClusterNotProvisioned": "ms-resource:loc.messages.ClusterNotProvisioned", + "ClusterNotFound": "ms-resource:loc.messages.ClusterNotFound", + "FailedToListClusters": "ms-resource:loc.messages.FailedToListClusters", + "RetryingRequest": "ms-resource:loc.messages.RetryingRequest", + "PatternNotFoundInFilePath": "ms-resource:loc.messages.PatternNotFoundInFilePath", + "CantResolvePatternInPath": "ms-resource:loc.messages.CantResolvePatternInPath", + "PatternFoundInPath": "ms-resource:loc.messages.PatternFoundInPath", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "SkipDeleteSecureFiles": "ms-resource:loc.messages.SkipDeleteSecureFiles", + "SkipDownloadSecureFiles": "ms-resource:loc.messages.SkipDownloadSecureFiles", + "FileNotFound": "ms-resource:loc.messages.FileNotFound", + "KubernetesServiceConnectionNotFound": "ms-resource:loc.messages.KubernetesServiceConnectionNotFound", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "SaveSupportedInHelmsV3Only": "ms-resource:loc.messages.SaveSupportedInHelmsV3Only", + "PackageSupportedInHelmsV37Only": "ms-resource:loc.messages.PackageSupportedInHelmsV37Only", + "OutputVariableDataSizeExceeded": "ms-resource:loc.messages.OutputVariableDataSizeExceeded", + "KubeloginFailed": "ms-resource:loc.messages.KubeloginFailed" + }, + "_buildConfigMapping": { + "Default": "1.252.2", + "LocalPackages": "1.249.4", + "Node20_229_3": "1.252.3" + } +} \ No newline at end of file