diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 69f0e0041d80..ca55bc376cf2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -97,6 +97,8 @@ Tasks/AzureRmWebAppDeploymentV3/ @jvano @dannysongg @microsoft/azure-app-servi Tasks/AzureRmWebAppDeploymentV4/ @jvano @dannysongg @microsoft/azure-app-service-pipelines-tasks @microsoft/release-management-task-team @manolerazvan +Tasks/AzureRmWebAppDeploymentV5/ @jvano @dannysongg @shilpirachna1 @microsoft/azure-app-service-pipelines-tasks @microsoft/release-management-task-team @manolerazvan + # DRI rotation: Azure Spring Apps/AzDMSS-Support Tasks/AzureSpringCloudV0 @microsoft/azure-spring-apps @ruoyuwang @menxiao diff --git a/Tasks/AzureRmWebAppDeploymentV5/.npmrc b/Tasks/AzureRmWebAppDeploymentV5/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/README.md b/Tasks/AzureRmWebAppDeploymentV5/README.md new file mode 100644 index 000000000000..aae6da3440d0 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/README.md @@ -0,0 +1,213 @@ +# Azure App Service Deployment: ARM + +## Overview + +The Azure App Service Deployment task is used to update different Azure App Service to deploy [Web Apps](https://azure.microsoft.com/en-in/documentation/articles/app-service-web-overview/), [Functions](https://docs.microsoft.com/en-us/azure/azure-functions/) and [WebJobs](https://azure.microsoft.com/en-us/blog/webjobs-goes-into-full-production/) to Azure. The task works on cross platform Azure Pipelines agents running Windows, Linux or Mac and uses the underlying deployment technologies of [Web Deploy](https://www.iis.net/downloads/microsoft/web-deploy), RunFromPackage, Zip Deploy, Containers and [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API). + +The task works for [ASP.NET](https://www.visualstudio.com/en-us/docs/release/examples/azure/azure-web-apps-from-build-and-release-hubs), [ASP.NET Core](https://www.visualstudio.com/en-us/docs/release/examples/azure/aspnet-core10-azure-web-apps), PHP, Java, Python, Go and [Node.js](https://www.visualstudio.com/en-us/docs/release/examples/nodejs/node-to-azure-webapps) based web applications. + +The task can be used to deploy different Azure App Services like Function App (Windows/Linux/Containers), Web App on Windows, Web App on Linux, Web App for Containers and apps configured under Azure App Service Environments. + +The task is **under development and is available to a limited set of Azure DevOps organizations**. The [video](https://www.youtube.com/watch?v=uQ2qCmaZ_Ag&feature=youtu.be) describes the features that are available in the task currently. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites need to be setup in the target machine(s) for the task to work properly. + +##### Azure Web App or Azure Function + +The task is used to deploy a Web project to an existing Azure Web App. The Web App should exist prior to running the task. The Web App can be created from the [Azure portal](https://azure.microsoft.com/en-in/documentation/videos/azure-app-service-web-apps-with-yochay-kiriaty/) and [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) there. Alternatively, the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) can be used to run [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx) to provision and configure the Web App. + +The task can also be used to deploy [Azure Functions](https://azure.microsoft.com/en-in/services/functions/) (Windows/Linux/Containers). + +##### Azure Subscription + +To deploy to Azure, an Azure subscription has to be linked to Team Foundation Server or to Azure Pipelines using the Services tab in the Account Administration section. Add the Azure subscription to use in the Build or Release Management definition by opening the Account Administration screen (gear icon on the top-right of the screen) and then click on the Services Tab. + +Create the [ARM](https://azure.microsoft.com/en-in/documentation/articles/resource-group-overview/) service endpoint, use **'Azure Resource Manager'** endpoint type, for more details follow the steps listed in the link [here](https://go.microsoft.com/fwlink/?LinkID=623000&clcid=0x409). + +The task does not work with the Azure Classic service endpoint and it will not list these connections in the parameters in the task. + +## Deployment + +Several deployment methods are available in this task. Web Deploy (msdeploy.exe) is the default option. To change the deployment option, expand Additional Deployment Options and enable Select deployment method to choose from additional package-based deployment options. + +Based on the type of Azure App Service and Azure Pipelines agent, the task chooses a suitable deployment technology. The different deployment technologies used by the task are: +* *Web Deploy* + +* *Kudu REST APIs* + +* *Container Registry* + +* *Zip Deploy* + +* *RunFromPackage* + +By default the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* For msdeploy (MSBuild generated package) package, use Web Deploy +* When post deployment script is provided, use Zip Deploy +* When the App Service type is Web App on Linux App, use Zip Deploy +* If War file is provided, use War Deploy +* If Jar file is provided, use Run From Zip +* For all others, use Run From Zip (via Zip Deploy) + +On non-Windows agent (for any App service type), the task relies on [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) to deploy the Web App. + +### Web Deploy + +Web Deploy (msdeploy.exe) is used to deploy the web application to the Azure Web App. Web Deploy Works on a Windows automation agent when the target is a Web App on Windows or Function App. Install it on the agent using the [Microsoft Web Platform Installer](https://www.microsoft.com/web/gallery/install.aspx?appid=wdeploynosmo). The Web Deploy 3.5 needs to be installed without the bundled SQL support. There is no need to choose any custom settings while installing Web Deploy. After installing the Web Deploy is available at C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V3. + +Web Deploy is feature rich and offers options like: +* **Rename locked files\*:** Rename file which are still in use by the web server by enabling msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment + +* **Remove additional files at destination\*:** Deletes files on the Azure App Service that have no matching files in the App Service artifact package or folder getting deployed. + +* **Exclude files from the App_Data folder\*:** Prevent files in the App_Data folder (in the artifact package/folder getting deployed) from being deployed to the Azure App Service + +* **Additional Web Deploy arguments\*:** Arguments that will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.For more examples of Web Deploy operation settings, refer [Web Deploy Operation Settings](https://go.microsoft.com/fwlink/?linkid=838471) + + +### [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) +Works on a Windows as well as Linux automation agent when the target is a Web App on Windows or Web App on Linux (built-in source) or Function App. The task uses Kudu to copy over files to the Azure App service. + +### Container Registry +Works on a Windows as well as Linux automation agent when the target is a Web App for Containers. The task updates the Azure Web App for Containers by setting the right Container registry, repository, image name and tag information. You can also use the task to pass a startup command for the container image. + +### Zip Deploy +Creates a .zip deployment package of the chosen Package or folder and deploys the file contents to the wwwroot folder of the App Service name function app in Azure. This option overwrites all existing contents in the wwwroot folder. For more information, see [Zip deployment for Azure Functions](https://docs.microsoft.com/azure/azure-functions/deployment-zip-push). + +### RunFromPackage +Creates the same deployment package as Zip Deploy. However, instead of deploying files to the wwwroot folder, the entire package is mounted by the Functions runtime. With this option, files in the wwwroot folder become read-only. For more information, see [Run your Azure Functions from a package file](https://docs.microsoft.com/azure/azure-functions/run-functions-from-deployment-package). + +### Parameters of the task +The task is used to deploy a Web project to an existing Azure Web App or Function. The mandatory fields are highlighted with a *. + +* **Azure Subscription\*:** Select the AzureRM Subscription. If none exists, then click on the **Manage** link, to navigate to the Services tab in the Administrators panel. In the tab click on **New Service Endpoint** and select **Azure Resource Manager** from the dropdown. + +* **App Service type\*:** Select the Azure App Service type. The different app types supported are Function App, Web App on Windows, Web App on Linux, Web App for Containers and Azure App Service Environments + +* **App Service Name\*:** Select the name of an existing Azure App Service. Enter the name of the Web App if it was provisioned dynamically using the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) and [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx). + +* **Deploy to Slot:** Select the option to deploy to an existing slot other than the Production slot. Do not select this option if the Web project is being deployed to the Production slot. The Web App itself is the Production slot. + +* **Resource Group:** Select the Azure Resource Group that contains the Azure App Service specified above. Enter the name of the Azure Resource Group if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Slot:** Select the Slot to deploy the Web project to. Enter the name of the Slot if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Virtual Application:** Specify the name of the Virtual Application that has been configured in the Azure portal. The option is not required for deployments to the website root. The Virtual Application should have been [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) prior to deploying the Web project to it using the task. + +* **Package or Folder\*:** Location of the Web App zip package or folder on the automation agent or on a UNC path accessible to the automation agent like, \\\\BudgetIT\\Web\\Deploy\\Fabrikam.zip. Predefined system variables and wild cards like, $(System.DefaultWorkingDirectory)\\\***.zip can be also used here. + +* **Select deployment method:** Select the option to to choose from Web Deploy, Container, Zip Deploy, RunFromPackage, Kudu REST apis + +By default (when 'Select deployment method' is not checked) the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* **Parameters File:** (Optional) The parameter file is used to override the default settings in the web deploy zip package file like, the IIS Web application name or the database connection string. This helps in having a single package that can be deployed across dev, test, staging, and production, with a specific parameter file for each environment. + +* **Remove Additional Files at Destination:** Select the option to delete the files in the Azure App Service that have no matching files in the Web App zip package. This will ensure that during the Web project deployment any additional files in the Azure App Service are deleted, and the only files in the Azure App Service are the ones in the Web App zip package. +This will also remove all files related to any extension (for example Application Insights) installed on this Azure App Service. To prevent this, enable 'Exclude files from App_Data folder' as well. + +* **Exclude Files from the App_Data Folder:** Select the option to prevent files in the App_Data folder from being deployed to the Azure App Service. This is a useful option to select, if a local database or a WebJob has been deployed earlier to the Azure App Service, and they should not be deleted in the subsequent deployments of the Web project. + +* **Take Application Offline:** Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the Web App before the sync operation begins. The file will be removed after the sync operation completes successfully. + +* **Additional Arguments:** Additional Web Deploy arguments that will be appended to the MSDeploy command while deploying the Azure Web App like,-disableLink:AppPoolExtension -disableLink:ContentExtension. A useful parameter for enabling and disabling rules and for skipping syncing of certain folders. + +* **Generate Web.config:** A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. For example, for [Nodejs application, web.config](https://github.com/projectkudu/kudu/wiki/Using-a-custom-web.config-for-Node-apps) will have startup file and iis_node module values. Similarly for Python (Bottle, Django, Flask) the web.config will have details of WSGI handler, Python path etc. The task will generate a new web.config only when the artifact package/folder does not contain an existing web.config. The default values populated by the task can be overriden in the task by using the Web.config parameters field. + +* **Web.config parameters:** Edit values like startup file in the task generated web.config file. The default values populated by the task can be overridden in the task by passing the web.config parameters. This edit feature is **only for the generated web.config**. Feature is useful when [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) is used to install specific Python version by using extensions or when you want to provide a different startup file for Node.js. +In case of Python, the path can be set as an output variable of the [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) and then set as the Python path in the web.config generated by this deploy task. You can try out this feature by selecting any Python, Nodejs, PHP release definition template. + +* **File transformation and variable substitution:** Refer to following links: + * [XML transformation](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-transformation) + * [XML variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-variable-substitution) + * [JSON variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#json-variable-substitution) +* **Deployment script:** +The task provides an option to customize the deployment by providing a script that will run on the Azure App Service once the application artifacts have been copied successfully to the App Service. You can choose to either provide an inline deployment script or point to a script file in your atifact folder. This is very useful when you want to restore your application dependencies on the App service directly. Restoring packages of Node, PHP, Python applications helps in avoiding timeouts when the application dependency results in a large artifact getting copied over from Azure Pipelines Agent to Azure app service. An example of this script is: +``` +@echo off +if NOT exist requirements.txt ( + echo No Requirements.txt found. + EXIT /b 0 +) +if NOT exist "$(PYTHON_EXT)/python.exe" ( + echo Python extension not available >&2 + EXIT /b 1 +) +echo Installing dependencies +call "$(PYTHON_EXT)/python.exe" -m pip install -U setuptools +if %errorlevel% NEQ 0 ( + echo Failed to install setuptools >&2 + EXIT /b 1 +) +call "$(PYTHON_EXT)/python.exe" -m pip install -r requirements.txt +if %errorlevel% NEQ 0 ( + echo Failed to install dependencies>&2 + EXIT /b 1 +) +``` + +* **Runtime Stack:** +Web App on Linux offers two different options to publish your application, one is Custom image deployment (Web App for Containers) and the other is App deployment with a built-in platform image (Web App on Linux). You will see this parameter only when you selected 'Linux Web App' in the App type selection option in the task. + +For Web **Web App for Containers** you need to provide the following details: +* *Registry or Namespace:* +A globally unique top-level domain name for your specific registry or namespace. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Image:* +Image Name of the repository where the container images are stored. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Tag:* +Tags are optional, it is the mechanism that registries use to give Docker images a version. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Startup command:* +Start up command for the container. + +For Web **Web App on Linux** you need to provide the following details: +* *Runtime stack:* Select the framework and version your web app will run on. + +* *Startup command:* +Start up command for the app. For example if you are using PM2 process manager for Nodejs then you can specify the PM2 file here. + +* *Application and Configuration Settings* + +**App settings**: [App settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure#app-settings) contains name/value pairs that your web app will load on start up. Edit web app application settings by following the syntax '-key value'. Value containing spaces should be enclosed in double quotes. +>Example : -Port 5000 -RequestTimeout 5000 +>-WEBSITE_TIME_ZONE "Eastern Standard Time" + +**Configuration settings**: +Edit web app [configuration settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure) following the syntax -key value. Value containing spaces should be enclosed in double quotes. +>Example : -phpVersion 5.6 -linuxFxVersion: node|6.11 + +### Output Variables + +* **Web App Hosted URL:** Provide a name, like FabrikamWebAppURL for the variable for the Azure App Service Hosted URL. The variable can be used as $(variableName), like $(FabrikamWebAppURL) to refer to the Hosted URL of the Azure App Service in subsequent tasks like in the [Run Functional Tests task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/RunDistributedTestsV1) or the [Visual Studio Test task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/VsTestV2). + + +### Troubleshooting : + +- **Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.** + + Service connection used by the task would have been expired or the service principal use must have been removed from the app registrations. [Troubleshoot the affected Azure Resource Manager service connection.](https://docs.microsoft.com/en-us/azure/devops/pipelines/release/azure-rm-endpoint?view=azure-devops) + +- **SSL error** + To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + +- **Managed Service Identity (MSI)** + configure Managed Service Identity (MSI) for virtual machine https://aka.ms/azure-msi-docs + + +- **Publish using zip deploy option is not supported for msBuild package type** + Follow the steps provided in the link https://github.com/microsoft/azure-pipelines-tasks/wiki/Migrating-from-Web-Deploy-to-Run-From-Package-deployment-mechanism + +- **ERROR_FILE_IN_USE** + * For avoiding deployment failure with error code ERROR_FILE_IN_USE, in case of .NET apps targeting Web App on Windows, ensure that 'Rename locked files' and 'Take App Offline' are enabled. For zero downtime deployment use slot swap. + * You can also use `Run From Package` deployment method to avoid resource locking. + +- **Web Job deployment** +When deploying to an App Service with App Insights configured, if you have enabled “Remove additional files at destination” then you also need to enable “Exclude files from the App_Data folder” in order to keep App insights extension in safe state. This is required because App Insights continuous web job gets installed into the App_Data folder. diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..61fdf60095b0 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service-Bereitstellung", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Hiermit wird eine Web-, Mobil- oder API-App mithilfe von Docker, Java, .NET, .NET Core, Node.js, PHP, Python oder Ruby für Azure App Service bereitgestellt.", + "loc.instanceNameFormat": "Azure App Service bereitstellen: $(WebAppName)", + "loc.releaseNotes": "Neuigkeiten in Version 4.*
Unterstützung für ZIP Deploy, die Ausführung über Pakete und WAR Deploy [Details](https://aka.ms/appServiceDeploymentMethods)
Unterstützung für App Service-Umgebungen
Verbesserte Benutzeroberfläche zum Ermitteln der von der Aufgabe unterstützten App Service-Typen
\"Aus Paket ausführen\" ist die bevorzugte Bereitstellungsmethode und markiert Dateien im Ordner \"wwwroot\" als schreibgeschützt
Klicken Sie [hier](https://aka.ms/azurermwebdeployreadme), um weitere Informationen zu erhalten.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Optionen für Dateitransformationen und Variablenersetzungen", + "loc.group.displayName.AdditionalDeploymentOptions": "Zusätzliche Bereitstellungsoptionen", + "loc.group.displayName.PostDeploymentAction": "Aktion nach der Bereitstellung", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Anwendungs- und Konfigurationseinstellungen", + "loc.input.label.ConnectionType": "Verbindungstyp", + "loc.input.help.ConnectionType": "Wählen Sie den Dienstverbindungstyp aus, der zum Bereitstellen der Web-App verwendet werden soll.
Wählen Sie \"Veröffentlichungsprofil\" aus, um das von Visual Studio erstellte Veröffentlichungsprofil zu verwenden. [Weitere Informationen](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure-Abonnement", + "loc.input.help.ConnectedServiceName": "Wählen Sie das Azure Resource Manager-Abonnement für die Bereitstellung aus.", + "loc.input.label.PublishProfilePath": "Pfad für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePath": "Pfad des von Visual Studio erstellten Veröffentlichungsprofils", + "loc.input.label.PublishProfilePassword": "Kennwort für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePassword": "Es wird empfohlen, das Kennwort in einer geheimen Variablen zu speichern und diese Variable hier zu verwenden, z. B. $(Password).", + "loc.input.label.WebAppKind": "App Service-Typ", + "loc.input.help.WebAppKind": "Wählen Sie aus zwischen Web-App unter Windows, Web-App unter Linux, Web-App für Container, Funktions-App, Funktions-App unter Linux, Funktions-App für Container und mobile App.", + "loc.input.label.WebAppName": "App Service-Name", + "loc.input.help.WebAppName": "Geben Sie den Namen eines vorhandenen Azure App Service ein, oder wählen Sie ihn aus. Es werden nur App-Dienste für den ausgewählten App-Typ angezeigt.", + "loc.input.label.DeployToSlotOrASEFlag": "In Slot oder App Service-Umgebung bereitstellen", + "loc.input.help.DeployToSlotOrASEFlag": "Wählen Sie die Option für die Bereitstellung in einem vorhandenen Bereitstellungsslot oder in der Azure App Service-Umgebung.
Für beide Ziele benötigt die Aufgabe den Ressourcengruppennamen.
Falls als Bereitstellungsziel ein Slot verwendet wird, erfolgt die Bereitstellung standardmäßig im Produktionsslot. Auch jeder andere vorhandene Slotname kann angegeben werden.
Falls als Bereitstellungsziel eine Azure App Service-Umgebung verwendet wird, behalten Sie den Slotnamen \"production\" bei, und geben Sie nur den Namen der Ressourcengruppe an.", + "loc.input.label.ResourceGroupName": "Ressourcengruppe", + "loc.input.help.ResourceGroupName": "Der Ressourcengruppenname ist erforderlich, wenn als Bereitstellungsziel ein Bereitstellungsslot oder eine App Service-Umgebung verwendet wird.
Geben Sie die Azure-Ressourcengruppe mit der oben angegebenen Azure App Service-Instanz ein, oder wählen Sie sie aus.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Geben Sie einen anderen vorhandenen Slot als den Produktionsslot ein, oder wählen Sie ihn aus.", + "loc.input.label.DockerNamespace": "Registrierung oder Namespace", + "loc.input.help.DockerNamespace": "Eine global eindeutiger Name einer Domäne der obersten Ebene für Ihre spezifische Registrierung oder den Namespace.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name des Repositorys, in dem Containerimages gespeichert werden.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags sind optional. Sie werden von den Registrierungen genutzt, um eine Version für die Docker-Images zu vergeben.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Virtuelle Anwendung", + "loc.input.help.VirtualApplication": "Geben Sie den Namen der virtuellen Anwendung ein, die im Azure-Portal konfiguriert wurde. Die Option ist für Bereitstellungen im App Service-Stamm nicht erforderlich.", + "loc.input.label.Package": "Paket oder Ordner", + "loc.input.help.Package": "Dateipfad zum Paket oder zu einem Ordner mit den durch MSBuild generierten App Service-Inhalten oder zu einer komprimierten ZIP-oder WAR-Datei.
Variablen ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), Platzhalter werden unterstützt.
Beispiel: \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip\" oder \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.war\".", + "loc.input.label.RuntimeStack": "Runtimestapel", + "loc.input.help.RuntimeStack": "Wählen Sie Framework und Version aus.", + "loc.input.label.RuntimeStackFunction": "Runtimestapel", + "loc.input.help.RuntimeStackFunction": "Wählen Sie das Framework und die Version aus. In [diesem Dokument](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) finden Sie die unterstützten Runtimeversionen. Verwenden Sie anstelle alter Werte wie \"DOCKER|microsoft/azure-functions-*\" die neuen Werte aus der Dropdownliste.", + "loc.input.label.StartupCommand": "Startbefehl ", + "loc.input.help.StartupCommand": "Geben Sie den Startbefehl ein. Beispiel:
dotnet exec Dateiname.dll
dotnet Dateiname.dll", + "loc.input.label.ScriptType": "Bereitstellungsskripttyp", + "loc.input.help.ScriptType": "Passen Sie die Bereitstellung durch das Angeben eines Skripts an, das im Azure App Service ausgeführt wird, nachdem die Aufgabe die Bereitstellung erfolgreich abgeschlossen hat. Stellen Sie beispielsweise Pakete für Node-, PHP- oder Python-Anwendungen wieder her. [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inlineskript", + "loc.input.label.ScriptPath": "Bereitstellungsskriptpfad", + "loc.input.label.WebConfigParameters": "Parameter der Datei \"web.config\" für Python-, Node.js-, Go- und Java-Apps generieren", + "loc.input.help.WebConfigParameters": "Ein Standarddatei \"web.config\" wird generiert und in Azure App Service bereitgestellt, wenn diese Datei nicht in der Anwendung vorhanden ist. Die Werte in \"web.config\" können bearbeitet werden und variieren je nach Anwendungsframework. Zum Beispiel enthält \"web.config\" für node.js-Anwendungen Werte für eine Startdatei und ein iis_node-Modul. Dieses Bearbeitungsfeature gilt nur für die generierte Datei \"web.config\". [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App-Einstellungen", + "loc.input.help.AppSettings": "Bearbeiten Sie Web-App-Anwendungseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Konfigurationseinstellungen", + "loc.input.help.ConfigurationSettings": "Bearbeiten Sie Web-App-Konfigurationseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Bereitstellungsmethode auswählen", + "loc.input.help.UseWebDeploy": "Wenn die Option deaktiviert ist, wird die beste Bereitstellungsmethode basierend auf dem App-Typ, dem Paketformat und anderen Parametern automatisch ermittelt.
Klicken Sie auf die Option zum Anzeigen der unterstützten Bereitstellungsmethoden, und wählen Sie eine davon für die Bereitstellung Ihrer App aus.", + "loc.input.label.DeploymentType": "Bereitstellungsmethode", + "loc.input.help.DeploymentType": "Wählen Sie die Bereitstellungsmethode für die App aus.", + "loc.input.label.TakeAppOfflineFlag": "App offline schalten", + "loc.input.help.TakeAppOfflineFlag": "Wählen Sie diese Option aus, um den Azure App Service offline zu schalten, indem vor dem Synchronisierungsvorgang eine Datei \"app_offline.htm\" im App Service-Stammverzeichnis platziert wird. Die Datei wird entfernt, nachdem der Synchronisierungsvorgang erfolgreich abgeschlossen wurde.", + "loc.input.label.SetParametersFile": "SetParameters-Datei", + "loc.input.help.SetParametersFile": "Optional: Speicherort für die zu verwendende Datei \"SetParameters.xml\".", + "loc.input.label.RemoveAdditionalFilesFlag": "Zusätzliche Dateien am Ziel entfernen", + "loc.input.help.RemoveAdditionalFilesFlag": "Wählen Sie diese Option aus, um Dateien im Azure App Service zu löschen, für die keine übereinstimmenden Dateien im Paket oder Ordner des App Service vorhanden sind.

Hierdurch werden auch alle zugehörigen Dateien für Erweiterungen entfernt, die in diesem Azure App Service installiert sind. Um dies zu verhindern, aktivieren Sie das Kontrollkästchen \"Dateien aus App_Data-Ordner ausschließen\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Dateien aus dem Ordner \"App_Data\" ausschließen", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Wählen Sie diese Option aus, um zu verhindern, dass Dateien im Ordner \"App_Data\" in Azure App Service bereitgestellt oder gelöscht werden.", + "loc.input.label.AdditionalArguments": "Zusätzliche Argumente", + "loc.input.help.AdditionalArguments": "Weitere Web Deploy-Argumente mit der Syntax \"-key:value\".
Diese werden angewendet, wenn der Azure App Service bereitgestellt wird. Beispiel: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Weitere Beispiele für Einstellungen für den Web Deploy-Vorgang finden Sie [hier] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Gesperrte Dateien umbenennen", + "loc.input.help.RenameFilesFlag": "Wählen Sie die Option aus, um das msdeploy-Flag MSDEPLOY_RENAME_LOCKED_FILES=1 in den Azure App Service-Anwendungseinstellungen zu aktivieren. Wenn diese Option festgelegt ist, kann \"msdeploy\" gesperrte Dateien umbenennen, die während der App-Bereitstellung gesperrt sind.", + "loc.input.label.XmlTransformation": "XML-Transformation", + "loc.input.help.XmlTransformation": "Die Konfigurationstransformationen werden für \"*.Release.config\" und \"*..config\" in der Datei \"*.config\" ausgeführt.
Konfigurationstransformationen werden vor der Variablenersetzung ausgeführt.
XML-Transformationen werden nur für Windows-Plattformen unterstützt.", + "loc.input.label.XmlVariableSubstitution": "XML-Variablenersetzung", + "loc.input.help.XmlVariableSubstitution": "In der Build- oder Releasepipeline definierte Variablen werden mit den Einträgen \"key\" oder \"name\" in den appSettings-, applicationSettings- und connectionStrings-Abschnitten jeder Konfigurationsdatei und der Datei \"parameters.xml\" abgeglichen. Die Variablenersetzung erfolgt nach den Konfigurationstransformationen.

Hinweis: Wenn in der Releasepipeline und der Umgebung dieselben Variablen definiert wurden, haben die Umgebungsvariablen Vorrang vor den Variablen der Releasepipeline.
", + "loc.input.label.JSONFiles": "JSON-Variablenersetzung", + "loc.input.help.JSONFiles": "Stellen Sie eine durch Zeilenumbrüche getrennte Liste der JSON-Dateien für die Ersetzung der Variablenwerte bereit. Die Dateinamen müssen relativ zum Stammordner angegeben werden.
Um geschachtelte oder hierarchische JSON-Variablen zu ersetzen, geben Sie diese mithilfe von JSONPath-Ausdrücken an.

Um etwa im Beispiel unten den Wert von \"ConnectionString\" zu ersetzen, müssen Sie in der Build- oder Releasepipeline (oder der Umgebung der Releasepipeline) eine Variable als \"Data.DefaultConnection.ConnectionString\" definieren.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Die Variablenersetzung wird nach den Konfigurationstransformationen durchgeführt.

Hinweis: Pipelinevariablen sind von der Ersetzung ausgenommen.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Ungültiges App Service-Paket oder ungültiger App Service-Ordnerpfad angegeben: %s", + "loc.messages.SetParamFilenotfound0": "Datei zum Festlegen der Parameter nicht gefunden: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Die XML-Transformationen wurden erfolgreich angewendet.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Die Dienstverbindungsdetails für Azure App Service wurden abgerufen: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Fehler: Keine solche Bereitstellungsmethode vorhanden.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Die Dienstverbindungsdetails für Azure App Service können nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Die Dienstverbindungsdetails für die Azure-Ressource \"%s\" konnten nicht abgerufen werden. Statuscode: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Der Bereitstellungsverlauf unter \"%s\" wurde erfolgreich aktualisiert.", + "loc.messages.Failedtoupdatedeploymenthistory": "Fehler beim Aktualisieren des Bereitstellungsverlaufs. Fehler: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNUNG: Der Bereitstellungsstatus kann nicht aktualisiert werden: Der SCM-Endpunkt ist für diese Website nicht aktiviert.", + "loc.messages.Unabletoretrievewebconfigdetails": "Die App Service-Konfigurationsdetails können nicht abgerufen werden. Statuscode: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Die App Service-Anwendungseinstellungen können nicht abgerufen werden. [Statuscode: %s, Fehlermeldung: %s]", + "loc.messages.Unabletoupdatewebappsettings": "Die App Service-Anwendungseinstellungen können nicht aktualisiert werden. Statuscode: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Der Bereitstellungsstatus kann nicht aktualisiert werden: Die eindeutige Bereitstellungs-ID kann nicht abgerufen werden.", + "loc.messages.PackageDeploymentSuccess": "Web-Paket für den App Service erfolgreich bereitgestellt.", + "loc.messages.PackageDeploymentFailed": "Fehler beim Bereitstellen des Web-Pakets für den App Service.", + "loc.messages.Runningcommand": "Befehl wird ausgeführt: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Webpaket \"%s\" wird im virtuellen Pfad (physischen Pfad) bereitgestellt: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Das Paket \"%s\" wurde unter Verwendung des Kudu-Diensts erfolgreich unter \"%s\" bereitgestellt.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Fehler beim Bereitstellen des App Service-Pakets mithilfe des Kudu-Diensts: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Der App Service kann nicht bereitgestellt werden. Fehlercode: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Mit MSDeploy generierte Pakete werden nur für Windows-Plattformen unterstützt.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Nicht unterstützte installierte Version %s für MSDeploy gefunden. Version 3 oder höher muss installiert sein.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Der Speicherort von MS Deploy wurde nicht in der Registrierung auf dem Computer gefunden (Fehler: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Es wurde kein Paket mit dem angegebenen Muster gefunden: %s
überprüfen, ob das in der Aufgabe erwähnte Paket als Artefakt im Build oder in einer vorherigen Stage veröffentlicht und im aktuellen Auftrag heruntergeladen wurde.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Mindestens zwei Pakete stimmten mit dem angegebenen Suchmuster überein: %s. Schränken Sie das Suchmuster ein.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Anwendung offline schalten\" erneut bereitzustellen.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Gesperrte Dateien umbenennen\" erneut bereitzustellen.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Keine JSON-Datei stimmte mit dem angegebenen Muster überein: %s", + "loc.messages.Configfiledoesntexists": "Die Konfigurationsdatei \"%s\" ist nicht vorhanden.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Fehler beim Schreiben in die Konfigurationsdatei \"%s\". Fehler: %s ", + "loc.messages.AppOfflineModeenabled": "Der App-Offlinemodus wurde aktiviert.", + "loc.messages.Failedtoenableappofflinemode": "Fehler beim Aktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.AppOflineModedisabled": "Der App-Offlinemodus wurde deaktiviert.", + "loc.messages.FailedtodisableAppOfflineMode": "Fehler beim Deaktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "XML-Transformationen können auf einer Nicht-Windows-Plattform nicht ausgeführt werden.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML-Transformationsfehler beim Transformieren von \"%s\" unter Verwendung von \"%s\".", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Eine Veröffentlichung unter Verwendung von webdeploy-Optionen wird nur unterstützt, wenn der Windows-Agent verwendet wird. ", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Die Veröffentlichung über die ZIP Deploy-Option wird für den msBuild-Pakettyp nicht unterstützt.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Die Veröffentlichung über die ZIP Deploy-Option wird für virtuelle Anwendungen nicht unterstützt.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Bei der Veröffentlichung über die Optionen \"ZIP Deploy\" oder \"RunFromZip\" wird die WAR-Dateibereitstellung nicht unterstützt.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Bei der Veröffentlichung über RunFromZip werden Skripts nach der Bereitstellung möglicherweise nicht unterstützt, wenn diese Änderungen an wwwroot vornehmen, weil der Ordner schreibgeschützt ist.", + "loc.messages.ResourceDoesntExist": "Die Ressource \"%s\" ist nicht vorhanden. Die Ressource muss vor der Bereitstellung vorhanden sein.", + "loc.messages.EncodeNotSupported": "Erkannte Codierung der Datei \"%s\": %s. Eine Variablenersetzung wird für die Dateicodierung \"%s\" nicht unterstützt. Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Die Codierung der Datei \"%s\" wurde nicht erkannt (typeCode: %s). Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Der Dateipuffer ist zu klein, um den Codierungstyp zu erkennen: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Fehler beim Aktualisieren der App Service-Konfigurationsdetails. Fehler: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Die App Service-Konfigurationsdetails wurden erfolgreich aktualisiert.", + "loc.messages.RequestedURLforkuduphysicalpath": "Angeforderte URL für physischen Kudu-Pfad: %s", + "loc.messages.Physicalpathalreadyexists": "Der physische Pfad \"%s\" ist bereits vorhanden.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Der physische Kudu-Pfad wurde erfolgreich erstellt: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Fehler beim Erstellen des physischen Kudu-Pfads. Fehler: %s", + "loc.messages.FailedtocheckphysicalPath": "Fehler beim Überprüfen des physischen Kudu-Pfads. Fehlercode: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Die virtuelle Anwendung ist nicht vorhanden: %s", + "loc.messages.JSONParseError": "Die JSON-Datei konnte nicht analysiert werden: %s. Fehler: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Die JSON-Variablenersetzung wurde erfolgreich angewendet.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML-Variablenersetzung erfolgreich angewendet.", + "loc.messages.failedtoUploadFileToKudu": "Datei \"%s\" kann nicht in Kudu (%s) hochgeladen werden. Statuscode: %s", + "loc.messages.failedtoUploadFileToKuduError": "Hochladen der Datei: %s auf Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ExecuteScriptOnKudu": "Das angegebene Skript wird im Kudu-Dienst ausgeführt.", + "loc.messages.FailedToRunScriptOnKuduError": "Das Skript kann nicht im Kudu-Dienst ausgeführt werden. Fehler: %s", + "loc.messages.FailedToRunScriptOnKudu": "Ausführen des Skripts in Kudu nicht möglich: %s. Statuscode: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Skript in Kudu erfolgreich ausgeführt.", + "loc.messages.ScriptExecutionOnKuduFailed": "Das ausgeführte Skript hat \"%s\" als Rückgabecode zurückgegeben. Fehler: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Die Datei \"%s\" kann nicht aus Kudu (%s) gelöscht werden. Statuscode: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Löschen der Datei: %s von Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ScriptFileNotFound": "Skriptdatei \"%s\" nicht gefunden.", + "loc.messages.InvalidScriptFile": "Ungültige Skriptdatei \"%s\" angegeben. Gültige Erweiterungen sind \".bat\" und \".cmd\" für Windows und \".sh\" für Linux.", + "loc.messages.RetryForTimeoutIssue": "Fehler beim Ausführen des Skripts mit Zeitüberschreitung. Es wird noch mal versucht.", + "loc.messages.stdoutFromScript": "Standardausgabe von Skript:", + "loc.messages.stderrFromScript": "Standardfehler von Skript:", + "loc.messages.WebConfigAlreadyExists": "web.config-Datei ist bereits vorhanden. Sie wird nicht erstellt.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config-Datei erfolgreich erstellt.", + "loc.messages.FailedToGenerateWebConfig": "Fehler beim Erstellen von \"web.config\". %s", + "loc.messages.FailedToGetKuduFileContent": "Dateiinhalt konnte nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Dateiinhalt konnte nicht abgerufen werden: %s. Fehler: %s", + "loc.messages.ScriptStatusTimeout": "Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden.", + "loc.messages.PollingForFileTimeOut": "Der Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden. Sie können das Zeitlimit erhöhen, indem Sie die erforderliche Minutenzahl für die Variable \"appservicedeploy.retrytimeout\" festlegen.", + "loc.messages.InvalidPollOption": "Ungültige Abrufoption angegeben: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Das Attribut \"-appType\" fehlt in den Parametern \"Web.config\". Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" und \"Go\".
Beispiel: \"-appType python_Bottle\" (ohne Anführungszeichen) im Fall von Python Bottle-Framework.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Der Pfad für die Datei \"settings.py\" von DJANGO_SETTINGS_MODULE 'settings.py' wurde nicht gefunden. Überprüfen Sie, ob die Datei \"settings.py\" existiert, oder geben Sie den korrekten Pfad in der Parametereingabe \"Web.config\" im folgenden Format an: \"-DJANGO_SETTINGS_MODULE .settings\".", + "loc.messages.FailedToApplyTransformation": "Die Transformation für das angegebene Paket kann nicht angewendet werden. Führen Sie die folgenden Schritte aus.", + "loc.messages.FailedToApplyTransformationReason1": "1. Prüfen Sie, ob die Transformation für das beim Build generierte MSBuild-Paket bereits angewendet wurde. Ist dies der Fall, entfernen Sie das Tag aus allen Konfigurationen in der CSPROJ-Datei, und führen Sie den Build erneut aus. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Stellen Sie sicher, dass sich die Konfigurationsdatei und die Transformationsdateien im selben Ordner im Paket befinden.", + "loc.messages.AutoParameterizationMessage": "ConnectionString-Attribute in Web.config ist standardmäßig parametrisiert. Beachten Sie, dass die Transformation keine Auswirkungen auf connectionString-Attribute hat, da der Wert bei der Bereitstellung durch Dateien vom Typ \"Parameters.xml\" oder \"SetParameters.xml\" überschrieben wird. Sie können die automatische Parametrisierung deaktivieren, indem Sie beim Erstellung des MSBuild-Pakets die Einstellung \"/p:AutoParameterizationWebConfigConnectionStrings=False\" festlegen.", + "loc.messages.UnsupportedAppType": "App-Typ \"%s\" wird beim Erstellen von \"Web.config\" nicht unterstützt. Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\" und \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Abrufen der Autoritäts-URL nicht möglich.", + "loc.messages.UnableToFetchActiveDirectory": "Abrufen der Active Directory-Ressourcen-ID nicht möglich.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Runtimestapel und Startbefehl erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Fehler beim Aktualisieren des Runtimestapels und des Startbefehls. Fehler: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "App-Einstellungen erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Fehler beim Aktualisieren der App-Einstellungen. Fehler: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Fehler beim Abrufen von AzureRM-WebApp-Metadaten. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM-WebApp-Metadaten können nicht aktualisiert werden. Fehlercode: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Die Anmeldeinformationen für Azure Container Registry konnten nicht abgerufen werden. [Statuscode: %s]", + "loc.messages.UnableToReadResponseBody": "Antworttext konnte nicht gelesen werden. Fehler: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp-Konfigurationsdetails konnten nicht aktualisiert werden. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Releaseanmerkung für Application Insights-Ressource \"%s\" wird hinzugefügt.", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Releaseanmerkung erfolgreich zu Application Insight hinzugefügt: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Fehler beim Hinzufügen einer Releaseanmerkung. %s", + "loc.messages.RenameLockedFilesEnabled": "Umbenennung gesperrter Dateien für App Service aktiviert.", + "loc.messages.FailedToEnableRenameLockedFiles": "Fehler beim Aktivieren der Umbenennung gesperrter Dateien. Fehler: %s", + "loc.messages.WebJobsInProgressIssue": "Einige WebJobs-Instanzen werden gerade ausgeführt und verhindern, dass die Bereitstellung Dateien entfernt. Sie können die Option \"Zusätzliche Dateien am Ziel entfernen\" deaktivieren oder fortlaufende Aufträge vor der Bereitstellung beenden.", + "loc.messages.FailedToFetchKuduAppSettings": "Fehler beim Abrufen von Kudu-App-Einstellungen. Fehler: %s", + "loc.messages.FailedToCreatePath": "Fehler beim Erstellen des Pfads \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFile": "Fehler beim Löschen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFolder": "Fehler beim Löschen des Ordners \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToUploadFile": "Fehler beim Hochladen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToGetFileContent": "Fehler beim Abrufen des Dateiinhalts \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToListPath": "Fehler beim Auflisten von Pfad \"%s\" aus Kudu. Fehler: %s", + "loc.messages.RetryToDeploy": "Es wird erneut versucht, das Paket bereitzustellen.", + "loc.messages.FailedToGetAppServiceDetails": "Fehler beim Abrufen der App Service-Details \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Fehler beim Abrufen des Veröffentlichungsprofils für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Fehler beim Aktualisieren der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Fehler beim Abrufen der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Fehler beim Patchen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Fehler beim Aktualisieren der App-Dienstkonfiguration \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Fehler beim Abrufen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Fehler beim Abrufen der Anmeldeinformationen für die Veröffentlichung für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Fehler beim Abrufen der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Fehler beim Aktualisieren der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Es wird versucht, die App Service-Konfigurationseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Die App Service-Konfigurationseinstellungen wurden aktualisiert.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Es wird versucht, die App Service-Anwendungseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service-Anwendungseinstellungen sind bereits vorhanden.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service-Verbindungszeichenfolgen sind bereits vorhanden.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Die App Service-Anwendungseinstellungen und die Kudu-Anwendungseinstellungen wurden aktualisiert.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Mehrere Ressourcengruppen für App Service \"%s\" gefunden.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Fehler bei der Paketbereitstellung über ZIP Deploy. Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.PackageDeploymentInitiated": "Die Paketbereitstellung über ZIP Deploy wurde eingeleitet.", + "loc.messages.WarPackageDeploymentInitiated": "Die Paketbereitstellung über WAR Deploy wurde eingeleitet.", + "loc.messages.FailedToGetDeploymentLogs": "Fehler beim Abrufen von Bereitstellungsprotokollen. Fehler: %s", + "loc.messages.GoExeNameNotPresent": "Der Name der Go-EXE-Datei ist nicht vorhanden.", + "loc.messages.WarDeploymentRetry": "Die Bereitstellung der WAR-Datei wird wiederholt, weil sie zuvor nicht erfolgreich erweitert wurde.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Stellen Sie sicher, dass der Computer das TLS 1.2-Protokoll oder eine höhere Version verwendet. Weitere Informationen zum Aktivieren von TLS auf Ihrem Computer finden Sie unter https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Ein Zugriffstoken für Azure konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Konfigurieren Sie die verwaltete Dienstidentität (MSI) für den virtuellen Computer (https://aka.ms/azure-msi-docs). Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.XmlParsingFailed": "Die publishProfileXML-Datei konnte nicht analysiert werden. Fehler: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Die [%s]-Eigenschaft ist im Veröffentlichungsprofil nicht vorhanden.", + "loc.messages.InvalidConnectionType": "Ungültiger Dienstverbindungstyp", + "loc.messages.InvalidImageSourceType": "Ungültiger Imagequelltyp", + "loc.messages.InvalidPublishProfile": "Die Veröffentlichungsprofildatei ist ungültig.", + "loc.messages.ASE_SSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie in der Build- oder Releasepipeline eine Variable mit dem Namen VSTS_ARM_REST_IGNORE_SSL_ERRORS auf den Wert TRUE festlegen.", + "loc.messages.ZipDeployLogsURL": "ZIP Deploy-Protokolle können unter %s angezeigt werden.", + "loc.messages.DeployLogsURL": "Bereitstellungsprotokolle können unter %s angezeigt werden.", + "loc.messages.AppServiceApplicationURL": "URL der App Service-Anwendung: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie \"-allowUntrusted\" in zusätzlichen Argumenten der Web Deploy-Option übergeben.", + "loc.messages.FailedToGetResourceID": "Fehler beim Abrufen der Ressourcen-ID für Ressourcentyp \"%s\" und Ressourcenname \"%s\". Fehler: %s", + "loc.messages.JarPathNotPresent": "Der Java-JAR-Pfad ist nicht vorhanden.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Fehler beim Aktualisieren der Application Insights-Ressource \"%s\". Fehler: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Wechseln Sie Web Deploy zum \"Aus Paket ausführen\", um FILE_IN_USE-Fehler zu vermeiden. Beachten Sie, dass \"Aus Paket ausführen\" keine Unterstützung für den msBuild-Pakettyp bietet. Ändern Sie Ihr Paketformat, um diese Bereitstellungsmethode zu verwenden." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..4214956f7665 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,237 @@ +{ + "loc.friendlyName": "Azure App Service deploy", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "loc.instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "loc.releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "File Transforms & Variable Substitution Options", + "loc.group.displayName.AdditionalDeploymentOptions": "Additional Deployment Options", + "loc.group.displayName.AdditionalDeploymentOptionsLinux": "Additional Deployment Options", + "loc.group.displayName.PostDeploymentAction": "Post Deployment Action", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Application and Configuration Settings", + "loc.input.label.ConnectionType": "Connection type", + "loc.input.help.ConnectionType": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure subscription", + "loc.input.help.ConnectedServiceName": "Select the Azure Resource Manager subscription for the deployment.", + "loc.input.label.PublishProfilePath": "Publish profile path", + "loc.input.help.PublishProfilePath": "Path of the Publish profile created from Visual Studio", + "loc.input.label.PublishProfilePassword": "Publish profile password", + "loc.input.help.PublishProfilePassword": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "loc.input.label.WebAppKind": "App Service type", + "loc.input.help.WebAppKind": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "loc.input.label.WebAppName": "App Service name", + "loc.input.help.WebAppName": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "loc.input.label.DeployToSlotOrASEFlag": "Deploy to Slot or App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "loc.input.label.ResourceGroupName": "Resource group", + "loc.input.help.ResourceGroupName": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Enter or Select an existing Slot other than the Production slot.", + "loc.input.label.DockerNamespace": "Registry or Namespace", + "loc.input.help.DockerNamespace": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Virtual application", + "loc.input.help.VirtualApplication": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root.", + "loc.input.label.Package": "Package or folder", + "loc.input.help.Package": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Runtime Stack", + "loc.input.help.RuntimeStack": "Select the framework and version.", + "loc.input.label.RuntimeStackFunction": "Runtime Stack", + "loc.input.help.RuntimeStackFunction": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "loc.input.label.StartupCommand": "Startup command ", + "loc.input.help.StartupCommand": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Deployment script type", + "loc.input.help.ScriptType": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inline Script", + "loc.input.label.ScriptPath": "Deployment script path", + "loc.input.label.WebConfigParameters": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "loc.input.help.WebConfigParameters": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App settings", + "loc.input.help.AppSettings": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Configuration settings", + "loc.input.help.ConfigurationSettings": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Select deployment method", + "loc.input.help.UseWebDeploy": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app.", + "loc.input.label.DeploymentType": "Deployment method", + "loc.input.help.DeploymentType": "Choose the deployment method for the app.", + "loc.input.label.TakeAppOfflineFlag": "Take App Offline", + "loc.input.help.TakeAppOfflineFlag": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully.", + "loc.input.label.SetParametersFile": "SetParameters file", + "loc.input.help.SetParametersFile": "Optional: location of the SetParameters.xml file to use.", + "loc.input.label.RemoveAdditionalFilesFlag": "Remove additional files at destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclude files from the App_Data folder", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service.", + "loc.input.label.AdditionalArguments": "Additional arguments", + "loc.input.help.AdditionalArguments": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rename locked files", + "loc.input.help.RenameFilesFlag": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment", + "loc.input.label.XmlTransformation": "XML transformation", + "loc.input.help.XmlTransformation": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform.", + "loc.input.label.XmlVariableSubstitution": "XML variable substitution", + "loc.input.help.XmlVariableSubstitution": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
", + "loc.input.label.JSONFiles": "JSON variable substitution", + "loc.input.help.JSONFiles": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution.", + "loc.input.label.DeploymentTypeLinux": "Deployment method", + "loc.input.help.DeploymentTypeLinux": "Choose the deployment method for the app.", + "loc.input.label.CleanDeploymentFlag": "Enable clean deployment", + "loc.input.help.CleanDeploymentFlag": "Deployment mode for complete sync (clean) deployment", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "loc.messages.SetParamFilenotfound0": "Set parameters file not found: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "loc.messages.Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "loc.messages.PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "loc.messages.PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "loc.messages.Runningcommand": "Running command: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "loc.messages.Configfiledoesntexists": "Configuration file %s doesn't exist.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "loc.messages.AppOfflineModeenabled": "App offline mode enabled.", + "loc.messages.Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "loc.messages.AppOflineModedisabled": "App offline mode disabled.", + "loc.messages.FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "loc.messages.ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "loc.messages.EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "loc.messages.RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "loc.messages.Physicalpathalreadyexists": "Physical path '%s' already exists", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "loc.messages.FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "loc.messages.JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "loc.messages.failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "loc.messages.failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "loc.messages.FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "Script file '%s' not found.", + "loc.messages.InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "loc.messages.RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "loc.messages.stdoutFromScript": "Standard output from script: ", + "loc.messages.stderrFromScript": "Standard error from script: ", + "loc.messages.WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "loc.messages.FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "loc.messages.PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "loc.messages.InvalidPollOption": "Invalid polling option provided: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "loc.messages.AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "loc.messages.FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "loc.messages.AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "loc.messages.UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "loc.messages.UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "loc.messages.UnableToReadResponseBody": "Unable to read response body. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "loc.messages.RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "loc.messages.FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "loc.messages.FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Retrying to deploy the package.", + "loc.messages.FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "loc.messages.PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "loc.messages.PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "loc.messages.OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "loc.messages.WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "loc.messages.FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "loc.messages.GoExeNameNotPresent": "Go exe name is not present", + "loc.messages.WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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.XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "loc.messages.InvalidConnectionType": "Invalid service connection type", + "loc.messages.InvalidImageSourceType": "Invalid Image source Type", + "loc.messages.InvalidPublishProfile": "Publish profile file is invalid.", + "loc.messages.ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "loc.messages.ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "loc.messages.DeployLogsURL": "Deploy logs can be viewed at %s", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "loc.messages.FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "loc.messages.JarPathNotPresent": "Java jar path is not present", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "loc.messages.MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy ." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..f10de1f4b8fc --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Implementación de Azure App Service", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Implementar en Azure App Service una aplicación de API, móvil o web con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Implementación de Azure App Service: $(WebAppName)", + "loc.releaseNotes": "Novedades de la versión 4.*
Compatibilidad con la implementación desde archivo zip, la ejecución desde paquete y la implementación desde archivo WAR [detalles aquí](https://aka.ms/appServiceDeploymentMethods)
Compatibilidad con los entornos de App Service Environment
Mejora de la interfaz de usuario para detectar diferentes tipos de instancias de App Service compatibles con la tarea
La ejecución desde el paquete es el método de implementación preferido, que hace que los archivos de la carpeta wwwroot sean de solo lectura
Haga clic [aquí](https://aka.ms/azurermwebdeployreadme) para obtener más información.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformaciones de archivos y opciones de sustitución de variables", + "loc.group.displayName.AdditionalDeploymentOptions": "Opciones de implementación adicionales", + "loc.group.displayName.PostDeploymentAction": "Acción posterior a la implementación", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Configuración y opciones de la aplicación", + "loc.input.label.ConnectionType": "Tipo de conexión", + "loc.input.help.ConnectionType": "Seleccione el tipo de conexión de servicio que se va a usar para implementar la aplicación web.
Seleccione Perfil de publicación para usar el perfil de publicación creado por Visual Studio. [Más información] (https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Suscripción a Azure", + "loc.input.help.ConnectedServiceName": "Seleccione la suscripción de Azure Resource Manager para la implementación.", + "loc.input.label.PublishProfilePath": "Ruta de acceso del perfil de publicación", + "loc.input.help.PublishProfilePath": "Ruta de acceso del perfil de publicación creado desde Visual Studio", + "loc.input.label.PublishProfilePassword": "Contraseña del perfil de publicación", + "loc.input.help.PublishProfilePassword": "Se recomienda almacenar la contraseña en una variable secreta y utilizar esa variable aquí; por ejemplo, $(Password).", + "loc.input.label.WebAppKind": "Tipo de App Service", + "loc.input.help.WebAppKind": "Elija entre Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers y Mobile App.", + "loc.input.label.WebAppName": "Nombre de App Service", + "loc.input.help.WebAppName": "Escriba o seleccione el nombre de una instancia existente de Azure App Service. Solo se enumerarán las instancias de App Service basadas en el tipo de aplicación seleccionado.", + "loc.input.label.DeployToSlotOrASEFlag": "Implementar en la ranura o en App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Seleccione la opción para implementar en una ranura de implementación o entorno de Azure App Service Environment existente.
Para ambos destinos, la tarea necesita el nombre del grupo de recursos.
En caso de que el destino de implementación sea una ranura, la implementación se realiza de forma predeterminada en la ranura de producción. También se puede proporcionar cualquier otro nombre de ranura existente.
En caso de que el destino de implementación sea un entorno de Azure App Service Environment, deje el nombre de la ranura como \"Producción\" y especifique el nombre del grupo de recursos.", + "loc.input.label.ResourceGroupName": "Grupo de recursos", + "loc.input.help.ResourceGroupName": "El nombre del grupo de recursos es necesario cuando el destino de implementación es una ranura de implementación o una instancia de App Service Environment.
Escriba o seleccione el grupo de recursos de Azure que contiene el servicio de Azure App Service especificado anteriormente.", + "loc.input.label.SlotName": "Ranura", + "loc.input.help.SlotName": "Escriba o seleccione un espacio que no sea el de producción.", + "loc.input.label.DockerNamespace": "Registro o espacio de nombres", + "loc.input.help.DockerNamespace": "Nombre de dominio de nivel superior único global para su espacio de nombres o Registro específico.
Nota: El nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerRepository": "Imagen", + "loc.input.help.DockerRepository": "Nombre del repositorio en el que se almacenan las imágenes del contenedor.
Nota: Un nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerImageTag": "Etiqueta", + "loc.input.help.DockerImageTag": "Las etiquetas son opcionales. Este es el mecanismo que los registros usan para asignar una versión a las imágenes de Docker.
Nota: El nombre de imagen completo tiene el formato: \"'`/`:`\". Por ejemplo, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Aplicación virtual", + "loc.input.help.VirtualApplication": "Especifique el nombre de la aplicación virtual que se ha configurado en Azure Portal. Esta opción no es necesaria para implementaciones en la raíz de App Service.", + "loc.input.label.Package": "Paquete o carpeta", + "loc.input.help.Package": "Ruta de acceso al paquete o carpeta que contiene el contenido de App Service generado por MSBuild o un archivo zip o war comprimido.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), se admiten caracteres comodín.
Por ejemplo, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStack": "Seleccione el marco y la versión.", + "loc.input.label.RuntimeStackFunction": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStackFunction": "Seleccione el marco y la versión. Consulte [este documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) para ver las versiones compatibles del entorno de ejecución. Los valores anteriores, como \"DOCKER|microsoft/azure-functions-*\", están en desuso; use los valores nuevos de la lista desplegable.", + "loc.input.label.StartupCommand": "Comando de inicio ", + "loc.input.help.StartupCommand": "Escriba el comando de inicio. Por ejemplo,
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo de script de implementación", + "loc.input.help.ScriptType": "Para personalizar la implementación, proporcione un script que se ejecute en Azure App Service una vez que la tarea haya completado la implementación correctamente. Por ejemplo, restaure paquetes para aplicaciones de Node, PHP y Python. [Más información](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script en línea", + "loc.input.label.ScriptPath": "Ruta de acceso del script de implementación", + "loc.input.label.WebConfigParameters": "Generar parámetros de web.config para aplicaciones de Python, Node.js, Go y Java", + "loc.input.help.WebConfigParameters": "Se generará un archivo web.config estándar y se implementará en Azure App Service si la aplicación no tiene uno. Los valores de web.config se pueden editar y pueden variar en función del marco de trabajo de la aplicación. Por ejemplo, para la aplicación node.js, web.config tendrá los valores de archivo de inicio y del módulo iis_node. La característica de edición es solo para el web.config generado. [Más información](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Configuración de la aplicación", + "loc.input.help.AppSettings": "Edite la configuración de la aplicación web siguiendo la sintaxis -clave valor. Si un valor contiene espacios, debe ponerlo entre comillas dobles.
Ejemplo: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Opciones de configuración", + "loc.input.help.ConfigurationSettings": "Edite opciones de configuración de aplicación web la sintaxis-valor de clave. Valor que contenga espacios debe incluirse entre comillas dobles.
Ejemplo: - phpVersion 5.6 - linuxFxVersion: nodo|6.11", + "loc.input.label.UseWebDeploy": "Seleccionar el método de implementación", + "loc.input.help.UseWebDeploy": "Si está desactivado, se detectará automáticamente el mejor método de implementación en función de su tipo de aplicación, el formato del paquete y otros parámetros.
Seleccione la opción para ver los métodos de implementación compatibles y elija uno para implementar su aplicación.", + "loc.input.label.DeploymentType": "Método de implementación", + "loc.input.help.DeploymentType": "Elija el método de implementación para la aplicación.", + "loc.input.label.TakeAppOfflineFlag": "Desconectar la aplicación", + "loc.input.help.TakeAppOfflineFlag": "Seleccione esta opción para poner sin conexión Azure App Service colocando el archivo app_offline.htm en el directorio raíz de App Service antes de que comience la operación de sincronización. El archivo se quitará cuando la operación de sincronización finalice correctamente.", + "loc.input.label.SetParametersFile": "Archivo SetParameters", + "loc.input.help.SetParametersFile": "Opcional: ubicación del archivo SetParameters.xml que debe usarse.", + "loc.input.label.RemoveAdditionalFilesFlag": "Quitar archivos adicionales en el destino", + "loc.input.help.RemoveAdditionalFilesFlag": "Seleccione la opción para eliminar archivos en la instancia de Azure App Service que no tiene archivos coincidentes en la carpeta o el paquete de App Service.

Nota: Al hacerlo, también se quitarán todos los archivos relacionados con cualquier extensión instalada en esta instancia de Azure App Service. Para evitarlo, seleccione la casilla \"Excluir archivos de la carpeta App_Data\". ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Excluir archivos de la carpeta App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Seleccione esta opción para evitar que los archivos de la carpeta App_Data se implementen en Azure App Service o se eliminen de ese servicio.", + "loc.input.label.AdditionalArguments": "Argumentos adicionales", + "loc.input.help.AdditionalArguments": "Argumentos adicionales de Web Deploy que siguen la sintaxis -clave:valor.
Se aplicarán cuando se implemente la instancia de Azure App Service. Ejemplo: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Para más ejemplos de configuración de la operación de Web Deploy, consulte [aquí] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Cambiar nombre de archivos bloqueados", + "loc.input.help.RenameFilesFlag": "Seleccione la opción para habilitar la marca de msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 en la configuración de la aplicación de Azure App Service. Si está establecida, la opción permite que msdeploy cambie el nombre de los archivos bloqueados que se bloquean durante la implementación de la aplicación", + "loc.input.label.XmlTransformation": "Transformación XML", + "loc.input.help.XmlTransformation": "Las transformaciones de configuración se ejecutarán para \"*.Release.config\" y \"*..config\" en el \"archivo *.config\".
Las transformaciones de configuración se ejecutarán antes de la sustitución de variables.
Las transformaciones XML solo se admiten para la plataforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sustitución de variables XML", + "loc.input.help.XmlVariableSubstitution": "Las variables que se definen en las canalizaciones de compilación o de versión se compararán con las entradas \"key\" o \"name\" de las secciones appSettings, applicationSettings y connectionStrings de cualquier archivo de configuración y parameters.xml. La sustitución de variable tiene lugar después de las transformaciones de configuración.

Nota: Si las mismas variables están definidas en la canalización de versión y en el entorno, las variables de entorno sustituirán las variables de la canalización de versión.
", + "loc.input.label.JSONFiles": "Sustitución de variables JSON", + "loc.input.help.JSONFiles": "Proporcione una nueva lista separada por líneas de los archivos JSON para sustituir los valores de variable. Los nombres de archivos que se proporcionen deben ser relativos a la carpeta raíz.
Para sustituir las variables JSON anidadas o jerárquicas, especifíquelas mediante expresiones JSONPath.

Por ejemplo, para reemplazar el valor de \"ConnectionString\" en el ejemplo siguiente, debe definir una variable como \"Data.DefaultConnection.ConnectionString\" en la canalización de compilación o versión (o el entorno de la canalización de versión).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sustitución de variables se ejecuta una vez que se transforma la configuración.

Nota: Las variables de la canalización se excluyen de la sustitución.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Paquete App Service o ruta de acceso de carpeta proporcionados no válidos: %s", + "loc.messages.SetParamFilenotfound0": "No se ha encontrado el archivo de parámetros establecido: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Las transformaciones XML se aplicaron correctamente", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Se obtuvieron detalles de conexión de servicio para Azure App Service: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No existe tal método de implementación", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "No se pueden recuperar los detalles de la conexión de servicio para Azure App Service: %s. Código de estado: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "No se pueden recuperar los detalles de la conexión de servicio para el recurso de Azure \"%s\". Código de estado: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "El historial de implementación se actualizó correctamente en %s", + "loc.messages.Failedtoupdatedeploymenthistory": "No se pudo actualizar el historial de implementación. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ADVERTENCIA : no se puede actualizar el estado de implementación, el punto de conexión de SCM no está habilitado para este sitio web", + "loc.messages.Unabletoretrievewebconfigdetails": "No se pueden recuperar los detalles de configuración de la instancia de App Service. Código de estado: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "No se puede recuperar la configuración de aplicación de App Service. [Código de estado: \"%s\", Mensaje de error: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "No se puede actualizar la configuración de aplicación de la instancia de App Service. Código de estado: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "No se puede actualizar el estado de implementación : no se puede recuperar el id. de implementación único", + "loc.messages.PackageDeploymentSuccess": "El paquete web se implementó correctamente en App Service.", + "loc.messages.PackageDeploymentFailed": "No se pudo implementar el paquete web en App Service.", + "loc.messages.Runningcommand": "Ejecutando el comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Implementando el paquete web : %s en una ruta de acceso virtual (ruta de acceso física): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "El paquete %s se implementó correctamente mediante el servicio Kudu en %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "No se pudo implementar el paquete App Service mediante el servicio Kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "No se puede implementar App Service debido al código de error: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Los paquetes generados por MSDeploy solo se admiten para la plataforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Versión instalada no admitida: se encontró %s para MSDeploy, pero la versión mínima admitida es 3 o posterior.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "No se puede encontrar la ubicación de MS Deploy del Registro en la máquina (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No se encontró ningún paquete con el patrón especificado: %s
Compruebe si el paquete mencionado en la tarea se publica como artefacto en la compilación o en una fase anterior y se descarga en el trabajo actual.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Más de un paquete coincidió con el patrón especificado: %s. Restrinja el patrón de búsqueda.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Poner la aplicación sin conexión seleccionada.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Cambiar de nombre archivos bloqueados seleccionada.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Ningún archivo JSON coincidía con un patrón específico: %s.", + "loc.messages.Configfiledoesntexists": "El archivo de configuración %s no existe.", + "loc.messages.Failedtowritetoconfigfilewitherror": "No se pudo escribir en el archivo de configuración %s con el error: %s", + "loc.messages.AppOfflineModeenabled": "Modo de aplicación sin conexión habilitado.", + "loc.messages.Failedtoenableappofflinemode": "No se pudo habilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.AppOflineModedisabled": "Modo de aplicación sin conexión deshabilitado.", + "loc.messages.FailedtodisableAppOfflineMode": "No se pudo deshabilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "No se pueden realizar las transformaciones XML en una plataforma que no es Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Error de transformación XML al transformar %s mediante %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Las opciones de publicación mediante webdeploy solo se admiten cuando se usa el agente de Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publicación mediante la opción de implementación desde un archivo zip no se admite para el tipo de paquete de MSBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publicación mediante la opción de implementación desde un archivo zip no se admite para una aplicación virtual.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publicación mediante las opciones de RunFromZip o de implementación desde un archivo zip no admiten la implementación de archivos war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publicación mediante RunFromZip podría no admitir el script posterior a la implementación si realiza cambios en wwwroot, puesto que la carpeta es de solo lectura.", + "loc.messages.ResourceDoesntExist": "El recurso \"%s\" no existe. Este debe existir antes de la implementación.", + "loc.messages.EncodeNotSupported": "Se detectó una codificación de archivos del archivo %s como %s. No se admite la sustitución de variables con la codificación de archivos %s. Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "No se puede detectar la codificación del archivo %s (typeCode: %s). Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.ShortFileBufferError": "El búfer de archivos es demasiado breve para detectar el tipo de codificación : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "No se pudieron actualizar los detalles de configuración de App Service. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Los detalles de configuración de App Service se actualizaron correctamente", + "loc.messages.RequestedURLforkuduphysicalpath": "Dirección URL solicitada para la ruta de acceso física a Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "La ruta de acceso física \"%s\" ya existe", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "La ruta de acceso física a Kudu se creó correctamente: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "No se pudo crear la ruta de acceso física de Kudu. Error: %s", + "loc.messages.FailedtocheckphysicalPath": "No se pudo comprobar la ruta de acceso física de Kudu. Código de error: %s", + "loc.messages.VirtualApplicationDoesNotExist": "La aplicación virtual no existe: %s", + "loc.messages.JSONParseError": "No se puede analizar el archivo JSON: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sustitución de variable JSON se aplicó correctamente.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Sustitución de variables XML aplicada correctamente.", + "loc.messages.failedtoUploadFileToKudu": "No se puede cargar el archivo %s en Kudu (%s). Código de estado: %s", + "loc.messages.failedtoUploadFileToKuduError": "No se puede cargar el archivo %s en Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Ejecutando el script dado en el servicio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "No se puede ejecutar el script en el servicio Kudu. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "No se puede ejecutar el script en Kudu: %s. Código de estado: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "El script se ejecutó correctamente en Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "El script ejecutado devolvió \"%s\" como código de retorno. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "No se puede eliminar el archivo %s de Kudu (%s). Código de estado: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "No se puede eliminar el archivo %s de Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "No se encuentra el archivo de script \"%s\".", + "loc.messages.InvalidScriptFile": "Se proporcionó un archivo de script \"%s\" no válido. Las extensiones válidas son .bat y .cmd para Windows y .sh para Linux.", + "loc.messages.RetryForTimeoutIssue": "No se pudo ejecutar el script porque se agotó el tiempo de espera. Se reintentará una vez más.", + "loc.messages.stdoutFromScript": "Salida estándar del script: ", + "loc.messages.stderrFromScript": "Error estándar del script: ", + "loc.messages.WebConfigAlreadyExists": "El archivo web.config ya existe. No se va a generar.", + "loc.messages.SuccessfullyGeneratedWebConfig": "El archivo web.config se generó correctamente", + "loc.messages.FailedToGenerateWebConfig": "No se pudo generar el archivo web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "No se puede obtener el contenido del archivo: %s. Código de estado: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "No se puede obtener el contenido del archivo: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "No se pudo recuperar el estado del script porque se agotó el tiempo de espera.", + "loc.messages.PollingForFileTimeOut": "No se puede recuperar el estado del script porque se agotó el tiempo de espera. Puede aumentar el tiempo de espera estableciendo la variable \"appservicedeploy.retrytimeout\" en el número de minutos que sea necesario.", + "loc.messages.InvalidPollOption": "Se ha proporcionado una opción de sondeo no válida: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "El atributo \"-appType\" falta en los parámetros de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" y \"Go\".
Por ejemplo, \"-appType python_Bottle\" (sin comillas) en el caso de la plataforma Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "No se puede detectar la ruta de acceso del archivo \"settings.py\" de DJANGO_SETTINGS_MODULE. Asegúrese de que el archivo \"settings.py\" existe o indique la ruta de acceso correcta en la entrada del parámetro de Web.config siguiendo este formato: \"-DJANGO_SETTINGS_MODULE .settings\"", + "loc.messages.FailedToApplyTransformation": "No se puede aplicar la transformación para el paquete dado. Compruebe lo siguiente.", + "loc.messages.FailedToApplyTransformationReason1": "1. Si la transformación ya se ha aplicado para el paquete generado por MSBuild durante la compilación. Si es así, quite la etiqueta para cada configuración del archivo csproj y compile de nuevo. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Asegúrese de que el archivo de configuración y los archivos de transformación están presentes en la misma carpeta dentro del paquete.", + "loc.messages.AutoParameterizationMessage": "Los atributos de ConnectionString en Web.config están parametrizados de manera predeterminada. Tenga en cuenta que la transformación no tiene efecto en los atributos connectionString porque el valor se invalida durante la implementación por los archivos \"Parameters.xml\" o \"SetParameters.xml\". Puede deshabilitar la parametrización automática estableciendo /p:AutoParameterizationWebConfigConnectionStrings=False durante la generación del paquete MSBuild.", + "loc.messages.UnsupportedAppType": "El tipo de aplicación \"'%s\" no se admite en la generación de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\" y \"'node\"", + "loc.messages.UnableToFetchAuthorityURL": "No se puede recuperar la dirección URL de la autoridad.", + "loc.messages.UnableToFetchActiveDirectory": "No se puede recuperar el id. de recurso de Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "La pila en tiempo de ejecución y el comando de inicio se actualizaron correctamente.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "No se pudieron actualizar la pila en tiempo de ejecución y el comando de inicio. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "La configuración de la aplicación se actualizó correctamente.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "No se pudo actualizar la configuración de la aplicación. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "No se pudieron capturar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "No se pueden actualizar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "No se pueden recuperar las credenciales de Azure Container Registry. [Código de estado: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "No se puede leer el cuerpo de la respuesta. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "No se pueden actualizar los detalles de la configuración de WebApp. Código de estado: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Agregar anotación de versión para el recurso de Application Insights \"%s\".", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "La anotación de versión se agregó correctamente a la instancia de Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "No se pudo agregar la anotación de versión. %s", + "loc.messages.RenameLockedFilesEnabled": "La opción Cambiar nombre de archivos bloqueados está habilitada para la instancia de App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "No se pudo habilitar el cambio de nombre de los archivos bloqueados. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Algunos WebJobs en estado de ejecución impiden que la implementación elimine los archivos. Puede deshabilitar la opción \"Quitar archivos adicionales en el destino\" o detener los trabajos continuos antes de la implementación.", + "loc.messages.FailedToFetchKuduAppSettings": "No se pudo capturar la configuración de la aplicación de Kudu. Error: %s", + "loc.messages.FailedToCreatePath": "No se pudo crear la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "No se pudo eliminar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "No se pudo eliminar la carpeta \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "No se pudo cargar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "No se pudo obtener el contenido del archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToListPath": "No se pudo enumerar la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Reintentando la implementación del paquete.", + "loc.messages.FailedToGetAppServiceDetails": "No se pudieron capturar los detalles de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "No se pudo capturar el perfil de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "No se pudieron actualizar los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "No se pudieron obtener los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "No se pudo aplicar una revisión a la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "No se pudo actualizar la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "No se pudo obtener la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "No se pudieron capturar las credenciales de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "No se pudo obtener la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "No se pudo actualizar la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Intentando actualizar los valores de configuración de la instancia de App Service. Datos: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Se han actualizado los valores de configuración de App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Intentando actualizar la configuración de aplicación de App Service. Datos: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "La configuración de aplicación de App Service ya está presente.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Las cadenas de conexión de App Service ya están presentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Se han actualizado la configuración de aplicación de App Service y la configuración de aplicación de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Se encontraron varios grupos de recursos para la instancia de App Service \"%s\".", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Error al implementar el paquete mediante la implementación de ZIP. Consulte los registros para obtener más detalles.", + "loc.messages.PackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo ZIP.", + "loc.messages.WarPackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo WAR.", + "loc.messages.FailedToGetDeploymentLogs": "No se pudieron obtener los registros de implementación. Error: %s", + "loc.messages.GoExeNameNotPresent": "Falta el nombre del archivo ejecutable de Go", + "loc.messages.WarDeploymentRetry": "Reintentando la implementación del archivo war, ya que no se expandió correctamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Asegúrese de que el equipo usa el protocolo TLS 1.2 o posterior. Consulte https://aka.ms/enableTlsv2 para obtener más información sobre cómo habilitar TLS en la máquina.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "No se pudo capturar el token de acceso para Azure. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Configure Managed Service Identity (MSI) para la máquina virtual \"https://aka.ms/azure-msi-docs\". Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.XmlParsingFailed": "No se puede analizar el archivo publishProfileXML: %s. Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propiedad no existe en el perfil de publicación", + "loc.messages.InvalidConnectionType": "Tipo de conexión de servicio no válido", + "loc.messages.InvalidImageSourceType": "Tipo de origen de imagen no válido", + "loc.messages.InvalidPublishProfile": "El archivo del perfil de publicación no es válido.", + "loc.messages.ASE_SSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe establecer una variable denominada VSTS_ARM_REST_IGNORE_SSL_ERRORS como true en la canalización de compilación o de versión", + "loc.messages.ZipDeployLogsURL": "Los registros de implementación desde un archivo zip pueden verse en %s", + "loc.messages.DeployLogsURL": "Los registros de implementación pueden verse en %s", + "loc.messages.AppServiceApplicationURL": "Dirección URL de la aplicación de App Service: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe pasar -allowUntrusted en argumentos adicionales de la opción de implementación web.", + "loc.messages.FailedToGetResourceID": "No se pudo obtener el identificador del tipo de recurso \"%s\" y el nombre de recurso \"%s\". Error: %s", + "loc.messages.JarPathNotPresent": "La ruta de acceso de jar de Java no está presente.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "No se pudo actualizar el recurso de Application Insights \"%s\". Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Cambie de Web Deploy a la ejecución desde el paquete, que ayuda a evitar el error FILE_IN_USE. Tenga en cuenta que la ejecución desde el paquete no admite el tipo de paquete msBuild. Cambie el formato del paquete para usar este método de implementación." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..735e9149ed5b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Déploiement Azure App Service", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Déployer sur Azure App Service une application web, mobile ou API via Docker, Java, .NET, .NET Core, Node.js, PHP, Python ou Ruby", + "loc.instanceNameFormat": "Déploiement d'Azure App Service : $(WebAppName)", + "loc.releaseNotes": "Nouveautés de la version 4.*
Prend en charge Zip Deploy, l'exécution à partir d'un package, War Deploy [Détails ici](https://aka.ms/appServiceDeploymentMethods)
Prend en charge les environnements App Service
Amélioration de l'IU pour la découverte des différents types d'App Service pris en charge par la tâche
L'exécution à partir d'un package est la méthode de déploiement recommandée. Elle permet de rendre les fichiers du dossier wwwroot accessibles en lecture seule
Cliquez [ici](https://aka.ms/azurermwebdeployreadme) pour plus d'informations.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformations de fichiers et options de substitution de variable", + "loc.group.displayName.AdditionalDeploymentOptions": "Options de déploiement supplémentaires", + "loc.group.displayName.PostDeploymentAction": "Action de postdéploiement", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Paramètres d'application et de configuration", + "loc.input.label.ConnectionType": "Type de connexion", + "loc.input.help.ConnectionType": "Sélectionnez le type de connexion de service à utiliser pour déployer l'application web.
Sélectionnez Publier le profil pour utiliser le profil de publication créé par Visual Studio. [Plus d'informations](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Abonnement Azure", + "loc.input.help.ConnectedServiceName": "Sélectionnez l'abonnement Azure Resource Manager pour le déploiement.", + "loc.input.label.PublishProfilePath": "Chemin du profil de publication", + "loc.input.help.PublishProfilePath": "Chemin du profil de publication créé à partir de Visual Studio", + "loc.input.label.PublishProfilePassword": "Mot de passe du profil de publication", + "loc.input.help.PublishProfilePassword": "Il est recommandé de stocker le mot de passe dans une variable secrète et d'utiliser cette variable ici, par exemple $(Password).", + "loc.input.label.WebAppKind": "Type d'App Service", + "loc.input.help.WebAppKind": "Choisissez parmi Web App sur Windows, Web App sur Linux, Web App pour conteneurs, Application de fonction, Application de fonction sur Linux, Application de fonction pour conteneurs et Mobile App.", + "loc.input.label.WebAppName": "Nom de l'App Service", + "loc.input.help.WebAppName": "Entrez ou sélectionnez le nom d'un Azure App Service existant. Seuls les App Services basés sur le type d'application sélectionné sont listés.", + "loc.input.label.DeployToSlotOrASEFlag": "Déployer sur l'emplacement ou l'environnement App Service", + "loc.input.help.DeployToSlotOrASEFlag": "Sélectionnez l'option permettant d'effectuer un déploiement sur un emplacement de déploiement existant ou sur Azure App Service Environment.
Pour les deux cibles, la tâche a besoin du nom du groupe de ressources.
Si la cible de déploiement est un emplacement, le déploiement est effectué par défaut sur l'emplacement de production. Vous pouvez également indiquer un autre nom d'emplacement existant.
Si la cible de déploiement est un environnement Azure App Service, gardez le nom d'emplacement 'production', et spécifiez simplement le nom du groupe de ressources.", + "loc.input.label.ResourceGroupName": "Groupe de ressources", + "loc.input.help.ResourceGroupName": "Le nom du groupe de ressources est obligatoire quand la cible de déploiement est un emplacement de déploiement ou un environnement App Service.
Entrez ou sélectionnez le groupe de ressources Azure qui contient le service Azure App Service spécifié ci-dessus.", + "loc.input.label.SlotName": "Emplacement", + "loc.input.help.SlotName": "Entrez ou sélectionnez un emplacement existant autre que l'emplacement de production.", + "loc.input.label.DockerNamespace": "Registre ou espace de noms", + "loc.input.help.DockerNamespace": "Nom de domaine de premier niveau de type identificateur global unique pour votre registre ou espace de noms spécifique.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Nom du dépôt où sont stockés les images conteneurs.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Étiquette", + "loc.input.help.DockerImageTag": "Les étiquettes sont facultatives. Il s'agit du mécanisme utilisé par les registres pour donner une version aux images Docker.
Remarque : Le nom d'image complet est au format suivant : '`/`:`'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Application virtuelle", + "loc.input.help.VirtualApplication": "Spécifiez le nom de l'application virtuelle configurée dans le portail Azure. L'option n'est pas nécessaire pour les déploiements sur la racine App Service.", + "loc.input.label.Package": "Package ou dossier", + "loc.input.help.Package": "Chemin de fichier du package ou d'un dossier de contenu App Service généré par MSBuild, ou d'un fichier zip ou war compressé.
Les variables ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Mise en production](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)) et les caractères génériques sont pris en charge.
Exemple : $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip ou $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pile d'exécution", + "loc.input.help.RuntimeStack": "Sélectionnez le framework et la version.", + "loc.input.label.RuntimeStackFunction": "Pile d'exécution", + "loc.input.help.RuntimeStackFunction": "Sélectionnez le framework et la version. Consultez [cette documentation](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) pour accéder aux versions de runtime prises en charge. Les anciennes valeurs telles que 'DOCKER|microsoft/azure-functions-*' sont dépréciées. Utilisez les nouvelles valeurs de la liste déroulante.", + "loc.input.label.StartupCommand": "Commande de démarrage ", + "loc.input.help.StartupCommand": "Entrez la commande de démarrage. Exemple :
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Type du script de déploiement", + "loc.input.help.ScriptType": "Personnalisez le déploiement en fournissant un script qui s'exécute sur Azure App Service, une fois que la tâche a effectué le déploiement avec succès. Par exemple, restaurez les packages des applications Node, PHP et Python. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script Inline", + "loc.input.label.ScriptPath": "Chemin du script de déploiement", + "loc.input.label.WebConfigParameters": "Générer les paramètres web.config pour les applications Python, Node.js, Go et Java", + "loc.input.help.WebConfigParameters": "Un fichier web.config standard va être généré et déployé sur Azure App Service, si l'application n'en a pas. Vous pouvez modifier les valeurs du fichier web.config. Celles-ci varient en fonction du framework d'application. Par exemple, pour l'application node.js, web.config a un fichier de démarrage et des valeurs de module iis_node. Cette fonctionnalité d'édition est réservée au fichier web.config généré. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Paramètres de l'application", + "loc.input.help.AppSettings": "Modifiez les paramètres d'application Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple :-Port 5000 - RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Paramètres de configuration", + "loc.input.help.ConfigurationSettings": "Modifiez les paramètres de configuration Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple : - phpVersion 5.6 -linuxFXVersion : node|6.11", + "loc.input.label.UseWebDeploy": "Sélectionner la méthode de déploiement", + "loc.input.help.UseWebDeploy": "Si l'option est décochée, nous détectons automatiquement la meilleure méthode de déploiement en fonction du type de votre application, du format de votre package et d'autres paramètres.
Sélectionnez l'option permettant d'afficher les méthodes de déploiement prises en charge, puis choisissez-en une pour déployer votre application.", + "loc.input.label.DeploymentType": "Méthode de déploiement", + "loc.input.help.DeploymentType": "Choisissez la méthode de déploiement de l'application.", + "loc.input.label.TakeAppOfflineFlag": "Mettre l'application hors connexion", + "loc.input.help.TakeAppOfflineFlag": "Sélectionnez cette option pour mettre Azure App Service hors connexion en plaçant un fichier app_offline.htm dans le répertoire racine de l'App Service avant le début de l'opération de synchronisation. Le fichier est supprimé une fois l'opération de synchronisation correctement effectuée.", + "loc.input.label.SetParametersFile": "Fichier SetParameters", + "loc.input.help.SetParametersFile": "Facultatif : emplacement du fichier SetParameters.xml à utiliser.", + "loc.input.label.RemoveAdditionalFilesFlag": "Supprimer les fichiers supplémentaires à la destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Sélectionnez l'option permettant de supprimer les fichiers du service Azure App Service qui n'ont aucun fichier correspondant dans le package ou dossier App Service.

Remarque : Tous les fichiers associés à une extension installée sur ce service Azure App Service sont également supprimés. Pour éviter que cela se produise, cochez la case 'Exclure les fichiers du dossier App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclure les fichiers du dossier App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Sélectionnez l'option permettant d'empêcher les fichiers du dossier App_Data d'être déployés/supprimés sur Azure App Service.", + "loc.input.label.AdditionalArguments": "Arguments supplémentaires", + "loc.input.help.AdditionalArguments": "Arguments Web Deploy supplémentaires suivant la syntaxe -key:value.
Ceux-ci sont appliqués au moment du déploiement d'Azure App Service, par exemple : -disableLink:AppPoolExtension -disableLink:ContentExtension.
Pour plus d'exemples de paramètres d'opération Web Deploy, consultez [cette page](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Renommer les fichiers verrouillés", + "loc.input.help.RenameFilesFlag": "Sélectionnez l'option permettant d'activer l'indicateur msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 dans les paramètres d'application Azure App Service. Si cette option est définie, elle permet à msdeploy de renommer les fichiers verrouillés durant le déploiement de l'application", + "loc.input.label.XmlTransformation": "Transformation XML", + "loc.input.help.XmlTransformation": "Les transformations de configuration sont exécutées pour '*Release.config' et '*..config' sur le fichier '*.config'.
Elles sont exécutées avant la substitution de variable.
Les transformations XML sont prises en charge uniquement pour la plateforme Windows.", + "loc.input.label.XmlVariableSubstitution": "Substitution de variable XML", + "loc.input.help.XmlVariableSubstitution": "Les variables définies dans le pipeline de build ou le pipeline de mise en production sont mappées aux entrées 'key' ou 'name' dans les sections appSettings, connectionStrings et applicationSettings d'un fichier config et d'un fichier parameters.xml. La substitution de variable est exécutée après les transformations de configuration.

Remarque : Si les mêmes variables sont définies dans le pipeline de mise en production et dans l'environnement, les variables d'environnement remplacent les variables de pipeline de mise en production.
", + "loc.input.label.JSONFiles": "Substitution de variable JSON", + "loc.input.help.JSONFiles": "Fournissez une liste de fichiers JSON séparés par une nouvelle ligne pour remplacer les valeurs de variables. Les noms de fichiers doivent être indiqués par rapport au dossier racine.
Pour remplacer les variables JSON imbriquées ou hiérarchiques, spécifiez-les à l'aide d'expressions JSONPath.

Par exemple, pour remplacer la valeur de 'ConnectionString' dans l'exemple ci-dessous, vous devez définir une variable en tant que 'Data.DefaultConnection.ConnectionString' dans la définition de build ou de mise en production (ou l'environnement du pipeline de mise en production).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La substitution de variable est exécutée après les transformations de configuration.

Remarque : Les variables de pipeline sont exclues de la substitution.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Chemin de dossier ou package App Service fourni non valide : %s", + "loc.messages.SetParamFilenotfound0": "Fichier de définition de paramètres introuvable : %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Transformations XML correctement appliquées", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Obtention effectuée des détails de la connexion de service d'Azure App Service : '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Erreur : Aucune méthode de déploiement de ce type n'existe", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Impossible de récupérer les détails de la connexion de service d'Azure App Service : %s. Code d'état : %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Impossible de récupérer les détails de connexion de service de la ressource Azure : '%s'. Code d'état : %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Historique de déploiement mis à jour sur %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Échec de la mise à jour de l'historique de déploiement. Erreur : %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVERTISSEMENT : Impossible de mettre à jour l'état de déploiement : le point de terminaison SCM n'est pas activé pour ce site web", + "loc.messages.Unabletoretrievewebconfigdetails": "Impossible de récupérer les détails de la configuration d'App Service. Code d'état : '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Impossible de récupérer les paramètres d'application App Service. [Code d'état : '%s', message d'erreur : '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Impossible de mettre à jour les paramètres d'application d'App Service. Code d'état : '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Impossible de mettre à jour l'état du déploiement : l'ID de déploiement unique ne peut pas être récupéré", + "loc.messages.PackageDeploymentSuccess": "Déploiement réussi du package web sur App Service.", + "loc.messages.PackageDeploymentFailed": "Échec de déploiement du package web sur App Service.", + "loc.messages.Runningcommand": "Exécution de la commande : %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Déploiement du package web : %s sur le chemin virtuel (chemin physique) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Package %s déployé à l'aide du service kudu sur %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Impossible de déployer le package App Service à l'aide du service kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Impossible de déployer App Service en raison du code d'erreur %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Les packages générés par MSDeploy sont uniquement pris en charge par la plateforme Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Version installée non prise en charge : %s trouvé pour MSDeploy. Il doit s'agir au minimum de la version 3 ou d'une version ultérieure", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Emplacement introuvable de MSDeploy dans le Registre de l'ordinateur (Erreur : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Package introuvable avec le modèle spécifié : %s
Vérifiez si le package mentionné dans la tâche est publié en tant qu'artefact dans la build ou à une étape précédente, et s'il est téléchargé dans le travail actuel.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Plusieurs packages correspondent au modèle spécifié : %s. Affinez le modèle de recherche.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Essayez de redéployer App Service avec l'option Mettre l'application hors connexion sélectionnée.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Essayez de redéployer App Service avec l'option Renommer les fichiers verrouillés sélectionnée.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Aucun fichier JSON ne correspond au modèle spécifique : %s.", + "loc.messages.Configfiledoesntexists": "Le fichier de configuration %s n'existe pas.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Échec d'écriture dans le fichier config %s avec l'erreur : %s", + "loc.messages.AppOfflineModeenabled": "Mode hors connexion de l'application activé.", + "loc.messages.Failedtoenableappofflinemode": "Échec de l'activation du mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.AppOflineModedisabled": "Mode hors connexion de l'application désactivé.", + "loc.messages.FailedtodisableAppOfflineMode": "Impossible de désactiver le mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Impossible d'effectuer les transformations XML sur une plateforme non-Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Erreur de transformation XML lors de la transformation de %s à l'aide de %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Les options de publication à l'aide de webdeploy ne sont prises en charge qu'en cas d'utilisation de l'agent Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour le type de package msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour une application virtuelle.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publication à l'aide des options zip deploy ou RunFromZip ne prend pas en charge le déploiement de fichiers war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publication à l'aide de RunFromZip risque de ne pas prendre en charge le script de postdéploiement, s'il apporte des changements à wwwroot, car le dossier est ReadOnly.", + "loc.messages.ResourceDoesntExist": "La ressource '%s' n'existe pas. La ressource doit exister avant le déploiement.", + "loc.messages.EncodeNotSupported": "Encodage du fichier %s en %s détecté. La substitution de variable n'est pas prise en charge avec l'encodage de fichier %s. Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Impossible de détecter l'encodage du fichier %s (typeCode : %s). Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.ShortFileBufferError": "La mémoire tampon de fichier est insuffisante pour détecter le type d'encodage : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Impossible de mettre à jour les informations sur la configuration App Service. Erreur : %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Informations sur la configuration App Service correctement mises à jour", + "loc.messages.RequestedURLforkuduphysicalpath": "URL demandée pour le chemin d'accès physique Kudu : %s", + "loc.messages.Physicalpathalreadyexists": "Le chemin d'accès physique '%s' existe déjà", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Chemin d'accès physique Kudu correctement créé : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Échec de la création du chemin physique de kudu. Erreur : %s", + "loc.messages.FailedtocheckphysicalPath": "Échec de la vérification du chemin physique de kudu. Code d'erreur : %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'application virtuelle %s n'existe pas", + "loc.messages.JSONParseError": "Impossible d'analyser le fichier JSON : %s. Erreur : %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Substitution de variable JSON correctement appliquée.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La substitution de la variable XML a été appliquée.", + "loc.messages.failedtoUploadFileToKudu": "Impossible de charger le fichier %s sur Kudu (%s). Code d'état : %s", + "loc.messages.failedtoUploadFileToKuduError": "Impossible de charger le fichier %s sur Kudu (%s). Erreur : %s", + "loc.messages.ExecuteScriptOnKudu": "Exécution du script donné sur le service Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Impossible d'exécuter le script sur le service Kudu. Erreur : %s", + "loc.messages.FailedToRunScriptOnKudu": "Impossible d'exécuter le script sur Kudu : %s. Code d'état : %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Exécution réussie du script sur Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Le script exécuté a généré le code de retour '%s'. Erreur : %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Impossible de supprimer le fichier %s de Kudu (%s). Code d'état : %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Impossible de supprimer le fichier %s de Kudu (%s). Erreur : %s", + "loc.messages.ScriptFileNotFound": "Le fichier de script '%s' est introuvable.", + "loc.messages.InvalidScriptFile": "Le fichier de script fourni '%s' est non valide. Les extensions valides sont .bat et .cmd pour Windows, et.sh pour Linux", + "loc.messages.RetryForTimeoutIssue": "Échec de l'exécution du script en raison d'un problème de délai d'expiration. Nouvelle tentative.", + "loc.messages.stdoutFromScript": "Sortie standard du script : ", + "loc.messages.stderrFromScript": "Erreur standard du script : ", + "loc.messages.WebConfigAlreadyExists": "Le fichier web.config existe déjà. Aucune génération en cours.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Génération réussie du fichier web.config", + "loc.messages.FailedToGenerateWebConfig": "Échec de génération de web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Impossible d'obtenir le contenu du fichier : %s. Code d'état : %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Impossible d'obtenir le contenu du fichier : %s. Erreur : %s", + "loc.messages.ScriptStatusTimeout": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration.", + "loc.messages.PollingForFileTimeOut": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration. Vous pouvez augmenter la limite du délai d'expiration en affectant le nombre de minutes nécessaires à la variable 'appservicedeploy.retrytimeout'.", + "loc.messages.InvalidPollOption": "Option d'interrogation non valide fournie : %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Il manque l'attribut '-appType' dans les paramètres de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask', 'node' et 'Go'.
Exemple : '-appType python_Bottle' (sans guillemets) dans le cas d'un framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Impossible de détecter le chemin du fichier 'settings.py' pour DJANGO_SETTINGS_MODULE. Vérifiez que le fichier 'settings.py' existe, ou indiquez le chemin approprié dans l'entrée de paramètre de Web.config au format suivant : '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Impossible d'appliquer la transformation pour le package donné. Vérifiez ce qui suit.", + "loc.messages.FailedToApplyTransformationReason1": "1. La transformation est-elle déjà appliquée pour le package MSBuild généré durant la build ? Si la réponse est oui, supprimez la balise pour chaque configuration dans le fichier csproj, puis effectuez une regénération. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Vérifiez que le fichier config et les fichiers de transformation sont présents dans le même dossier à l'intérieur du package.", + "loc.messages.AutoParameterizationMessage": "Les attributs de ConnectionString dans Web.config sont paramétrables par défaut. Notez que la transformation n'a aucun effet sur les attributs de connectionString, car la valeur est remplacée durant le déploiement par les fichiers 'Parameters.xml' ou 'SetParameters.xml'. Vous pouvez désactiver le paramétrage automatique en définissant /p:AutoParameterizationWebConfigConnectionStrings=False durant la génération du package MSBuild.", + "loc.messages.UnsupportedAppType": "Le type d'application '%s' n'est pas pris en charge dans la génération de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask' et 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Impossible de récupérer (fetch) l'URL d'autorité.", + "loc.messages.UnableToFetchActiveDirectory": "Impossible de récupérer (fetch) l'ID de ressource Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Mise à jour réussie de la pile d'exécution et de la commande de démarrage.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Échec de la mise à jour de la pile d'exécution et de la commande de démarrage. Erreur : %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Mise à jour réussie des paramètres de l'application.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Échec de la mise à jour des paramètres de l'application. Erreur : %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Échec de la récupération (fetch) des métadonnées de la WebApp AzureRM. ErrorCode : %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Impossible de mettre à jour les métadonnées de la WebApp AzureRM. Code d'erreur : %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Impossible de récupérer les informations d'identification d'Azure Container Registry.[Code d'état : '%s']", + "loc.messages.UnableToReadResponseBody": "Impossible de lire le corps de la réponse. Erreur : %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Impossible de mettre à jour les détails de configuration de la WebApp. StatusCode : '%s'", + "loc.messages.AddingReleaseAnnotation": "Ajout d'une annotation de mise en production pour la ressource Application Insights '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Ajout réussi de l'annotation de mise en production à Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Échec de l'ajout de l'annotation de mise en production. %s", + "loc.messages.RenameLockedFilesEnabled": "Le renommage des fichiers verrouillés est activé pour App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Échec de l'activation du renommage des fichiers verrouillés. Erreur : %s", + "loc.messages.WebJobsInProgressIssue": "Un petit nombre de WebJobs à l'état en cours d'exécution empêchent le processus de déploiement de supprimer les fichiers. Désactivez l'option Supprimer les fichiers supplémentaires à l'emplacement de destination, ou arrêtez les travaux continus avant le déploiement.", + "loc.messages.FailedToFetchKuduAppSettings": "Échec de la récupération (fetch) des paramètres d'application Kudu. Erreur : %s", + "loc.messages.FailedToCreatePath": "Échec de la création du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFile": "Échec de la suppression du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFolder": "Échec de la suppression du dossier '%s' dans Kudu. Erreur : %s", + "loc.messages.FailedToUploadFile": "Échec du chargement du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToGetFileContent": "Échec de l'obtention du contenu du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToListPath": "Échec du listage du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.RetryToDeploy": "Nouvelle tentative de déploiement du package.", + "loc.messages.FailedToGetAppServiceDetails": "Échec de la récupération (fetch) des détails de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Échec de la récupération (fetch) du profil de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Échec de la mise à jour des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceMetadata": "Échec de l'obtention des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Échec de l'application du correctif à la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Échec de la mise à jour de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Échec de l'obtention de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Échec de la récupération (fetch) des informations d'identification de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Échec de l'obtention des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Échec de la mise à jour des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentative de mise à jour des paramètres de configuration d'App Service. Données : %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Mise à jour effectuée des paramètres de configuration d'App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentative de mise à jour des paramètres d'application d'App Service. Données : %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Les paramètres d'application d'App Service sont déjà présents.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Les chaînes de connexion d'App Service sont déjà présentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Mise à jour effectuée des paramètres d'application d'App Service et des paramètres d'application de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Plusieurs groupes de ressources trouvés pour l'App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Échec du déploiement de package à l'aide de ZIP Deploy. Pour plus d'informations, consultez les journaux.", + "loc.messages.PackageDeploymentInitiated": "Déploiement de package avec ZIP Deploy lancé.", + "loc.messages.WarPackageDeploymentInitiated": "Lancement effectué du déploiement de package à l'aide de WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Échec de l'obtention des journaux de déploiement. Erreur : %s", + "loc.messages.GoExeNameNotPresent": "Nom de l’exe Go absent", + "loc.messages.WarDeploymentRetry": "Nouvelle tentative de déploiement du fichier war, car il ne s'est pas décompressé correctement.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assurez-vous que l'ordinateur utilise le protocole TLS 1.2 ou ultérieur. Consultez https://aka.ms/enableTlsv2 pour plus d'informations sur l'activation de TLS sur votre ordinateur.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Configurez MSI (Managed Service Identity) pour la machine virtuelle 'https://aka.ms/azure-msi-docs'. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Code d'état : %s, message d'état : %s", + "loc.messages.XmlParsingFailed": "Impossible d'analyser le fichier publishProfileXML. Erreur : %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propriété n'existe pas dans le profil de publication", + "loc.messages.InvalidConnectionType": "Type de connexion de service non valide", + "loc.messages.InvalidImageSourceType": "Type de source d'image non valide", + "loc.messages.InvalidPublishProfile": "Le fichier de profil de publication est non valide.", + "loc.messages.ASE_SSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez affecter la valeur true à une variable nommée VSTS_ARM_REST_IGNORE_SSL_ERRORS dans le pipeline de build ou le pipeline de mise en production", + "loc.messages.ZipDeployLogsURL": "Les journaux Zip Deploy peuvent être consultés sur %s", + "loc.messages.DeployLogsURL": "Les journaux de déploiement peuvent être consultés sur %s", + "loc.messages.AppServiceApplicationURL": "URL d'application App Service : %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez passer -allowUntrusted dans des arguments supplémentaires de l'option Web Deploy.", + "loc.messages.FailedToGetResourceID": "Échec de l'obtention de l'ID de ressource pour le type de ressource '%s' et le nom de ressource '%s'. Erreur : %s", + "loc.messages.JarPathNotPresent": "Le chemin du fichier jar Java n'est pas présent", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Échec de la mise à jour de la ressource Application Insights '%s'. Erreur : %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passez de Web Deploy à l'exécution à partir d'un package, ce qui permet d'éviter l'erreur FILE_IN_USE. Notez que l'exécution à partir d'un package ne prend pas en charge le type de package msBuild. Changez le format de votre package pour utiliser cette méthode de déploiement." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..f4bfc0ca0356 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Distribuzione di Servizio app di Azure", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Esegue la distribuzione in Servizio app di Azure di un'app Web, per dispositivi mobili o API con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Distribuzione servizio app di Azure: $(WebAppName)", + "loc.releaseNotes": "Novità della versione 4.*
Supporto di Zip Deploy, Run From Package, War Deploy [Dettagli](https://aka.ms/appServiceDeploymentMethods)
Supporto di Ambienti del servizio app
Interfaccia utente migliorata per l'individuazione dei diversi tipi di servizio app supportati dall'attività
Il metodo di distribuzione preferito è Run From Package, con cui i file nella cartella wwwroot diventano di sola lettura
Per altre informazioni, fare clic [qui](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Opzioni di trasformazioni di file e sostituzioni di variabili", + "loc.group.displayName.AdditionalDeploymentOptions": "Opzioni di distribuzione aggiuntive", + "loc.group.displayName.PostDeploymentAction": "Azione post-distribuzione", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Impostazioni applicazione e configurazione", + "loc.input.label.ConnectionType": "Tipo di connessione", + "loc.input.help.ConnectionType": "Selezionare il tipo di connessione al servizio da usare per distribuire l'app Web.
Selezionare Profilo di pubblicazione per usare il profilo di pubblicazione creato da Visual Studio. [Altre informazioni](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceName": "Selezionare la sottoscrizione di Azure Resource Manager per la distribuzione.", + "loc.input.label.PublishProfilePath": "Percorso del profilo di pubblicazione", + "loc.input.help.PublishProfilePath": "Percorso del profilo di pubblicazione creato da Visual Studio", + "loc.input.label.PublishProfilePassword": "Password del profilo di pubblicazione", + "loc.input.help.PublishProfilePassword": "È consigliabile archiviare la password in una variabile di segreto e usare qui tale variabile, ad esempio $(Password).", + "loc.input.label.WebAppKind": "Tipo del servizio app", + "loc.input.help.WebAppKind": "Consente di scegliere tra App Web in Windows, App Web in Linux, App Web per contenitori, App per le funzioni, App per le funzioni in Linux, App per le funzioni per contenitori e App per dispositivi mobili.", + "loc.input.label.WebAppName": "Nome del servizio app", + "loc.input.help.WebAppName": "Consente di immettere o selezionare il nome di un servizio app di Azure. Verranno elencati solo i servizi app basati sul tipo di app selezionato.", + "loc.input.label.DeployToSlotOrASEFlag": "Distribuisci nello slot o nell'ambiente del servizio app", + "loc.input.help.DeployToSlotOrASEFlag": "Consente di selezionare l'opzione per la distribuzione in uno slot di distribuzione esistente o in un ambiente del servizio app di Azure.
Per entrambe le destinazioni l'attività richiede il nome del gruppo di risorse.
Se la destinazione di distribuzione è uno slot, per impostazione predefinita la distribuzione viene eseguita nello slot di produzione. È anche possibile specificare qualsiasi altro nome di slot esistente.
Se la destinazione di distribuzione è un ambiente del servizio app di Azure, lasciare il nome dello slot impostato su 'produzione' e specificare solo il nome del gruppo di risorse.", + "loc.input.label.ResourceGroupName": "Gruppo di risorse", + "loc.input.help.ResourceGroupName": "Il nome del gruppo di risorse è obbligatorio quando la destinazione di distribuzione è uno slot di distribuzione o un ambiente del servizio app.
Immettere o selezionare il gruppo di risorse di Azure che contiene il servizio app di Azure specificato sopra.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Immettere o selezionare uno slot esistente diverso da quello di produzione.", + "loc.input.label.DockerNamespace": "Registro o spazio dei nomi", + "loc.input.help.DockerNamespace": "Nome di dominio di primo livello univoco a livello globale per il registro o lo spazio dei nomi specifico.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Immagine", + "loc.input.help.DockerRepository": "Nome del repository in cui vengono archiviate le immagini del contenitore.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "I tag sono facoltativi e costituiscono il meccanismo usato dai registri per assegnare una versione alle immagini Docker.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Applicazione virtuale", + "loc.input.help.VirtualApplication": "Consente di specificare il nome dell'applicazione virtuale configurata nel portale di Azure. L'opzione non è necessaria per le distribuzioni nella radice del servizio app.", + "loc.input.label.Package": "Pacchetto o cartella", + "loc.input.help.Package": "Percorso file del pacchetto o di una cartella che include il contenuto del servizio app generato da MSBuild oppure un file WAR o ZIP compresso.
Variabili ( [Compilazione](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Versione](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)). I caratteri jolly sono supportati.
Ad esempio, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Stack di runtime", + "loc.input.help.RuntimeStack": "Consente di selezionare il framework e la versione.", + "loc.input.label.RuntimeStackFunction": "Stack di runtime", + "loc.input.help.RuntimeStackFunction": "Consente di selezionare il framework e la versione. Fare riferimento a [questo documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) per le versioni del runtime supportate. I valori precedenti, come `DOCKER|microsoft/azure-functions-*`, sono deprecati. Usare i nuovi valori dall'elenco a discesa.", + "loc.input.label.StartupCommand": "Comando di avvio ", + "loc.input.help.StartupCommand": "Immettere il comando di avvio, ad esempio
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo dello script di distribuzione", + "loc.input.help.ScriptType": "È possibile personalizzare la distribuzione fornendo uno script che verrà eseguito nel servizio app di Azure una volta completata la distribuzione dell'attività, ad esempio per ripristinare i pacchetti per le applicazioni Node, PHP e Python. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script inline", + "loc.input.label.ScriptPath": "Percorso dello script di distribuzione", + "loc.input.label.WebConfigParameters": "Genera i parametri di web.config per app Python, Node.js, Go e Java", + "loc.input.help.WebConfigParameters": "Verrà generato un file Web.config standard che verrà distribuito nel servizio app di Azure, se non è disponibile per l'applicazione. I valori presenti nel file Web.config sono modificabili e possono variare a seconda del framework dell'applicazione. Ad esempio, per l'applicazione node.js il file Web.config includerà i valori per il file di avvio e il modulo iis_node. Questa funzionalità di modifica è utilizzabile solo per il file Web.config generato. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Impostazioni app", + "loc.input.help.AppSettings": "Consente di modificare le impostazioni applicazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Ora solare fuso orientale\"", + "loc.input.label.ConfigurationSettings": "Impostazioni di configurazione", + "loc.input.help.ConfigurationSettings": "Consente di modificare le impostazioni di configurazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Seleziona il metodo di distribuzione", + "loc.input.help.UseWebDeploy": "Se questa opzione è deselezionata, il metodo di distribuzione migliore verrà rilevato automaticamente in base al tipo di app, al formato del pacchetto e ad altri parametri.
Selezionare l'opzione per visualizzare i metodi di distribuzione supportati e sceglierne uno per la distribuzione dell'app.", + "loc.input.label.DeploymentType": "Metodo di distribuzione", + "loc.input.help.DeploymentType": "Consente di scegliere il metodo di distribuzione per l'app.", + "loc.input.label.TakeAppOfflineFlag": "Porta app offline", + "loc.input.help.TakeAppOfflineFlag": "Consente di selezionare l'opzione per portare offline il servizio app di Azure inserendo un file app_offline.htm nella directory radice del servizio app prima dell'inizio dell'operazione di sincronizzazione. Il file verrà rimosso al termine dell'operazione di sincronizzazione.", + "loc.input.label.SetParametersFile": "File SetParameters", + "loc.input.help.SetParametersFile": "Facoltativo: percorso del file SetParameters.xml da usare.", + "loc.input.label.RemoveAdditionalFilesFlag": "Rimuovi file aggiuntivi nella destinazione", + "loc.input.help.RemoveAdditionalFilesFlag": "Consente di selezionare l'opzione per eliminare nel servizio app di Azure i file per cui non esistono file corrispondenti nella cartella o nel pacchetto del servizio app.

Nota: verranno rimossi anche tutti i file correlati a eventuali estensioni installate in questo servizio app di Azure. Per evitarlo, selezionare la casella di controllo 'Escludi file dalla cartella App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Escludi file dalla cartella App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Consente di selezionare l'opzione per impedire che i file nella cartella App_Data vengano distribuiti nel servizio app di Azure o eliminati da tale servizio.", + "loc.input.label.AdditionalArguments": "Argomenti aggiuntivi", + "loc.input.help.AdditionalArguments": "Argomenti aggiuntivi di Web Deploy conformi alla sintassi -chiave:valore.
Tali argomenti verranno applicati durante la distribuzione del servizio app di Azure. Esempio: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Per altri esempi di impostazioni per le operazioni di Web Deploy, fare clic [qui](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rinomina i file bloccati", + "loc.input.help.RenameFilesFlag": "Consente di selezionare l'opzione per abilitare il flag MSDEPLOY_RENAME_LOCKED_FILES=1 di MSDeploy nelle impostazioni dell'applicazione del servizio app di Azure. Se impostata, l'opzione consente a MSDeploy di rinominare file bloccati che vengono bloccati durante la distribuzione dell'app", + "loc.input.label.XmlTransformation": "Trasformazione XML", + "loc.input.help.XmlTransformation": "Le trasformazioni dei file config verranno eseguite per `*.Release.config` e `*..config` nel file `*.config`.
Le trasformazioni dei file config verranno eseguite prima della sostituzione delle variabili.
Le trasformazioni XML sono supportate solo per la piattaforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sostituzione di variabili XML", + "loc.input.help.XmlVariableSubstitution": "Le variabili definite nelle pipeline di compilazione o di versione verranno confrontate con le voci 'key' o 'name' nelle sezioni appSettings, applicationSettings e connectionStrings di tutti i file config e parameters.xml. La sostituzione delle variabili viene eseguita dopo le trasformazioni dei file config.

Nota: se si definiscono le stesse variabili nella pipeline di versione e nell'ambiente, quelle di ambiente prevarranno su quelle della pipeline di versione.
", + "loc.input.label.JSONFiles": "Sostituzione di variabili JSON", + "loc.input.help.JSONFiles": "Consente di specificare l'elenco di file JSON delimitati da caratteri di nuova riga per sostituire i valori delle variabili. I nomi di file specificati devono essere relativi alla cartella radice.
Per sostituire le variabili JSON annidate o gerarchiche, specificarle usando espressioni JSONPath.

Ad esempio, per sostituire il valore di ‘ConnectionString’ nell'esempio seguente, è necessario definire una variabile come ‘Data.DefaultConnection.ConnectionString’ nella pipeline di compilazione o versione (o nell'ambiente della pipeline di versione).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sostituzione delle variabili viene eseguita dopo le trasformazioni della configurazione.

Nota: le variabili delle pipeline vengono escluse nella sostituzione.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Il percorso specificato per il pacchetto o la cartella del servizio app non è valido: %s", + "loc.messages.SetParamFilenotfound0": "Il file dei parametri del set non è stato trovato: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Le trasformazioni XML sono state applicate", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "I dettagli della connessione al servizio per il servizio app di Azure sono stati recuperati: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Errore: non esiste alcun metodo di distribuzione di questo tipo", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Non è possibile recuperare i dettagli della connessione al servizio per il servizio app di Azure: %s. Codice di stato: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Non è possibile recuperare i dettagli della connessione al servizio per la risorsa di Azure '%s'. Codice di stato: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "L'aggiornamento della cronologia di distribuzione all'indirizzo %s è stato completato", + "loc.messages.Failedtoupdatedeploymenthistory": "Non è stato possibile aggiornare la cronologia di distribuzione. Errore: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVVISO: non è possibile aggiornare lo stato di distribuzione. L'endpoint di Gestione controllo del codice sorgente non è abilitato per questo sito Web", + "loc.messages.Unabletoretrievewebconfigdetails": "Non è possibile recuperare i dettagli di configurazione del servizio app. Codice di stato: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Non è possibile recuperare le impostazioni dell'applicazione del servizio app. [Codice di stato: '%s'. Messaggio di errore: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Non è possibile aggiornare le impostazioni dell'applicazione del servizio app. Codice di stato: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Non è possibile aggiornare lo stato di distribuzione. L'ID distribuzione univoco non è stato recuperato", + "loc.messages.PackageDeploymentSuccess": "Il pacchetto Web è stato distribuito nel servizio app.", + "loc.messages.PackageDeploymentFailed": "Non è stato possibile distribuire il pacchetto Web nel servizio app.", + "loc.messages.Runningcommand": "Esecuzione del comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Distribuzione del pacchetto Web %s nel percorso virtuale (percorso fisico) %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "La distribuzione del pacchetto %s con il servizio Kudu all'indirizzo %s è riuscita", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Non è stato possibile distribuire il pacchetto del servizio app con il servizio Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Non è possibile distribuire il servizio app a causa del codice errore: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "I pacchetti generati da MSDeploy sono supportati solo per la piattaforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "La versione installata non è supportata. La versione trovata per MSDeploy è %s, ma deve essere almeno 3 o successiva", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Il percorso di MSDeploy non è stato trovato dal Registro di sistema nel computer (errore: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Non è stato trovato alcun pacchetto con il criterio specificato: %s
Verificare se il pacchetto menzionato nell'attività viene pubblicato come artefatto nella compilazione o in una fase precedente e quindi scaricato nel processo corrente.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Più pacchetti corrispondono al criterio specificato %s. Restringere i criteri di ricerca.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Porta l'applicazione offline.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Rinomina i file bloccati.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Non sono stati trovati file JSON corrispondenti al criterio specificato: %s.", + "loc.messages.Configfiledoesntexists": "Il file di configurazione %s non esiste.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Non è stato possibile scrivere nel file config %s. Errore: %s", + "loc.messages.AppOfflineModeenabled": "La modalità offline dell'app è abilitata.", + "loc.messages.Failedtoenableappofflinemode": "Non è stato possibile abilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.AppOflineModedisabled": "La modalità offline dell'app è disabilitata.", + "loc.messages.FailedtodisableAppOfflineMode": "Non è stato possibile disabilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Non è possibile eseguire trasformazioni XML su una piattaforma non Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Si è verificato un errore di trasformazione XML durante la trasformazione di %s con %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Le opzioni di pubblicazione con Distribuzione Web sono supportate solo quando si usa l'agente Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La pubblicazione con l'opzione zipdeploy non è supportata per il tipo di pacchetto msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La pubblicazione con l'opzione zipdeploy non è supportata per l'applicazione virtuale.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Se si pubblica usando le opzioni zipdeploy o RunFromZip, la distribuzione di file war non è supportata.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Se si pubblica usando RunFromZip, è possibile che lo script post-distribuzione non sia supportato se apporta modifiche a wwwroot perché la cartella è di sola lettura.", + "loc.messages.ResourceDoesntExist": "La risorsa '%s' non esiste. La risorsa deve esistere prima della distribuzione.", + "loc.messages.EncodeNotSupported": "La codifica rilevata del file %s è %s. La sostituzione delle variabili non è supportata con la codifica file %s. Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Non è possibile rilevare la codifica del file %s (typeCode: %s). Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Il buffer di file è troppo piccolo per il rilevamento del tipo di codifica: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Non è stato possibile aggiornare i dettagli della configurazione del servizio app. Errore: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "I dettagli della configurazione del servizio app sono stati aggiornati", + "loc.messages.RequestedURLforkuduphysicalpath": "È stato richiesto l'URL per il percorso fisico di Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Il percorso fisico '%s' esiste già", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Il percorso fisico di Kudu è stato creato: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Non è stato possibile creare il percorso fisico di Kudu. Errore: %s", + "loc.messages.FailedtocheckphysicalPath": "Non è stato possibile verificare il percorso fisico di Kudu. Codice errore: %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'applicazione virtuale non esiste: %s", + "loc.messages.JSONParseError": "Non è possibile analizzare il file JSON: %s. Errore: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili JSON è stata applicata.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili XML è stata applicata.", + "loc.messages.failedtoUploadFileToKudu": "Non è possibile caricare il file %s in Kudu (%s). Codice di stato: %s", + "loc.messages.failedtoUploadFileToKuduError": "Non è stato possibile caricare il file %s in Kudu (%s). Errore: %s", + "loc.messages.ExecuteScriptOnKudu": "Esecuzione dello script specificato nel servizio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Non è possibile eseguire lo script nel servizio Kudu. Errore: %s", + "loc.messages.FailedToRunScriptOnKudu": "Non è possibile eseguire lo script in Kudu: %s. Codice di stato: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Lo script è stato eseguito in Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Il codice restituito dallo script eseguito è '%s'. Errore: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Non è possibile eliminare il file %s da Kudu (%s). Codice di stato: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Non è possibile eliminare il file %s da Kudu (%s). Errore: %s", + "loc.messages.ScriptFileNotFound": "Il file di script '%s' non è stato trovato.", + "loc.messages.InvalidScriptFile": "Il file di script specificato '%s' non è valido. Le estensioni valide sono bat e cmd per Windows e sh per Linux", + "loc.messages.RetryForTimeoutIssue": "L'esecuzione dello script non è riuscita a causa del timeout. Verrà effettuato un nuovo tentativo.", + "loc.messages.stdoutFromScript": "Output standard dello script: ", + "loc.messages.stderrFromScript": "Errore standard dello script: ", + "loc.messages.WebConfigAlreadyExists": "Il file Web.config esiste già e non verrà generato.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Il file Web.config è stato generato", + "loc.messages.FailedToGenerateWebConfig": "Non è stato possibile generare il file Web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Non è possibile recuperare il contenuto del file: %s. Codice di stato: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Non è possibile recuperare il contenuto del file: %s. Errore: %s", + "loc.messages.ScriptStatusTimeout": "Non è possibile recuperare lo stato dello script a causa del timeout.", + "loc.messages.PollingForFileTimeOut": "Non è possibile recuperare lo stato dello script a causa del timeout. È possibile aumentare il limite di timeout impostando la variabile 'appservicedeploy.retrytimeout' sul numero di minuti necessari.", + "loc.messages.InvalidPollOption": "L'opzione di polling specificata %s non è valida.", + "loc.messages.MissingAppTypeWebConfigParameters": "Nei parametri di Web.config manca l'attributo '-appType'. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask', 'node' e 'Go'.
Esempio: '-appType python_Bottle' (senza virgolette) nel caso del framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Il percorso del file 'settings.py' di DJANGO_SETTINGS_MODULE non è stato rilevato. Assicurarsi che il file 'settings.py' sia esistente oppure specificare il percorso corretto nel campo di input del parametro di Web.config nel formato seguente: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Non è possibile applicare la trasformazione per il pacchetto specificato. Eseguire le verifiche seguenti.", + "loc.messages.FailedToApplyTransformationReason1": "1. Verificare se la trasformazione è già stata applicata per il pacchetto generato da MSBuild durante la compilazione. In caso affermativo, rimuovere il tag per ogni file config nel file csproj e ricompilare. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Assicurarsi che il file config e i file di trasformazione siano presenti nella stessa cartella all'interno del pacchetto.", + "loc.messages.AutoParameterizationMessage": "Per impostazione predefinita, agli attributi di ConnectionString in Web.config sono associati parametri. Si noti che la trasformazione non ha effetto sugli attributi di ConnectionString perché durante la distribuzione il valore viene sostituito dai file 'Parameters.xml' o 'SetParameters.xml'. Per disabilitare l'aggiunta automatica di parametri, impostare /p:AutoParameterizationWebConfigConnectionStrings=False durante la generazione del pacchetto MSBuild.", + "loc.messages.UnsupportedAppType": "Il tipo di app '%s' non è supportato nella generazione di Web.config. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask' e 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Non è possibile recuperare l'URL dell'autorità.", + "loc.messages.UnableToFetchActiveDirectory": "Non è possibile recuperare l'ID risorsa di Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Lo stack di runtime e il comando di avvio sono stati aggiornati.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Non è stato possibile aggiornare lo stack di runtime e il comando di avvio. Errore: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Le impostazioni dell'app sono state aggiornate.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Non è stato possibile aggiornare le impostazioni dell'app. Errore: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Non è stato possibile recuperare i metadati dell'app Web AzureRM. Codice errore: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Non è possibile aggiornare i metadati dell'app Web di AzureRM. Codice errore: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Non è possibile recuperare le credenziali di Registro Azure Container. [Codice di stato: '%s']", + "loc.messages.UnableToReadResponseBody": "Non è possibile leggere il corpo della risposta. Errore: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Non è possibile aggiornare i dettagli di configurazione dell'app Web. Codice di stato: '%s'", + "loc.messages.AddingReleaseAnnotation": "Aggiunta dell'annotazione versione per la risorsa '%s' di Application Insights", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "L'annotazione versione è stata aggiunta alla risorsa di Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Non è stato possibile aggiungere l'annotazione versione. %s", + "loc.messages.RenameLockedFilesEnabled": "La ridenominazione dei file bloccati è abilitata per il servizio app.", + "loc.messages.FailedToEnableRenameLockedFiles": "Non è stato possibile abilitare la ridenominazione de file bloccati. Errore: %s", + "loc.messages.WebJobsInProgressIssue": "Qualche processo Web nello stato in esecuzione impedisce alla distribuzione di rimuovere i file. È possibile disabilitare l'opzione 'Rimuovi file aggiuntivi nella destinazione' oppure arrestare i processi continui prima della distribuzione.", + "loc.messages.FailedToFetchKuduAppSettings": "Non è stato possibile recuperare le impostazioni dell'app Kudu. Errore: %s", + "loc.messages.FailedToCreatePath": "Non è stato possibile creare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFile": "Non è stato possibile eliminare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFolder": "Non è stato possibile eliminare la cartella '%s' da Kudu. Errore: %s", + "loc.messages.FailedToUploadFile": "Non è stato possibile caricare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToGetFileContent": "Non è stato possibile ottenere il contenuto '%s/%s' del file da Kudu. Errore: %s", + "loc.messages.FailedToListPath": "Non è stato possibile elencare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.RetryToDeploy": "Verrà effettuato un nuovo tentativo di distribuzione del pacchetto.", + "loc.messages.FailedToGetAppServiceDetails": "Non è stato possibile recuperare i dettagli del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Non è stato possibile recuperare il profilo di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Non è stato possibile aggiornare i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Non è stato possibile ottenere i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Non è stato possibile correggere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Non è stato possibile aggiornare la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Non è stato possibile ottenere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Non è stato possibile recuperare le credenziali di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Non è stato possibile ottenere le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Non è stato possibile aggiornare le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentativo di aggiornamento delle impostazioni di configurazione del servizio app. Dati: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Le impostazioni di configurazione del servizio app sono state aggiornate.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentativo di aggiornamento delle impostazioni applicazione del servizio app. Dati: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Le impostazioni applicazione del servizio app sono già presenti.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Le stringhe di connessione del servizio app sono già presenti.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Le impostazioni applicazione del servizio app e le impostazioni applicazione di Kudu sono state aggiornate.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Sono stati trovati più gruppi di risorse per il servizio app '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "La distribuzione del pacchetto con zipdeploy non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.PackageDeploymentInitiated": "La distribuzione del pacchetto con zipdeploy è stata avviata.", + "loc.messages.WarPackageDeploymentInitiated": "La distribuzione del pacchetto con WAR Deploy è stata avviata.", + "loc.messages.FailedToGetDeploymentLogs": "Non è stato possibile ottenere i log di distribuzione. Errore: %s", + "loc.messages.GoExeNameNotPresent": "Il nome dell'eseguibile Go non è presente", + "loc.messages.WarDeploymentRetry": "Verrà effettuato un nuovo tentativo di distribuzione del file WAR perché in precedenza non si è espanso correttamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assicurarsi che il computer usi il protocollo TLS 1.2 o superiore. Per altre informazioni su come abilitare TLS nel computer, vedere https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Non è stato possibile recuperare il token di accesso per Azure. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Configurare l'identità del servizio gestita per la macchina virtuale 'https://aka.ms/azure-msi-docs'. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.XmlParsingFailed": "Non è possibile analizzare il file XML del profilo di pubblicazione. Errore: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La proprietà non esiste nel profilo di pubblicazione", + "loc.messages.InvalidConnectionType": "Il tipo di connessione al servizio non è valido", + "loc.messages.InvalidImageSourceType": "Il tipo di origine immagini non è valido", + "loc.messages.InvalidPublishProfile": "Il file del profilo di pubblicazione non è valido.", + "loc.messages.ASE_SSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario impostare su true una variabile denominata VSTS_ARM_ARM_REST_IGNORE_SSL_ERRORS nella pipeline di compilazione o versione", + "loc.messages.ZipDeployLogsURL": "I log di zipdeploy possono essere visualizzati in %s", + "loc.messages.DeployLogsURL": "I log di distribuzione possono essere visualizzati in %s", + "loc.messages.AppServiceApplicationURL": "URL dell'applicazione del servizio app: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario passare -allowUntrusted negli argomenti aggiuntivi dell'opzione di distribuzione Web.", + "loc.messages.FailedToGetResourceID": "Non è stato possibile ottenere l'ID risorsa per il tipo di risorsa '%s' e il nome di risorsa '%s'. Errore: %s", + "loc.messages.JarPathNotPresent": "Il percorso del file jar Java non è presente", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Non è stato possibile aggiornare la risorsa '%s' di Application Insights. Errore: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passare da Distribuzione Web a Run From Package, che consente di evitare errori FILE_IN_USE. Tenere presente che Run From Package non supporta il tipo di pacchetto msBuild. Per usare questo metodo di distribuzione, modificare il formato del pacchetto." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c363ab7cf9cb --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service デプロイ", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker、Java、.NET、.NET Core、Node.js、PHP、Python、Ruby を使用して、Web、モバイル、API アプリを Azure App Service にデプロイします", + "loc.instanceNameFormat": "Azure App Service の配置: $(WebAppName)", + "loc.releaseNotes": "バージョン 4.* での変更点
Zip Deploy、Run From Package、War Deploy のサポート [詳細はこちら](https://aka.ms/appServiceDeploymentMethods)
App Service Environment のサポート
タスクによってサポートされる複数のアプリ サービス タイプを見つけるための、UI の向上
推奨されるデプロイ方法は、wwwroot フォルダー内のファイルが読み取り専用になる Run From Package です。
詳細については、[こちら](https://aka.ms/azurermwebdeployreadme)をクリックしてください。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "ファイルの変換と変数の置換のオプション", + "loc.group.displayName.AdditionalDeploymentOptions": "追加の配置オプション", + "loc.group.displayName.PostDeploymentAction": "配置後アクション", + "loc.group.displayName.ApplicationAndConfigurationSettings": "アプリケーションと構成の設定", + "loc.input.label.ConnectionType": "接続の種類", + "loc.input.help.ConnectionType": "Web アプリの配置に使用するサービス接続の種類を選択してください。
Visual Studio で作成された公開プロファイルを使用するには、[公開プロファイル] を選択します。[詳細情報](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceName": "デプロイ用の Azure Resource Manager サブスクリプションを選択します。", + "loc.input.label.PublishProfilePath": "プロファイルのパスの公開", + "loc.input.help.PublishProfilePath": "Visual Studio から作成された公開プロファイルのパス", + "loc.input.label.PublishProfilePassword": "プロファイルのパスワードの公開", + "loc.input.help.PublishProfilePassword": "パスワードは秘密の変数に保管し、ここではその変数を使用することをお勧めします。例: $(Password)。", + "loc.input.label.WebAppKind": "App Service の種類", + "loc.input.help.WebAppKind": "Web App on Windows、Web App on Linux、Web App for Containers、関数アプリ、Linux 上の 関数アプリ、コンテナー向け 関数アプリ、モバイル アプリから選択します。", + "loc.input.label.WebAppName": "App Service の名前", + "loc.input.help.WebAppName": "既存の Azure App Service の名前を入力するか、選択します。選択するアプリの種類に基づく App Service のみが一覧表示されます。", + "loc.input.label.DeployToSlotOrASEFlag": "スロットまたは App Service Environment に配置する", + "loc.input.help.DeployToSlotOrASEFlag": "既存の配置スロットまたは Azure App Service Environment に配置するためのオプションを選択します。
どちらのターゲットでも、タスクにはリソース グループ名が必要です。
配置ターゲットがスロットの場合、配置は既定で運用スロットに実施されます。他の既存のスロット名を指定することもできます。
配置ターゲットが Azure App Service Environment の場合、スロット名を 'production' のままにして、リソース グループ名だけを指定します。", + "loc.input.label.ResourceGroupName": "リソース グループ", + "loc.input.help.ResourceGroupName": "配置ターゲットが配置スロットまたは App Service Environment の場合、リソース グループ名が必要です。
上記で指定された Azure App Service を含む Azure リソース グループを入力するか選択します。", + "loc.input.label.SlotName": "スロット", + "loc.input.help.SlotName": "運用スロット以外の既存のスロットを入力または選択してください。", + "loc.input.label.DockerNamespace": "レジストリまたは名前空間", + "loc.input.help.DockerNamespace": "特定のレジストリまたは名前空間をグローバルに識別する一意の最上位ドメイン名です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "イメージ", + "loc.input.help.DockerRepository": "コンテナー イメージが格納されるリポジトリの名前です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "タグ", + "loc.input.help.DockerImageTag": "タグは省略可能です。これは、レジストリで Docker イメージにバージョンを付けるために使う機構です。
メモ: 完全修飾イメージ名の形式は '`/`:`' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "仮想アプリケーション", + "loc.input.help.VirtualApplication": "Azure Portal に構成された仮想アプリケーションの名前を指定します。App Service ルートに配置する場合には、このオプションは不要です。", + "loc.input.label.Package": "パッケージまたはフォルダー", + "loc.input.help.Package": "MSBuild で生成されたアプリ サービスのコンテンツが入ったパッケージまたはフォルダー、あるいは圧縮された zip または war ファイルへのファイル パス。
変数 ([ビルド](https://docs.microsoft.com/vsts/pipelines/build/variables) |[リリース](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables))、ワイルドカードを使用できます。
たとえば、$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip または $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "ランタイム スタック", + "loc.input.help.RuntimeStack": "フレームワークとバージョンを選択します。", + "loc.input.label.RuntimeStackFunction": "ランタイム スタック", + "loc.input.help.RuntimeStackFunction": "フレームワークとバージョンを選択します。サポートされているランタイム バージョンについては、[こちらのドキュメント](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)をご覧ください。`DOCKER|microsoft/azure-functions-*` などの前の値は非推奨であるため、ドロップダウンから新しい値をお使いください。", + "loc.input.label.StartupCommand": "スタートアップ コマンド ", + "loc.input.help.StartupCommand": "スタートアップ コマンドを入力してください。例:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "配置スクリプトの種類", + "loc.input.help.ScriptType": "タスクで配置が正常に完了したときに Azure App Service 上で実行されるスクリプトを提供して、配置をカスタマイズします。たとえば、Node、PHP、Python アプリケーション用のパッケージを復元します。[詳細](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "インライン スクリプト", + "loc.input.label.ScriptPath": "配置スクリプトのパス", + "loc.input.label.WebConfigParameters": "Python、Node.js、Go、Java アプリ向けの web.config パラメーターを生成する", + "loc.input.help.WebConfigParameters": "アプリケーションに web.config がない場合は、標準の web.config が生成され、Azure App Service に配置されます。web.config 内の値は編集可能で、アプリケーション フレームワークに基づいて変えることができます。たとえば、node.js アプリケーションの場合、スタートアップ ファイルと iis_node モジュールの値を web.config 内に設定します。この編集機能は、生成される web.config のためにのみ使用できます。[詳細情報](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "アプリ設定", + "loc.input.help.AppSettings": "構文 -key value の後に続く Web App アプリケーションの設定を編集します。スペースが含まれる値は二重引用符で囲む必要があります。
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "構成設定", + "loc.input.help.ConfigurationSettings": "構文 -key value の後に続く Web App 構成の設定を編集します。スペースが含まれる値は、二重引用符で囲む必要があります。
例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "配置方法を選択する", + "loc.input.help.UseWebDeploy": "チェック ボックスをオフにすると、アプリの種類、パッケージ形式、その他のパラメーターに基づいて最適な配置方法が自動的に検出されます。
サポートされる配置方法を確認して、アプリの配置に使用する方法を選択するには、オプションを選択してください。", + "loc.input.label.DeploymentType": "配置方法", + "loc.input.help.DeploymentType": "アプリの配置方法を選択します。", + "loc.input.label.TakeAppOfflineFlag": "アプリをオフラインにする", + "loc.input.help.TakeAppOfflineFlag": "Azure App Service をオフラインにする場合、このオプションを選択します。オフラインにするには、同期操作を開始する前に App Service のルート ディレクトリに app_offline.htm ファイルを配置します。このファイルは、同期操作が正常に完了すると削除されます。", + "loc.input.label.SetParametersFile": "SetParameters ファイル", + "loc.input.help.SetParametersFile": "省略可能: 使用する SetParameters.xml ファイルの場所。", + "loc.input.label.RemoveAdditionalFilesFlag": "ターゲットで追加ファイルを削除する", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service パッケージまたはフォルダー内に一致するファイルがない Azure App Service 上のファイルを削除する場合、このオプションを選択します。

注: これにより、この Azure App Service にインストールされたあらゆる拡張機能に関連するファイルも全部削除されます。これを避けるには、[App_Data フォルダーのファイルを除外する] チェックボックスを選択します。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data フォルダーのファイルを除外する", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data フォルダー内のファイルが Azure App Service に配置されないようにする場合、または Azure App Service から削除されないようにする場合、このオプションを選択します。", + "loc.input.label.AdditionalArguments": "追加引数", + "loc.input.help.AdditionalArguments": "構文 -key:value に続くその他の Web 配置の引数。
これらの引数は、Azure App Service を配置するときに適用されます。例: -disableLink:AppPoolExtension -disableLink:ContentExtension。
Web 配置操作の設定に関するその他の例については、[ここ](https://go.microsoft.com/fwlink/?linkid=838471) を参照してください。", + "loc.input.label.RenameFilesFlag": "ロックされたファイルの名前を変更する", + "loc.input.help.RenameFilesFlag": "Azure App Service のアプリケーション設定で msdeploy フラグ FLAGMSDEPLOY_RENAME_LOCKED_FILES=1 を有効にするには、このオプションを選択します。このオプションを設定すると、アプリの配置中にロックされたファイルの名前を MSDeploy で変更できるようになります", + "loc.input.label.XmlTransformation": "XML 変換", + "loc.input.help.XmlTransformation": "`*.config ファイル` 上の `*.Release.config` と `*..config` に対する構成変換が実行されます。
構成変換は変数置換の前に実行されます。
XML 変換は、Windows プラットフォームの場合のみサポートされます。", + "loc.input.label.XmlVariableSubstitution": "XML 変数置換", + "loc.input.help.XmlVariableSubstitution": "ビルド パイプラインまたはリリース パイプラインで定義された変数は、任意の構成ファイルと parameters.xml の appSettings、applicationSettings、connectionStrings セクションの 'key' または 'name' エントリと照合されます。変数置換は config 変換の後に実行されます。

注: リリース パイプラインと環境内で同じ変数が定義されている場合、環境変数はリリース パイプライン変数よりも優先されます。
", + "loc.input.label.JSONFiles": "JSON 変数置換", + "loc.input.help.JSONFiles": "JSON ファイルの行区切り一覧を新しく提供して、変数値を置換します。ルート フォルダーの相対ファイル名を提供します。
入れ子または階層の JSON 変数を置換するには、JSONPath 式を使用して指定します。

たとえば、下のサンプル内の ‘ConnectionString’ 値を置き換えるには、ビルドまたはリリース パイプライン (またはリリース パイプラインの環境) 内で変数を ‘Data.DefaultConnection.ConnectionString’ として定義する必要があります。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
変数置換は構成変換の後に実行されます。

メモ: 置換では、パイプライン変数は除外されます。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "無効な App Service パッケージまたはフォルダー パスが指定されました: %s", + "loc.messages.SetParamFilenotfound0": "Set パラメーター ファイルが見つかりません: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 変換が正常に適用されました", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service のサービス接続の詳細を取得しました: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "エラー: そのような配置方法はありません", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service のサービス接続の詳細を取得できません: %s。状態コード: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure Resource のサービス接続の詳細を取得できません: '%s'。状態コード: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "配置履歴が %s で正常に更新されました", + "loc.messages.Failedtoupdatedeploymenthistory": "配置履歴を更新できませんでした。エラー: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 配置状態を更新できません: この Web サイトでは SCM エンドポイントが有効になっていません", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service の構成の詳細を取得できません。状態コード: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service のアプリケーションの設定を取得できません。[状態コード: '%s'、エラー メッセージ: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "App Service のアプリケーションの設定を更新できません。状態コード: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "配置の状態を更新できません: 一意の配置 ID を取得できません", + "loc.messages.PackageDeploymentSuccess": "Web パッケージを App Service に正常に配置できました。", + "loc.messages.PackageDeploymentFailed": "Web パッケージを App Service に配置できませんでした。", + "loc.messages.Runningcommand": "コマンドを実行しています: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Web パッケージ: %s を仮想パス (物理パス) へ配置しています: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "kudu サービスにより、パッケージ %s が %s に配置されました", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu サービスを使用して App Service パッケージをデプロイできませんでした: %s", + "loc.messages.Unabletodeploywebappresponsecode": "エラー コードにより、App Service を配置できません: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy が生成したパッケージは Windows プラットフォームでのみサポートされます。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy のサポートされていないバージョン: %s がインストールされています。バージョンは 3 以降である必要があります", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "コンピューター上のレジストリから、MS Deploy の場所を特定できません (エラー: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "指定されたパターン %s のパッケージが見つかりませんでした
タスクに指定されているパッケージがビルドまたは前のステージで成果物として公開されており、現在のジョブにダウンロードされているかどうかをご確認ください。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定したパターンと一致するパッケージが複数あります: %s。検索パターンを絞り込んでください。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[アプリケーションをオフラインにする] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[ロックされたファイルの名前を変更する] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "指定のパターンと一致する JSON ファイルはありません: %s。", + "loc.messages.Configfiledoesntexists": "構成ファイル %s がありません。", + "loc.messages.Failedtowritetoconfigfilewitherror": "構成ファイル %s への書き込みに失敗しました。エラー: %s", + "loc.messages.AppOfflineModeenabled": "アプリのオフライン モードが有効です。", + "loc.messages.Failedtoenableappofflinemode": "アプリのオフライン モードを有効にできませんでした。状態コード: %s (%s)", + "loc.messages.AppOflineModedisabled": "アプリのオフライン モードが無効です。", + "loc.messages.FailedtodisableAppOfflineMode": "アプリのオフライン モードを無効にできませんでした。状態コード: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "非 Windows プラットフォームでは XML 変換を実行できません。", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s の %s による変換中に XML 変換エラーが発生しました。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Web 配置オプションによる公開は、Windows エージェントを使用している場合のみサポートされます", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 配置オプションによる公開は、msBuild パッケージの種類ではサポートされていません。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 配置オプションによる公開は、仮想アプリケーションではサポートされていません。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 配置または RunFromZip オプションによる公開は、war ファイルの配置をサポートしていません。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "フォルダーが ReadOnly のため、RunFromZip による公開は、wwwroot に変更を加える場合は配置後スクリプトをサポートしない可能性があります。", + "loc.messages.ResourceDoesntExist": "リソース '%s' がありません。リソースは配置前に存在している必要があります。", + "loc.messages.EncodeNotSupported": "ファイル %s のファイル エンコードが %s として検出されました。ファイル エンコード %s では変数置換はサポートされていません。サポートされているエンコードは UTF-8 と UTF-16 LE です。", + "loc.messages.UnknownFileEncodeError": "ファイル %s (typeCode: %s) のエンコードを検出できません。サポートされているエンコードは UTF-8 および UTF-16 LE です。", + "loc.messages.ShortFileBufferError": "ファイル バッファーが短すぎてエンコードの種類を検出できません: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 構成の詳細を更新できませんでした。エラー: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 構成の詳細が正常に更新されました", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 物理パスに関して URL が要求されました: %s", + "loc.messages.Physicalpathalreadyexists": "物理パス '%s' は既に存在しています", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理パスが正常に作成されました: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 物理パスを作成することができませんでした。エラー: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 物理パスを確認できませんでした。エラー コード: %s", + "loc.messages.VirtualApplicationDoesNotExist": "仮想アプリケーションがありません: %s", + "loc.messages.JSONParseError": "JSON ファイルを解析できません: %s。エラー: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 変数置換が正常に適用されました。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 変数の置換が正常に適用されました。", + "loc.messages.failedtoUploadFileToKudu": "ファイル %s を Kudu (%s) にアップロードできません。状態コード: %s", + "loc.messages.failedtoUploadFileToKuduError": "ファイル %s を Kudu (%s) にアップロードできません。エラー: %s", + "loc.messages.ExecuteScriptOnKudu": "指定されたスクリプトを Kudu サービス上で実行しています。", + "loc.messages.FailedToRunScriptOnKuduError": "スクリプトを Kudu サービス上で実行できません。エラー: %s", + "loc.messages.FailedToRunScriptOnKudu": "スクリプトを Kudu (%s) 上で実行できません。状態コード: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "スクリプトを Kudu 上で正常に実行できました。", + "loc.messages.ScriptExecutionOnKuduFailed": "実行したスクリプトからリターン コードとして '%s' が返されました。エラー: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "ファイル %s を Kudu (%s) から削除できません。状態コード: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "ファイル %s を Kudu (%s) から削除できません。エラー: %s", + "loc.messages.ScriptFileNotFound": "スクリプト ファイル '%s' が見つかりません。", + "loc.messages.InvalidScriptFile": "無効なスクリプト ファイル '%s' が指定されました。有効な拡張子は、Windows の場合は .bat と .cmd、Linux の場合は .sh です", + "loc.messages.RetryForTimeoutIssue": "タイムアウトの問題でスクリプトを実行できませんでした。もう一度お試しください。", + "loc.messages.stdoutFromScript": "スクリプトからの標準出力: ", + "loc.messages.stderrFromScript": "スクリプトからの標準エラー出力: ", + "loc.messages.WebConfigAlreadyExists": "web.config ファイルは既に存在します。生成しません。", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config ファイルを正常に生成できました", + "loc.messages.FailedToGenerateWebConfig": "web.config を生成できませんでした。%s", + "loc.messages.FailedToGetKuduFileContent": "ファイルの内容を取得できません: %s。状態コード: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "ファイルの内容を取得できません: %s。エラー: %s", + "loc.messages.ScriptStatusTimeout": "タイムアウトのため、スクリプトの状態をフェッチできません。", + "loc.messages.PollingForFileTimeOut": "タイムアウトのため、スクリプトの状態をフェッチできません。タイムアウト制限を延長するには、'appservicedeploy.retrytimeout' 変数を必要な時間 (分) に設定します。", + "loc.messages.InvalidPollOption": "指定されたポーリング オプションが無効です: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "属性 '-appType' が Web.config パラメーターにありません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node'、'Go' です。
たとえば、Python Bottle フレームワークの場合は、'-appType python_Bottle' (sans-quotes) を指定します。", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE の 'settings.py' ファイル パスを検出できません。'settings.py' ファイルが存在することを確認するか、次の形式で Web.config パラメーター入力に正しいパスを指定してください: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "指定されたパッケージに変換を適用することはできません。次の点をご確認ください。", + "loc.messages.FailedToApplyTransformationReason1": "1. ビルド中、MSBuild によって生成されたパッケージに対して変換が既に適用されたかどうか。適用された場合は、csproj ファイル内の各構成の タグを削除してから、リビルドします。", + "loc.messages.FailedToApplyTransformationReason2": "2. 構成ファイルと変換ファイルがパッケージ内の同じフォルダーに存在すること。", + "loc.messages.AutoParameterizationMessage": "Web.config の ConnectionString 属性は既定でパラメーター化されています。'Parameters.xml' ファイルまたは 'SetParameters.xml' ファイルによって値が配置中に上書きされるため、変換が connectionString 属性に影響を与えることはありません。自動パラメーター化は、MSBuild パッケージの生成中に /p:AutoParameterizationWebConfigConnectionStrings=False のように設定することによって無効にできます。", + "loc.messages.UnsupportedAppType": "アプリの種類 '%s' が Web.config 生成でサポートされていません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node' です。", + "loc.messages.UnableToFetchAuthorityURL": "機関の URL をフェッチできません。", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory リソース ID をフェッチできません。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドが正常に更新されました。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドの更新に失敗しました。エラー: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "アプリの設定が正常に更新されました。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "アプリ設定の更新に失敗しました。エラー: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp メタデータをフェッチできませんでした。ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp メタデータを更新できません。エラー コード: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure コンテナー レジストリの資格情報を取得できません。[状態コード: '%s']", + "loc.messages.UnableToReadResponseBody": "応答本文を読み取ることができません。エラー: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 構成の詳細を更新できません。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights リソース ’%s’ のリリース コメントを追加しています", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight にリリース コメントが正常に追加されました: %s", + "loc.messages.FailedAddingReleaseAnnotation": "リリース コメントを追加できませんでした。%s", + "loc.messages.RenameLockedFilesEnabled": "App Service で [ロックされたファイルの名前を変更する] が有効です。", + "loc.messages.FailedToEnableRenameLockedFiles": "[ロックされたファイルの名前を変更する] を有効にできませんでした。エラー: %s", + "loc.messages.WebJobsInProgressIssue": "実行状態の Web ジョブが少数あるため、配置でファイルを削除できません。[Remove additional files at destination] (同期先で追加のファイルを削除する) オプションを無効にするか、配置の前に継続ジョブを停止することができます。", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu アプリ設定をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToCreatePath": "Kudu からパス '%s' を作成することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFile": "Kudu からファイル '%s/%s' を削除することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFolder": "Kudu からフォルダー '%s' を削除できませんでした。エラー: %s", + "loc.messages.FailedToUploadFile": "Kudu からファイル '%s/%s' をアップロードできませんでした。エラー: %s", + "loc.messages.FailedToGetFileContent": "Kudu からファイル コンテンツ '%s/%s' を取得できませんでした。エラー: %s", + "loc.messages.FailedToListPath": "Kudu からパス '%s' の一覧を取得できませんでした。エラー: %s", + "loc.messages.RetryToDeploy": "パッケージの配置を再試行しています。", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' の詳細をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' の公開プロファイルをフェッチできませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' のメタデータの更新に失敗しました。エラー: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' のメタデータの取得に失敗しました。エラー: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' の構成を修正できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 構成を更新できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 構成を取得できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' の公開資格情報をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を取得できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を更新できませんでした。エラー: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 構成の設定を更新しようとしています。データ: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 構成の設定が更新されました。", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service アプリケーションの設定を更新しようとしています。データ: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service アプリケーション設定は既に存在します。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 接続文字列は既に存在します。", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service アプリケーション設定と Kudu アプリケーション設定が更新されました。", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s' に複数のリソース グループが見つかりました。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 配置を使用したパッケージ配置に失敗しました。詳細についてはログを参照してください。", + "loc.messages.PackageDeploymentInitiated": "ZIP 配置を使用したパッケージ配置を開始しました。", + "loc.messages.WarPackageDeploymentInitiated": "WAR 配置を使用したパッケージ配置が開始しました。", + "loc.messages.FailedToGetDeploymentLogs": "配置ログを取得できませんでした。エラー: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名が存在しません", + "loc.messages.WarDeploymentRetry": "war ファイルは前回正常に展開されなかったため、展開を再試行しています。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "マシンで TLS 1.2 プロトコル以上を使用していることを確認します。お使いのマシンで TLS を有効にする方法について詳しくは、https://aka.ms/enableTlsv2 をご確認ください。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure 用のアクセス トークンをフェッチできませんでした。状態コード: %s、状態メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。仮想マシンのマネージド サービス ID (MSI) を構成してください 'https://aka.ms/azure-msi-docs'。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML ファイルを解析できません。エラー: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] プロパティが公開プロファイル内に存在しません", + "loc.messages.InvalidConnectionType": "無効なサービス接続の種類", + "loc.messages.InvalidImageSourceType": "無効な画像ソースの種類", + "loc.messages.InvalidPublishProfile": "公開プロファイルのファイルが無効です。", + "loc.messages.ASE_SSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があり、それを解決するには、VSTS_ARM_REST_IGNORE_SSL_ERRORS という名前の変数の値をビルド定義またはリリース パイプラインで true に設定する必要があります。", + "loc.messages.ZipDeployLogsURL": "Zip 配置のログは、%s で確認できます", + "loc.messages.DeployLogsURL": "配置ログは %s で確認できます", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があります。これを解決するには、Web 配置オプションの追加引数に -allowUntrusted を渡す必要があります。", + "loc.messages.FailedToGetResourceID": "リソースの種類 '%s'、リソース名 '%s' のリソース ID を取得できませんでした。エラー: %s", + "loc.messages.JarPathNotPresent": "Java jar パスが存在しません", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' リソースを更新できませんでした。エラー: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Web 配置から Run From Package に移動します。これは、FILE_IN_USE エラーを回避するのに役立ちます。Run From Package では、msBuild パッケージの種類はサポートされていません。この配置方法を使用するには、パッケージ形式を変更してください。" +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..b73547991743 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 배포", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker, Java, .NET, .NET Core, Node.js, PHP, Python 또는 Ruby를 사용하는 웹, 모바일 또는 API 앱을 Azure App Service에 배포합니다.", + "loc.instanceNameFormat": "Azure App Service 배포: $(WebAppName)", + "loc.releaseNotes": "버전 4.*의 새로운 기능
zip 배포, 패키지에서 실행, war 배포 지원 [자세한 정보](https://aka.ms/appServiceDeploymentMethods)
App Service Environment 지원
작업에서 지원하는 다양한 App Service 유형을 검색하기 위한 향상된 UI
'패키지에서 실행'이 기본 배포 방법으로, wwwroot 폴더의 파일을 읽기 전용으로 설정
자세한 내용을 보려면 [여기](https://aka.ms/azurermwebdeployreadme)를 클릭하세요.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "파일 변환 및 변수 대체 옵션", + "loc.group.displayName.AdditionalDeploymentOptions": "추가 배포 옵션", + "loc.group.displayName.PostDeploymentAction": "배포 후 작업", + "loc.group.displayName.ApplicationAndConfigurationSettings": "응용 프로그램 및 구성 설정", + "loc.input.label.ConnectionType": "연결 형식", + "loc.input.help.ConnectionType": "웹앱을 배포하는 데 사용할 서비스 연결 형식을 선택합니다.
Visual Studio에서 만든 게시 프로필을 사용하려면 게시 프로필을 선택합니다. [자세한 정보](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 구독", + "loc.input.help.ConnectedServiceName": "배포에 대한 Azure Resource Manager 구독을 선택합니다.", + "loc.input.label.PublishProfilePath": "게시 프로필 경로", + "loc.input.help.PublishProfilePath": "Visual Studio에서 만든 게시 프로필의 경로", + "loc.input.label.PublishProfilePassword": "게시 프로필 암호", + "loc.input.help.PublishProfilePassword": "비밀 변수에 암호를 저장하고 여기서 해당 변수를 사용하는 것이 좋습니다(예: $(Password)).", + "loc.input.label.WebAppKind": "App Service 유형", + "loc.input.help.WebAppKind": "Windows의 웹앱, Web App on Linux, Web App for Containers, 함수 앱, Linux의 함수 앱, 컨테이너용 함수 앱 및 모바일 앱 중에서 선택합니다.", + "loc.input.label.WebAppName": "App Service 이름", + "loc.input.help.WebAppName": "기존 Azure App Service의 이름을 입력하거나 선택합니다. 선택한 앱 유형을 기반으로 하는 앱 서비스만 나열됩니다.", + "loc.input.label.DeployToSlotOrASEFlag": "슬롯 또는 App Service Environment에 배포", + "loc.input.help.DeployToSlotOrASEFlag": "기존 배포 슬롯 또는 Azure App Service Environment에 배포하는 옵션을 선택합니다.
두 대상 모두, 작업에 리소스 그룹 이름이 필요합니다.
배포 대상이 슬롯인 경우 기본적으로 프로덕션 슬롯에 배포가 수행됩니다. 다른 기존 슬롯 이름을 제공할 수도 있습니다.
배포 대상이 Azure App Service Environment인 경우 슬롯 이름을 '프로덕션'으로 두고 리소스 그룹 이름만 지정하세요.", + "loc.input.label.ResourceGroupName": "리소스 그룹", + "loc.input.help.ResourceGroupName": "배포 대상이 배포 슬롯 또는 App Service Environment인 경우 리소스 그룹 이름이 필요합니다.
위에서 지정한 Azure App Service를 포함하는 Azure 리소스 그룹을 입력하거나 선택합니다.", + "loc.input.label.SlotName": "슬롯", + "loc.input.help.SlotName": "프로덕션 슬롯이 아닌 기존 슬롯을 입력하거나 선택합니다.", + "loc.input.label.DockerNamespace": "레지스트리 또는 네임스페이스", + "loc.input.help.DockerNamespace": "특정 레지스트리 또는 네임스페이스의 전역적으로 고유한 최상위 도메인 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerRepository": "이미지", + "loc.input.help.DockerRepository": "컨테이너 이미지가 저장된 리포지토리의 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerImageTag": "태그", + "loc.input.help.DockerImageTag": "태그는 선택 사항입니다. 태그는 레지스트리에서 Docker 이미지에 버전을 지정하는 데 사용하는 메커니즘입니다.
참고: 정규화된 이미지 이름은 '`/`:`' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.VirtualApplication": "가상 응용 프로그램", + "loc.input.help.VirtualApplication": "Azure Portal에서 구성된 가상 응용 프로그램의 이름을 지정합니다. App Service 루트에 배포할 경우 이 옵션은 필요하지 않습니다.", + "loc.input.label.Package": "패키지 또는 폴더", + "loc.input.help.Package": "패키지, MSBuild에서 생성된 App Service 콘텐츠를 포함하는 폴더 또는 압축된 zip 또는 war 파일의 파일 경로입니다.
변수([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), 와일드카드가 지원됩니다.
예: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 또는 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "런타임 스택", + "loc.input.help.RuntimeStack": "프레임워크 및 버전을 선택합니다.", + "loc.input.label.RuntimeStackFunction": "런타임 스택", + "loc.input.help.RuntimeStackFunction": "프레임워크 및 버전을 선택합니다. 지원되는 런타임 버전은 [관련 문서](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)를 참조하세요. 'DOCKER|microsoft/azure-functions-*' 같은 이전 값은 사용되지 않습니다. 드롭다운에서 새 값을 사용하세요.", + "loc.input.label.StartupCommand": "시작 명령 ", + "loc.input.help.StartupCommand": "시작 명령을 입력합니다. 예:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "배포 스크립트 형식", + "loc.input.help.ScriptType": "작업이 배포를 완료한 후 Azure App Service에서 실행할 스크립트를 제공하여 배포를 사용자 지정합니다. 예를 들어 Node, PHP, Python 응용 프로그램용 패키지를 복원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "인라인 스크립트", + "loc.input.label.ScriptPath": "배포 스크립트 경로", + "loc.input.label.WebConfigParameters": "Python, Node.js, Go 및 Java 앱에 대한 web.config 매개 변수 생성", + "loc.input.help.WebConfigParameters": "애플리케이션에 없는 경우 표준 Web.config가 생성되어 Azure App Service에 배포됩니다. web.config의 값은 편집 가능하며, 애플리케이션 프레임워크에 따라 달라집니다. 예를 들어 node.js 애플리케이션의 경우 web.config에 시작 파일 및 iis_node 모듈 값이 포함됩니다. 이 편집 기능은 생성된 web.config에만 사용됩니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "앱 설정", + "loc.input.help.AppSettings": "구문 -key 값 다음에 오는 웹앱 응용 프로그램 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "구성 설정", + "loc.input.help.ConfigurationSettings": "구문 -key 값 다음에 오는 웹앱 구성 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
예 : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "배포 방법 선택", + "loc.input.help.UseWebDeploy": "선택 취소하면, 앱 유형, 패키지 형식 및 기타 매개 변수를 기준으로 가장 적합한 배포 방법이 자동 검색됩니다.
지원되는 배포 방법을 표시하는 옵션을 선택하고, 앱 배포 방법을 선택합니다.", + "loc.input.label.DeploymentType": "배포 방법", + "loc.input.help.DeploymentType": "앱의 배포 방법을 선택합니다.", + "loc.input.label.TakeAppOfflineFlag": "앱을 오프라인으로 전환", + "loc.input.help.TakeAppOfflineFlag": "동기화 작업이 시작되기 전에 App Service의 루트 디렉터리에 app_offline.htm 파일을 배치하여 Azure App Service를 오프라인 상태로 전환하려면 이 옵션을 선택합니다. 이 파일은 동기화 작업이 완료된 후 제거됩니다.", + "loc.input.label.SetParametersFile": "SetParameters 파일", + "loc.input.help.SetParametersFile": "옵션: 사용할 SetParameters.xml 파일의 위치입니다.", + "loc.input.label.RemoveAdditionalFilesFlag": "대상에서 추가 파일 제거", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service 패키지 또는 폴더에 일치하는 파일이 없는 Azure App Service의 파일을 삭제하는 옵션을 선택합니다.

참고: 이 경우 Azure App Service에 설치된 확장과 관련된 모든 파일도 제거됩니다. 이를 방지하려면 'App_Data 폴더에서 파일 제외' 확인란을 선택합니다. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일 제외", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일이 Azure App Service에 배포되거나 Azure App Service에서 삭제되지 않게 하려면 이 옵션을 선택합니다.", + "loc.input.label.AdditionalArguments": "추가 인수", + "loc.input.help.AdditionalArguments": "구문 -key:value 다음에 오는 추가 웹 배포 인수입니다.
이 인수는 Azure App Service를 배포할 때 적용됩니다. 예: -disableLink:AppPoolExtension -disableLink:ContentExtension.
웹 배포 작업 설정의 추가 예제는 [여기](https://go.microsoft.com/fwlink/?linkid=838471)를 참조하세요.", + "loc.input.label.RenameFilesFlag": "잠겨 있는 파일 이름 바꾸기", + "loc.input.help.RenameFilesFlag": "Azure App Service 응용 프로그램 설정에서 msdeploy 플래그 MSDEPLOY_RENAME_LOCKED_FILES=1을 사용하도록 설정하려면 이 옵션을 선택합니다. 이 옵션을 설정하면 msdeploy에서 앱 배포 중 잠겨 있는 파일의 이름을 바꿀 수 있습니다.", + "loc.input.label.XmlTransformation": "XML 변환", + "loc.input.help.XmlTransformation": "`*.config 파일`에서 `*.Release.config` 및 `*..config`에 대한 구성 변환이 실행됩니다.
구성 변환은 변수 대체 전에 실행됩니다.
XML 변환은 Windows 플랫폼에서만 지원됩니다.", + "loc.input.label.XmlVariableSubstitution": "XML 변수 대체", + "loc.input.help.XmlVariableSubstitution": "빌드 또는 릴리스 파이프라인에서 정의된 변수가 구성 파일 및 parameters.xml의 appSettings, applicationSettings 및 connectionStrings 섹션에 있는 'key' 또는 'name' 항목과 일치됩니다. 구성 변환 후에 변수 대체가 실행됩니다.

참고: 릴리스 파이프라인 및 환경에서 동일한 변수가 정의된 경우 환경 변수가 릴리스 파이프라인 변수를 대체합니다.
", + "loc.input.label.JSONFiles": "JSON 변수 대체", + "loc.input.help.JSONFiles": "변수 값을 대체할 JSON 파일을 줄 바꿈으로 구분된 목록으로 제공합니다. 파일 이름은 루트 폴더에 상대적으로 지정해야 합니다.
중첩되거나 계층적인 JSON 변수를 대체하려면 JSONPath 식을 사용하여 지정합니다.

예를 들어 아래 샘플에서 'ConnectionString' 값을 대체하려면 빌드 또는 릴리스 파이프라인(또는 릴리스 파이프라인의 환경)에서 변수를 'Data.DefaultConnection.ConnectionString'으로 정의해야 합니다.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
변수 대체는 구성 변환 후 실행됩니다.

참고: 파이프라인 변수는 대체에서 제외됩니다.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "잘못된 App Service 패키지 또는 폴더 경로를 제공했습니다. %s", + "loc.messages.SetParamFilenotfound0": "매개 변수 설정 파일을 찾을 수 없습니다. %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 변환을 적용했습니다.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service '%s'에 대한 서비스 연결 정보를 가져왔습니다.", + "loc.messages.ErrorNoSuchDeployingMethodExists": "오류: 해당 배포 방법이 없습니다.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service %s에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s(%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure 리소스 '%s'에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "%s에서 배포 기록을 업데이트했습니다.", + "loc.messages.Failedtoupdatedeploymenthistory": "배포 기록을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "경고: 배포 상태를 업데이트할 수 없습니다. 이 웹 사이트에는 SCM 엔드포인트를 사용할 수 없습니다.", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service 구성 정보를 검색할 수 없습니다. 상태 코드: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service 응용 프로그램 설정을 검색할 수 없습니다[상태 코드: '%s', 오류 메시지: '%s'].", + "loc.messages.Unabletoupdatewebappsettings": "App Service 응용 프로그램 설정을 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "배포 상태를 업데이트할 수 없습니다. 고유한 배포 ID를 검색할 수 없습니다.", + "loc.messages.PackageDeploymentSuccess": "웹 패키지를 App Service에 배포했습니다.", + "loc.messages.PackageDeploymentFailed": "웹 패키지를 App Service에 배포하지 못했습니다.", + "loc.messages.Runningcommand": "%s 명령을 실행하고 있습니다.", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "웹 패키지 %s을(를) 가상 경로(실제 경로) %s(%s)에 배포하는 중입니다.", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Kudu 서비스를 사용하여 %s 패키지를 %s에 배포했습니다.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu 서비스를 사용하여 App Service 패키지를 배포하지 못했습니다. %s", + "loc.messages.Unabletodeploywebappresponsecode": "오류 코드로 인해 App Service를 배포할 수 없습니다. %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 생성 패키지는 Windows 플랫폼에만 지원됩니다.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy에 대해 지원되지 않는 설치된 버전 %s을(를) 찾았습니다. 버전은 3 이상이어야 합니다.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "컴퓨터의 레지스트리에서 MS 배포의 위치를 찾을 수 없습니다(오류: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "지정된 패턴의 패키지를 찾을 수 없습니다. %s
작업에 언급된 패키지가 빌드 또는 이전 스테이지에서 아티팩트로 게시되고 현재 작업에 다운로드되는지 확인합니다.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "지정한 패턴 %s과(와) 일치하는 패키지가 두 개 이상 있습니다. 검색 패턴을 제한하세요.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[응용 프로그램을 오프라인으로 만들기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[잠겨 있는 파일 이름 바꾸기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "특정 패턴과 일치하는 JSON 파일이 없음: %s", + "loc.messages.Configfiledoesntexists": "구성 파일 %s이(가) 없습니다.", + "loc.messages.Failedtowritetoconfigfilewitherror": "구성 파일 %s에 쓰지 못했습니다(오류: %s).", + "loc.messages.AppOfflineModeenabled": "앱 오프라인 모드를 사용하도록 설정했습니다.", + "loc.messages.Failedtoenableappofflinemode": "앱 오프라인 모드를 사용하도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.AppOflineModedisabled": "앱 오프라인 모드를 사용하지 않도록 설정했습니다.", + "loc.messages.FailedtodisableAppOfflineMode": "앱 오프라인 모드를 사용하지 않도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Windows가 아닌 플랫폼에서는 XML 변환을 수행할 수 없습니다.", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s을(를) 변환(%s 사용)하는 동안 XML 변환 오류가 발생했습니다.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "웹 배포 옵션을 사용한 게시는 Windows 에이전트를 사용할 경우에만 지원됩니다.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 배포 옵션을 사용한 게시는 msBuild 패키지 형식에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 배포 옵션을 사용한 게시는 가상 애플리케이션에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 배포 또는 RunFromZip 옵션을 사용한 게시에서는 war 파일 배포를 지원하지 않습니다.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "폴더가 읽기 전용이므로 wwwroot를 변경하는 경우 RunFromZip을 사용한 게시에서 배포 후 스크립트를 지원하지 않을 수 있습니다.", + "loc.messages.ResourceDoesntExist": "'%s' 리소스가 없습니다. 배포 전에 리소스가 있어야 합니다.", + "loc.messages.EncodeNotSupported": "%s 파일에 대한 파일 인코딩이 %s(으)로 검색되었습니다. 파일 인코딩 %s을(를) 사용할 경우 변수 대체가 지원되지 않습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.UnknownFileEncodeError": "%s 파일(typeCode: %s)에 대한 인코딩을 검색할 수 없습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.ShortFileBufferError": "파일 버퍼가 너무 짧아서 인코딩 형식을 검색할 수 없습니다. %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트했습니다.", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 실제 경로의 요청된 URL: %s", + "loc.messages.Physicalpathalreadyexists": "실제 경로 '%s'이(가) 이미 있습니다.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 실제 경로를 만들었습니다. %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 실제 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 실제 경로를 확인하지 못했습니다. 오류 코드: %s", + "loc.messages.VirtualApplicationDoesNotExist": "가상 응용 프로그램이 없습니다. %s", + "loc.messages.JSONParseError": "JSON 파일 %s을(를) 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 변수 대체를 적용했습니다.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 변수 대체를 적용했습니다.", + "loc.messages.failedtoUploadFileToKudu": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 상태 코드: %s", + "loc.messages.failedtoUploadFileToKuduError": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 오류: %s", + "loc.messages.ExecuteScriptOnKudu": "Kudu 서비스에서 지정된 스크립트를 실행하는 중입니다.", + "loc.messages.FailedToRunScriptOnKuduError": "Kudu 서비스에서 스크립트를 실행할 수 없습니다. 오류: %s", + "loc.messages.FailedToRunScriptOnKudu": "Kudu에서 스크립트를 실행할 수 없음: %s. 상태 코드: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Kudu에서 스크립트를 실행했습니다.", + "loc.messages.ScriptExecutionOnKuduFailed": "실행된 스크립트에서 반환 코드로 '%s'을(를) 반환했습니다. 오류: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 상태 코드: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 오류: %s", + "loc.messages.ScriptFileNotFound": "스크립트 파일 '%s'을(를) 찾을 수 없습니다.", + "loc.messages.InvalidScriptFile": "잘못된 스크립트 파일 '%s'이(가) 제공되었습니다. 유효한 확장명은 Windows의 경우 .bat 및 .cmd이고, Linux의 경우 .sh입니다.", + "loc.messages.RetryForTimeoutIssue": "시간 초과 문제로 스크립트 실행에 실패했습니다. 다시 시도하는 중입니다.", + "loc.messages.stdoutFromScript": "스크립트의 표준 출력: ", + "loc.messages.stderrFromScript": "스크립트의 표준 오류: ", + "loc.messages.WebConfigAlreadyExists": "web.config 파일이 이미 있습니다. 생성하지 않습니다.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config 파일을 생성했습니다.", + "loc.messages.FailedToGenerateWebConfig": "web.config를 생성하지 못했습니다. %s", + "loc.messages.FailedToGetKuduFileContent": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.FailedToGetKuduFileContentError": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.ScriptStatusTimeout": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다.", + "loc.messages.PollingForFileTimeOut": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다. 'appservicedeploy.retrytimeout' 변수를 필요한 시간(분)으로 설정하여 시간 제한을 늘릴 수 있습니다.", + "loc.messages.InvalidPollOption": "잘못된 폴링 옵션이 제공됨: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 매개 변수에 '-appType' 특성이 없습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 'node' 및 'Go'입니다.
예를 들어 Python Bottle 프레임워크의 경우 '-appType python_Bottle' (sans-quotes)입니다.", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE 'settings.py' 파일 경로를 검색할 수 없습니다. 'settings.py' 파일이 존재하는지 확인하거나 Web.config 매개 변수 입력에 '-DJANGO_SETTINGS_MODULE .settings' 형식으로 올바른 경로를 제공하세요.", + "loc.messages.FailedToApplyTransformation": "지정된 패키지에 변환을 적용할 수 없습니다. 다음을 확인하세요.", + "loc.messages.FailedToApplyTransformationReason1": "1. 빌드 중 생성된 MSBuild 패키지에 대해 변환이 이미 적용되었는지 여부를 확인합니다. 그런 경우 csproj 파일에서 각 구성에 대해 태그를 제거하고 다시 빌드합니다. ", + "loc.messages.FailedToApplyTransformationReason2": "2. 구성 파일 및 변환 파일이 패키지 내의 동일한 폴더에 있는지 확인합니다.", + "loc.messages.AutoParameterizationMessage": "Web.config의 ConnectionString 특성은 기본적으로 매개 변수가 있습니다. 'Parameters.xml' 또는 'SetParameters.xml' 파일로 배포 중 값이 재정의되므로 변환은 connectionString 특성에 아무런 영향을 미치지 않습니다. MSBuild 패키지 생성 중 p:AutoParameterizationWebConfigConnectionStrings=False를 설정하여 자동 매개 변수화를 사용하지 않도록 설정할 수 있습니다.", + "loc.messages.UnsupportedAppType": "Web.config 생성에서 '%s' 앱 형식이 지원되지 않습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 및 'node'입니다.", + "loc.messages.UnableToFetchAuthorityURL": "기관 URL을 페치할 수 없습니다.", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory 리소스 ID를 페치할 수 없습니다.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트했습니다.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "앱 설정을 업데이트했습니다.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "앱 설정을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 페치하지 못했습니다. 오류 코드: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 업데이트할 수 없습니다. 오류 코드: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure Container Registry 자격 증명을 검색할 수 없습니다.[상태 코드: '%s']", + "loc.messages.UnableToReadResponseBody": "응답 본문을 읽을 수 없습니다. 오류: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 구성 정보를 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights 리소스 '%s'에 대한 릴리스 주석을 추가하는 중", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight에 릴리스 주석 추가함: %s", + "loc.messages.FailedAddingReleaseAnnotation": "릴리스 주석을 추가하지 못했습니다. %s", + "loc.messages.RenameLockedFilesEnabled": "App Service에 대해 잠긴 파일 이름 바꾸기를 사용할 수 있습니다.", + "loc.messages.FailedToEnableRenameLockedFiles": "잠긴 파일 이름 바꾸기를 사용하도록 설정하지 못했습니다. 오류: %s", + "loc.messages.WebJobsInProgressIssue": "실행 상태의 WebJobs가 거의 없으므로 배포에서 파일을 제거할 수 없습니다. 배포 전에 연속 작업을 중지하거나 '대상에서 추가 파일 제거' 옵션을 사용하지 않을 수 있습니다.", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu 앱 설정을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToCreatePath": "Kudu에서 '%s' 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFile": "Kudu에서 '%s/%s' 파일을 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFolder": "Kudu에서 '%s' 폴더를 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToUploadFile": "Kudu에서 '%s/%s' 파일을 업로드하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetFileContent": "Kudu에서 파일 콘텐츠 '%s/%s'을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToListPath": "Kudu에서 '%s' 경로를 나열하지 못했습니다. 오류: %s", + "loc.messages.RetryToDeploy": "패키지 배포를 다시 시도하는 중입니다.", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' 정보를 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' 게시 프로필을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' 메타데이터를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' 메타데이터를 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' 구성을 패치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 구성을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 구성을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' 게시 자격 증명을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트했습니다.", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service 애플리케이션 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 애플리케이션 설정이 이미 있습니다.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 연결 문자열이 이미 있습니다.", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service 응용 프로그램 설정 및 Kudu 응용 프로그램 설정을 업데이트했습니다.", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s'에 대한 리소스 그룹이 여러 개 있습니다.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 배포를 사용한 패키지 배포에 실패했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.PackageDeploymentInitiated": "ZIP 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.WarPackageDeploymentInitiated": "WAR 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.FailedToGetDeploymentLogs": "배포 로그를 가져오지 못했습니다. 오류: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 이름이 없습니다.", + "loc.messages.WarDeploymentRetry": "이전에 war 파일이 확장되지 않았으므로 war 파일 배포를 다시 시도합니다.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "머신에서 TLS 1.2 프로토콜 이상을 사용 중인지 확인하세요. 머신에서 TLS를 사용하도록 설정하는 방법에 대해 자세히 알아보려면 https://aka.ms/enableTlsv2를 참조하세요.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 가상 머신에 대한 MSI(관리 서비스 ID)를 구성하세요('https://aka.ms/azure-msi-docs'). 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML 파일을 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 속성이 게시 프로필에 없습니다.", + "loc.messages.InvalidConnectionType": "잘못된 서비스 연결 형식", + "loc.messages.InvalidImageSourceType": "잘못된 이미지 소스 유형", + "loc.messages.InvalidPublishProfile": "게시 프로필 파일이 잘못되었습니다.", + "loc.messages.ASE_SSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우, 자체 서명된 인증서를 사용하는 중일 수 있으며 오류를 해결하려면 이름이 VSTS_ARM_REST_IGNORE_SSL_ERRORS인 변수를 빌드 또는 릴리스 파이프라인에서 true 값으로 설정해야 합니다.", + "loc.messages.ZipDeployLogsURL": "zip 배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.DeployLogsURL": "배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.AppServiceApplicationURL": "App Service 애플리케이션 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우 자체 서명된 인증서를 사용하는 것 같으며, 오류를 해결하려면 웹 배포 옵션의 추가 인수에 -allowUntrusted를 전달해야 합니다.", + "loc.messages.FailedToGetResourceID": "리소스 종류 '%s' 및 리소스 이름 '%s'의 리소스 ID를 가져오지 못했습니다. 오류: %s", + "loc.messages.JarPathNotPresent": "Java jar 경로가 없습니다.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' 리소스를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "'웹 배포'에서 FILE_IN_USE 오류 방지에 도움이 되는 '패키지에서 실행'으로 전환하세요. '패키지에서 실행'은 msBuild 패키지 형식을 지원하지 않습니다. 이 배포 방법을 사용하려면 패키지 형식을 변경하세요." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..d5539e3edd48 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Развертывание Службы приложений Azure", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Развертывание веб-приложения, мобильного приложения или приложения API в Службе приложений Azure с помощью Docker, Java, .NET, .NET Core, Node.js, PHP, Python или Ruby", + "loc.instanceNameFormat": "Развертывание службы приложений Azure: $(WebAppName)", + "loc.releaseNotes": "Новые возможности в версии 4.*
Поддерживается развертывание из ZIP-файла, запуск из пакета, развертывание WAR-файла [Подробности здесь](https://aka.ms/appServiceDeploymentMethods)
Поддерживаются среды службы приложений
Улучшен пользовательский интерфейс для обнаружения различных типов службы приложений, поддерживаемых задачей
Предпочтительным методом развертывания является запуск из пакета, при котором файлы в папке wwwroot становятся доступными только для чтения
Чтобы получить дополнительные сведения, щелкните [здесь](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Параметры преобразования файлов и подстановки переменных", + "loc.group.displayName.AdditionalDeploymentOptions": "Дополнительные параметры развертывания", + "loc.group.displayName.PostDeploymentAction": "Действие после развертывания", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Параметры приложения и конфигурации", + "loc.input.label.ConnectionType": "Тип подключения", + "loc.input.help.ConnectionType": "Выберите тип подключения службы, который будет использоваться для развертывания веб-приложения.
Выберите \"Профиль публикации\" для использования профиля публикации, созданного в Visual Studio. [Дополнительные сведения](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Подписка Azure", + "loc.input.help.ConnectedServiceName": "Выберите подписку на Azure Resource Manager для развертывания.", + "loc.input.label.PublishProfilePath": "Путь к профилю публикации", + "loc.input.help.PublishProfilePath": "Путь к профилю публикации, созданному в Visual Studio", + "loc.input.label.PublishProfilePassword": "Пароль профиля публикации", + "loc.input.help.PublishProfilePassword": "Рекомендуется хранить пароль в секретной переменной и использовать ее здесь, например $(Password).", + "loc.input.label.WebAppKind": "Тип службы приложений", + "loc.input.help.WebAppKind": "Выберите веб-приложение в Windows, веб-приложение в Linux, веб-приложение для контейнеров, приложение-функцию, приложение-функцию в Linux, приложение-функцию для контейнеров или мобильное приложение.", + "loc.input.label.WebAppName": "Имя службы приложений", + "loc.input.help.WebAppName": "Введите или выберите имя существующей службы приложений Azure. Будут перечислены только службы приложений для выбранного типа приложения.", + "loc.input.label.DeployToSlotOrASEFlag": "Развернуть в слоте или среде службы приложений", + "loc.input.help.DeployToSlotOrASEFlag": "Выберите вариант развертывания в существующем слоте развертывания или в среде службы приложений Azure.
В обоих случаях задаче требуется имя группы ресурсов.
Если целью развертывания является слот, по умолчанию оно выполняется в рабочем слоте. Можно также указать имя любого другого существующего слота.
Если целью развертывания является среда службы приложений Azure, оставьте имя слота \"рабочий\" и укажите имя группы ресурсов.", + "loc.input.label.ResourceGroupName": "Группа ресурсов", + "loc.input.help.ResourceGroupName": "Имя группы ресурсов является обязательным, если цель развертывания — слот развертывания или среда службы приложений.
Введите или выберите группу ресурсов Azure, которая содержит указанную выше службу приложений Azure.", + "loc.input.label.SlotName": "Слот", + "loc.input.help.SlotName": "Введите или выберите существующий слот вместо рабочего слота.", + "loc.input.label.DockerNamespace": "Реестр или пространство имен", + "loc.input.help.DockerNamespace": "Глобально уникальное доменное имя верхнего уровня для реестра или пространства имен.
Примечание. Полное доменное имя имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Образ", + "loc.input.help.DockerRepository": "Имя репозитория, в котором хранятся образы контейнера.
Примечание. Полное доменное имя образа имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Тег", + "loc.input.help.DockerImageTag": "Теги необязательны, они используются в реестрах для указания версий образов Docker.
Примечание. Полное доменное имя образа имеет следующий формат: \"`/`:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Виртуальное приложение", + "loc.input.help.VirtualApplication": "Укажите имя виртуального приложения, настроенного на портале Azure. Параметр не является обязательным для развертываний в корне службы приложений.", + "loc.input.label.Package": "Пакет или папка", + "loc.input.help.Package": "Путь к файлу пакета или папке с содержимым службы приложений, созданным MSBuild, или к сжатому ZIP- или WAR-файлу.
Поддерживаются переменные ([сборки](https://docs.microsoft.com/vsts/pipelines/build/variables) | [выпуска](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), а также подстановочные знаки.
Примеры: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip или $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Стек среды выполнения", + "loc.input.help.RuntimeStack": "Выберите платформу и версию.", + "loc.input.label.RuntimeStackFunction": "Стек среды выполнения", + "loc.input.help.RuntimeStackFunction": "Выберите платформу и версию. Поддерживаемые версии среды выполнения приведены в [следующем документе](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages). Старые значения, такие как \"DOCKER|microsoft/azure-functions-*\", являются нерекомендуемыми, используйте новые значения из раскрывающегося списка.", + "loc.input.label.StartupCommand": "Команда запуска ", + "loc.input.help.StartupCommand": "Введите команду запуска, например
dotnet exec имя_файла.dll
dotnet имя_файла.dll", + "loc.input.label.ScriptType": "Тип сценария развертывания", + "loc.input.help.ScriptType": "Настройте развертывание, указав скрипт, который будет выполнен в службе приложений Azure по окончании развертывания. Например: восстановите пакеты для приложений Node, PHP и Python. [Дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Встроенный скрипт", + "loc.input.label.ScriptPath": "Путь к сценарию развертывания", + "loc.input.label.WebConfigParameters": "Создание параметров файла web.config для приложений Python, Node.js, Go и Java", + "loc.input.help.WebConfigParameters": "Если в приложении отсутствует стандартный файл web.config, он будет сгенерирован и развернут в Службе приложений Azure. Значения в файле web.config можно изменить. Они могут меняться в зависимости от исполняющей среды. Например, в файле web.config приложения node.js имеются загрузочный файл и модульные значения iis_node. Возможность редактирования доступна только для сгенерированного файла web.config. [Подробнее](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Параметры приложения", + "loc.input.help.AppSettings": "Измените параметры веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Параметры конфигурации", + "loc.input.help.ConfigurationSettings": "Измените параметры настройки веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Выбор метода развертывания", + "loc.input.help.UseWebDeploy": "Если этот флажок не установлен, оптимальный метод развертывания определяется автоматически в соответствии с типом приложения, форматом пакета и другими параметрами.
Выберите этот параметр, чтобы просмотреть поддерживаемые методы развертывания и выбрать один из них для своего приложения.", + "loc.input.label.DeploymentType": "Метод развертывания", + "loc.input.help.DeploymentType": "Выберите метод развертывания для приложения.", + "loc.input.label.TakeAppOfflineFlag": "Перевести приложение в автономный режим", + "loc.input.help.TakeAppOfflineFlag": "Выберите этот параметр, чтобы перевести службу приложений Azure в автономный режим путем размещения файла app_offline.htm в корневом каталоге службы приложений перед началом операции синхронизации. Файл будет удален после успешного завершения синхронизации.", + "loc.input.label.SetParametersFile": "Файл SetParameters", + "loc.input.help.SetParametersFile": "Дополнительно: расположение используемого файла SetParameters.xml.", + "loc.input.label.RemoveAdditionalFilesFlag": "Удалять дополнительные файлы в месте назначения", + "loc.input.help.RemoveAdditionalFilesFlag": "Выберите этот параметр, чтобы удалить файлы в службе приложений Azure, для которых отсутствуют соответствующие файлы или папки в службе приложений.

Примечание. При этом также будут удалены все файлы, связанные со всеми расширениями, установленными в этой службе приложений Azure App. Чтобы этого избежать, установите флажок \"Исключить файлы из папки App_Data\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Исключить файлы из папки App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Выберите этот параметр, чтобы заблокировать развертывание файлов из папки App_Data в службе приложений Azure или их удаление из этой службы.", + "loc.input.label.AdditionalArguments": "Дополнительные аргументы", + "loc.input.help.AdditionalArguments": "Дополнительные аргументы веб-развертывания, использующие синтаксис -ключ:значение.
Они будут применяться при развертывании службы приложений Azure, например -disableLink:AppPoolExtension -disableLink:ContentExtension.
Другие примеры рабочих параметров веб-развертывания см. [здесь](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Переименовывать заблокированные файлы", + "loc.input.help.RenameFilesFlag": "Выберите этот параметр, чтобы включить в msdeploy флаг MSDEPLOY_RENAME_LOCKED_FILES=1 в параметрах приложения службы приложений Azure. Если этот параметр установлен, msdeploy может переименовывать файлы, заблокированные во время развертывания приложения", + "loc.input.label.XmlTransformation": "XML-преобразование", + "loc.input.help.XmlTransformation": "Преобразования конфигурации будут выполнены для \"*.Release.config\" и \"*..config\" в файле \"*.config\".
Преобразования конфигурации запускаются перед подстановкой переменных.
XML-преобразования поддерживаются только на платформе Windows.", + "loc.input.label.XmlVariableSubstitution": "Подстановка XML-переменных", + "loc.input.help.XmlVariableSubstitution": "Переменные, заданные в конвейерах сборки или выпуска, будут сопоставлены с записями key или name в разделах appSettings, applicationSettings и connectionStrings всех файлов конфигурации и parameters.xml. Подстановка переменных выполняется после преобразований конфигурации.

Примечание. Если одни и те же переменные заданы в конвейере выпуска и в среде, то переменные среды имеют приоритет над переменными из конвейера выпуска.
", + "loc.input.label.JSONFiles": "Подстановка переменных JSON", + "loc.input.help.JSONFiles": "Укажите разделенный переносами строки список JSON-файлов для подстановки значений переменных. Имена файлов следует указывать относительно корневой папки.
Чтобы подставить вложенные или иерархические переменные JSON, укажите их с помощью выражений JSONPath.

Например, чтобы заменить значение ConnectionString в примере ниже, следует определить переменную как Data.DefaultConnection.ConnectionString в конвейере сборки или выпуска (или среде конвейера выпуска).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Подстановка переменных запускается после преобразований конфигураций.

Примечание. Переменные конвейера исключены из подстановки.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Указан недопустимый путь к пакету службы приложений или папке: %s", + "loc.messages.SetParamFilenotfound0": "Заданный файл параметров не найден: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML-преобразования успешно применены.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Получены сведения о подключении к службе приложений Azure: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Ошибка: такого метода развертывания не существует.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Не удалось получить данные о подключении к Службе приложений Azure: %s. Код состояния: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Не удалось получить сведения о подключении к службе для ресурса Azure: \"%s\". Код состояния: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Журнал развертывания (%s) успешно обновлен.", + "loc.messages.Failedtoupdatedeploymenthistory": "Не удалось обновить журнал развертывания. Ошибка: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ПРЕДУПРЕЖДЕНИЕ: невозможно обновить состояние развертывания, конечная точка SCM не включена для этого веб-сайта.", + "loc.messages.Unabletoretrievewebconfigdetails": "Не удалось получить сведения о конфигурации службы приложений. Код состояния: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Не удалось извлечь параметры приложения службы приложений. [Код состояния: \"%s\", сообщение об ошибке: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "Не удалось обновить параметры приложения службы приложений. Код состояния: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Не удается обновить состояние развертывания: не удается получить уникальный идентификатор развертывания.", + "loc.messages.PackageDeploymentSuccess": "Веб-пакет успешно развернут в службе приложений.", + "loc.messages.PackageDeploymentFailed": "Не удалось развернуть веб-пакет в службе приложений.", + "loc.messages.Runningcommand": "Запуск команды: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Развертывание веб-пакета %s по виртуальному пути (физическому пути): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Пакет %s успешно развернут при помощи службы Kudu в %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Не удалось развернуть пакет службы приложений при помощи службы Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Не удалось развернуть службу приложений из-за ошибки: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Пакеты, созданные при помощи MSDeploy, поддерживаются только для платформы Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Установленная версия MSDeploy (%s) не поддерживается. Должна быть установлена версия 3 или более поздняя.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Не удалось определить расположение MS Deploy при помощи реестра на компьютере (ошибка: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Не удалось найти пакет с указанным шаблоном: %s
Проверьте, публикуется ли пакет, упомянутый в задаче, как артефакт в сборке или на предыдущем этапе и скачан ли он в текущем задании.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Указанному шаблону соответствует несколько пакетов: %s. Ограничьте шаблон поиска.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Отключить приложение от сети\".", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Переименовывать заблокированные файлы\".", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Не найден файл JSON, соответствующий заданному шаблону: %s.", + "loc.messages.Configfiledoesntexists": "Файл конфигурации %s не существует.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Сбой записи в файл конфигурации %s. Ошибка: %s.", + "loc.messages.AppOfflineModeenabled": "Автономный режим для приложения включен.", + "loc.messages.Failedtoenableappofflinemode": "Не удалось включить автономный режим для приложения. Код состояния: %s (%s).", + "loc.messages.AppOflineModedisabled": "Автономный режим для приложения отключен.", + "loc.messages.FailedtodisableAppOfflineMode": "Не удалось отключить автономный режим для приложения. Код состояния: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Невозможно выполнить XML-преобразования на платформе, отличной от Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Ошибка XML-преобразования при преобразовании %s с помощью %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Публикация при помощи веб-развертывания поддерживается только при использовании агента для Windows.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Публикация путем развертывания из ZIP-файла не поддерживается для типа пакета msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Публикация путем развертывания из ZIP-файла не поддерживается для виртуального приложения.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "При публикации с помощью развертывания из ZIP-файла или RunFromZip не поддерживается развертывание WAR-файла.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "При публикации с помощью RunFromZip скрипт, выполняемый после развертывания, может не поддерживаться, если он вносит изменения в wwwroot, так как эта папка доступна только для чтения.", + "loc.messages.ResourceDoesntExist": "Ресурс \"%s\" не существует. Он должен существовать перед началом развертывания.", + "loc.messages.EncodeNotSupported": "Обнаруженная кодировка файла %s — %s. Подстановка переменных не поддерживается для кодировки %s. Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Не удается определить кодировку файла %s (typeCode: %s). Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Слишком короткий файловый буфер для обнаружения типа кодировки: %s.", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Не удалось изменить конфигурацию службы приложений. Ошибка: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Конфигурация службы приложений успешно изменена.", + "loc.messages.RequestedURLforkuduphysicalpath": "Запрошенный URL-адрес для физического пути Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Физический путь \"%s\" уже существует.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Физический путь Kudu успешно создан: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Не удалось создать физический путь Kudu. Ошибка: %s", + "loc.messages.FailedtocheckphysicalPath": "Не удалось проверить физический путь Kudu. Код ошибки: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Виртуальное приложение не существует: %s", + "loc.messages.JSONParseError": "Не удалось проанализировать JSON-файл: %s. Ошибка: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Подстановка переменных JSON успешно применена.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Подстановка переменных XML применена.", + "loc.messages.failedtoUploadFileToKudu": "Не удалось отправить файл %s в Kudu (%s). Код состояния: %s", + "loc.messages.failedtoUploadFileToKuduError": "Не удалось передать файл %s в Kudu (%s). Ошибка: %s", + "loc.messages.ExecuteScriptOnKudu": "Выполнение указанного скрипта в службе Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Не удалось выполнить скрипт в службе Kudu. Ошибка: %s", + "loc.messages.FailedToRunScriptOnKudu": "Не удалось выполнить скрипт в службе Kudu: %s. Код состояния: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Сценарий успешно выполнен в Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Выполненный сценарий вернул код \"%s\". Ошибка: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Не удалось удалить файл %s из Kudu (%s). Код состояния: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Не удалось удалить файл %s из Kudu (%s). Ошибка: %s", + "loc.messages.ScriptFileNotFound": "Файл сценария \"%s\" не найден.", + "loc.messages.InvalidScriptFile": "Указан недопустимый файл скрипта \"%s\". Допустимые расширения: .bat и .cmd в Windows, .sh в Linux", + "loc.messages.RetryForTimeoutIssue": "Сбои выполнения сценария из-за превышения времени ожидания. Выполняется повторная попытка.", + "loc.messages.stdoutFromScript": "Стандартные выходные данные сценария: ", + "loc.messages.stderrFromScript": "Стандартная ошибка сценария: ", + "loc.messages.WebConfigAlreadyExists": "Файл web.config уже существует. Он не будет сгенерирован.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Файл web.config успешно сгенерирован.", + "loc.messages.FailedToGenerateWebConfig": "Не удалось сгенерировать файл web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Не удалось получить содержимое файла: %s. Код состояния: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Не удалось получить содержимое файла: %s. Ошибка: %s", + "loc.messages.ScriptStatusTimeout": "Не удалось получить состояние сценария, так как превышено время ожидания.", + "loc.messages.PollingForFileTimeOut": "Не удалось получить состояние сценария, так как превышено время ожидания. Чтобы увеличить время ожидания, задайте для переменной \"appservicedeploy.retrytimeout\" требуемое количество минут.", + "loc.messages.InvalidPollOption": "Указан недопустимый параметр опроса: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Атрибут \"-appType\" отсутствует в параметрах Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" и \"Go\".
Например, \"-appType python_Bottle\" (без кавычек), если используется платформа Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Не удалось обнаружить путь к файлу \"settings.py\" DJANGO_SETTINGS_MODULE. Убедитесь, что файл \"settings.py\" существует, или укажите правильный путь во входных данных параметра Web.config в следующем формате: \"-DJANGO_SETTINGS_MODULE <имя_папки>.settings\".", + "loc.messages.FailedToApplyTransformation": "Не удается применить преобразование для указанного пакета. Проверьте следующее.", + "loc.messages.FailedToApplyTransformationReason1": "1. Применено ли преобразование к созданному пакету MSBuild во время сборки. Если это так, удалите тег для каждой конфигурации в CSPROJ-файле и повторите сборку. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Убедитесь, что файлы конфигурации и преобразования находятся в одной и той же папке в пакете.", + "loc.messages.AutoParameterizationMessage": "Атрибуты ConnectionString в Web.config параметризованы по умолчанию. Обратите внимание, что преобразование не влияет на атрибуты connectionString, так как значение переопределяется во время развертывания файлом \"Parameters.xml\" или \"SetParameters.xml\". Вы можете отключить автоматическую параметризацию, задав /p:AutoParameterizationWebConfigConnectionStrings=False во время создания пакета MSBuild.", + "loc.messages.UnsupportedAppType": "Тип приложения \"%s\" не поддерживается при создании Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\" и \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Не удается получить URL-адрес центра.", + "loc.messages.UnableToFetchActiveDirectory": "Не удается получить идентификатор ресурса Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Стек времени выполнения и команда запуска успешно обновлены.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Не удалось обновить стек времени выполнения и команду запуска. Ошибка: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Параметры приложения успешно обновлены.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Не удалось обновить параметры приложения. Ошибка: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Не удалось получить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Не удалось обновить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Не удалось получить учетные данные реестра контейнеров Azure. [Код состояния: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "Не удалось прочитать текст ответа. Ошибка: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Не удалось обновить сведения о конфигурации WebApp. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Добавление примечаний к выпуску для ресурса Application Insights \"%s\"", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Примечания к выпуску успешно добавлены в Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Не удалось добавить примечания к выпуску. %s", + "loc.messages.RenameLockedFilesEnabled": "Переименование заблокированных файлов для службы приложений включено.", + "loc.messages.FailedToEnableRenameLockedFiles": "Не удалось включить переименование заблокированных файлов. Ошибка: %s", + "loc.messages.WebJobsInProgressIssue": "Невозможно удалить файлы в развертывании, так как запущено несколько веб-заданий. Отключите параметр \"Удалить дополнительные файлы в месте назначения\" или остановите непрерывные задания перед развертыванием.", + "loc.messages.FailedToFetchKuduAppSettings": "Не удалось получить параметры приложения Kudu. Ошибка: %s", + "loc.messages.FailedToCreatePath": "Не удалось создать путь \"%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFile": "Не удалось удалить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFolder": "Не удалось удалить папку \"%s\" из Kudu. Ошибка: %s.", + "loc.messages.FailedToUploadFile": "Не удалось отправить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToGetFileContent": "Не удалось получить содержимое файла \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToListPath": "Не удалось получить список элементов для пути \"%s\" из Kudu. Ошибка: %s", + "loc.messages.RetryToDeploy": "Повторная попытка развертывания пакета.", + "loc.messages.FailedToGetAppServiceDetails": "Не удалось получить сведения о службе приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Не удалось получить профиль публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Не удалось обновить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Не удалось получить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Не удалось изменить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Не удалось обновить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Не удалось получить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Не удалось получить учетные данные публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Не удалось получить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Не удалось обновить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Выполняется попытка изменить параметры конфигурации Службы приложений. Данные: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Параметры конфигурации службы приложений обновлены.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Выполняется попытка изменить параметры приложения Службы приложений. Данные: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Параметры приложения Службы приложений уже существуют.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Строки подключений Службы приложений уже существуют.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Параметры приложений службы приложений и параметры приложений Kudu обновлены.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Для службы приложений \"%s\" найдено несколько групп ресурсов.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Не удалось выполнить развертывание пакета с помощью развертывания ZIP-файла. Дополнительные сведения см. в журналах.", + "loc.messages.PackageDeploymentInitiated": "Запущено развертывание пакета с помощью ZIP Deploy.", + "loc.messages.WarPackageDeploymentInitiated": "Запущено развертывание пакета с помощью WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Не удалось получить журналы развертывания. Ошибка: %s", + "loc.messages.GoExeNameNotPresent": "Отсутствует имя EXE-файла Go", + "loc.messages.WarDeploymentRetry": "Повторяется попытка развертывания WAR-файла, так как он не был развернут раньше.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Компьютер должен использовать протокол TLS 1.2 или более поздней версии. Дополнительные сведения о том, как включить TLS на вашем компьютере: https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Не удалось получить маркер доступа для Azure. Код состояния: %s, сообщение о состоянии: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Настройте управляемое удостоверение службы (MSI) для виртуальной машины \"https://aka.ms/azure-msi-docs\". Код состояния: %s; сообщения о состоянии: %s.", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Код состояния: %s, сообщение о состоянии: %s.", + "loc.messages.XmlParsingFailed": "Не удалось проанализировать файл publishProfileXML. Ошибка: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Свойство [%s] отсутствует в профиле публикации", + "loc.messages.InvalidConnectionType": "Недопустимый тип подключения к службе", + "loc.messages.InvalidImageSourceType": "Недопустимый тип источника образа", + "loc.messages.InvalidPublishProfile": "Недопустимый файл профиля публикации.", + "loc.messages.ASE_SSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо установить значение true для переменной VSTS_ARM_REST_IGNORE_SSL_ERRORS в конвейере сборки или выпуска", + "loc.messages.ZipDeployLogsURL": "Журналы развертывания из ZIP-файла можно просмотреть в %s", + "loc.messages.DeployLogsURL": "Журналы развертывания можно просмотреть в %s", + "loc.messages.AppServiceApplicationURL": "URL-адрес приложения службы приложений: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо передать -allowUntrusted в дополнительных аргументах параметра веб-развертывания.", + "loc.messages.FailedToGetResourceID": "Не удалось получить идентификатор ресурса для ресурса с типом \"%s\" и именем \"%s\". Ошибка: %s", + "loc.messages.JarPathNotPresent": "Отсутствует путь к jar-файлу Java.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Не удалось обновить ресурс Application Insights \"%s\". Ошибка: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Переход от веб-развертывания к запуску из пакета, что помогает избежать ошибки FILE_IN_USE. Обратите внимание, что запуск из пакета не поддерживает тип пакета msBuild. Измените формат пакета, чтобы использовать этот метод развертывания." +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..99bb677d364e --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure 应用服务部署", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 向 Azure 应用服务部署 Web、移动或 API 应用", + "loc.instanceNameFormat": "Azure 应用服务部署: $(WebAppName)", + "loc.releaseNotes": "版本 4.* 中的新增功能
支持 Zip 部署、从包运行、War 部署[在此处获取详细信息](https://aka.ms/appServiceDeploymentMethods)
支持应用服务环境
改进了用于发现任务支持的不同应用服务类型的 UI
从包运行是首选的部署方法,它使 wwwroot 文件夹中的文件成为只读文件
单击[此处](https://aka.ms/azurermwebdeployreadme)以获取更多信息。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "文件转换和变量替换选项", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署选项", + "loc.group.displayName.PostDeploymentAction": "部署后操作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "应用程序和配置设置", + "loc.input.label.ConnectionType": "连接类型", + "loc.input.help.ConnectionType": "选择要用于部署 Web 应用的服务连接类型。
选择发布配置文件以使用 Visual Studio 创建的发布配置文件。[更多信息](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure 订阅", + "loc.input.help.ConnectedServiceName": "为部署选择 Azure 资源管理器订阅。", + "loc.input.label.PublishProfilePath": "发布配置文件路径", + "loc.input.help.PublishProfilePath": "从 Visual Studio 中创建的发布配置文件的路径", + "loc.input.label.PublishProfilePassword": "发布配置文件密码", + "loc.input.help.PublishProfilePassword": "建议将密码存储在机密变量中,并在此处使用该变量,例如 $(Password)。", + "loc.input.label.WebAppKind": "应用服务类型", + "loc.input.help.WebAppKind": "从后列选项中选择: Windows 上的 Web 应用、Linux 上的 Web 应用、用于容器的 Web 应用、Linux 上的函数应用、用于容器和移动应用的函数应用。", + "loc.input.label.WebAppName": "应用服务名称", + "loc.input.help.WebAppName": "输入或选择现有 Azure 应用服务的名称。只会列出基于所选应用类型的应用服务。", + "loc.input.label.DeployToSlotOrASEFlag": "部署到槽或应用服务环境", + "loc.input.help.DeployToSlotOrASEFlag": "选择要部署到现有部署槽或 Azure 应用服务环境的选项。
对于这两个目标,任务需要资源组名称。
如果部署目标是槽,默认部署到生产槽。此外还可以提供任何其他现有的槽名称。
如果部署目标是 Azure 应用服务环境,则将槽名称保留为“生产”并指定资源组名称即可。", + "loc.input.label.ResourceGroupName": "资源组", + "loc.input.help.ResourceGroupName": "当部署目标是部署槽或应用服务环境时,需要资源组名称。
输入或选择包含上面指定的 Azure 应用服务的 Azure 资源组。", + "loc.input.label.SlotName": "槽", + "loc.input.help.SlotName": "输入或选择生产槽以外的现有槽。", + "loc.input.label.DockerNamespace": "注册表或命名空间", + "loc.input.help.DockerNamespace": "特定注册表或命名空间的全局唯一顶级域名。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "用于存储容器映像的存储库的名称。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerImageTag": "标记", + "loc.input.help.DockerImageTag": "标记为可选项,它是注册表用以对 Docker 映像提供版本的机制。
注意: 完全限定的映射名称格式应为:“`/`:`”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.VirtualApplication": "虚拟应用程序", + "loc.input.help.VirtualApplication": "指定 Azure 门户中已配置的虚拟应用程序的名称。对于以应用服务根目录为目标的部署,此选项并非必需。", + "loc.input.label.Package": "包或文件夹", + "loc.input.help.Package": "包的文件路径或一个包含由 MSBuild 生成的应用服务内容或压缩的 zip 或 war 文件的文件夹。
变量([生成](https://docs.microsoft.com/vsts/pipelines/build/variables) | [发布](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支持通配符。
例如,$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 或 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "运行时堆栈", + "loc.input.help.RuntimeStack": "选择框架和版本。", + "loc.input.label.RuntimeStackFunction": "运行时堆栈", + "loc.input.help.RuntimeStackFunction": "选择框架和版本。请查看[此文档](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages),了解受支持的运行时版本。\"DOCKER|microsoft/azure-functions-*\" 等旧值已被弃用,请使用下拉列表中的新值。", + "loc.input.label.StartupCommand": "启动命令", + "loc.input.help.StartupCommand": "输入启动命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署脚本类型", + "loc.input.help.ScriptType": "任务成功完成部署后,通过提供可在 Azure 应用服务上运行的脚本自定义部署。例如 Node、PHP 和 Python 应用程序的还原包。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "内联脚本", + "loc.input.label.ScriptPath": "部署脚本路径", + "loc.input.label.WebConfigParameters": "生成适用于 Python、Node.js、Go 和 Java 应用的 web.config 参数", + "loc.input.help.WebConfigParameters": "如果应用程序中没有标准的 Web.config,系统将生成一个并将其部署到 Azure 应用服务。Web.config 中的值可进行编辑,并且可能因应用程序框架而异。例如,对于 node.js 应用程序,web.config 将包含启动文件和 iis_node module 模块值。此编辑功能仅适用于生成的 web.config。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "应用设置", + "loc.input.help.AppSettings": "按照语法 -key 值编辑 Web 应用应用程序设置。包含空格的值应括在双引号中。
示例: -Port 5000 -RequestTimeout
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "配置设置", + "loc.input.help.ConfigurationSettings": "按照语法 -key 值编辑 Web 应用配置设置。包含空格的值应括在双引号中。
示例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "选择部署方法", + "loc.input.help.UseWebDeploy": "如果未选中,将根据应用类型、包格式和其他参数自动检测最佳部署方法。
选择此选项以查看支持的部署方法,并选择一个用于部署应用。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "选择应用的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "使应用脱机", + "loc.input.help.TakeAppOfflineFlag": "选择该选项,通过在同步操作开始前将 app_offline.htm 文件放入应用服务的根目录而使 Azure 应用服务脱机。同步操作成功完成后,将删除该文件。", + "loc.input.label.SetParametersFile": "SetParameters 文件", + "loc.input.help.SetParametersFile": "可选: 要使用的 SetParameters.xml 文件的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "删除目标中的其他文件", + "loc.input.help.RemoveAdditionalFilesFlag": "选择该选项可删除 Azure 应用服务上在应用服务包或文件夹中没有匹配文件的文件。

注意: 这该将删除与安装在此 Azure 应用服务上的任何扩展相关的所有文件。为防止出现这种情况,请选中“从 App_Data 文件夹中排除文件”复选框。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 文件夹中的文件", + "loc.input.help.ExcludeFilesFromAppDataFlag": "选择该选项以阻止将 App_Data 文件夹中的文件部署到 Azure 应用服务/从 Azure 应用服务删除。", + "loc.input.label.AdditionalArguments": "其他参数", + "loc.input.help.AdditionalArguments": "语法 -key:value 后的其他 Web 部署参数。
部署 Azure 应用服务时将应用这些参数。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
有关 Web 部署操作设置的更多示例,请参阅[此处](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重命名锁定的文件", + "loc.input.help.RenameFilesFlag": "选择此选项可在 Azure 应用服务应用程序设置中启用 msdeploy 标志 MSDEPLOY_RENAME_LOCKED_FILES=1。如果设定,此选项可使 msdeploy 重命名在应用部署期间锁定的锁定文件", + "loc.input.label.XmlTransformation": "XML 转换", + "loc.input.help.XmlTransformation": "将在 \"*.config file\" 上为 \"*.Release.config\" 和 \"*..config\" 运行配置转换。
配置转换将在变量替换前运行。
仅 Windows 平台支持 XML 转换。", + "loc.input.label.XmlVariableSubstitution": "XML 变量替换", + "loc.input.help.XmlVariableSubstitution": "生成或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的 \"key\" 或 \"name\" 条目进行匹配。变量替换在配置变换后运行。

注意: 如果在发布管道和环境中定义了相同的变量,则环境变量将取代发布管道变量。
", + "loc.input.label.JSONFiles": "JSON 变量替换", + "loc.input.help.JSONFiles": "提供 JSON 文件的新行分隔列表,用于替换变量值。将相对于根文件夹来提供文件名。
要替代嵌套或层次结构式 JSON 变量,请使用 JSONPath 表达式指定它们。

例如,若要替换下面示例中的 \"ConnectionString\" 的值,需要在生成或发布管道(或发布管道的环境)中将变量定义为 \"Data.DefaultConnection.ConnectionString\"。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
变量替换在配置转换后运行。

注意: 管道变量排除在替换之外。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供了无效的应用服务包或文件夹路径: %s", + "loc.messages.SetParamFilenotfound0": "设置的参数文件未找到: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 转换已成功应用", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "已获取 Azure 应用服务“%s”的服务连接详细信息", + "loc.messages.ErrorNoSuchDeployingMethodExists": "错误: 不存在此种部署方法", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "无法检索 Azure 应用服务 %s 的服务连接详细信息。状态代码: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "无法检索 Azure 资源“%s”的服务连接详细信息。状态代码: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功在 %s 更新了部署历史记录", + "loc.messages.Failedtoupdatedeploymenthistory": "未能更新部署历史记录。错误: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 无法更新部署状态: SCM 终结点没有为此网站启用", + "loc.messages.Unabletoretrievewebconfigdetails": "无法检索应用配置详细信息。状态代码:“%s”", + "loc.messages.Unabletoretrievewebappsettings": "无法检索应用服务应用程序设置。[状态代码: %s, 错误消息: %s]", + "loc.messages.Unabletoupdatewebappsettings": "无法更新应用服务应用程序设置。状态代码:“%s”", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "无法更新部署状态: 无法检索唯一部署 ID", + "loc.messages.PackageDeploymentSuccess": "已成功将 Web 包部署到应用服务。", + "loc.messages.PackageDeploymentFailed": "未能将 Web 包部署到应用服务。", + "loc.messages.Runningcommand": "正在运行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正在部署 Web 包 %s,部署位置: 虚拟路径 %s (物理路径 %s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功部署了包 %s (通过在 %s 使用 kudu 服务)", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "未能使用 kudu 服务 %s 部署应用服务包", + "loc.messages.Unabletodeploywebappresponsecode": "错误代码 %s 导致无法部署应用服务", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 生成的包仅受 Windows 平台支持。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "为 MSDeploy 找到了不受支持的已安装版本 %s。版本应至少为 3 或以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "无法从计算机的注册表上找到 MS 部署的位置(错误: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "未找到具有指定模式的包: %s
请检查任务中提及的包是否在版本或上一阶段中作为项目发布,以及是否已在当前作业中下载。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定的模式 %s 有多个匹配的包。请限制搜索模式。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "再次尝试使用所选“使应用程序脱机”选项部署应用服务。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "再次尝试使用所选“重命名锁定文件”选项部署应用服务。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "没有与特定模式 %s 匹配的 JSON 文件。", + "loc.messages.Configfiledoesntexists": "配置文件 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "未能写入配置文件 %s,错误为 %s", + "loc.messages.AppOfflineModeenabled": "已启用应用脱机模式。", + "loc.messages.Failedtoenableappofflinemode": "未能启用应用脱机模式。状态代码: %s (%s)", + "loc.messages.AppOflineModedisabled": "已禁用应用脱机模式。", + "loc.messages.FailedtodisableAppOfflineMode": "未能禁用应用脱机模式。状态代码: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "无法在非 Windows 平台上执行 XML 转换。", + "loc.messages.XdtTransformationErrorWhileTransforming": "转换 %s (通过使用 %s)时出现 XML 转换错误。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "仅当使用 Windows 代理时才支持使用 webdeploy 选项进行发布", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 包类型不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虚拟应用程序不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip 部署或 RunFromZip 选项执行的发布不支持 war 文件部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果对 wwwroot 进行更改,则使用 RunFromZip 发布可能不支持后期部署脚本,因为该文件夹为只读。", + "loc.messages.ResourceDoesntExist": "资源“%s”不存在。资源应在部署前就已存在。", + "loc.messages.EncodeNotSupported": "检测到文件 %s 的文件编码为 %s。不支持使用文件编码 %s 进行变量替换。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "无法检测文件 %s (类型代码: %s)的编码。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "文件缓冲区太短,无法检测编码类型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "未能更新应用服务配置详细信息。错误: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新应用服务配置详细信息。", + "loc.messages.RequestedURLforkuduphysicalpath": "kudu 物理路径的请求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "物理路径 \"%s\" 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理路径已成功创建: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "未能创建 kudu 物理路径。错误: %s", + "loc.messages.FailedtocheckphysicalPath": "未能检查 kudu 物理路径。错误代码: %s", + "loc.messages.VirtualApplicationDoesNotExist": "不存在虚拟应用程序: %s", + "loc.messages.JSONParseError": "无法分析 JSON 文件: %s。错误: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 变量替换已成功应用。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功应用 XML 变量替换。", + "loc.messages.failedtoUploadFileToKudu": "无法将文件 %s 上传到 Kudu (%s)。状态代码: %s", + "loc.messages.failedtoUploadFileToKuduError": "无法将文件 %s 上传到 Kudu (%s)。错误: %s", + "loc.messages.ExecuteScriptOnKudu": "正在 Kudu 服务上执行给定脚本。", + "loc.messages.FailedToRunScriptOnKuduError": "无法在 Kudu 服务上运行该脚本。错误: %s", + "loc.messages.FailedToRunScriptOnKudu": "无法在 Kudu 上运行该脚本: %s。状态代码: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上执行脚本。", + "loc.messages.ScriptExecutionOnKuduFailed": "已执行的脚本返回了“%s”作为返回代码。错误: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "无法从 Kudu (%s) 删除文件: %s。状态代码: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "无法删除文件 %s (位于 Kudu (%s)上)。错误: %s", + "loc.messages.ScriptFileNotFound": "找不到脚本文件“%s”。", + "loc.messages.InvalidScriptFile": "提供的脚本文件“%s”无效。有效的扩展名为 .bat 和 .cmd (对于 Windows)和 .sh (对于 Linux)", + "loc.messages.RetryForTimeoutIssue": "由于出现超时问题,脚本执行失败。请重试。", + "loc.messages.stdoutFromScript": "脚本中的标准输出:", + "loc.messages.stderrFromScript": "脚本中的标准错误:", + "loc.messages.WebConfigAlreadyExists": "web.config 文件已存在。不再生成。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功生成 web.config 文件", + "loc.messages.FailedToGenerateWebConfig": "未能生成 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "无法获取文件内容: %s。状态代码: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "无法获取文件内容: %s。错误: %s", + "loc.messages.ScriptStatusTimeout": "因为超时,无法提取脚本状态。", + "loc.messages.PollingForFileTimeOut": "因为超时,无法提取脚本状态。通过将 \"appservicedeploy.retrytimeout\" 变量设置为所需分钟数可以增加超时限制。", + "loc.messages.InvalidPollOption": "提供的轮询选项无效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 参数中缺少属性 \"-appType\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\"、\"node\" 和 \"Go\"。
例如,如果是 Python Bottle 框架,则应为 \"-appType python_Bottle\" (不带引号)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "无法检测 DJANGO_SETTINGS_MODULE \"settings.py\" 文件路径。请确保 \"settings.py\" 文件存在或采用格式 \"-DJANGO_SETTINGS_MODULE .settings\" 在 Web.config 参数输出中提供正确的路径", + "loc.messages.FailedToApplyTransformation": "无法对给定的包应用转换。请验证以下各项。", + "loc.messages.FailedToApplyTransformationReason1": "1. 在生成期间是否已对 MSBuild 生成的包应用转换。如果已应用,请删除 csproj 文件中每个配置的 标记,然后重新生成。", + "loc.messages.FailedToApplyTransformationReason2": "2. 确保配置文件和转换文件位于包内的同一个文件夹中。", + "loc.messages.AutoParameterizationMessage": "默认情况下,Web.config 中的 connectionString 属性已参数化。请注意,转换对 connectionString 属性无影响,因为在通过 \"Parameters.xml\" 或 \"SetParameters.xml\" 文件进行部署期间,该值将被重写。可通过在 MSBuild 包生成期间设置 /p:AutoParameterizationWebConfigConnectionStrings=False 来禁用自动参数化。", + "loc.messages.UnsupportedAppType": "Web.config 生成中不支持应用类型 \"%s\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\" 和 \"node\"", + "loc.messages.UnableToFetchAuthorityURL": "无法提取授权 URL。", + "loc.messages.UnableToFetchActiveDirectory": "无法提取 Active Directory 资源 ID。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新运行时堆栈和启动命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "未能更新运行时堆栈和启动命令。错误: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新应用设置。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "未能更新应用设置。错误: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "未能提取 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "无法更新 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "无法检索 Azure 容器注册表凭据。[状态代码: “%s”]", + "loc.messages.UnableToReadResponseBody": "无法读取响应正文。错误: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "无法更新 WebApp 配置详细信息。状态代码:“%s”", + "loc.messages.AddingReleaseAnnotation": "正在添加 Application Insights 资源“%s”的发布注释", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功向 Application Insights 添加发布注释: %s", + "loc.messages.FailedAddingReleaseAnnotation": "未能添加发布注释。%s", + "loc.messages.RenameLockedFilesEnabled": "已对应用服务启用“重命名已锁定文件”。", + "loc.messages.FailedToEnableRenameLockedFiles": "未能启用“重命名已锁定文件”。错误: %s", + "loc.messages.WebJobsInProgressIssue": "几个处于运行状态的 Web 作业阻止部署删除这些文件。可禁用“删除目标处的其他文件”选项或在部署前停止连续作业。", + "loc.messages.FailedToFetchKuduAppSettings": "未能提取 Kudu 应用设置。错误: %s", + "loc.messages.FailedToCreatePath": "未能从 Kudu 创建路径“%s”。错误: %s", + "loc.messages.FailedToDeleteFile": "未能从 Kudu 删除文件“%s/%s”。错误: %s", + "loc.messages.FailedToDeleteFolder": "未能从 Kudu 删除文件夹“%s”。错误: %s", + "loc.messages.FailedToUploadFile": "未能从 Kudu 上传文件“%s/%s”。错误: %s", + "loc.messages.FailedToGetFileContent": "未能从 Kudu 获取文件内容“%s/%s”。错误: %s", + "loc.messages.FailedToListPath": "未能从 Kudu 列出路径“%s”。错误: %s", + "loc.messages.RetryToDeploy": "正在重新尝试部署包。", + "loc.messages.FailedToGetAppServiceDetails": "未能提取应用服务“%s”详细信息。错误: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "未能提取应用服务“%s”发布配置文件。错误: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "未能更新应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToGetAppServiceMetadata": "未能获取应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "未能修补应用服务“%s”配置。错误: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "未能更新应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "未能获取应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "未能提取应用服务“%s”发布凭据。错误: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "未能获取应用服务“%s”应用程序设置。错误: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "未能更新应用服务“%s”应用程序设置。错误: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在尝试更新应用服务配置设置。数据: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新应用服务配置设置。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在尝试更新应用服务应用程序设置。数据: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "应用服务应用程序设置已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "应用服务连接字符串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新应用服务应用程序设置和 Kudu 应用程序设置。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到了应用服务“%s”的多个资源组。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP 部署的包部署失败。有关更多详细信息,请参阅日志。", + "loc.messages.PackageDeploymentInitiated": "已启动使用 ZIP 部署的包部署。", + "loc.messages.WarPackageDeploymentInitiated": "已启动使用 WAR 部署的包部署。", + "loc.messages.FailedToGetDeploymentLogs": "未能获取部署日志。错误: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名称不存在", + "loc.messages.WarDeploymentRetry": "正在重试 war 文件部署,因为它之前未成功扩展。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "请确保计算机使用的是 TLS 1.2 协议或更高版本。请访问 https://aka.ms/enableTlsv2 获取有关如何在计算机中启用 TLS 的详细信息。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "无法提取 Azure 的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "无法提取托管服务主体的访问令牌。请为虚拟机配置托管服务标识(MSI)(https://aka.ms/azure-msi-docs)。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "无法提取托管服务主体的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.XmlParsingFailed": "无法分析 publishProfileXML 文件,错误: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s]发布配置文件中不存在属性", + "loc.messages.InvalidConnectionType": "无效的服务连接类型", + "loc.messages.InvalidImageSourceType": "无效的映像源类型", + "loc.messages.InvalidPublishProfile": "发布配置文件无效。", + "loc.messages.ASE_SSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在生成或发布管道中,将名为 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的变量设置为 true 值", + "loc.messages.ZipDeployLogsURL": "可以在 %s 查看 Zip 部署日志", + "loc.messages.DeployLogsURL": "可在 %s 查看部署日志", + "loc.messages.AppServiceApplicationURL": "应用服务应用程序 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在 Web 部署选项的其他参数中传递 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "未能获取资源类型“%s”和资源名称“%s”的资源 ID。错误: %s", + "loc.messages.JarPathNotPresent": "Java jar 路径不存在", + "loc.messages.FailedToUpdateApplicationInsightsResource": "未能更新 Application Insights“%s”资源。错误: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "从 Web 部署移动到 RunFrom 包,这有助于避免 FILE_IN_USE 错误。请注意,“从包运行”不支持 msBuild 包类型。请更改包格式以使用此部署方法。" +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..7bcbc1329826 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 部署", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 對 Azure App Service 部署 Web、行動或 API 應用程式", + "loc.instanceNameFormat": "Azure App Service 部署: $(WebAppName)", + "loc.releaseNotes": "4.* 版的新功能 (預覽)
支援 Zip 部署、Run From Package (從套件執行)、War 部署 ([詳細資料在此](https://aka.ms/appServiceDeploymentMethods))
支援 App Service 環境
改善 UI,以供探索工作所支援的各種應用程式服務類型
「從套件執行」為偏好的部署方法,會使 wwwroot 資料夾中的檔案變成唯讀
如需詳細資訊,請按一下[這裡](https://aka.ms/azurermwebdeployreadme)。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "檔案轉換及變數替代選項", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署選項", + "loc.group.displayName.PostDeploymentAction": "部署後動作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "應用程式和組態設定", + "loc.input.label.ConnectionType": "連線類型", + "loc.input.help.ConnectionType": "請選取要用來部署 Web 應用程式的服務連線類型。
請選取發佈設定檔以使用 Visual Studio 建立的發佈設定檔。[詳細資訊](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceName": "選取部署的 Azure Resource Manager 訂用帳戶。", + "loc.input.label.PublishProfilePath": "發行設定檔的路徑", + "loc.input.help.PublishProfilePath": "從 Visual Studio 所建立之發佈設定檔的路徑", + "loc.input.label.PublishProfilePassword": "發行設定檔的密碼", + "loc.input.help.PublishProfilePassword": "建議您將密碼儲存在祕密變數中,並在此處使用該變數,例如 $(Password)。", + "loc.input.label.WebAppKind": "App Service 類型", + "loc.input.help.WebAppKind": "從 Windows 上的 Web 應用程式、Linux 上的 Web 應用程式、用於容器的 Web App、函數應用程式、Linux 上的函數應用程式、用於容器的函數應用程式及行動裝置應用程式中選擇。", + "loc.input.label.WebAppName": "App Service 名稱", + "loc.input.help.WebAppName": "輸入或選取現有 Azure App Service 的名稱。僅依選取的應用程式類型列出應用程式服務。", + "loc.input.label.DeployToSlotOrASEFlag": "將部署到位置或 App Service 環境", + "loc.input.help.DeployToSlotOrASEFlag": "請選取選項以部署至現有的部署位置或 Azure App Service 環境。
對於這兩個目標而言,工作都需要資源群組名稱。
假如部署目標是位置,預設會對生產位置進行部署。此外,也能提供任何其他現有的位置名稱。
假如部署目標是 Azure App Service 環境,請將位置名稱保留為 ‘production’,並請僅指定資源群組名稱。", + "loc.input.label.ResourceGroupName": "資源群組", + "loc.input.help.ResourceGroupName": "當部署目標為部署位置或 App Service 環境時,資源群組名稱為必要項。
請輸入或選取包含上方所指定 Azure App Service 的 Azure 資源群組。", + "loc.input.label.SlotName": "位置", + "loc.input.help.SlotName": "請輸入或選取現有的位置,而不是生產位置。", + "loc.input.label.DockerNamespace": "登錄或命名空間", + "loc.input.help.DockerNamespace": "您的特定登錄或命名空間的全域唯一頂層網域名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "容器映像儲存所在的存放庫名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "標記", + "loc.input.help.DockerImageTag": "標記是選擇項,這是登錄提供版本給 Docker 映像時所使用的機制。
注意: 完整映像名稱的格式為: '`/`:`'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "虛擬應用程式", + "loc.input.help.VirtualApplication": "指定在 Azure 入口網站中設定的虛擬應用程式名稱。若要部署到 App Service 的根目錄,則無須使用此選項。", + "loc.input.label.Package": "套件或資料夾", + "loc.input.help.Package": "包含應用程式服務內容的套件或資料夾路徑,產生該內容的來源為 MSBuild,或壓縮的 zip 或 war 檔案。
變數 ( [組建](https://docs.microsoft.com/vsts/pipelines/build/variables) | [發行](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支援使用萬用字元。
例如 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "執行階段堆疊", + "loc.input.help.RuntimeStack": "選取架構及版本。", + "loc.input.label.RuntimeStackFunction": "執行階段堆疊", + "loc.input.help.RuntimeStackFunction": "選取架構和版本。如需支援的執行階段版本,請參閱[本文件](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)。`DOCKER|microsoft/azure-functions-*` 等舊值已淘汰,請使用下拉式清單中的新值。", + "loc.input.label.StartupCommand": "啟動命令 ", + "loc.input.help.StartupCommand": "輸入啟動命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署指令碼類型", + "loc.input.help.ScriptType": "當工作已成功完成部署時,就提供將在 Azure App Service 上執行的指令碼以自訂部署。例如,還原 Node、PHP、Python 應用程式的套件。[深入了解](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "內嵌指令碼", + "loc.input.label.ScriptPath": "部署指令碼路徑", + "loc.input.label.WebConfigParameters": "產生 Python、Node.js、Go 和 Java 應用程式的 web.config 參數", + "loc.input.help.WebConfigParameters": "若應用程式沒有標準 Web.config,會予以產生並部署至 Azure App Service。Web.config 中的值可編輯,並會因應用程式架構而有所不同。例如若是 node.js 應用程式,web.config 會具有啟動檔案和 iis_node 模組值。此編輯功能僅適用於所產生的 web.config。[深入了解](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "應用程式設定", + "loc.input.help.AppSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "組態設定", + "loc.input.help.ConfigurationSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例 -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "選取部署方法", + "loc.input.help.UseWebDeploy": "若取消選取,我們會根據您的應用程式類型、套件格式及其他參數,自動偵測最適合的部署方法。
選取選項即可檢視支援的部署方法,並請選擇一項以部署應用程式。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "選擇應用程式的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "將應用程式設為離線", + "loc.input.help.TakeAppOfflineFlag": "選取此選項可在同步作業開始之前,將 app_offline.htm 檔案置於 App Service 的根目錄中而使此 Azure App Service 離線。此檔案將會在同步作業成功完成後移除。", + "loc.input.label.SetParametersFile": "SetParameters 檔案", + "loc.input.help.SetParametersFile": "選擇性: 要使用之 SetParameters.xml 檔案的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "移除目的地的其他檔案", + "loc.input.help.RemoveAdditionalFilesFlag": "選取此選項可刪除在 Azure App Service 上,於 App Service 套件或資料夾中沒有任何相符檔案的檔案。

注意: 這也會移除與此 Azure App Service 上所安裝之任何延伸模組相關的所有檔案。若要避免,請選取 'Exclude files from App_Data folder' 核取方塊。 ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 資料夾內的檔案", + "loc.input.help.ExcludeFilesFromAppDataFlag": "選取此選項可避免將 App_Data 資料夾中的檔案部署至 Azure App Service 或從中刪除。", + "loc.input.label.AdditionalArguments": "其他引數", + "loc.input.help.AdditionalArguments": "其他 Web Deploy 引數,接在 -key:value 語法後方。
部署 Azure App Service 時會加以套用。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
如需其他 Web Deploy 作業設定範例,請參閱[這裡](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重新命名鎖定的檔案", + "loc.input.help.RenameFilesFlag": "選取此選項可在 Azure App Service 應用程式設定中啟用 MSDeploy 旗標 MSDEPLOY_RENAME_LOCKED_FILES=1。若設定此選項,MSDeploy 即可為鎖定於應用程式部署期間的鎖定檔案重新命名", + "loc.input.label.XmlTransformation": "XML 轉換", + "loc.input.help.XmlTransformation": "將為 `*.config file` 上 `*.Release.config` 及 `*.<環境名稱>.config` 執行的組態轉換。
將會在變數替代前執行組態轉換。
只有在 Windows 平台上才支援 XML 轉換。", + "loc.input.label.XmlVariableSubstitution": "XML 變數替代", + "loc.input.help.XmlVariableSubstitution": "組建或發行管線中定義的變數,會與組態檔及 parameters.xml 中 appSettings、applicationSettings 及 connectionStrings 的 'key' 或 'name' 項目進行比對。變數替代會在組態轉換後執行。

注意: 若發行管線與環境所定義的變數相同,則環境變數會取代發行管線變數。
", + "loc.input.label.JSONFiles": "JSON 變數替代", + "loc.input.help.JSONFiles": "提供新行分隔的 JSON 檔案清單,以替代變數值。提供的檔案名稱必須相對於根資料夾。
若要替代巢狀或階層式 JSON 變數,請使用 JSONPath 運算式加以指定。

例如,若要取代下方範例中的 ‘ConnectionString’ 值,您必須在組建/發行管線 (或發行管線的環境) 中定義 ‘Data.DefaultConnection.ConnectionString’ 這樣的變數。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
變數替代會在組態轉換之後執行。

注意: 管線變數不在替代範圍內。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供的 App Service 套件或資料夾路徑無效: %s", + "loc.messages.SetParamFilenotfound0": "找不到設定參數檔案: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "已成功套用 XML 轉換", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "取得 Azure App Service 的服務連線詳細資料: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "錯誤: 此類部署方法不存在", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "無法擷取 Azure App Service 的服務連線詳細資料 : %s。狀態碼: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "無法擷取 Azure 資源的服務連線詳細資料:'%s'。狀態碼: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功於 %s 更新部署歷程記錄", + "loc.messages.Failedtoupdatedeploymenthistory": "無法更新部署歷程記錄。錯誤: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 無法更新部署狀態: 此網站未啟用 SCM 端點", + "loc.messages.Unabletoretrievewebconfigdetails": "無法擷取 App Service 組態詳細資料。狀態碼: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "無法擷取 App Service 應用程式設定。[狀態碼: '%s',錯誤訊息: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "無法更新 App Service 應用程式設定。狀態碼: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "無法更新部署狀態: 無法擷取唯一部署識別碼", + "loc.messages.PackageDeploymentSuccess": "已成功將 Web 套件部署到 App Service。", + "loc.messages.PackageDeploymentFailed": "無法將 Web 套件部署到 App Service。", + "loc.messages.Runningcommand": "正在執行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正於虛擬路徑 (實體路徑) 部署網頁套件 %s: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功使用 Kudu 服務部署套件 %s 於 %s ", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "無法部署使用 Kudu 服務的 App Service 套件: %s", + "loc.messages.Unabletodeploywebappresponsecode": "因以下錯誤碼而無法部署 App Service: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "僅 Windows 平台支援 MSDeploy 產生的套件。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "發現對 MSDeploy 安裝了不受支援的版本: %s。版本至少應為 3 (含) 以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "電腦上的登錄找不到 MS 部署的位置 (錯誤: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "找不到具有指定模式的套件: %s
請確認工作中所提及的套件已在組建或上一個階段中發行為成品,並已在目前的作業中下載。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "有多個套件與指定模式相符: %s。請縮小搜尋模式範圍。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "請先選取 [讓應用程式成為離線狀態] 選項,然後嘗試再次部署 App Service。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "請先選取 [重新命名鎖定的檔案] 選項,然後嘗試再次部署 App Service。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "沒有符合特定模式 %s 的 JSON 檔案。", + "loc.messages.Configfiledoesntexists": "組態檔 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "無法寫入組態檔 %s,錯誤為: %s", + "loc.messages.AppOfflineModeenabled": "已啟用 [應用程式離線] 模式。", + "loc.messages.Failedtoenableappofflinemode": "無法啟用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.AppOflineModedisabled": "已停用 [應用程式離線] 模式。", + "loc.messages.FailedtodisableAppOfflineMode": "無法停用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "無法在非 Windows 平台執行 XML 轉換。", + "loc.messages.XdtTransformationErrorWhileTransforming": "轉換 %s (使用 %s) 時發生 XML 轉換錯誤。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "僅限使用 Windows 代理程式時才可使用 webdeploy 選項發佈", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 套件類型不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虛擬應用程式不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip deploy 或 RunFromZip 發佈的選項不支援 war 檔案部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果使用 RunFromZip 發佈會對 wwwroot 進行變更,就可能會因為資料夾是唯讀的,而不支援部署後指令碼。", + "loc.messages.ResourceDoesntExist": "資源 '%s' 不存在。應具備資源才可部署。", + "loc.messages.EncodeNotSupported": "偵測到檔案 %s 的檔案編碼為 %s。檔案編碼 %s 不支援變數替代。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "無法偵測檔案 %s 的編碼 (typeCode: %s)。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "檔案緩衝區太短而無法偵測編碼類型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "無法更新 App Service 組態詳細資料。錯誤: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新 App Service 組態詳細資料", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 實體路徑的要求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "實體路徑 '%s' 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "已成功建立 Kudu 實體路徑: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "無法建立 Kudu 實體路徑。錯誤 : %s", + "loc.messages.FailedtocheckphysicalPath": "無法檢查 Kudu 實體路徑。錯誤碼: %s", + "loc.messages.VirtualApplicationDoesNotExist": "虛擬應用程式不存在: %s", + "loc.messages.JSONParseError": "無法剖析 JSON 檔案: %s。錯誤: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "已成功套用 JSON 變數替代。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功套用替代的 XML 變數。", + "loc.messages.failedtoUploadFileToKudu": "無法將檔案 %s 上傳到 Kudu (%s)。狀態碼: %s", + "loc.messages.failedtoUploadFileToKuduError": "無法將檔案 %s 上傳到 Kudu (%s)。錯誤: %s", + "loc.messages.ExecuteScriptOnKudu": "正在於 Kudu 服務上執行指定的指令碼。", + "loc.messages.FailedToRunScriptOnKuduError": "無法在 Kudu 服務上執行指令碼。錯誤: %s", + "loc.messages.FailedToRunScriptOnKudu": "無法在 Kudu 上執行指令碼: %s。狀態碼: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上執行指令碼。", + "loc.messages.ScriptExecutionOnKuduFailed": "執行的指令碼傳回了下列傳回碼: '%s'。錯誤: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "無法從 Kudu (%s) 刪除檔案 %s。狀態碼: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "無法從下列 Kudu 刪除檔案 %s: %s。錯誤: %s", + "loc.messages.ScriptFileNotFound": "找不到指令碼檔案 '%s'。", + "loc.messages.InvalidScriptFile": "提供的指令檔 '%s' 無效。有效的副檔名為 .bat 與 .cmd (Windows),以及 .sh (Linux)", + "loc.messages.RetryForTimeoutIssue": "因為逾時,導致指令碼執行失敗。請重試。", + "loc.messages.stdoutFromScript": "指令碼的標準輸出:", + "loc.messages.stderrFromScript": "指令碼的標準錯誤:", + "loc.messages.WebConfigAlreadyExists": "已有 web.config 檔案。未產生任何檔案。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功產生 web.config 檔案", + "loc.messages.FailedToGenerateWebConfig": "無法產生 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "無法取得檔案內容: %s。狀態碼: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "無法取得檔案內容: %s。錯誤: %s", + "loc.messages.ScriptStatusTimeout": "因為逾時,所以無法擷取指令碼狀態。", + "loc.messages.PollingForFileTimeOut": "因為逾時,所以無法擷取指令碼狀態。您可以將 'appservicedeploy.retrytimeout' 變數設定為所需的分鐘數來提高逾時限制。", + "loc.messages.InvalidPollOption": "提供的輪詢選項無效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 參數中缺少屬性 '-appType'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask'、'node' 和 'Go'。
假如是 Python Bottle 架構,即為 '-appType python_Bottle' (不含括號)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "偵測不到 DJANGO_SETTINGS_MODULE 'settings.py' 檔案路徑。請確定 'settings.py' 檔案存在,或依下列格式在 Web.config 參數輸入中提供正確的路徑: '-DJANGO_SETTINGS_MODULE <資料夾名稱>.settings'", + "loc.messages.FailedToApplyTransformation": "無法對指定的套件套用轉換。請確認下列事項。", + "loc.messages.FailedToApplyTransformationReason1": "1. 是否已對建置期間由 MSBuild 產生的套件套用轉換。若已套用,請移除 csproj 檔案中每項設定的 標記,然後重建。", + "loc.messages.FailedToApplyTransformationReason2": "2. 確認組態檔與轉換檔皆位於套件內的同一個資料夾中。", + "loc.messages.AutoParameterizationMessage": "根據預設,Web.config 中的 ConnectionString 屬性已經過參數化。請注意,轉換對 connectionString 屬性無效,因為 'Parameters.xml' 或 'SetParameters.xml' 檔案已於部署期間覆寫該值。您可在產生 MSBuild 套件期間設定 /p:AutoParameterizationWebConfigConnectionStrings=False,停用自動參數化。", + "loc.messages.UnsupportedAppType": "產生 Web.config 時不支援應用程式類型 '%s'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask' 與 'node'", + "loc.messages.UnableToFetchAuthorityURL": "無法擷取授權單位 URL。", + "loc.messages.UnableToFetchActiveDirectory": "無法擷取 Active Directory 資源識別碼。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新執行階段堆疊與啟動命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "無法更新執行階段堆疊與啟動命令。錯誤: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新應用程式設定。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "無法更新應用程式設定。錯誤: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "無法擷取 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "無法更新 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "無法擷取 Azure Container Registry 認證。[狀態碼: '%s']", + "loc.messages.UnableToReadResponseBody": "無法讀取回應主體。錯誤: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "無法更新 WebApp 組態詳細資料。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "正在新增 Application Insights 資源 '%s' 的版本註釋", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功將版本註釋新增至 Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "無法新增版本註釋。%s", + "loc.messages.RenameLockedFilesEnabled": "將為 App Service 啟用的已鎖定檔案重新命名。", + "loc.messages.FailedToEnableRenameLockedFiles": "無法允許已鎖定重新命名的檔案。錯誤: %s", + "loc.messages.WebJobsInProgressIssue": "有幾個處於執行狀態的 WebJob 導致部署無法移除檔案。您可以在部署前停用 [移除目的地的其他檔案] 選項或停止連續的作業。", + "loc.messages.FailedToFetchKuduAppSettings": "無法擷取 Kudu 應用程式設定。錯誤: %s", + "loc.messages.FailedToCreatePath": "無法從 Kudu 建立路徑 '%s'。錯誤: %s", + "loc.messages.FailedToDeleteFile": "無法從 Kudu 刪除檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToDeleteFolder": "無法從 Kudu 刪除資料夾 '%s'。錯誤: %s", + "loc.messages.FailedToUploadFile": "無法從 Kudu 上傳檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToGetFileContent": "無法從 Kudu 取得檔案內容 '%s/%s'。錯誤: %s", + "loc.messages.FailedToListPath": "無法從 Kudu 列出路徑 '%s'。錯誤: %s", + "loc.messages.RetryToDeploy": "正在重試部署套件。", + "loc.messages.FailedToGetAppServiceDetails": "無法擷取 App Service '%s' 詳細資料。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "無法擷取 App Service '%s' 發佈設定檔。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "無法更新 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToGetAppServiceMetadata": "無法取得 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "無法修補 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "無法更新 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "無法取得 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "無法擷取 App Service '%s' 發佈認證。錯誤: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "無法取得 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "無法更新 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在嘗試更新 App Service 組態設定。資料: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新 App Service 組態設定。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在嘗試更新 App Service 應用程式設定。資料: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 應用程式設定已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 連接字串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新 App Service 應用程式設定與 Kudu 應用程式設定。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到 App Service '%s' 的多個資源群組。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP Deploy 的套件部署失敗。如需詳細資料,請查看記錄。", + "loc.messages.PackageDeploymentInitiated": "已起始使用 ZIP Deploy 部署套件。", + "loc.messages.WarPackageDeploymentInitiated": "已開始使用 WAR Deploy 部署套件。", + "loc.messages.FailedToGetDeploymentLogs": "無法取得部署記錄。錯誤: %s", + "loc.messages.GoExeNameNotPresent": "沒有 Go 可執行檔的名稱", + "loc.messages.WarDeploymentRetry": "因為 war 檔案稍早未成功展開,所以正在重試其部署。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "請確定電腦目前使用 TLS 1.2 通訊協定或更高的版本。請查看 https://aka.ms/enableTlsv2,以取得如何於您的電腦上啟用 TLS 的詳細資訊。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "無法擷取 Azure 的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "無法擷取受控服務主體的存取權杖。請設定虛擬機器的受控服務識別 (MSI) (https://aka.ms/azure-msi-docs)。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "無法擷取受控服務主體的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.XmlParsingFailed": "無法剖析 publishProfileXML 檔案,錯誤: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 屬性不存在於發佈設定檔中", + "loc.messages.InvalidConnectionType": "服務連線類型無效", + "loc.messages.InvalidImageSourceType": "映像來源類型無效", + "loc.messages.InvalidPublishProfile": "發佈設定檔的檔案無效。", + "loc.messages.ASE_SSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在建置或發行管線中將名為 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的變數設為 true 值", + "loc.messages.ZipDeployLogsURL": "可於 %s 檢視 Zip 部署記錄", + "loc.messages.DeployLogsURL": "在 %s 可檢視部署記錄檔", + "loc.messages.AppServiceApplicationURL": "App Service 應用程式 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在 Web 部署選項的其他引數中傳遞 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "無法取得資源類型 '%s' 和資源名稱 '%s' 的資源識別碼。錯誤: %s", + "loc.messages.JarPathNotPresent": "沒有 Java 的 jar 路徑", + "loc.messages.FailedToUpdateApplicationInsightsResource": "無法更新 Application Insights '%s' 資源。錯誤: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "從 Web Deploy 移至 RunFrom Package 可協助避免 FILE_IN_USE 錯誤。請注意,Run From Package 不支援 msBuild 套件類型。請變更您的套件格式以使用此部署方法。" +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/.npmrc b/Tasks/AzureRmWebAppDeploymentV5/Tests/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..5737c680118f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,69 @@ +import tl = require('azure-pipelines-task-lib'); +import { AzureRmWebAppDeploymentProvider } from '../deploymentProvider/AzureRmWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); + +export class AzureRmWebAppDeploymentProviderL0Tests { + + public static async startAzureRmWebAppDeploymentProviderL0Tests() { + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps(); + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled(); + await AzureRmWebAppDeploymentProviderL0Tests.testForVirtualApplication(); + await AzureRmWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus(); + } + + public static async testForPreDeploymentSteps() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps should succeeded but failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with slot enabled failed with error'); + } + } + + public static async testForVirtualApplication() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + taskParameters.VirtualApplication = "VirtualApplication"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with virtual application should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with virtual application failed with error'); + } + } + + public static async testForUpdateDeploymentStatus() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + await azureRmWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus steps should succeeded but failed with error'); + } + } + +} + +AzureRmWebAppDeploymentProviderL0Tests.startAzureRmWebAppDeploymentProviderL0Tests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..0bf907fcc75e --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts @@ -0,0 +1,41 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class AzureRmWebAppDeploymentProviderTests { + + public static startAzureRmWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'AzureRmWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +AzureRmWebAppDeploymentProviderTests.startAzureRmWebAppDeploymentProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..2029bd44bab3 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,115 @@ +import tl = require('azure-pipelines-task-lib'); +import { BuiltInLinuxWebAppDeploymentProvider } from '../deploymentProvider/BuiltInLinuxWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockLinuxAppSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockLinuxAppSettings(); + +export class BuiltInLinuxWebAppDeploymentProviderL0Tests { + + public static async startBuiltInLinuxWebAppDeploymentProviderL0Tests() { + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage(); + } + + public static async testForPreDeploymentSteps_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for built in linux web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with folder package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with war package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.jar" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with jar package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with jar package should succeeded but failed with error'); + } + } + +} + +BuiltInLinuxWebAppDeploymentProviderL0Tests.startBuiltInLinuxWebAppDeploymentProviderL0Tests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..3995adce9d91 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts @@ -0,0 +1,80 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class BuiltInLinuxWebAppDeploymentProviderTests { + + public static startBuiltInLinuxWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'BuiltInLinuxWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + + +} + +BuiltInLinuxWebAppDeploymentProviderTests.startBuiltInLinuxWebAppDeploymentProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..6cc81a9913d1 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,70 @@ +import tl = require('azure-pipelines-task-lib'); +import { ContainerWebAppDeploymentProvider } from '../deploymentProvider/ContainerWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockContainerDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockContainerDeploySettings(); + +export class ContainerWebAppDeploymentProviderL0Tests { + + public static async startContainerWebAppDeploymentProviderL0Tests() { + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForDeployWebSteps_ContainerWebApp(); + } + + public static async testForPreDeploymentSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for container web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = null; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'Web app Deployment steps for container should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'Deployment web app steps for container failed with error'); + } + } + +} + +ContainerWebAppDeploymentProviderL0Tests.startContainerWebAppDeploymentProviderL0Tests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..fb1d790687ac --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts @@ -0,0 +1,43 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class ContainerWebAppDeploymentProviderTests { + + public static startContainerWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'ContainerWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + tr.setInput("DockerNamespace", "DockerNamespace"); + tr.setInput("DockerRepository", "DockerRepository"); + tr.setInput("DockerImageTag","DockerImageTag"); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + + } + +} + +ContainerWebAppDeploymentProviderTests.startContainerWebAppDeploymentProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts new file mode 100644 index 000000000000..552c63e6d0fe --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts @@ -0,0 +1,177 @@ +import tl = require('azure-pipelines-task-lib'); +import { DeploymentFactory } from '../deploymentProvider/DeploymentFactory'; +import { IWebAppDeploymentProvider } from '../deploymentProvider/IWebAppDeploymentProvider'; +import { TaskParametersUtility, TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +export class DeploymentFactoryL0Tests { + + public static async startDeploymentFactoryL0Tests() { + await DeploymentFactoryL0Tests.testForLinuxWebDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWarDeployProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider() + await DeploymentFactoryL0Tests.testForPublishProfileProvider(); + await DeploymentFactoryL0Tests.testForContainerWebAppDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWebDeployProvider_UserSelected() + } + + public static async testForLinuxWebDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var linuxWebAppDeploymentProvider: IWebAppDeploymentProvider = await new DeploymentFactory(taskParameters).GetDeploymentProvider(); + if(linuxWebAppDeploymentProvider.constructor.name === "BuiltInLinuxWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'LinuxWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed with error.'+error); + } + } + + public static async testForWindowsWebAppRunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.isMSBuildPackage = () :Promise => {return Promise.resolve(false)}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWarDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWarDeployProvider.constructor.name === "WindowsWebAppWarDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWarDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWebDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.webDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWebDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWebDeployProvider.constructor.name === "WindowsWebAppWebDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWebDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.zipDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppRunFromZipProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.runFromZip; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppRunFromZipProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppRunFromZipProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForPublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ConnectionType = "PublishProfile"; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var publishProfileProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(publishProfileProvider.constructor.name === "PublishProfileWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'PublishProfileWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + + public static async testForContainerWebAppDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = true; + taskParameters.isBuiltinLinuxWebApp = false; + taskParameters.isContainerWebApp = true; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var containerWebAppDeploymentProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(containerWebAppDeploymentProvider.constructor.name === "ContainerWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'ContainerWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + +} + +DeploymentFactoryL0Tests.startDeploymentFactoryL0Tests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts new file mode 100644 index 000000000000..6cbde3e31e5a --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts @@ -0,0 +1,19 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class DeploymentFactoryTests { + + public static startDeploymentFactoryTests() { + let tp = path.join(__dirname, 'DeploymentFactoryL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setAgentsData(); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +DeploymentFactoryTests.startDeploymentFactoryTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0.ts new file mode 100644 index 000000000000..b2eb464a706f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0.ts @@ -0,0 +1,236 @@ +import * as path from "path"; +import * as assert from "assert"; +import * as ttm from "azure-pipelines-task-lib/mock-test"; +import tl = require('azure-pipelines-task-lib'); + +var AppServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service.js"); +var KuduServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service-kudu-tests.js"); +var ApplicationInsightsTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-appinsights-tests.js"); +var ResourcesTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-resource-tests.js"); + +const tmpDir = path.join(__dirname, 'temp'); + +describe('AzureRmWebAppDeployment Suite', function() { + this.timeout(60000); + this.beforeAll(done => { + tl.mkdirP(tmpDir); + done(); + }); + this.afterAll(done => { + tl.rmRF(tmpDir); + done(); + }); + + before((done) => { + if(!tl.exist(path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/node_modules'))) { + tl.cp(path.join( __dirname, 'node_modules'), path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests'), '-rf', true); + } + + done(); + }); + + ApplicationInsightsTests.ApplicationInsightsTests(); + AppServiceTests.AzureAppServiceMockTests(); + KuduServiceTests.KuduServiceTests(); + ResourcesTests.ResourcesTests(); + + it('AzureRmWebAppDeploymentV4 DeploymentFactoryTests', (done: MochaDone) => { + let tp = path.join(__dirname,'DeploymentFactoryTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('LinuxWebAppDeploymentProvider should be excepted.'), 'Should have printed: LinuxWebAppDeploymentProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppWarDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppWarDeployProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider should be expected.'); + assert(tr.stdOutContained('PublishProfileWebAppDeploymentProvider should be excepted.'), 'Should have printed: PublishProfileWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('ContainerWebAppDeploymentProvider should be excepted.'), 'Should have printed: ContainerWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppWebDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppWebDeployProvider for user selected should be excepted.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 AzureRmWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'AzureRmWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('PreDeployment steps with slot enabled should succeeded'), 'Should have printed: PreDeployment steps withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('PreDeployment steps with virtual application should succeeded'), 'Should have printed: PreDeployment steps with slot enabled should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 BuiltInLinuxWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'BuiltInLinuxWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess'); + assert(tr.stdOutContained('Skipped updating the SCM value'), 'Should have printed: Skipped updating the SCM value'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with zip package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with folder package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with war package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with war package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with jar package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with jar package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 ContainerWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'ContainerWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for container web app should succeeded'), 'Should have printed: PreDeployment steps for container web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for container web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for container web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'), 'Should have printed: loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceConfigurationSettings'), 'Should have printed: loc_mock_UpdatedAppServiceConfigurationSettings'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('Web app Deployment steps for container should succeeded'), 'Should have printed: Web app Deployment steps for container should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppRunFromZipProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppRunFromZipProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for run from zip should succeeded'), 'Should have printed: PreDeployment steps for run from zip should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for run from zip with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for run from zip with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.') + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'), 'Should have printed: loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with folder package succeeded.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWarDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWarDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for war deploy should succeeded'), 'Should have printed: PreDeployment steps for war deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for war deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for war deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for war deploy steps with war package succeeded'), 'Should have printed: DeployWebAppStep for war deploy steps with war package succeeded.') + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('loc_mock_WarPackageDeploymentInitiated'), 'Should have printed: loc_mock_WarPackageDeploymentInitiated.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppZipDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppZipDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for zip deploy should succeeded'), 'Should have printed: PreDeployment steps for zip deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for zip deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for zip deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with zip package succeeded.') + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with folder package succeeded.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + done(); + } + catch(error) { + done(error); + } + }); + + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWebDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWebDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for web deploy should succeeded'), 'Should have printed: PreDeployment steps for web deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for web deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for web deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 PublishProfileWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'PublishProfileWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for publish profile should succeeded'), 'Should have printed: PreDeployment steps for publish profile should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=SiteUrl'), 'Should have printed: set AppServiceApplicationUrl=SiteUrl'); + assert(tr.stdOutContained('UpdateDeploymentStatus for publish profile steps should succeeded'), 'Should have printed: UpdateDeploymentStatus for publish profile steps should succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'), 'Should have printed: DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 Validate TaskParameters', (done: MochaDone) => { + let tp = path.join(__dirname,'TaskParametersTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'), 'Should have printed: SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + assert(tr.stdOutContained('msbuild package PRESENT'), 'Should have printed: msbuild package PRESENT'); + done(); + } + catch(error) { + console.log(tr.stdout); + console.log(tr.stderr); + done(error); + } + }); + +}); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts new file mode 100644 index 000000000000..1e1459c9eec6 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts @@ -0,0 +1,283 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('GenerateWebConfig','true'); +tr.setInput('WebConfigParameters','-appType node -Handler iisnode -NodeStartFile server.js'); +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "temp_web_package_random_path/web.config": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function() { + console.log('App Service availability check.'); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + } +}); + +tr.registerMock('./ParameterParserUtility', { + parse: function (data) { + return { + "appType": { + "value": "node" + }, + "Handler": { + "value": "iisnode" + }, + "NodeStartFile": { + "value": "server.js" + } + } + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(webConfigPath,options) { + return ""; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts new file mode 100644 index 000000000000..bb1e5decedef --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts @@ -0,0 +1,236 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('ImageSource', "Builtin Image"); +tr.setInput('WebAppKind', "applinux"); +tr.setInput('RuntimeStack', "dummy|version"); +tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function(Url, port) { + console.log("Testing availability of the webApp"); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated web app config details"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getWebAppAppSettings: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var appSettings = { + properties: { + } + }; + return appSettings; + }, + updateWebAppAppSettings: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName){ + console.log("Successfully updated webApp app-settings"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function () { + return false; + }, + canUseWebDeploy: function () { + return false; + }, + findfiles: function () { + return ['linuxPkg']; + }, + isMSDeployPackage: function () { + return false; + } +}); +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts new file mode 100644 index 000000000000..b69c217af9d7 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts @@ -0,0 +1,217 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts new file mode 100644 index 000000000000..3bebf8379159 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts @@ -0,0 +1,230 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = true; + return isParamFilePresent; + } +}); + +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + unzip: zipUtility.unzip, + getArchivedEntries: zipUtility.getArchivedEntries +}); + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts new file mode 100644 index 000000000000..a584aa554afd --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts @@ -0,0 +1,213 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + }, + containsParamFile: function(webAppPackage: string) { + var taskResult = mockTask.execSync("cmd", ['/C',"DefaultWorkingDirectory\\msDeployParam.bat"]); + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js", { + getArchivedEntries: function( webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts new file mode 100644 index 000000000000..fe9247e0807f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts @@ -0,0 +1,237 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock('webdeployment-common/ziputility.js', { + archiveFolder : function() { + console.log('Folder Archiving Successful'); + } +}); + +tr.registerMock('webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts new file mode 100644 index 000000000000..ed36177767db --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "cmd" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Linux" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..8fa7ec87fa34 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts @@ -0,0 +1,185 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + archiveFolder: function() { + return "DefaultWorkingDirectory\\temp_web_package.zip" + }, + getArchivedEntries: function() { + return { + entries: ['Web.config', 'Web.debug.config'] + } + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts new file mode 100644 index 000000000000..826ec50f3335 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "File Path", null, 'myscript.cmd', false, false); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts new file mode 100644 index 000000000000..07b0f60c6d58 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "Inline Script", "run command xyz", null, false, true); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts new file mode 100644 index 000000000000..094f74ff0059 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts @@ -0,0 +1,232 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('RemoveAdditionalFilesFlag', 'true'); +tr.setInput('ExcludeFilesFromAppDataFlag', 'true'); +tr.setInput('TakeAppOfflineFlag', 'false'); +tr.setInput('VirtualApplication', 'virtualApp'); +tr.setInput('AdditionalArguments', 'additionalArguments'); +tr.setInput('WebAppUri', 'someuri'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp/virtualApp\' -skip:Directory=App_Data additionalArguments -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths : function() { + return ["/virtualApp", "/test/path"] + }, + ensurePhysicalPathExists: function() { + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts new file mode 100644 index 000000000000..47fc64f9c0dc --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + return { }; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts new file mode 100644 index 000000000000..cfb4c7d8bb2e --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern": ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg": [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function (webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs: msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath: function () { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if (deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [['Object'], ['Object'], ['Object']], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function (publishingProfile, isDeploymentSuccess, customMessage) { + if (isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings: function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string) { + var appSettings = { + properties: { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings: function () { + return true; + }, + updateAzureRMWebAppConfigDetails: function () { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function () { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function () { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + throw "Random error"; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end": () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function (fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts new file mode 100644 index 000000000000..ad27403c48d7 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: any = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 1, + "stdout": "Failed to Deploy WebSite" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\error.txt": true + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY" : "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT" : "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "release.releaseId": '1', + "release.releaseName": "Release-1", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "DefaultWorkingDirectory\\error.txt": true + } +}; + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + shouldRetryMSDeploy: msDeployUtility.shouldRetryMSDeploy, + redirectMSDeployErrorToConsole : msDeployUtility.redirectMSDeployErrorToConsole, + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + var retryFunction; + return { + "isWriteStreamObj": true, + "on": (name, functionOnFinish) => { retryFunction = functionOnFinish;}, + "end" : () => { + if(retryFunction != null) { + retryFunction(); + } + return true; + } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts new file mode 100644 index 000000000000..3dda39d63518 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts @@ -0,0 +1,167 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'invalidparameterFile.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "invalidparameterFile.xml": { + "isFile" : false + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "osType": { + "osType": "Windows" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "findMatch": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts new file mode 100644 index 000000000000..0e16cec39849 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts @@ -0,0 +1,211 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "msdeploy": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:IisApp=\'webAppPkg\' -dest:iisApp=\'mytestapp\',ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent":{ + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has been triggered"); + }, + "end" : () => { return true; } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + }, + fstat: fs.fstat, + read: fs.read, + open: fs.open, + writeFile: fs.writeFile, + symlink: fs.symlink, + stat: fs.stat +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts new file mode 100644 index 000000000000..c36cdcb27a2b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts @@ -0,0 +1,180 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'C:/pattern/**/*.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "match": { + "C:/pattern/**/*.zip":["webAppPkg1", "webAppPkg2"] + }, + "find" : { + "C:/pattern/":["C:/pattern/webAppPkg.zip", "C:/pattern/webAppPkg1.zip"] + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts new file mode 100644 index 000000000000..bf8eef36d07f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts @@ -0,0 +1,175 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'Invalid_webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "Invalid_webAppPkg": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts new file mode 100644 index 000000000000..92c4fbc4a6e8 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts @@ -0,0 +1,219 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "msdeploy" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Windows" + }, + "rmRF": { + "DefaultWorkingDirectory\\tempSetParameters.xml": { + "success": true + } + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -setParamFile=tempSetParameters.xml -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\tempSetParameters.xml": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts new file mode 100644 index 000000000000..c5ad17b9ec24 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts @@ -0,0 +1,225 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('DeployToSlotFlag', 'true'); +tr.setInput('ResourceGroupName', 'mytestappRg'); +tr.setInput('SlotName', 'testslot'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl-testslot/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp__testslot\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return []; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts new file mode 100644 index 000000000000..c0a9e1693f38 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts @@ -0,0 +1,278 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = 'true'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "msdeploy": "msdeploy", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i verbose": { + "code": 0, + "stdout": "ctt execution successful" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return true; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..b5c7a3c79fac --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts @@ -0,0 +1,227 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = "false"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts new file mode 100644 index 000000000000..95867a366375 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts @@ -0,0 +1,226 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..73aeb2693678 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,56 @@ +import tl = require('azure-pipelines-task-lib'); +import { PublishProfileWebAppDeploymentProvider } from '../deploymentProvider/PublishProfileWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class PublishProfileWebAppDeploymentProviderL0Tests { + + public static async startPublishProfileWebAppDeploymentProviderL0Tests() { + await PublishProfileWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_PublishProfileProvider(); + } + + public static async testForPreDeploymentSteps_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for publish profile should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for publish profile failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.UpdateDeploymentStatus(true); + tl.setResult(tl.TaskResult.Succeeded, 'UpdateDeploymentStatus for publish profile steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for publish profile steps failed with error'); + } + } + + public static async testForDeployWebAppStep_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for publish profile steps steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for publish profile steps steps failed with error'+ error); + } + } + +} + +PublishProfileWebAppDeploymentProviderL0Tests.startPublishProfileWebAppDeploymentProviderL0Tests(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..e0844fd33b28 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts @@ -0,0 +1,63 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument } from './utils'; + +export class PublishProfileWebAppDeploymentProviderTests { + + public static startPublishProfileWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'PublishProfileWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + tr.setInput("ConnectionType", "PublishProfile"); + tr.setInput('PublishProfilePath', 'publishxml.pubxml'); + tr.setInput('PublishProfilePassword', 'password'); + tr.setInput('Package', 'webAppPkg.zip'); + + setEndpointData(); + setAgentsData(); + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu', { + Kudu: function(A, B, C) { + return { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + } + } + }); + + + tr.registerMock('../operations/PublishProfileUtility', { + PublishProfileUtility: function(A) { + return { + GetPropertyValuefromPublishProfile : function(B) { + return "SiteUrl"; + } + } + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +PublishProfileWebAppDeploymentProviderTests.startPublishProfileWebAppDeploymentProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts new file mode 100644 index 000000000000..764e7f213c03 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts @@ -0,0 +1,34 @@ +import tl = require('azure-pipelines-task-lib'); +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; + +function ValidatePostDeploymentInput() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + if (taskParameters.AppSettings.indexOf('-SCM_COMMAND_IDLE_TIMEOUT') != -1) { + tl.setResult(tl.TaskResult.Succeeded, 'SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'SCM_COMMAND_IDLE_TIMEOUT variable NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +async function ValidateMsBuildPackage() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + const isMsBuildType = await taskParameters.Package.isMSBuildPackage(); + if (isMsBuildType) { + tl.setResult(tl.TaskResult.Succeeded, 'msbuild package PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'msbuild package NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +ValidatePostDeploymentInput(); +ValidateMsBuildPackage(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts new file mode 100644 index 000000000000..9fbb4d0d4eab --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setAgentsData, setEndpointData, mockTaskArgument } from './utils'; + +import path = require('path'); +import * as JSZip from "jszip" +import * as uuid from 'uuid'; +import * as fs from 'fs'; + +const tempDir = path.join(__dirname, 'temp'); + +setEndpointData(); + +export class TaskParametersTests { + public static async ValidateLinuxAppTaskParameters() { + let tp = path.join(__dirname, 'TaskParametersLinuxAppL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + const zipFilePath = await TaskParametersTests.createSampleZipFile(tempDir); + + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', zipFilePath); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', zipFilePath); + tr.setInput('ScriptType', 'Inline Script'); + tr.setInput('InlineScript','npm install --production'); + setAgentsData() + + const answers = mockTaskArgument(); + answers.exist[zipFilePath] = true; + answers.stats[zipFilePath] = { "isFile": true }; + answers.checkPath[zipFilePath] = true; + + tr.setAnswers(answers); + tr.run(); + } + + public static async createSampleZipFile(tempDir: string): Promise { + const zip = new JSZip(); + zip.file("index.html", "index"); + zip.file("parameters.xml", "parameters"); + zip.file("systemInfo.xml", "systemInfo"); + zip.file("file:../s.txt", `1\n`); + + const content = await zip.generateAsync({ type: "nodebuffer" }); + const outZipPath = path.join(tempDir, `${uuid.v1()}.zip`); + fs.writeFileSync(outZipPath, content); + return outZipPath; + } +} + +TaskParametersTests.ValidateLinuxAppTaskParameters(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts new file mode 100644 index 000000000000..d723b6482a1c --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net') + .get("/") + .reply(299, {"statusCode":"299", "statusMessage": "Fail"}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts new file mode 100644 index 000000000000..6d56b67d8547 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net/') + .get("/") + .reply(200, {}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts new file mode 100644 index 000000000000..afe94231e8d6 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppRunFromZipProvider } from '../deploymentProvider/WindowsWebAppRunFromZipProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppRunFromZipProviderL0Tests { + + public static async startWindowsWebAppRunFromZipProviderL0Tests() { + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentSteps_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForUpdateDeploymentStatus_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStep_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStepForFolder_RunFromZipProvider(); + } + + public static async testForPreDeploymentSteps_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in run from zip failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for run from zip with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for run from zip steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppRunFromZipProviderL0Tests.startWindowsWebAppRunFromZipProviderL0Tests(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts new file mode 100644 index 000000000000..9f176751a5a1 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts @@ -0,0 +1,82 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppRunFromZipProviderTests { + + public static startWindowsWebAppRunFromZipProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppRunFromZipProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppRunFromZipProviderTests.startWindowsWebAppRunFromZipProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts new file mode 100644 index 000000000000..f6e6f446b222 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts @@ -0,0 +1,78 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWarDeployProvider } from '../deploymentProvider/WindowsWebAppWarDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppWarDeployProviderL0Tests { + + public static async startWindowsWebAppWarDeployProviderL0Tests() { + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentSteps_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForUpdateDeploymentStatus_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForDeployWebAppStep_WarDeployProvider(); + } + + public static async testForPreDeploymentSteps_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for war deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for war deploy steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for war deploy steps with war package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWarDeployProviderL0Tests.startWindowsWebAppWarDeployProviderL0Tests(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts new file mode 100644 index 000000000000..81fd7dcc2b07 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWarDeployProviderTests { + + public static startWindowsWebAppWarDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWarDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWarDeployProviderTests.startWindowsWebAppWarDeployProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts new file mode 100644 index 000000000000..e0a2d5e9062f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts @@ -0,0 +1,89 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWebDeployProvider } from '../deploymentProvider/WindowsWebAppWebDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppWebDeployProviderL0Tests { + + public static async startWindowsWebAppWebDeployProviderL0Tests() { + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentSteps_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForUpdateDeploymentStatus_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStep_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStepForVirtualApplication_WebDeployProvider(); + } + + public static async testForPreDeploymentSteps_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for web deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForVirtualApplication_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + taskParameters.VirtualApplication = "VirtualApplication"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with virtual application with zip package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWebDeployProviderL0Tests.startWindowsWebAppWebDeployProviderL0Tests(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts new file mode 100644 index 000000000000..85f07ba20ebb --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWebDeployProviderTests { + + public static startWindowsWebAppWebDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWebDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + }, + extractZIP: function(J, K){ + + }, + listDir: function(L){ + return "VirtualApplication"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWebDeployProviderTests.startWindowsWebAppWebDeployProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts new file mode 100644 index 000000000000..8061a036fe02 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppZipDeployProvider } from '../deploymentProvider/WindowsWebAppZipDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppZipDeployProviderL0Tests { + + public static async startWindowsWebAppZipDeployProviderL0Tests() { + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentSteps_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForUpdateDeploymentStatus_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStep_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStepForFolder_ZipDeployProvider(); + } + + public static async testForPreDeploymentSteps_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for zip deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppZipDeployProviderL0Tests.startWindowsWebAppZipDeployProviderL0Tests(); \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts new file mode 100644 index 000000000000..4c012622208d --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts @@ -0,0 +1,79 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppZipDeployProviderTests { + + public static startWindowsWebAppZipDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppZipDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppZipDeployProviderTests.startWindowsWebAppZipDeployProviderTests(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts new file mode 100644 index 000000000000..4b4c62c316ff --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts @@ -0,0 +1,310 @@ +export var nock = require('nock'); + +export function mockAzureARMPreDeploymentSteps() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resources?$filter=resourceType%20EQ%20%27Microsoft.Web%2FSites%27%20AND%20name%20EQ%20%27mytestapp%27&api-version=2016-07-01") + .reply(200, { + value: [{ + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/microsoft.web/sites/mytestapp", + name: "MOCK_APP_INSIGHTS_NAME", + type: "microsoft.insights/components", + tags: {}, + properties: {} + }] + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/publishingcredentials/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/publishingcredentials/$mytestapp", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + publishingUserName: "$mytestapp", + publishingPassword: "MOCK_APP_SERVICE_MSDEPLOY_PASSWORD", + scmUri: "https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net" + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/publishxml?api-version=2016-08-01") + .reply(200,` + + + `).persist(); + + nock('https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net', + { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }). + put('/api/deployments/MOCK_DEPLOYMENT_ID').reply(200, { + type: 'Deployment', + url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID' + }); + + // linux built in app + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true, + "virtualApplications": [ {"physicalPath" : "physicalPath", "virtualPath": "/virtualApplication" }] + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).patch("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true + } + }).persist(); +} + +export function mockLinuxAppSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT": "/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); +} + +export function mockRunFromZipSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); +} + +export function mockZipDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); +} + +export function mockContainerDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/package-lock.json b/Tasks/AzureRmWebAppDeploymentV5/Tests/package-lock.json new file mode 100644 index 000000000000..302728831d57 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/package-lock.json @@ -0,0 +1,145 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "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==", + "dev": true + }, + "nock": { + "version": "13.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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==", + "dev": true + }, + "propagate": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + } + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/package.json b/Tasks/AzureRmWebAppDeploymentV5/Tests/package.json new file mode 100644 index 000000000000..756191a90e5b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "azurermappservicedeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/Tests/utils.ts b/Tasks/AzureRmWebAppDeploymentV5/Tests/utils.ts new file mode 100644 index 000000000000..9b1aa18cb2c3 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/Tests/utils.ts @@ -0,0 +1,87 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); + +export function extendObject(output, target) { + output = output || {}; + + if (target) { + for (var key in target) { + if (target.hasOwnProperty(key)) { + output[key] = target[key]; + } + } + } + + return output; +} + +export function setEndpointData() { + process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"MOCK_SPN_ID\",\"serviceprincipalkey\":\"MOCK_SPN_KEY\",\"tenantid\":\"MOCK_TENANT_ID\"},\"scheme\":\"ServicePrincipal\"}"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "MOCK_SPN_ID"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "MOCK_SPN_KEY"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "MOCK_TENANT_ID"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "MOCK_SUBSCRIPTION_NAME"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "MOCK_SUBSCRIPTION_ID"; + process.env["ENDPOINT_URL_AzureRMSpn"] = "https://management.azure.com/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ENVIRONMENTAUTHORITYURL"] = "https://login.windows.net/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ACTIVEDIRECTORYSERVICEENDPOINTRESOURCEID"] = "https://management.azure.com/"; +} + +export function setAgentsData() { + process.env['TASK_TEST_TRACE'] = "1"; + process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; + process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; + process.env["AGENT_NAME"] = "author"; + process.env["AGENT_TEMPDIRECTORY"] = process.cwd(); + process.env["BUILD_BUILDID"] = 'Build.BuildId'; + process.env["USE_MSAL"] = "false"; +} + +export function mockTaskArgument(): ma.TaskLibAnswers{ + // provide answers for task mock + let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "publishxml.pubxml": { + "isFile": true + }, + "webAppPkg": { + "isDirectory": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "publishxml.pubxml": true, + "publishxml": true, + "webAppPkg": true + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "publishxml.pubxml": true, + "publishxml": true + } + } + + return a; +} + +export function mockTaskInputParameters(tr) { + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', 'webAppPkg.zip'); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt b/Tasks/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt new file mode 100644 index 000000000000..23bf6b698d0c --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt @@ -0,0 +1,2248 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Azure App Service Deploy incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. abbrev (https://github.com/isaacs/abbrev-js) +2. Archiver (https://github.com/archiverjs/node-archiver) +3. archiver-utils (https://github.com/archiverjs/archiver-utils) +4. async (https://github.com/caolan/async) +5. balanced-match (https://github.com/juliangruber/balanced-match) +6. binary (https://github.com/substack/node-binary) +7. bl (Buffer List) (https://github.com/rvagg/bl) +8. brace-expansion (https://github.com/juliangruber/brace-expansion) +9. buffer-crc32 (https://github.com/brianloveswords/buffer-crc32) +10. buffers (DefinitelyTyped) (https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/buffers) +11. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +12. buffer-shims (https://github.com/calvinmetcalf/buffer-shims) +13. chainsaw (https://github.com/substack/node-chainsaw) +14. compress-commons (https://github.com/archiverjs/node-compress-commons) +15. concat-map (https://github.com/substack/node-concat-map) +16. core-util-is (https://github.com/isaacs/core-util-is) +17. Crc32-stream (https://github.com/archiverjs/node-crc32-stream) +18. Ctt (https://ctt.codeplex.com) +19. decompress-zip (https://github.com/bower/decompress-zip) +20. end-of-stream (https://github.com/mafintosh/end-of-stream) +21. fs.realpath (https://github.com/isaacs/fs.realpath) +22. Glob (https://github.com/isaacs/node-glob) +23. graceful-fs (https://github.com/isaacs/node-graceful-fs) +24. hoek (https://github.com/hapijs/hoek) +25. inflight (https://github.com/npm/inflight) +26. inherits (https://github.com/isaacs/inherits) +27. isarray (https://github.com/juliangruber/isarray/) +28. isemail (https://github.com/hapijs/isemail) +29. joi (https://github.com/hapijs/joi) +30. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +31. lazystream (https://github.com/jpommerening/node-lazystream) +32. lodash (https://lodash.com/) + Includes:File(s) copyright John Resig (http://ejohn.org/blog/javascript-micro-templating/) + Includes:File(s) copyright Laura Doktorova (https://github.com/olado/doT) +33. lodash.once (https://github.com/lodash/lodash) +34. Ltx (https://github.com/node-xmpp/ltx) +35. minimatch (https://github.com/isaacs/minimatch) +36. mkpath (https://github.com/jrajav/mkpath) +37. Mockery (https://github.com/mfncooper/mockery) +38. Moment (https://github.com/moment/moment) +39. ms (https://github.com/zeit/ms) +40. Node.js (https://nodejs.org/) +41. node-ecdsa-sig-formatter (https://github.com/Brightspace/node-ecdsa-sig-formatter) +42. node-jwa (https://github.com/brianloveswords/node-jwa) +43. node-jws (https://github.com/brianloveswords/node-jws) +44. node-tar (https://github.com/npm/node-tar/) +45. node-uuid (https://github.com/broofa/node-uuid/) +46. nopt (https://github.com/npm/nopt) +47. normalize-path (https://github.com/jonschlinkert/normalize-path) +48. OpenSSL (http://www.openssl.org) +49. once (https://github.com/isaacs/once) +50. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +51. process-nextick-args (https://github.com/calvinmetcalf/process-nextick-args) +52. Q (https://github.com/kriskowal/q) +53. readable-stream (https://github.com/isaacs/readable-stream) +54. safe-buffer (https://github.com/feross/safe-buffer) +55. sax js (https://github.com/isaacs/sax-js) +56. semver (https://github.com/npm/node-semver/) +57. ShellJS (https://github.com/shelljs/shelljs) +58. string_decoder (https://github.com/rvagg/string_decoder) +59. tar-stream (https://github.com/mafintosh/tar-stream) +60. topo (https://github.com/hapijs/topo) +61. touch (https://github.com/isaacs/node-touch) +62. traverse (https://github.com/substack/js-traverse) +63. tunnel (https://github.com/koichik/node-tunnel) +64. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +65. util-deprecate (https://github.com/TooTallNate/util-deprecate) +66. VSTS-task-lib (https://github.com/Microsoft/vsts-task-lib) +67. winreg (https://github.com/fresc81/node-winreg) +68. wrappy (https://github.com/npm/wrappy) +69. Xml2JS (https://github.com/Leonidas-from-XIV/node-xml2js) +70. Xmlbuilder (https://github.com/oozcitak/xmlbuilder-js) +71. xtend (https://github.com/Raynos/xtend) +72. zip-stream (https://github.com/archiverjs/node-zip-stream) +73. uuid (https://github.com/kelektiv/node-uuid) +74. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +75. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +76. @types/mocha (https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% abbrev NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF abbrev NOTICES, INFORMATION, AND LICENSE + +%% Archiver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Archiver NOTICES, INFORMATION, AND LICENSE + +%% archiver-utils NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Chris Talkington. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF archiver-utils NOTICES, INFORMATION, AND LICENSE + +%% async NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2010-2016 Caolan McMahon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF async NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% binary NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF binary NOTICES, INFORMATION, AND LICENSE + +%% bl (Buffer List) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) +Copyright (c) 2014 bl contributors + +bl contributors listed at https://github.com/rvagg/bl#contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF bl (Buffer List) NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-crc32 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License + +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF buffer-crc32 NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE + +%% buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is licensed under the MIT license. + +Copyrights are respective of each contributor listed at the beginning of each definition file. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE + +%% buffer-shims NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2016 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** + +========================================= +END OF buffer-shims NOTICES, INFORMATION, AND LICENSE + +%% chainsaw NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF chainsaw NOTICES, INFORMATION, AND LICENSE + +%% compress-commons NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF compress-commons NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% Crc32-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Crc32-stream NOTICES, INFORMATION, AND LICENSE + +%% Ctt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. +========================================= +END OF Ctt NOTICES, INFORMATION, AND LICENSE + +%% decompress-zip NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Bower Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF decompress-zip NOTICES, INFORMATION, AND LICENSE + +%% end-of-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF end-of-stream NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license, as follows: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% Glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF Glob NOTICES, INFORMATION, AND LICENSE + +%% graceful-fs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF graceful-fs NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% isemail NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES, INFORMATION, AND LICENSE + +%% joi NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES, INFORMATION, AND LICENSE + +%% jsonwebtoken NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES, INFORMATION, AND LICENSE + +%% lazystream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 J. Pommerening, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF lazystream NOTICES, INFORMATION, AND LICENSE + +%% lodash NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +========================================= +// Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/) + +Copyright 2008 John Resig + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +// Based on Laura Doktorova's doT.js (https://github.com/olado/doT). + +Copyright (c) 2011 Laura Doktorova + +Software includes portions from jQote2 Copyright (c) 2010 aefxx, +http://aefxx.com/ licensed under the MIT license. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF lodash NOTICES, INFORMATION, AND LICENSE + +%% lodash.once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES, INFORMATION, AND LICENSE + +%% Ltx NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Stephan Maka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +========================================= +END OF Ltx NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mkpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (C) 2012 Jonathan Rajavuori + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF mkpath NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following +terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +END OF Moment NOTICES, INFORMATION, AND LICENSE + +%% ms NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES, INFORMATION, AND LICENSE + +%% Node.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. +========================================= +END OF Node.js NOTICES, INFORMATION, AND LICENSE + +%% node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% node-jwa NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES, INFORMATION, AND LICENSE + +%% node-jws NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES, INFORMATION, AND LICENSE + +%% node-tar NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License +Copyright (c) Isaac Z. Schlueter and Contributors +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF node-tar NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% nopt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF nopt NOTICES, INFORMATION, AND LICENSE + +%% normalize-path NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014-2015, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF normalize-path NOTICES, INFORMATION, AND LICENSE + +%% OpenSSL NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/) + * + * 4. The names OpenSSL Toolkit and OpenSSL Project must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called OpenSSL + * nor may OpenSSL appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/) + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com) + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * This product includes software written by Tim Hudson (tjh@cryptsoft.com) + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] +========================================= +END OF OpenSSL NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +path-is-absolute + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +node.js: + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% Q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009�2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +The file q.js is prefaced by the following additional third-party subcomponent information: + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +========================================= +END OF Q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + + +%% sax js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax js NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% tar-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tar-stream NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES, INFORMATION, AND LICENSE + +%% touch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF touch NOTICES, INFORMATION, AND LICENSE + +%% traverse NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: +http://www.opensource.org/licenses/mit-license.php + +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF traverse NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% underscore.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore.js NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the Software), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% VSTS-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF VSTS-task-lib NOTICES, INFORMATION, AND LICENSE + +%% winreg NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is released under BSD 2-Clause License. + +Copyright (c) 2016, Paul Bottin All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF winreg NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% Xml2JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF Xml2JS NOTICES, INFORMATION, AND LICENSE + +%% Xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF Xmlbuilder NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES, INFORMATION, AND LICENSE + +%% zip-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF zip-stream NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Includes Chris Veness' SHA1 + +Copyright (c) 2014 Chris Veness + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/.npmrc b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/.npmrc b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..a4a148b61c0b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,168 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "license": "MIT", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/nock": { + "version": "13.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + } + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package.json b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..756191a90e5b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "azurermappservicedeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package-lock.json b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..034d5482d866 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,1438 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } + }, + "node_modules/@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": "sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@types/events": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/events/-/events-3.0.3.tgz", + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==" + }, + "node_modules/@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": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ltx": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/ltx/-/ltx-3.0.6.tgz", + "integrity": "sha512-ZdHUgFEaBVUHI0si050pQkuGzHQC5UU46JsljUUJkGWbsjKeV3RUspJvvdV80Inrnhx8d3JqXw4qCDRX4A/BdA==", + "dependencies": { + "@types/events": "*" + } + }, + "node_modules/@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==" + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.6", + "resolved": "git+ssh://git@github.com/xmldom/xmldom.git#238b1ea8431fae8817812c68d55b4933248af07e", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/archiver": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha512-5GQRAgpHGPwWIiMzL9lthd+t75fLi8BpRBYtflomSYv2i6+EO9trtwWAm2+zGjIuwKmVmBRknAZFFBSqxYxiJw==", + "dependencies": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-utils": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "dependencies": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/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": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/azure-devops-node-api": { + "version": "14.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-14.0.1.tgz", + "integrity": "sha512-oVnFfTNmergd3JU852EpGY64d1nAxW8lCyzZqFDPhfQVZkdApBeK/ZMN7yoFiq/C50Ru304X1L/+BFblh2SRJw==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^2.0.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "4.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.11.0.tgz", + "integrity": "sha512-svPdgXPmX9j5aLcb+ZmddBsKlkK5TJnlFfgPrDlY8EZAmnR9jLOYiHLLyLph3UO6hoHucsiqvIpH1SBFfH1I8w==", + "dependencies": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "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" + } + }, + "node_modules/azure-pipelines-task-lib/node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.251.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.251.0.tgz", + "integrity": "sha1-9989r2zWGXLLREIAQHuYci00+EM=", + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-webdeployment-common": { + "version": "4.243.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-webdeployment-common/-/azure-pipelines-tasks-webdeployment-common-4.243.1.tgz", + "integrity": "sha512-FWjNQDguvLmqfKgCYxcevgvid5RJdv3FrqyrAmMfIe0gLOpyp57yjQ6QCaO5GFc3niWV/MgIxadqlnwrq2haUQ==", + "dependencies": { + "@types/ltx": "3.0.6", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@xmldom/xmldom": "git+https://github.com/xmldom/xmldom.git#0.8.6", + "archiver": "1.2.0", + "azure-pipelines-task-lib": "^4.2.0", + "ltx": "2.8.0", + "node-stream-zip": "^1.15.0", + "q": "1.4.1", + "semver": "^7.5.4", + "winreg": "1.2.2", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/compress-commons": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "dependencies": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/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": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/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==" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc32-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "dependencies": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/deasync": { + "version": "0.1.30", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/deasync/-/deasync-0.1.30.tgz", + "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + }, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/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": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/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": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent/node_modules/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": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/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": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" + }, + "node_modules/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": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/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": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/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": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/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": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/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": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/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": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/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": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/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": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/ltx": { + "version": "2.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-SJJUrmDgXP0gkUzgErfkaeD+pugM8GYxerTALQa1gTUb5W1wrC4k07GZU+QNZd7MpFqJSYWXTQSUy8Ps03hx5Q==", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/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_modules/msalv1": { + "name": "@azure/msal-node", + "version": "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": "sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==", + "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "dependencies": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": "10 || 12 || 14 || 16 || 18" + } + }, + "node_modules/msalv1/node_modules/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": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/msalv2": { + "name": "@azure/msal-node", + "version": "2.10.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.10.0.tgz", + "integrity": "sha512-JxsSE0464a8IA/+q5EHKmchwNyUFJHtCH00tSXsLaOddwLjG6yVvTH6lGgPcWMhO7YWUXj/XVgVgeE9kZtsPUQ==", + "dependencies": { + "@azure/msal-common": "14.13.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/msalv2/node_modules/@azure/msal-common": { + "version": "14.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.13.0.tgz", + "integrity": "sha512-b4M/tqRzJ4jGU91BiwCsLTqChveUEyFK3qY2wGfZ0zBswIBZjAxopx5CYt5wzZFKuN15HqRDYXQbztttuIC3nA==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msalv2/node_modules/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": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "node_modules/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==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/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==", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/nodejs-file-downloader/node_modules/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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==" + }, + "node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "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" + } + }, + "node_modules/readable-stream/node_modules/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==" + }, + "node_modules/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": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/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": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/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": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/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==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/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==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.0.1.tgz", + "integrity": "sha512-LSfgVu+jKUbkceVBGJ6bdIMzzpvjhw6A+aKsVnGa2S7bT82QCALh/RAtq/fdV3aLXxHqsChuClrQ93fXMrIckA==", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/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==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/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==" + }, + "node_modules/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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/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": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/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": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/winreg": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/winreg/-/winreg-1.2.2.tgz", + "integrity": "sha512-I1mQ2HDZbOXm3XctfGPNzm9p/md7FAxHtACVFeBNrnOE4p4b3a0baqNObx1OqHE8DEx25l5CaCDipxFM5FSYOg==" + }, + "node_modules/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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/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": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zip-stream": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "dependencies": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + } + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package.json b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..01e6b8d8e0da --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/_buildConfigs/Node20/package.json @@ -0,0 +1,35 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "AzureRmWebAppDeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts b/Tasks/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts new file mode 100644 index 000000000000..a77a66ee795b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts @@ -0,0 +1,40 @@ +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); +import { TaskParameters, TaskParametersUtility } from './operations/TaskParameters'; +import { DeploymentFactory } from './deploymentProvider/DeploymentFactory'; +import * as Endpoint from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; + +async function main() { + let isDeploymentSuccess: boolean = true; + + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + tl.setResourcePath(path.join( __dirname, 'node_modules/azure-pipelines-tasks-webdeployment-common/module.json')); + var taskParams: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParams); + var deploymentProvider = await deploymentFactory.GetDeploymentProvider(); + + tl.debug("Predeployment Step Started"); + await deploymentProvider.PreDeploymentStep(); + + tl.debug("Deployment Step Started"); + + await deploymentProvider.DeployWebAppStep(); + + } + catch(error) { + tl.debug("Deployment Failed with Error: " + error); + isDeploymentSuccess = false; + tl.setResult(tl.TaskResult.Failed, error); + } + finally { + if(deploymentProvider != null) { + await deploymentProvider.UpdateDeploymentStatus(isDeploymentSuccess); + } + Endpoint.dispose(); + tl.debug(isDeploymentSuccess ? "Deployment Succeded" : "Deployment failed"); + + } +} + +main(); diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..728449091d96 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts @@ -0,0 +1,90 @@ +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { TaskParameters } from '../operations/TaskParameters'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { AzureResourceFilterUtility } from '../operations/AzureResourceFilterUtility'; +import { KuduServiceUtility } from '../operations/KuduServiceUtility'; +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +import { PackageUtility } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { AzureDeployPackageArtifactAlias } from '../operations/Constants'; + +export class AzureRmWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + protected taskParams:TaskParameters; + protected appService: AzureAppService; + protected kuduService: Kudu; + protected appServiceUtility: AzureAppServiceUtility; + protected kuduServiceUtility: KuduServiceUtility; + protected virtualApplicationPath: string = ""; + protected azureEndpoint: AzureEndpoint; + protected activeDeploymentID; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + let packageArtifactAlias = this.taskParams.Package ? PackageUtility.getArtifactAlias(this.taskParams.Package.getPath()) : null; + tl.setVariable(AzureDeployPackageArtifactAlias, packageArtifactAlias); + } + + public async PreDeploymentStep() { + + if (this.taskParams.WebAppKind.includes("functionAppContainer")){ + tl.warning(`Recommendation: Use Azure Functions for container Task to deploy Function app.`); + } + else if (this.taskParams.WebAppKind.includes("functionApp")){ + tl.warning(`Recommendation: Use Azure Functions Task to deploy Function app.`); + } + + this.azureEndpoint = await new AzureRMEndpoint(this.taskParams.connectedServiceName).getEndpoint(); + console.log(tl.loc('GotconnectiondetailsforazureRMWebApp0', this.taskParams.WebAppName)); + if(!this.taskParams.DeployToSlotOrASEFlag) { + this.taskParams.ResourceGroupName = await AzureResourceFilterUtility.getResourceGroupName(this.azureEndpoint, this.taskParams.WebAppName); + } + + this.appService = new AzureAppService(this.azureEndpoint, this.taskParams.ResourceGroupName, this.taskParams.WebAppName, + this.taskParams.SlotName, this.taskParams.WebAppKind); + this.appServiceUtility = new AzureAppServiceUtility(this.appService); + + this.kuduService = await this.appServiceUtility.getKuduService(); + this.kuduServiceUtility = new KuduServiceUtility(this.kuduService); + tl.debug(`Resource Group: ${this.taskParams.ResourceGroupName}`); + } + + public async DeployWebAppStep() {} + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + this.activeDeploymentID = await this.kuduServiceUtility.updateDeploymentStatus(isDeploymentSuccess, null, {'type': 'Deployment', slotName: this.appService.getSlot()}); + tl.debug('Active DeploymentId :'+ this.activeDeploymentID); + } + + if(this.appServiceUtility) { + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + } + + protected async PostDeploymentStep() { + if(this.taskParams.AppSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.AppSettings); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSettings); + } + + if(this.taskParams.ConfigurationSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.ConfigurationSettings); + await this.appServiceUtility.updateConfigurationSettings(customApplicationSettings); + } + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams, this.virtualApplicationPath); + } + + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..2d2371181ca4 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts @@ -0,0 +1,123 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import path = require('path'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentTypeLinux } from '../operations/TaskParameters'; + +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE true'; +const linuxFunctionRuntimeSettingName: string = '-FUNCTIONS_WORKER_RUNTIME '; + +const linuxFunctionRuntimeSettingValue = new Map([ + [ 'DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0', 'dotnet ' ], + [ 'DOCKER|microsoft/azure-functions-node8:2.0', 'node ' ], + [ 'DOCKER|microsoft/azure-functions-python3.6:2.0', 'python '], + [ 'DOTNET|2.2', 'dotnet ' ], + [ 'DOTNET|3.1', 'dotnet ' ], + [ 'JAVA|8', 'java ' ], + [ 'JAVA|11', 'java ' ], + [ 'NODE|8', 'node ' ], + [ 'NODE|10', 'node ' ], + [ 'NODE|12', 'node ' ], + [ 'NODE|14', 'node ' ], + [ 'PYTHON|3.6', 'python '], + [ 'PYTHON|3.7', 'python '], + [ 'PYTHON|3.8', 'python '] +]); + +export class BuiltInLinuxWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let packageType = this.taskParams.Package.getPackageType(); + let deploymentMethodtelemetry = packageType === PackageType.war ? '{"deploymentMethod":"War Deploy"}' : '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug('Performing Linux built-in package deployment'); + var isNewValueUpdated: boolean = false; + + if(this.taskParams.isFunctionApp) { + var linuxFunctionRuntimeSetting = ""; + if(this.taskParams.RuntimeStack){ + linuxFunctionRuntimeSetting = linuxFunctionRuntimeSettingName + linuxFunctionRuntimeSettingValue.get(this.taskParams.RuntimeStack); + } + var linuxFunctionAppSetting = linuxFunctionRuntimeSetting + linuxFunctionStorageSetting; + var customApplicationSetting = ParameterParser.parse(linuxFunctionAppSetting); + isNewValueUpdated = await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + var zipDeploy: boolean = this.taskParams.DeploymentTypeLinux === DeploymentTypeLinux.zipDeploy; + var isClean: boolean = this.taskParams.CleanDeploymentFlag; + if (!zipDeploy && !isClean) { + console.log(tl.loc('OneDeployWithIncrementalDeploymentOption')); + } + + switch(packageType){ + case PackageType.folder: + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + let archivedWebPackage = await zipUtility.archiveFolder(this.taskParams.Package.getPath(), "", tempPackagePath); + tl.debug("Compressed folder into zip " + archivedWebPackage); + await this.InvokeDeploymentMethod(zipDeploy, archivedWebPackage, 'Zip', isClean); + + break; + + case PackageType.zip: + await this.InvokeDeploymentMethod(zipDeploy, this.taskParams.Package.getPath(), 'Zip', isClean); + + break; + + case PackageType.jar: + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ this.taskParams.Package.getPath()); + var folderPath = await webCommonUtility.generateTemporaryFolderForDeployment(false, this.taskParams.Package.getPath(), PackageType.jar); + var output = await webCommonUtility.archiveFolderForDeployment(false, folderPath); + var webPackage = output.webDeployPkg; + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ webPackage); + await this.InvokeDeploymentMethod(zipDeploy, webPackage, 'Jar', isClean); + + break; + + case PackageType.war: + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + break; + + default: + throw new Error(tl.loc('Invalidwebapppackageorfolderpathprovided', this.taskParams.Package.getPath())); + } + + await this.appServiceUtility.updateStartupCommandAndRuntimeStack(this.taskParams.RuntimeStack, this.taskParams.StartupCommand); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + } + + private async InvokeDeploymentMethod(zipDeploy: boolean, packagePath: string, packageType: string, isClean: boolean){ + if (zipDeploy) { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(packagePath, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, true); + } + else { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingOneDeploy(packagePath, isClean, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, packageType, true); + } + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..542ab8d73728 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts @@ -0,0 +1,25 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { ContainerBasedDeploymentUtility } from '../operations/ContainerBasedDeploymentUtility'; +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE false'; + +export class ContainerWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + tl.debug("Performing container based deployment."); + + if(this.taskParams.isFunctionApp) { + var customApplicationSetting = ParameterParser.parse(linuxFunctionStorageSetting); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + let containerDeploymentUtility: ContainerBasedDeploymentUtility = new ContainerBasedDeploymentUtility(this.appService); + await containerDeploymentUtility.deployWebAppImage(this.taskParams); + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams); + } + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts new file mode 100644 index 000000000000..a6cd9ec9f01b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts @@ -0,0 +1,99 @@ +import { TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import * as Constant from '../operations/Constants' +import { PublishProfileWebAppDeploymentProvider } from './PublishProfileWebAppDeploymentProvider'; +import { BuiltInLinuxWebAppDeploymentProvider } from './BuiltInLinuxWebAppDeploymentProvider'; +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { WindowsWebAppWebDeployProvider } from './WindowsWebAppWebDeployProvider'; +import { WindowsWebAppZipDeployProvider } from './WindowsWebAppZipDeployProvider'; +import { WindowsWebAppRunFromZipProvider } from './WindowsWebAppRunFromZipProvider'; +import { ContainerWebAppDeploymentProvider } from './ContainerWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { WindowsWebAppWarDeployProvider } from './WindowsWebAppWarDeployProvider'; + +export class DeploymentFactory { + + private _taskParams: TaskParameters; + + constructor(taskParams: TaskParameters) { + this._taskParams = taskParams; + } + + public async GetDeploymentProvider(): Promise { + switch(this._taskParams.ConnectionType) { + case Constant.ConnectionType.PublishProfile: + return new PublishProfileWebAppDeploymentProvider(this._taskParams); + case Constant.ConnectionType.AzureRM: + if(this._taskParams.isLinuxApp) { + tl.debug("Depolyment started for linux app service"); + return await this._getLinuxDeploymentProvider(); + } if(this._taskParams.isHyperVContainerApp) { + tl.debug("Depolyment started for hyperV container app service"); + return await this._getContainerDeploymentProvider(); + } + else { + tl.debug("Depolyment started for windows app service"); + return await this._getWindowsDeploymentProvider() + } + default: + throw new Error(tl.loc('InvalidConnectionType')); + } + } + + private async _getLinuxDeploymentProvider(): Promise { + if(this._taskParams.isBuiltinLinuxWebApp) { + return new BuiltInLinuxWebAppDeploymentProvider(this._taskParams); + } else if(this._taskParams.isContainerWebApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getContainerDeploymentProvider(): Promise { + if(this._taskParams.isHyperVContainerApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getWindowsDeploymentProvider(): Promise { + tl.debug("Package type of deployment is: "+ this._taskParams.Package.getPackageType()); + switch(this._taskParams.Package.getPackageType()){ + case PackageType.war: + return new WindowsWebAppWarDeployProvider(this._taskParams); + case PackageType.jar: + return new WindowsWebAppZipDeployProvider(this._taskParams); + default: + return await this._getWindowsDeploymentProviderForZipAndFolderPackageType(); + } + } + + private async _getWindowsDeploymentProviderForZipAndFolderPackageType(): Promise { + if(this._taskParams.UseWebDeploy) { + return await this._getUserSelectedDeploymentProviderForWindow(); + } else { + var _isMSBuildPackage = await this._taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage || this._taskParams.VirtualApplication) { + return new WindowsWebAppWebDeployProvider(this._taskParams); + } else if(this._taskParams.ScriptType) { + return new WindowsWebAppZipDeployProvider(this._taskParams); + } else { + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + } + + private async _getUserSelectedDeploymentProviderForWindow(): Promise { + switch(this._taskParams.DeploymentType){ + case DeploymentType.webDeploy: + return new WindowsWebAppWebDeployProvider(this._taskParams); + case DeploymentType.zipDeploy: + return new WindowsWebAppZipDeployProvider(this._taskParams); + case DeploymentType.runFromZip: + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..3ed6e50c86f4 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts @@ -0,0 +1,5 @@ +export interface IWebAppDeploymentProvider{ + PreDeploymentStep(); + DeployWebAppStep(); + UpdateDeploymentStatus(isDeploymentSuccess: boolean); +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..363fc8557366 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts @@ -0,0 +1,143 @@ +import { IWebAppDeploymentProvider } from "./IWebAppDeploymentProvider"; +import { TaskParameters } from "../operations/TaskParameters"; +import { PublishProfileUtility, PublishingProfile } from '../operations/PublishProfileUtility'; +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import * as Constant from '../operations/Constants'; +import tl = require('azure-pipelines-task-lib/task'); +import fs = require('fs'); +import path = require('path'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +const DEFAULT_RETRY_COUNT = 3; + +export class PublishProfileWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + private taskParams: TaskParameters; + private publishProfileUtility: PublishProfileUtility; + private origWebPackage: string; + private modWebPackage: string; + private bakWebPackage: string; + private origEnvPath: string; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + } + + public async PreDeploymentStep() { + this.publishProfileUtility = new PublishProfileUtility(this.taskParams.PublishProfilePath); + try { + var siteUrl = await this.publishProfileUtility.GetPropertyValuefromPublishProfile(Constant.PublishProfileXml.SiteUrlToLaunchAfterPublish); + await AzureAppServiceUtility.pingApplication(siteUrl); + tl.setVariable('AppServiceApplicationUrl', siteUrl); + } + catch (error){ + tl.debug('Unable to ping webapp, Error: ' + error); + } + } + + public async DeployWebAppStep() { + if(!tl.osType().match(/^Win/)){ + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + tl.debug("Performing the deployment of webapp using publish profile."); + + var applyFileTransformFlag = this.taskParams.JSONFiles.length != 0 || this.taskParams.XmlTransformation || this.taskParams.XmlVariableSubstitution; + if(applyFileTransformFlag) { + await this.ApplyFileTransformation(); + } + + var msDeployPublishingProfile: PublishingProfile = await this.publishProfileUtility.GetTaskParametersFromPublishProfileFile(this.taskParams); + var deployCmdFilePath = this.GetDeployCmdFilePath(); + + await this.SetMsdeployEnvPath(); + var cmdArgs:string = this.GetDeployScriptCmdArgs(msDeployPublishingProfile); + + var retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + var retryCount = (retryCountParam && !(isNaN(Number(retryCountParam)))) ? Number(retryCountParam): DEFAULT_RETRY_COUNT; + + try { + while(true) { + try { + retryCount -= 1; + await this.publishProfileUtility.RunCmd(deployCmdFilePath, cmdArgs); + break; + } + catch (error) { + if(retryCount == 0) { + throw error; + } + console.log(error); + console.log(tl.loc('RetryToDeploy')); + } + } + console.log(tl.loc('PackageDeploymentSuccess')); + } + catch (error) { + tl.error(tl.loc('PackageDeploymentFailed')); + tl.debug(JSON.stringify(error)); + msDeployUtility.redirectMSDeployErrorToConsole(); + throw Error(error.message); + } + finally { + this.ResetMsdeployEnvPath(); + if(applyFileTransformFlag) { + this.ResetFileTransformation(); + } + } + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean){ } + + private async SetMsdeployEnvPath() { + var msDeployPath = await msDeployUtility.getMSDeployFullPath(); + var msDeployDirectory = msDeployPath.slice(0, msDeployPath.lastIndexOf('\\') + 1); + this.origEnvPath = process.env.PATH; + process.env.PATH = msDeployDirectory + ";" + process.env.PATH ; + } + + private async ResetMsdeployEnvPath() { + process.env.PATH = this.origEnvPath; + } + + private GetDeployCmdFilePath(): string { + var webPackagePath = this.taskParams.Package.getPath(); + var packageDir = path.dirname(webPackagePath); + return packageUtility.PackageUtility.getPackagePath(packageDir + "\\*.deploy.cmd"); + } + + private GetDeployScriptCmdArgs(msDeployPublishingProfile:any): string { + var deployCmdArgs: string = " /Y /A:basic \"/U:" + msDeployPublishingProfile.UserName + "\" \"\\\"/P:" + msDeployPublishingProfile.UserPWD + + "\\\"\" \"\\\"/M:" + "https://" + msDeployPublishingProfile.PublishUrl + "/msdeploy.axd?site=" + msDeployPublishingProfile.WebAppName + "\\\"\""; + + if(msDeployPublishingProfile.TakeAppOfflineFlag) { + deployCmdArgs += ' -enableRule:AppOffline'; + } + + if(msDeployPublishingProfile.RemoveAdditionalFilesFlag) { + deployCmdArgs += " -enableRule:DoNotDeleteRule"; + } + + if(this.taskParams.AdditionalArguments) { + deployCmdArgs += " " + this.taskParams.AdditionalArguments; + } + + return deployCmdArgs; + } + + private async ApplyFileTransformation() { + this.origWebPackage = packageUtility.PackageUtility.getPackagePath(this.taskParams.Package); + this.modWebPackage = await FileTransformsUtility.applyTransformations(this.origWebPackage, this.taskParams); + this.bakWebPackage = this.origWebPackage + ".bak"; + fs.renameSync(this.origWebPackage, this.bakWebPackage); + fs.renameSync(this.modWebPackage, this.origWebPackage); + } + + private ResetFileTransformation() { + tl.rmRF(this.origWebPackage); + fs.renameSync(this.bakWebPackage, this.origWebPackage); + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts new file mode 100644 index 000000000000..165930ea5baa --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts @@ -0,0 +1,68 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +const oldRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP'; +const runFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE 1'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppRunFromZipProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Run from Package"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.runFromZip) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var addCustomApplicationSetting = ParameterParser.parse(runFromZipAppSetting); + var deleteCustomApplicationSetting = ParameterParser.parse(oldRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(addCustomApplicationSetting, deleteCustomApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + await this.kuduServiceUtility.deployUsingRunFromZip(webPackage, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.taskParams.ScriptType && this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + } + else { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts new file mode 100644 index 000000000000..fba9f86f6519 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts @@ -0,0 +1,36 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + + +export class WindowsWebAppWarDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"War Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + + await this.kuduServiceUtility.warmpUp(); + + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + await this.PostDeploymentStep(); + } + + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts new file mode 100644 index 000000000000..55467fa83d97 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts @@ -0,0 +1,53 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import * as Constant from '../operations/Constants'; +import { WebDeployUtility } from '../operations/WebDeployUtility'; +import { Package } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP -WEBSITE_RUN_FROM_PACKAGE'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export class WindowsWebAppWebDeployProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + var physicalPath: string = Constant.SiteRoot; + var webPackage = this.taskParams.Package.getPath(); + + if(this.taskParams.VirtualApplication) { + physicalPath = await this.appServiceUtility.getPhysicalPath(this.taskParams.VirtualApplication); + await this.kuduServiceUtility.createPathIfRequired(physicalPath); + this.virtualApplicationPath = physicalPath; + } + + webPackage = await FileTransformsUtility.applyTransformations(webPackage, this.taskParams); + this.taskParams.Package = new Package(webPackage); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting) + await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if (deployUtility.canUseWebDeploy(this.taskParams.UseWebDeploy)) { + const webDeployUtility = new WebDeployUtility(this.appServiceUtility); + const deploymentMethodtelemetry = '{"deploymentMethod":"Web Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Performing the deployment of webapp."); + + if (tl.getPlatform() !== tl.Platform.Windows) { + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + await webDeployUtility.publishUsingWebDeploy(this.taskParams); + } + else { + const deploymentMethodtelemetry = '{"deploymentMethod":"Zip API"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp package : "); + await this.kuduServiceUtility.deployWebPackage(webPackage, physicalPath, this.taskParams.VirtualApplication, this.taskParams.TakeAppOfflineFlag); + } + + await this.PostDeploymentStep(); + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts new file mode 100644 index 000000000000..9d3429714c79 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts @@ -0,0 +1,64 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE -WEBSITE_RUN_FROM_ZIP'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppZipDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.zipDeploy) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(webPackage, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/icon.png b/Tasks/AzureRmWebAppDeploymentV5/icon.png new file mode 100644 index 000000000000..9ee7be815737 Binary files /dev/null and b/Tasks/AzureRmWebAppDeploymentV5/icon.png differ diff --git a/Tasks/AzureRmWebAppDeploymentV5/icon.svg b/Tasks/AzureRmWebAppDeploymentV5/icon.svg new file mode 100644 index 000000000000..4b1d57e6a85b --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Tasks/AzureRmWebAppDeploymentV5/make.json b/Tasks/AzureRmWebAppDeploymentV5/make.json new file mode 100644 index 000000000000..541eb613f8ec --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/make.json @@ -0,0 +1,28 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "ctt.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/ctt/1.6/ctt.zip", + "dest": "./" + } + ] + }, + "cp": [ + { + "source": "postDeploymentScript", + "options": "-R" + } + ], + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base", + "node_modules/https-proxy-agent/node_modules/agent-base" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts new file mode 100644 index 000000000000..e9286351c825 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts @@ -0,0 +1,336 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +var parseString = require('xml2js').parseString; +import Q = require('q'); +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { AzureAppServiceUtility as AzureAppServiceUtilityCommon } from 'azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility'; + +//todo replace this class with azure-arm-rest/azureAppServiceUtility +export class AzureAppServiceUtility { + private _appService: AzureAppService; + constructor(appService: AzureAppService) { + this._appService = appService; + } + + public async updateScmTypeAndConfigurationDetails(): Promise { + try { + var configDetails = await this._appService.getConfiguration(); + var scmType: string = configDetails.properties.scmType; + let shouldUpdateMetadata = false; + if (scmType && scmType.toLowerCase() === "none") { + configDetails.properties.scmType = 'VSTSRM'; + tl.debug('updating SCM Type to VSTS-RM'); + await this._appService.updateConfiguration(configDetails); + tl.debug('updated SCM Type to VSTS-RM'); + shouldUpdateMetadata = true; + } + else if (scmType && scmType.toLowerCase() == "vstsrm") { + tl.debug("SCM Type is VSTSRM"); + shouldUpdateMetadata = true; + } + else { + tl.debug(`Skipped updating the SCM value. Value: ${scmType}`); + } + + if (shouldUpdateMetadata) { + tl.debug('Updating metadata with latest pipeline details'); + let newMetadataProperties = this._getNewMetadata(); + let siteMetadata = await this._appService.getMetadata(); + let skipUpdate = true; + for (let property in newMetadataProperties) { + if (siteMetadata.properties[property] !== newMetadataProperties[property]) { + siteMetadata.properties[property] = newMetadataProperties[property]; + skipUpdate = false; + } + } + + if (!skipUpdate) { + await this._appService.patchMetadata(siteMetadata.properties); + tl.debug('Updated metadata with latest pipeline details'); + console.log(tl.loc("SuccessfullyUpdatedAzureRMWebAppConfigDetails")); + } + else { + tl.debug("No changes in metadata properties, skipping update."); + } + } + } + catch (error) { + tl.warning(tl.loc("FailedToUpdateAzureRMWebAppConfigDetails", error)); + } + } + + public async getWebDeployPublishingProfile(): Promise { + var publishingProfile = await this._appService.getPublishingProfileWithSecrets(); + var defer = Q.defer(); + parseString(publishingProfile, (error, result) => { + if(!!error) { + defer.reject(error); + } + var publishProfile = result && result.publishData && result.publishData.publishProfile ? result.publishData.publishProfile : null; + if(publishProfile) { + for (var index in publishProfile) { + if (publishProfile[index].$ && publishProfile[index].$.publishMethod === "MSDeploy") { + defer.resolve(result.publishData.publishProfile[index].$); + } + } + } + + defer.reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + + return defer.promise; + } + + public async getApplicationURL(virtualApplication?: string): Promise { + let webDeployProfile: any = await this.getWebDeployPublishingProfile(); + return await webDeployProfile.destinationAppUrl + ( virtualApplication ? "/" + virtualApplication : "" ); + } + + public async pingApplication(): Promise { + try { + var applicationUrl: string = await this.getApplicationURL(); + + if(!applicationUrl) { + tl.debug("Application Url not found."); + return; + } + await AzureAppServiceUtility.pingApplication(applicationUrl); + } catch(error) { + tl.debug("Unable to ping App Service. Error: ${error}"); + } + } + + public static async pingApplication(applicationUrl: string) { + if(!applicationUrl) { + tl.debug('Application Url empty.'); + return; + } + try { + var webRequest = new webClient.WebRequest(); + webRequest.method = 'GET'; + webRequest.uri = applicationUrl; + let webRequestOptions: webClient.WebRequestOptions = {retriableErrorCodes: [], retriableStatusCodes: [], retryCount: 1, retryIntervalInSeconds: 5, retryRequestTimedout: true}; + var response = await webClient.sendRequest(webRequest, webRequestOptions); + tl.debug(`App Service status Code: '${response.statusCode}'. Status Message: '${response.statusMessage}'`); + } + catch(error) { + tl.debug(`Unable to ping App Service. Error: ${error}`); + } + } + + public async getKuduService(): Promise { + + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.getKuduService(); + + } + + public async isSitePublishingCredentialsEnabled(): Promise { + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.isSitePublishingCredentialsEnabled(); + } + + public async getAuthToken(): Promise { + const token = await this._appService._client.getCredentials().getToken(); + tl.setSecret(token); + return token; + } + + public async getPhysicalPath(virtualApplication: string): Promise { + + if(!virtualApplication) { + return '/site/wwwroot'; + } + + virtualApplication = (virtualApplication.startsWith("/")) ? virtualApplication.substr(1) : virtualApplication; + + var physicalToVirtualPathMap = await this._getPhysicalToVirtualPathMap(virtualApplication); + + if(!physicalToVirtualPathMap) { + throw Error(tl.loc("VirtualApplicationDoesNotExist", virtualApplication)); + } + + tl.debug(`Virtual Application Map: Physical path: '${physicalToVirtualPathMap.physicalPath}'. Virtual path: '${physicalToVirtualPathMap.virtualPath}'.`); + return physicalToVirtualPathMap.physicalPath; + } + + public async updateConfigurationSettings(properties: any) : Promise { + for(var property in properties) { + if(!!properties[property] && properties[property].value !== undefined) { + properties[property] = properties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceConfigurationSettings', JSON.stringify(properties))); + await this._appService.patchConfiguration({'properties': properties}); + console.log(tl.loc('UpdatedAppServiceConfigurationSettings')); + } + + public async updateAndMonitorAppSettings(addProperties: any, deleteProperties?: any): Promise { + for(var property in addProperties) { + if(!!addProperties[property] && addProperties[property].value !== undefined) { + addProperties[property] = addProperties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceApplicationSettings', JSON.stringify(addProperties))); + var isNewValueUpdated: boolean = await this._appService.patchApplicationSettings(addProperties, deleteProperties); + + if(!!isNewValueUpdated) { + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + } + else { + console.log(tl.loc('AppServiceApplicationSettingsAlreadyPresent')); + return isNewValueUpdated; + } + + var kuduService = await this.getKuduService(); + var noOftimesToIterate: number = 12; + tl.debug('retrieving values from Kudu service to check if new values are updated'); + while(noOftimesToIterate > 0) { + var kuduServiceAppSettings = await kuduService.getAppSettings(); + var propertiesChanged: boolean = true; + for(var property in addProperties) { + if(kuduServiceAppSettings[property] != addProperties[property]) { + tl.debug('New properties are not updated in Kudu service :('); + propertiesChanged = false; + break; + } + } + for(var property in deleteProperties) { + if(kuduServiceAppSettings[property]) { + tl.debug('Deleted properties are not reflected in Kudu service :('); + propertiesChanged = false; + break; + } + } + + if(propertiesChanged) { + tl.debug('New properties are updated in Kudu service.'); + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + return isNewValueUpdated; + } + + noOftimesToIterate -= 1; + await webClient.sleepFor(5); + } + + tl.debug('Timing out from app settings check'); + return isNewValueUpdated; + } + + public async enableRenameLockedFiles(): Promise { + try { + var webAppSettings = await this._appService.getApplicationSettings(); + if(webAppSettings && webAppSettings.properties) { + if(webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES !== '1') { + tl.debug(`Rename locked files value found to be ${webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES}. Updating the value to 1`); + await this.updateAndMonitorAppSettings({ 'MSDEPLOY_RENAME_LOCKED_FILES' : '1' }); + console.log(tl.loc('RenameLockedFilesEnabled')); + } + else { + tl.debug('Rename locked files is already enabled in App Service'); + } + } + } + catch(error) { + throw new Error(tl.loc('FailedToEnableRenameLockedFiles', error)); + } + } + + public async updateStartupCommandAndRuntimeStack(runtimeStack: string, startupCommand?: string): Promise { + var configDetails = await this._appService.getConfiguration(); + var appCommandLine: string = configDetails.properties.appCommandLine; + startupCommand = (!!startupCommand) ? startupCommand : appCommandLine; + var linuxFxVersion: string = configDetails.properties.linuxFxVersion; + runtimeStack = (!!runtimeStack) ? runtimeStack : linuxFxVersion; + + if (appCommandLine != startupCommand || runtimeStack != linuxFxVersion) { + await this.updateConfigurationSettings({linuxFxVersion: runtimeStack, appCommandLine: startupCommand}); + } + else { + tl.debug(`Skipped updating the values. linuxFxVersion: ${linuxFxVersion} : appCommandLine: ${appCommandLine}`) + } + } + + private async _getPhysicalToVirtualPathMap(virtualApplication: string): Promise { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = null; + var virtualPath = "/" + virtualApplication; + var appConfigSettings = await this._appService.getConfiguration(); + var virtualApplicationMappings = appConfigSettings.properties && appConfigSettings.properties.virtualApplications; + + if(virtualApplicationMappings) { + for( var mapping of virtualApplicationMappings ) { + if(mapping.virtualPath.toLowerCase() == virtualPath.toLowerCase()) { + physicalPath = mapping.physicalPath; + break; + } + } + } + + return physicalPath ? { + 'virtualPath': virtualPath, + 'physicalPath': physicalPath + }: null; + } + + private _getNewMetadata(): any { + var collectionUri = tl.getVariable("system.teamfoundationCollectionUri"); + var projectId = tl.getVariable("system.teamprojectId"); + var releaseDefinitionId = tl.getVariable("release.definitionId"); + + // Log metadata properties based on whether task is running in build OR release. + + let newProperties = { + VSTSRM_ProjectId: projectId, + VSTSRM_AccountId: tl.getVariable("system.collectionId") + } + + if(!!releaseDefinitionId) { + // Task is running in Release + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + tl.debug("Artifact Source Alias is: "+ artifactAlias); + + let buildDefinitionUrl = ""; + let buildDefintionId = ""; + + if (artifactAlias) { + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + // Get build definition info only when artifact type is build. + if (artifactType && artifactType.toLowerCase() == "build") { + + buildDefintionId = tl.getVariable("build.definitionId"); + let buildProjectId = tl.getVariable("build.projectId") || projectId; + let artifactBuildDefinitionId = tl.getVariable("release.artifacts." + artifactAlias + ".definitionId"); + let artifactBuildProjectId = tl.getVariable("release.artifacts." + artifactAlias + ".projectId"); + + if (artifactBuildDefinitionId && artifactBuildProjectId) { + buildDefintionId = artifactBuildDefinitionId; + buildProjectId = artifactBuildProjectId; + } + + buildDefinitionUrl = collectionUri + buildProjectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + } + } + + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + newProperties["VSTSRM_ReleaseDefinitionId"] = releaseDefinitionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl; + newProperties["VSTSRM_ConfiguredCDEndPoint"] = collectionUri + projectId + "/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?definitionId=" + releaseDefinitionId; + } + else { + // Task is running in Build + let buildDefintionId = tl.getVariable("system.definitionId"); + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + let buildDefinitionUrl = collectionUri + projectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl + newProperties["VSTSRM_ConfiguredCDEndPoint"] = buildDefinitionUrl; + } + + return newProperties; + } + +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts new file mode 100644 index 000000000000..091a77d51a06 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts @@ -0,0 +1,20 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { Resources } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-resource'; + +export class AzureResourceFilterUtility { + public static async getResourceGroupName(endpoint: AzureEndpoint, resourceName: string): Promise { + const azureResources: Resources = new Resources(endpoint); + const resources: Array = await azureResources.getResources('Microsoft.Web/Sites', resourceName); + const resourceGroupIds: string[] = [...new Set(resources.map(r => r.id as string))]; + if(!resourceGroupIds || resourceGroupIds.length == 0) { + throw new Error(tl.loc('ResourceDoesntExist', resourceName)); + } + else if(resourceGroupIds.length > 1) { + throw new Error(tl.loc('MultipleResourceGroupFoundForAppService', resourceName)); + } + else { + return resourceGroupIds[0].split("/")[4]; + } + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/Constants.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/Constants.ts new file mode 100644 index 000000000000..3289e7f10524 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/Constants.ts @@ -0,0 +1,19 @@ +export const ConnectionType = { + PublishProfile: "PublishProfile", + AzureRM: "AzureRM" +} + +export const SiteRoot: string = '/site/wwwroot'; + +export const PublishProfileXml = { + ExcludeApp_Data: "ExcludeApp_Data", + EnableMSDeployAppOffline: "EnableMSDeployAppOffline", + SkipExtraFilesOnServer: "SkipExtraFilesOnServer", + SiteUrlToLaunchAfterPublish: "SiteUrlToLaunchAfterPublish", + MSDeployServiceURL: "MSDeployServiceURL", + DeployIisAppPath: "DeployIisAppPath", + MSDeploy: "MSDeploy", + UserName: "UserName" +} + +export const AzureDeployPackageArtifactAlias = "Azure_App_Service_Deploy_PackageArtifactAlias"; \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts new file mode 100644 index 000000000000..8390173487b8 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts @@ -0,0 +1,226 @@ +import tl = require('azure-pipelines-task-lib/task'); +import url = require('url'); +import util = require('util'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +enum registryTypes { + "AzureContainerRegistry", + "Registry", // TODO: Rename it to DockerHub while supporting all the registry types. Also add all these registry types in Task.json in ImageSource pick list. + "PrivateRegistry" +} + +export class ContainerBasedDeploymentUtility { + private _appService: AzureAppService; + private _appServiceUtility: AzureAppServiceUtility; + + constructor(appService: AzureAppService) { + this._appService = appService; + this._appServiceUtility = new AzureAppServiceUtility(appService); + } + + public async deployWebAppImage(taskParameters: TaskParameters): Promise { + let imageName: string = this._getDockerHubImageName(); + tl.debug("Deploying an image " + imageName + " to the webapp " + this._appService.getName()); + + tl.debug("Updating the webapp configuration."); + await this._updateConfigurationDetails(taskParameters, imageName); + + tl.debug('Updating web app settings'); + await this._updateApplicationSettings(taskParameters, imageName); + } + + private async _updateApplicationSettings(taskParameters: TaskParameters, imageName: string): Promise { + var appSettingsParameters = taskParameters.AppSettings; + appSettingsParameters = appSettingsParameters ? appSettingsParameters.trim() : ""; + appSettingsParameters = await this._getContainerRegistrySettings(imageName, null) + ' ' + appSettingsParameters; + var appSettingsNewProperties = parse(appSettingsParameters); + await this._appServiceUtility.updateAndMonitorAppSettings(appSettingsNewProperties); + } + + private async _updateConfigurationDetails(taskParameters: TaskParameters, imageName: string): Promise { + var startupCommand: string = taskParameters.StartupCommand; + var configSettingsParameters = taskParameters.ConfigurationSettings; + var appSettingsNewProperties = !!configSettingsParameters ? parse(configSettingsParameters.trim()): { }; + if(!!startupCommand) { + appSettingsNewProperties.appCommandLine = { + 'value': startupCommand + } + } + + if (taskParameters.isHyperVContainerApp){ + appSettingsNewProperties.windowsFxVersion = { + 'value': "DOCKER|" + imageName + } + } + else { + appSettingsNewProperties.linuxFxVersion = { + 'value': "DOCKER|" + imageName + } + } + + tl.debug(`CONATINER UPDATE CONFIG VALUES : ${appSettingsNewProperties}`); + await this._appServiceUtility.updateConfigurationSettings(appSettingsNewProperties); + } + + private getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _getAzureContainerImageName(): string { + var registry = tl.getInput('AzureContainerRegistryLoginServer', true) + ".azurecr.io"; + var image = tl.getInput('AzureContainerRegistryImage', true); + var tag = tl.getInput('AzureContainerRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _constructImageName(namespace, repository, tag): string { + var imageName = null; + /* + Special Case : If release definition is not linked to build artifacts + then $(Build.BuildId) variable don't expand in release. So clearing state + of dockerImageTag if $(Build.BuildId) not expanded in value of dockerImageTag. + */ + if(tag && (tag.trim() == "$(Build.BuildId)")) { + tag = null; + } + + if(tag) { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase() + ":" + tag; + } else { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase(); + } + + return imageName.replace(/ /g,""); + } + + private _getPrivateRegistryImageName(): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var loginServer = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'url', true); + + var registry = url.parse(loginServer).hostname; + var image = tl.getInput('PrivateRegistryImage', true); + var tag = tl.getInput('PrivateRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _updateWebAppSettings(appSettingsParameters, webAppSettings): void { + // In case of public repo, clear the connection details of a registry + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', true); + + // Uncomment the below lines while supprting all registry types. + // if(dockerRespositoryAccess === "public") + // { + // deleteRegistryConnectionSettings(webAppSettings); + // } + + var parsedAppSettings = parse(appSettingsParameters); + for (var settingName in parsedAppSettings) { + var setting = settingName.trim(); + var settingVal = parsedAppSettings[settingName].value; + settingVal = settingVal ? settingVal.trim() : ""; + + if(setting) { + webAppSettings["properties"][setting] = settingVal; + } + } + } + + private _getImageName(): string { + var registryType = tl.getInput('ImageSource', true); + var imageName = null; + + switch(registryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + imageName = this._getAzureContainerImageName(); + break; + + case registryTypes[registryTypes.Registry]: + imageName = this._getDockerHubImageName(); + break; + + case registryTypes[registryTypes.PrivateRegistry]: + imageName = this._getPrivateRegistryImageName(); + break; + } + + return imageName; + } + + private async _getContainerRegistrySettings(imageName, endPoint): Promise { + var containerRegistryType: string = 'Registry'; + var containerRegistrySettings: string = "-DOCKER_CUSTOM_IMAGE_NAME " + imageName; + var containerRegistryAuthParamsFormatString: string = "-DOCKER_REGISTRY_SERVER_URL %s -DOCKER_REGISTRY_SERVER_USERNAME %s -DOCKER_REGISTRY_SERVER_PASSWORD %s"; + + switch(containerRegistryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + containerRegistrySettings = await this._getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + + case registryTypes[registryTypes.Registry]: + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', false); + if(dockerRespositoryAccess === "private") + { + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + } + break; + + case registryTypes[registryTypes.PrivateRegistry]: + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + } + + return containerRegistrySettings; + } + + private async _getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString): Promise { + var registryServerName = tl.getInput('AzureContainerRegistryLoginServer', true); + var registryUrl = "https://" + registryServerName + ".azurecr.io"; + tl.debug("Azure Container Registry Url: " + registryUrl); + + var registryName = tl.getInput('AzureContainerRegistry', true); + var resourceGroupName = '';// await azureRESTUtility.getResourceGroupName(endPoint, registryName, "Microsoft.ContainerRegistry/registries"); + tl.debug("Resource group name of a registry: " + resourceGroupName); + + var creds = null //await azureRESTUtility.getAzureContainerRegistryCredentials(endPoint, registryName, resourceGroupName); + tl.debug("Successfully retrieved the registry credentials"); + + var username = creds.username; + var password = creds["passwords"][0].value; + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var username = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'username', true); + var password = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'password', true); + var registryUrl = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'registry', true); + + tl.debug("Docker or Private Container Registry Url: " + registryUrl); + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _deleteRegistryConnectionSettings(webAppSettings): void { + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_URL"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_USERNAME"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_PASSWORD"]; + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts new file mode 100644 index 000000000000..5483a5ca2376 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts @@ -0,0 +1,37 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var fileTransformationsUtility = require('azure-pipelines-tasks-webdeployment-common/fileTransformationsUtility.js'); +var generateWebConfigUtil = require('azure-pipelines-tasks-webdeployment-common/webconfigutil.js'); + +export class FileTransformsUtility { + + private static rootDirectoryPath: string = "D:\\home\\site\\wwwroot"; + public static async applyTransformations(webPackage: string, taskParams: TaskParameters): Promise { + tl.debug("WebConfigParameters is "+ taskParams.WebConfigParameters); + var applyFileTransformFlag = taskParams.JSONFiles.length != 0 || taskParams.XmlTransformation || taskParams.XmlVariableSubstitution; + if (applyFileTransformFlag || taskParams.WebConfigParameters) { + var isFolderBasedDeployment: boolean = tl.stats(webPackage).isDirectory(); + var folderPath = await deployUtility.generateTemporaryFolderForDeployment(isFolderBasedDeployment, webPackage, taskParams.Package.getPackageType()); + if (taskParams.WebConfigParameters) { + tl.debug('parsing web.config parameters'); + var webConfigParameters = parse(taskParams.WebConfigParameters); + generateWebConfigUtil.addWebConfigFile(folderPath, webConfigParameters, this.rootDirectoryPath); + } + + if (applyFileTransformFlag) { + var isMSBuildPackage = !isFolderBasedDeployment && (await deployUtility.isMSDeployPackage(webPackage)); + fileTransformationsUtility.fileTransformations(isFolderBasedDeployment, taskParams.JSONFiles, taskParams.XmlTransformation, taskParams.XmlVariableSubstitution, folderPath, isMSBuildPackage); + } + + var output = await deployUtility.archiveFolderForDeployment(isFolderBasedDeployment, folderPath); + webPackage = output.webDeployPkg; + } + else { + tl.debug('File Tranformation not enabled'); + } + + return webPackage; + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts new file mode 100644 index 000000000000..85bf06da55ba --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts @@ -0,0 +1,576 @@ +import tl = require('azure-pipelines-task-lib/task'); +import Q = require('q'); +import path = require('path'); + +import { DeploymentType, TaskParameters } from './TaskParameters'; + +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { KUDU_DEPLOYMENT_CONSTANTS } from 'azure-pipelines-tasks-azure-arm-rest/constants'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; + +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +const physicalRootPath: string = '/site/wwwroot'; +const deploymentFolder: string = 'site/deployments'; +const manifestFileName: string = 'manifest'; +const VSTS_ZIP_DEPLOY: string = 'VSTS_ZIP_DEPLOY'; +const VSTS_ONE_DEPLOY: string = 'VSTS_ONE_DEPLOY'; +const VSTS_DEPLOY: string = 'VSTS'; + +export class KuduServiceUtility { + private _appServiceKuduService: Kudu; + private _deploymentID: string; + + constructor(kuduService: Kudu) { + this._appServiceKuduService = kuduService; + } + + public async createPathIfRequired(phsyicalPath: string): Promise { + var listDir = await this._appServiceKuduService.listDir(phsyicalPath); + if(listDir == null) { + await this._appServiceKuduService.createPath(phsyicalPath); + } + } + + public async updateDeploymentStatus(taskResult: boolean, DeploymentID: string, customMessage: any): Promise { + try { + let requestBody = this._getUpdateHistoryRequest(taskResult, DeploymentID, customMessage); + return await this._appServiceKuduService.updateDeployment(requestBody); + } + catch(error) { + tl.warning(error); + } + } + + public async runPostDeploymentScript(taskParams: TaskParameters, directoryPath?: string): Promise { + var uniqueID = this.getDeploymentID(); + let vstsPostDeploymentFolderPath: string = path.join(physicalRootPath.substring(1), '..', 'VSTS_PostDeployment_' + uniqueID); + try { + var rootDirectoryPath = directoryPath || physicalRootPath.substring(1); + + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, true); + } + + var scriptFile = this._getPostDeploymentScript(taskParams.ScriptType, taskParams.InlineScript, taskParams.ScriptPath, taskParams.isLinuxApp); + var fileExtension : string = taskParams.isLinuxApp ? '.sh' : '.cmd'; + var mainCmdFilePath = path.join(__dirname, '..', 'postDeploymentScript', 'mainCmdFile' + fileExtension); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'mainCmdFile' + fileExtension, mainCmdFilePath); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'kuduPostDeploymentScript' + fileExtension, scriptFile.filePath); + console.log(tl.loc('ExecuteScriptOnKudu')); + var cmdFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\mainCmdFile' + fileExtension; + var scriprResultPath = '/site/VSTS_PostDeployment_' + uniqueID; + if (taskParams.isLinuxApp){ + cmdFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/mainCmdFile' + fileExtension; + } + await this.runCommand(rootDirectoryPath, cmdFilePath + ' ' + uniqueID, 30, scriprResultPath, 'script_result.txt'); + await this._printPostDeploymentLogs(vstsPostDeploymentFolderPath); + + } + catch(error) { + if(taskParams.UseWebDeploy && taskParams.DeploymentType === DeploymentType.runFromZip) { + var debugMode = tl.getVariable('system.debug'); + if(debugMode && debugMode.toLowerCase() == 'true') { + tl.warning(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + else { + console.log(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + } + throw Error(tl.loc('FailedToRunScriptOnKuduError', error)); + } + finally { + try { + let deleteFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\delete_log_file' + fileExtension; + if(taskParams.isLinuxApp) { + deleteFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/delete_log_file' + fileExtension; + } + + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'delete_log_file' + fileExtension, path.join(__dirname, '..', 'postDeploymentScript', 'deleteLogFile' + fileExtension)); + await this.runCommand(vstsPostDeploymentFolderPath, deleteFilePath); + await this._appServiceKuduService.deleteFolder(vstsPostDeploymentFolderPath); + } + catch(error) { + tl.debug('Unable to delete log files : ' + error); + } + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, false); + } + } + } + + public getDeploymentID(): string { + if(this._deploymentID) { + return this._deploymentID; + } + + var buildUrl = tl.getVariable('build.buildUri'); + var releaseUrl = tl.getVariable('release.releaseUri'); + + var buildId = tl.getVariable('build.buildId'); + var releaseId = tl.getVariable('release.releaseId'); + + var buildNumber = tl.getVariable('build.buildNumber'); + var releaseName = tl.getVariable('release.releaseName'); + + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + + var commitId = tl.getVariable('build.sourceVersion'); + var repoName = tl.getVariable('build.repository.name'); + var repoProvider = tl.getVariable('build.repository.provider'); + + var buildOrReleaseUrl = "" ; + var deploymentID: string = (releaseId ? releaseId : buildId) + Date.now().toString(); + + return deploymentID; + } + + public async deployWebPackage(packagePath: string, physicalPath: string, virtualPath: string, appOffline?: boolean): Promise { + physicalPath = physicalPath ? physicalPath : physicalRootPath; + try { + if(appOffline) { + await this._appOfflineKuduService(physicalPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if(tl.stats(packagePath).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + packagePath = await zipUtility.archiveFolder(packagePath, "", tempPackagePath); + tl.debug("Compressed folder " + packagePath + " into zip : " + packagePath); + } + else if(packagePath.toLowerCase().endsWith('.war')) { + physicalPath = await this._warFileDeployment(packagePath, physicalPath, virtualPath); + } + + await this._appServiceKuduService.extractZIP(packagePath, physicalPath); + if(appOffline) { + await this._appOfflineKuduService(physicalPath, false); + } + + console.log(tl.loc("Successfullydeployedpackageusingkuduserviceat", packagePath, physicalPath)); + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingZipDeploy(packagePath: string, appOffline?: boolean, customMessage?: any, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + let queryParameters: Array = [ + 'isAsync=true', + 'deployer=' + VSTS_ZIP_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.zipDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingOneDeploy(packagePath: string, isClean: boolean, appOffline?: boolean, customMessage?: any, packageType?:string, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiatedWithOneDeploy')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if (!packageType){ + tl.debug('No package type provided. Defaulting to zip package type'); + packageType = PackageType[PackageType.zip]; + } + + let queryParameters: Array = [ + 'async=true', + 'deployer=' + VSTS_ONE_DEPLOY, + 'type=' + packageType, + 'clean=' + isClean + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.oneDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingRunFromZip(packagePath: string, customMessage?: any) : Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'deployer=' + VSTS_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + await this._appServiceKuduService.zipDeploy(packagePath, queryParameters); + + console.log(tl.loc('PackageDeploymentSuccess')); + console.log(tl.loc('RunFromPackageAppsetting')); + + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingWarDeploy(packagePath: string, customMessage?: any, targetFolderName?: any): Promise { + try { + console.log(tl.loc('WarPackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'isAsync=true' + ]; + + if(targetFolderName) { + queryParameters.push('name=' + encodeURIComponent(targetFolderName)); + } + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + let deploymentDetails = await this._appServiceKuduService.warDeploy(packagePath, queryParameters); + await this._processDeploymentResponse(deploymentDetails); + console.log(tl.loc('PackageDeploymentSuccess')); + + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async postZipDeployOperation(oldDeploymentID: string, activeDeploymentID: string): Promise { + try { + tl.debug(`ZIP DEPLOY - Performing post zip-deploy operation: ${oldDeploymentID} => ${activeDeploymentID}`); + let manifestFileContent = await this._appServiceKuduService.getFileContent(`${deploymentFolder}/${oldDeploymentID}`, manifestFileName); + if(!!manifestFileContent) { + let tempManifestFile: string = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), manifestFileName); + tl.writeFile(tempManifestFile, manifestFileContent); + await this._appServiceKuduService.uploadFile(`${deploymentFolder}/${activeDeploymentID}`, manifestFileName, tempManifestFile); + } + tl.debug('ZIP DEPLOY - Performed post-zipdeploy operation.'); + } + catch(error) { + tl.debug(`Failed to execute post zip-deploy operation: ${JSON.stringify(error)}.`); + } + } + + public async warmpUp() { + try { + + tl.debug('warming up Kudu Service'); + await this._appServiceKuduService.getAppSettings(); + tl.debug('warmed up Kudu Service'); + + } + catch(error) { + tl.debug('Failed to warm-up Kudu: ' + error.toString()); + } + } + + private async _processDeploymentResponse(deploymentDetails: any): Promise { + try { + var kuduDeploymentDetails = await this._appServiceKuduService.getDeploymentDetails(deploymentDetails.id); + tl.debug(`logs from kudu deploy: ${kuduDeploymentDetails.log_url}`); + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED || tl.getVariable('system.debug') && tl.getVariable('system.debug').toLowerCase() == 'true') { + await this._printZipDeployLogs(kuduDeploymentDetails.log_url); + } + else { + console.log(tl.loc('DeployLogsURL', kuduDeploymentDetails.log_url)); + } + } + catch(error) { + tl.debug(`Unable to fetch logs for kudu Deploy: ${JSON.stringify(error)}`); + } + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED) { + throw tl.loc('PackageDeploymentUsingZipDeployFailed'); + } + } + + private async _printZipDeployLogs(log_url: string): Promise { + if(!log_url) { + return; + } + + var deploymentLogs = await this._appServiceKuduService.getDeploymentLogs(log_url); + for(var deploymentLog of deploymentLogs) { + console.log(`${deploymentLog.message}`); + + if(deploymentLog.details_url) { + await this._printZipDeployLogs(deploymentLog.details_url); + } + } + } + + private async _printPostDeploymentLogs(physicalPath: string) : Promise { + var stdoutLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stdout.txt'); + var stderrLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stderr.txt'); + var scriptReturnCode = await this._appServiceKuduService.getFileContent(physicalPath, 'script_result.txt'); + + if(scriptReturnCode == null) { + throw new Error('File not found in Kudu Service. ' + 'script_result.txt'); + } + + if(stdoutLog) { + console.log(tl.loc('stdoutFromScript')); + console.log(stdoutLog); + } + if(stderrLog) { + console.log(tl.loc('stderrFromScript')); + if(scriptReturnCode != '0') { + tl.error(stderrLog); + throw Error(tl.loc('ScriptExecutionOnKuduFailed', scriptReturnCode, stderrLog)); + } + else { + console.log(stderrLog); + } + } + } + + private async runCommand(physicalPath: string, command: string, timeOutInMinutes?: number, pollFolderPath?: string, pollFile?: string): Promise { + try { + await this._appServiceKuduService.runCommand(physicalPath, command); + } + catch(error) { + if(!!pollFolderPath && !!pollFile && timeOutInMinutes > 0 && error.toString().indexOf('Request timeout: /api/command') != -1) { + tl.debug('Request timeout occurs. Trying to poll for file: ' + pollFile); + await this._pollForFile(pollFolderPath, pollFile, timeOutInMinutes); + } + else { + if(typeof error.valueOf() == 'string') { + throw error; + } + + throw `${error.statusCode} - ${error.statusMessage}`; + } + } + } + + private _getPostDeploymentScript(scriptType, inlineScript, scriptPath, isLinux): any { + if(scriptType === 'Inline Script') { + tl.debug('creating kuduPostDeploymentScript_local file'); + var scriptFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), isLinux ? 'kuduPostDeploymentScript_local.sh' : 'kuduPostDeploymentScript_local.cmd'); + tl.writeFile(scriptFilePath, inlineScript); + tl.debug('Created temporary script file : ' + scriptFilePath); + return { + "filePath": scriptFilePath, + "isCreated": true + }; + } + if(!tl.exist(scriptPath)) { + throw Error(tl.loc('ScriptFileNotFound', scriptPath)); + } + var scriptExtension = path.extname(scriptPath); + if(isLinux){ + if(scriptExtension != '.sh'){ + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } else { + if(scriptExtension != '.bat' && scriptExtension != '.cmd') { + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } + tl.debug('postDeployment script path to execute : ' + scriptPath); + return { + filePath: scriptPath, + isCreated: false + } + } + + private async _warFileDeployment(packagePath: string, physicalPath: string, virtualPath?: string): Promise { + tl.debug('WAR: webAppPackage = ' + packagePath); + let warFile = path.basename(packagePath.slice(0, packagePath.length - '.war'.length)); + let warExt = packagePath.slice(packagePath.length - '.war'.length) + tl.debug('WAR: warFile = ' + warFile); + warFile = warFile + ((virtualPath) ? "/" + virtualPath : ""); + tl.debug('WAR: warFile = ' + warFile); + physicalPath = physicalPath + "/webapps/" + warFile; + await this.createPathIfRequired(physicalPath); + return physicalPath; + + } + + private async _appOfflineKuduService(physicalPath: string, enableFeature: boolean): Promise { + if(enableFeature) { + tl.debug('Trying to enable app offline mode.'); + var appOfflineFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), 'app_offline_temp.htm'); + tl.writeFile(appOfflineFilePath, '

App Service is offline.

'); + await this._appServiceKuduService.uploadFile(physicalPath, 'app_offline.htm', appOfflineFilePath); + tl.debug('App Offline mode enabled.'); + } + else { + tl.debug('Trying to disable app offline mode.'); + await this._appServiceKuduService.deleteFile(physicalPath, 'app_offline.htm'); + tl.debug('App Offline mode disabled.'); + } + } + + private async _pollForFile(physicalPath: string, fileName: string, timeOutInMinutes: number): Promise { + var attempts: number = 0; + const retryInterval: number = 10; + if(tl.getVariable('appservicedeploy.retrytimeout')) { + timeOutInMinutes = Number(tl.getVariable('appservicedeploy.retrytimeout')); + tl.debug('Retry timeout in minutes provided by user: ' + timeOutInMinutes); + } + + var timeOutInSeconds = timeOutInMinutes * 60; + var noOfRetry = timeOutInSeconds / retryInterval; + + tl.debug(`Polling started for file: ${fileName} with retry count: ${noOfRetry}`); + + while (attempts < noOfRetry) { + attempts += 1; + var fileContent: string = await this._appServiceKuduService.getFileContent(physicalPath, fileName); + if(fileContent == null) { + tl.debug('File: ' + fileName + ' not found. retry after 5 seconds. Attempt: ' + attempts); + await webClient.sleepFor(5); + } + else { + tl.debug('Found file: ' + fileName); + return ; + } + } + + if(attempts == noOfRetry) { + throw new Error(tl.loc('PollingForFileTimeOut')); + } + } + + private _getUpdateHistoryRequest(isDeploymentSuccess: boolean, deploymentID?: string, customMessage?: any): any { + + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + var status = isDeploymentSuccess ? KUDU_DEPLOYMENT_CONSTANTS.SUCCESS : KUDU_DEPLOYMENT_CONSTANTS.FAILED; + var releaseId = tl.getVariable('release.releaseId'); + var releaseName = tl.getVariable('release.releaseName'); + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + let buildId = '', buildNumber = '', buildProject = '', commitId = '', repoProvider = '', repoName = '', branch = '', repositoryUrl = '', author = ''; + + if (releaseId && artifactAlias) { + // Task is running in release determine build information of selected artifact using artifactAlias + author = tl.getVariable('release.requestedfor') || tl.getVariable('agent.name'); + tl.debug(`Artifact Source Alias is: ${artifactAlias}`); + + commitId = tl.getVariable(`release.artifacts.${artifactAlias}.sourceVersion`); + repoProvider = tl.getVariable(`release.artifacts.${artifactAlias}.repository.provider`); + repoName = tl.getVariable(`release.artifacts.${artifactAlias}.repository.name`); + branch = tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranchname`) || tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranch`); + + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + if (artifactType && artifactType.toLowerCase() == "tfvc") { + repositoryUrl = `${collectionUrl}${buildProject}/_versionControl`; + repoProvider = "tfsversioncontrol"; + } + else if(artifactType && artifactType.toLowerCase() == "build") { + buildId = tl.getVariable(`release.artifacts.${artifactAlias}.buildId`); + buildNumber = tl.getVariable(`release.artifacts.${artifactAlias}.buildNumber`); + buildProject = tl.getVariable(`release.artifacts.${artifactAlias}.projectId`); + } + else { + repositoryUrl = tl.getVariable(`release.artifacts.${artifactAlias}.repository.uri`); + } + } + else { + // Task is running in build OR artifact alias not found so use primary artifact variables + author = tl.getVariable('build.requestedfor') || tl.getVariable('agent.name'); + + buildId = tl.getVariable('build.buildId'); + buildNumber = tl.getVariable('build.buildNumber'); + buildProject = teamProject; + + commitId = tl.getVariable('build.sourceVersion'); + repoName = tl.getVariable('build.repository.name'); + repoProvider = tl.getVariable('build.repository.provider'); + repositoryUrl = tl.getVariable("build.repository.uri") || ""; + branch = tl.getVariable("build.sourcebranchname") || tl.getVariable("build.sourcebranch"); + } + + deploymentID = !!deploymentID ? deploymentID : this.getDeploymentID(); + + var message = { + type : "deployment", + commitId : commitId, + buildId : buildId, + releaseId : releaseId, + buildNumber : buildNumber, + releaseName : releaseName, + repoProvider : repoProvider, + repoName : repoName, + collectionUrl : collectionUrl, + teamProject : teamProject, + buildProjectUrl: buildProject ? collectionUrl + buildProject : "", + repositoryUrl: repositoryUrl, + branch: branch, + teamProjectName: tl.getVariable("system.teamproject") + }; + + if(!!customMessage) { + // Append Custom Messages to original message + for(var attribute in customMessage) { + message[attribute] = customMessage[attribute]; + } + + } + var deploymentLogType: string = message['type']; + var active: boolean = false; + if(deploymentLogType.toLowerCase() === "deployment" && isDeploymentSuccess) { + active = true; + } + + return { + id: deploymentID, + active : active, + status : status, + message : JSON.stringify(message), + author : author, + deployer : 'VSTS' + }; + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts new file mode 100644 index 000000000000..147ab48de5e3 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts @@ -0,0 +1,123 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import fs = require('fs'); +import * as Constant from './Constants'; +import path = require('path'); +import Q = require('q'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var parseString = require('xml2js').parseString; +const ERROR_FILE_NAME = "error.txt"; + +export interface PublishingProfile{ + PublishUrl:string; + UserName: string; + UserPWD: string; + WebAppName: string; + TakeAppOfflineFlag: boolean; + RemoveAdditionalFilesFlag: boolean; +} + +export class PublishProfileUtility { + + private _publishProfileJs: any = null; + private _publishProfilePath: string; + + constructor(publishProfilePath: string) { + this._publishProfilePath = publishProfilePath; + } + + public async GetTaskParametersFromPublishProfileFile(taskParams: TaskParameters): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + var msDeployPublishingProfile: PublishingProfile = { + WebAppName: this._publishProfileJs.DeployIisAppPath[0], + TakeAppOfflineFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.EnableMSDeployAppOffline) ? + this._publishProfileJs.EnableMSDeployAppOffline[0] : false, + RemoveAdditionalFilesFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.SkipExtraFilesOnServer) ? + this._publishProfileJs.SkipExtraFilesOnServer[0] : false, + PublishUrl: this._publishProfileJs.MSDeployServiceURL[0], + UserName: this._publishProfileJs.UserName[0], + UserPWD: taskParams.PublishProfilePassword + } + return msDeployPublishingProfile; + } + + public async GetPropertyValuefromPublishProfile(propertyKey: string): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + return new Promise ((response, reject) => { + this._publishProfileJs.hasOwnProperty(propertyKey) ? + response(this._publishProfileJs[propertyKey][0]) : reject(tl.loc('PropertyDoesntExistPublishProfile', propertyKey)); + }); + } + + private async GetPublishProfileJsonFromFile(): Promise { + return new Promise((response, reject) => { + var pubxmlFile = packageUtility.PackageUtility.getPackagePath(this._publishProfilePath); + var publishProfileXML = fs.readFileSync(pubxmlFile); + parseString(publishProfileXML, (error, result) => { + if(!!error) { + reject(tl.loc('XmlParsingFailed', error)); + } + var propertyGroup = result && result.Project && result.Project.PropertyGroup ? result.Project.PropertyGroup : null; + if(propertyGroup) { + for (var index in propertyGroup) { + if (propertyGroup[index] && propertyGroup[index].WebPublishMethod[0] === Constant.PublishProfileXml.MSDeploy) { + if(!propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.MSDeployServiceURL) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.DeployIisAppPath) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.UserName)) { + reject(tl.loc('InvalidPublishProfile')); + } + tl.debug("Publish Profile: " + JSON.stringify(propertyGroup[index])); + response(propertyGroup[index]); + } + } + } + reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + }); + } + + public async RunCmd(cmdTool: string, cmdArgs: string) { + var deferred = Q.defer(); + var cmdError = null; + var errorFile = path.join(tl.getVariable('System.DefaultWorkingDirectory'), ERROR_FILE_NAME); + var errObj = fs.createWriteStream(errorFile); + errObj.on('finish', () => { + if(cmdError) { + deferred.reject(cmdError); + } else { + deferred.resolve(); + } + }); + + try { + await tl.exec(cmdTool, cmdArgs, { + errStream: errObj, + outStream: process.stdout, + failOnStdErr: true, + windowsVerbatimArguments: true, + // shell should be true, otherwise see https://github.com/microsoft/azure-pipelines-tasks/issues/17634 + // workaround https://github.com/nodejs/node/issues/7367#issuecomment-229728704 + shell: true + }); + } catch (error) { + cmdError = error; + } finally { + errObj.end(); + } + + return deferred.promise; + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts new file mode 100644 index 000000000000..1ed0aef6bcaf --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts @@ -0,0 +1,93 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { AzureApplicationInsights, ApplicationInsightsResources} from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-appinsights'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +var uuidV4 = require("uuid/v4"); + +export async function addReleaseAnnotation(endpoint: AzureEndpoint, azureAppService: AzureAppService, isDeploymentSuccess: boolean): Promise { + try { + var appSettings = await azureAppService.getApplicationSettings(); + var instrumentationKey = appSettings && appSettings.properties && appSettings.properties.APPINSIGHTS_INSTRUMENTATIONKEY; + if(instrumentationKey) { + let appinsightsResources: ApplicationInsightsResources = new ApplicationInsightsResources(endpoint); + var appInsightsResources = await appinsightsResources.list(null, [`$filter=InstrumentationKey eq '${instrumentationKey}'`]); + if(appInsightsResources.length > 0) { + var appInsights: AzureApplicationInsights = new AzureApplicationInsights(endpoint, appInsightsResources[0].id.split('/')[4], appInsightsResources[0].name); + var releaseAnnotationData = getReleaseAnnotation(isDeploymentSuccess); + await appInsights.addReleaseAnnotation(releaseAnnotationData); + console.log(tl.loc("SuccessfullyAddedReleaseAnnotation", appInsightsResources[0].name)); + } + else { + tl.debug(`Unable to find Application Insights resource with Instrumentation key ${instrumentationKey}. Skipping adding release annotation.`); + } + } + else { + tl.debug(`Application Insights is not configured for the App Service. Skipping adding release annotation.`); + } + } + catch(error) { + console.log(tl.loc("FailedAddingReleaseAnnotation", error)); + } +} + +function getReleaseAnnotation(isDeploymentSuccess: boolean): {[key: string]: any} { + let annotationName = "Release Annotation"; + let releaseUri = tl.getVariable("Release.ReleaseUri"); + let buildUri = tl.getVariable("Build.BuildUri"); + + if (!!releaseUri) { + annotationName = `${tl.getVariable("Release.DefinitionName")} - ${tl.getVariable("Release.ReleaseName")}`; + } + else if (!!buildUri) { + annotationName = `${tl.getVariable("Build.DefinitionName")} - ${tl.getVariable("Build.BuildNumber")}`; + } + + let releaseAnnotationProperties = { + "Label": isDeploymentSuccess ? "Success" : "Error", // Label decides the icon for release annotation + "Deployment Uri": getDeploymentUri(), + "BuildNumber": getPipelineVariable("Build.BuildNumber"), + "BuildRepositoryName": getPipelineVariable("Build.Repository.Name"), + "BuildRepositoryProvider": getPipelineVariable("Build.Repository.Provider"), + "SourceBranch": getPipelineVariable("Build.SourceBranch"), + "ReleaseId": getPipelineVariable("Release.ReleaseId"), + "ReleaseDescription": getPipelineVariable("Release.ReleaseDescription"), + "ReleaseDefinitionName": getPipelineVariable("Release.DefinitionName"), + "ReleaseEnvironmentName": getPipelineVariable("Release.EnvironmentName"), + "ReleaseRequestedFor": getPipelineVariable("Release.RequestedForId") || getPipelineVariable("Release.RequestedFor") + }; + + let releaseAnnotation = { + "AnnotationName": annotationName, + "Category": "Deployment", + "EventTime": new Date(), + "Id": uuidV4(), + "Properties": JSON.stringify(releaseAnnotationProperties) + }; + + return releaseAnnotation; +} + +function getDeploymentUri(): string { + let buildUri = tl.getVariable("Build.BuildUri"); + let releaseWebUrl = tl.getVariable("Release.ReleaseWebUrl"); + let collectionUrl = tl.getVariable('System.TeamFoundationCollectionUri'); + let teamProject = tl.getVariable('System.TeamProjectId'); + let buildId = tl.getVariable('build.buildId'); + + if (!!releaseWebUrl) { + return releaseWebUrl; + } + + if (!!buildUri) { + return `${collectionUrl}${teamProject}/_build?buildId=${buildId}&_a=summary`; + } + + return ""; +} + +function getPipelineVariable(variableName: string): string | undefined { + let variable = tl.getVariable(variableName); + //we dont want to set a variable to be empty string + return !!variable ? variable : undefined; +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts new file mode 100644 index 000000000000..a0efa0c2f176 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts @@ -0,0 +1,313 @@ +import tl = require('azure-pipelines-task-lib/task'); +import * as Constant from '../operations/Constants' +import { Package, PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export enum DeploymentType { + webDeploy, + zipDeploy, + runFromZip, + warDeploy +} + +export enum DeploymentTypeLinux { + oneDeploy, + zipDeploy +} + +type AdditionalArgumentsTelemetry = { + deploymentMethod: DeploymentType; + doubleQuoteCount: number; + singleQuoteCount: number; + escapeCharCount: number; + spaceCharCount: number; + totalArgs: number; +} +export class TaskParametersUtility { + public static getParameters(): TaskParameters { + var taskParameters: TaskParameters = { + ConnectionType: tl.getInput('ConnectionType', true), + WebAppKind: tl.getInput('WebAppKind', false), + DeployToSlotOrASEFlag: tl.getBoolInput('DeployToSlotOrASEFlag', false), + GenerateWebConfig: tl.getBoolInput('GenerateWebConfig', false), + WebConfigParameters: tl.getInput('WebConfigParameters', false), + XmlTransformation: tl.getBoolInput('XmlTransformation', false), + JSONFiles: tl.getDelimitedInput('JSONFiles', '\n', false), + XmlVariableSubstitution: tl.getBoolInput('XmlVariableSubstitution', false), + TakeAppOfflineFlag: tl.getBoolInput('TakeAppOfflineFlag', false), + RenameFilesFlag: tl.getBoolInput('RenameFilesFlag', false), + AdditionalArguments: tl.getInput('AdditionalArguments', false), + ScriptType: tl.getInput('ScriptType', false), + InlineScript: tl.getInput('InlineScript', false), + ScriptPath : tl.getPathInput('ScriptPath', false), + DockerNamespace: tl.getInput('DockerNamespace', false), + AppSettings: tl.getInput('AppSettings', false), + StartupCommand: tl.getInput('StartupCommand', false), + ConfigurationSettings: tl.getInput('ConfigurationSettings', false) + } + + if(taskParameters.ConnectionType === Constant.ConnectionType.PublishProfile) { + this._initializeDefaultParametersForPublishProfile(taskParameters); + return taskParameters; + } + + taskParameters.connectedServiceName = tl.getInput('ConnectedServiceName', true); + taskParameters.WebAppName = tl.getInput('WebAppName', true); + taskParameters.isFunctionApp = taskParameters.WebAppKind.indexOf("function") != -1; + taskParameters.isLinuxApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.indexOf("Linux") !=-1 || taskParameters.WebAppKind.indexOf("Container") != -1); + taskParameters.isHyperVContainerApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.toLowerCase().indexOf("hyperv") !=-1 && taskParameters.WebAppKind.toLowerCase().indexOf("container") != -1); + taskParameters.isBuiltinLinuxWebApp = taskParameters.WebAppKind.indexOf('Linux') != -1; + taskParameters.isContainerWebApp =taskParameters.WebAppKind.indexOf('Container') != -1; + taskParameters.ResourceGroupName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('ResourceGroupName', false) : null; + taskParameters.SlotName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('SlotName', false) : null; + + var endpointTelemetry = '{"endpointId":"' + taskParameters.connectedServiceName + '"}'; + console.log("##vso[telemetry.publish area=TaskEndpointId;feature=AzureRmWebAppDeployment]" + endpointTelemetry); + + if(!taskParameters.isContainerWebApp){ + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + tl.debug("intially web config parameters :" + taskParameters.WebConfigParameters); + if(taskParameters.Package.getPackageType() === PackageType.jar && (!taskParameters.isLinuxApp)) { + if(!taskParameters.WebConfigParameters) { + taskParameters.WebConfigParameters = "-appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-appType java_springboot") < 0) { + taskParameters.WebConfigParameters += " -appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH D:\\home\\site\\wwwroot\\*.jar") >= 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("D:\\home\\site\\wwwroot\\*.jar", jarPath); + } else if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH ") < 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters += " -JAR_PATH " + jarPath; + } + if(taskParameters.WebConfigParameters.indexOf("-Dserver.port=%HTTP_PLATFORM_PORT%") > 0) { + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("-Dserver.port=%HTTP_PLATFORM_PORT%", ""); + } + tl.debug("web config parameters :" + taskParameters.WebConfigParameters); + } + } + + taskParameters.UseWebDeploy = !taskParameters.isLinuxApp ? tl.getBoolInput('UseWebDeploy', false) : false; + + if(taskParameters.isLinuxApp && taskParameters.isBuiltinLinuxWebApp) { + if(taskParameters.isFunctionApp) { + taskParameters.RuntimeStack = tl.getInput('RuntimeStackFunction', false); + } + else { + taskParameters.RuntimeStack = tl.getInput('RuntimeStack', false); + } + taskParameters.TakeAppOfflineFlag = false; + } + if (!taskParameters.isFunctionApp && !taskParameters.isLinuxApp) { + taskParameters.VirtualApplication = tl.getInput('VirtualApplication', false); + taskParameters.VirtualApplication = taskParameters.VirtualApplication && taskParameters.VirtualApplication.startsWith('/') + ? taskParameters.VirtualApplication.substr(1) : taskParameters.VirtualApplication; + } + + if(taskParameters.UseWebDeploy) { + taskParameters.DeploymentType = this.getDeploymentType(tl.getInput('DeploymentType', false)); + if(taskParameters.DeploymentType == DeploymentType.webDeploy) { + taskParameters.RemoveAdditionalFilesFlag = tl.getBoolInput('RemoveAdditionalFilesFlag', false); + taskParameters.SetParametersFile = tl.getPathInput('SetParametersFile', false); + taskParameters.ExcludeFilesFromAppDataFlag = tl.getBoolInput('ExcludeFilesFromAppDataFlag', false) + taskParameters.AdditionalArguments = tl.getInput('AdditionalArguments', false) || ''; + } + } + else if(taskParameters.isLinuxApp) { + taskParameters.DeploymentTypeLinux = this.getDeploymentTypeLinux(tl.getInput('DeploymentTypeLinux', false)); + taskParameters.CleanDeploymentFlag = tl.getBoolInput('CleanDeploymentFlag', false); + } + else { + // Retry Attempt is passed by default + taskParameters.AdditionalArguments = '-retryAttempts:6 -retryInterval:10000'; + } + if (taskParameters.DeploymentType === DeploymentType.runFromZip) { + taskParameters.TakeAppOfflineFlag = false; + } + + if(taskParameters.isLinuxApp && taskParameters.ScriptType) { + this.UpdateLinuxAppTypeScriptParameters(taskParameters); + } + + try { + var additionalArgsTelemetry = this._getAdditionalArgumentsTelemetry(taskParameters.AdditionalArguments, taskParameters.DeploymentType); + console.log("##vso[telemetry.publish area=AdditionalArgumentsVerification;feature=AzureRmWebAppDeployment]" + JSON.stringify(additionalArgsTelemetry)); + } catch (error) { + // Ignore errors in telemetry + }; + + return taskParameters; + } + + private static _initializeDefaultParametersForPublishProfile(taskParameters: TaskParameters): void { + taskParameters.PublishProfilePath = tl.getInput('PublishProfilePath', true); + taskParameters.PublishProfilePassword = tl.getInput('PublishProfilePassword', true); + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + taskParameters.AdditionalArguments = "-retryAttempts:6 -retryInterval:10000"; + } + + private static UpdateLinuxAppTypeScriptParameters(taskParameters: TaskParameters) { + let retryTimeoutValue = tl.getVariable('appservicedeploy.retrytimeout'); + let timeoutAppSettings = retryTimeoutValue ? Number(retryTimeoutValue) * 60 : 1800; + + tl.debug(`setting app setting SCM_COMMAND_IDLE_TIMEOUT to ${timeoutAppSettings}`); + if(taskParameters.AppSettings) { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings} ` + taskParameters.AppSettings; + } + else { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings}`; + } + } + + private static getDeploymentType(type): DeploymentType { + switch(type) { + case "webDeploy": return DeploymentType.webDeploy; + case "zipDeploy": return DeploymentType.zipDeploy; + case "runFromZip": return DeploymentType.runFromZip; + case "warDeploy": return DeploymentType.warDeploy; + } + } + + private static getDeploymentTypeLinux(type): DeploymentTypeLinux { + switch(type) { + case "oneDeploy": return DeploymentTypeLinux.oneDeploy; + case "zipDeploy": return DeploymentTypeLinux.zipDeploy; + } + } + + private static _getAdditionalArgumentsTelemetry(additionalArguments: string, deploymentType: DeploymentType): AdditionalArgumentsTelemetry { + const telemetry = { + deploymentMethod: deploymentType, + doubleQuoteCount: 0, + singleQuoteCount: 0, + escapeCharCount: 0, + spaceCharCount: 0, + totalArgs: 0 + } + + if (!additionalArguments) return telemetry; + + const parsedArgs = this.parseAdditionalArguments(additionalArguments); + const escapedChars = new RegExp(/[\\\^\.\*\?\-\&\|\(\)\<\>\t\n\r\f]/); + const separator = ","; + + parsedArgs.forEach(function (arg) { + let formattedArg = ''; + let equalsSignEncountered = false; + for (let i = 0; i < arg.length; i++) { + const char = arg.charAt(i); + if (char == separator && equalsSignEncountered) { + equalsSignEncountered = false; + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + telemetry.totalArgs++; + formattedArg = ''; + continue; + } + if (equalsSignEncountered) { + formattedArg += char; + } + if (char == '=') { + equalsSignEncountered = true; + } + }; + + if (formattedArg.length > 0) { + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + + telemetry.totalArgs++;; + } + }); + + return telemetry; + } + + /** + * Parses additional arguments for the msdeploy command-line utility. + * @param {string} additionalArguments - The additional arguments to parse. + * @returns {string[]} An array of parsed arguments. + */ + private static parseAdditionalArguments(additionalArguments: string): string[] { + var parsedArgs = []; + var isInsideQuotes = false; + for (let i = 0; i < additionalArguments.length; i++) { + var arg = ''; + var qouteSymbol = ''; + let char = additionalArguments.charAt(i); + // command parse start + if (char === '-') { + while (i < additionalArguments.length) { + char = additionalArguments.charAt(i); + const prevSym = additionalArguments.charAt(i - 1); + // If we reach space and we are not inside quotes, then it is the end of the argument + if (char === ' ' && !isInsideQuotes) break; + // If we reach unescaped comma and we inside qoutes we assume that it is the end of quoted line + if (isInsideQuotes && char === qouteSymbol && prevSym !== '\\') { + isInsideQuotes = false; + qouteSymbol = ''; + // If we reach unescaped comma and we are not inside qoutes we assume that it is the beggining of quoted line + } else if (!isInsideQuotes && (char === '"' || char === "'") && prevSym !== '\\') { + isInsideQuotes = !isInsideQuotes; + qouteSymbol = char; + } + + arg += char; + i += 1; + } + parsedArgs.push(arg); + } + } + return parsedArgs; + } +} + +export interface TaskParameters { + ConnectionType: string; + connectedServiceName?: string; + PublishProfilePath?: string; + PublishProfilePassword?: string; + WebAppName?: string; + WebAppKind?: string; + DeployToSlotOrASEFlag?: boolean; + ResourceGroupName?: string; + SlotName?: string; + VirtualApplication?: string; + Package?: Package; + GenerateWebConfig?: boolean; + WebConfigParameters?: string; + XmlTransformation?: boolean; + JSONFiles?: string[]; + XmlVariableSubstitution?: boolean; + UseWebDeploy?: boolean; + DeploymentType?: DeploymentType; + DeploymentTypeLinux?: DeploymentTypeLinux; + CleanDeploymentFlag?: boolean; + RemoveAdditionalFilesFlag?: boolean; + SetParametersFile?: string; + ExcludeFilesFromAppDataFlag?: boolean; + TakeAppOfflineFlag?: boolean; + RenameFilesFlag?: boolean; + AdditionalArguments?: string; + ScriptType?: string; + InlineScript?: string; + ScriptPath ?: string; + DockerNamespace?: string; + AppSettings?: string; + StartupCommand?: string; + RuntimeStack?: string; + ConfigurationSettings?: string; + /** Additional parameters */ + isLinuxApp?: boolean; + isHyperVContainerApp?: boolean; + isBuiltinLinuxWebApp?: boolean; + isContainerWebApp?: boolean; + isFunctionApp?: boolean; +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts b/Tasks/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts new file mode 100644 index 000000000000..00dcbff4683c --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts @@ -0,0 +1,135 @@ +import tl = require('azure-pipelines-task-lib/task'); + +import { WebDeployArguments, WebDeployResult, shouldUseMSDeployTokenAuth, installedMSDeployVersionSupportsTokenAuth } from 'azure-pipelines-tasks-webdeployment-common/msdeployutility'; +import { executeWebDeploy } from 'azure-pipelines-tasks-webdeployment-common/deployusingmsdeploy'; +import { copySetParamFileIfItExists } from 'azure-pipelines-tasks-webdeployment-common/utility'; + +import { TaskParameters } from './TaskParameters'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +const DEFAULT_RETRY_COUNT = 3; + +export class WebDeployUtility { + + private readonly _azureAppServiceUtility: AzureAppServiceUtility; + + constructor(azureAppServiceUtility: AzureAppServiceUtility) { + this._azureAppServiceUtility = azureAppServiceUtility; + } + + public async publishUsingWebDeploy(taskParameters: TaskParameters) { + const webDeployArguments = await this.constructWebDeployArguments(taskParameters); + const retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + let retryCount = (retryCountParam && !isNaN(Number(retryCountParam))) ? Number(retryCountParam) : DEFAULT_RETRY_COUNT; + let webDeployResult: WebDeployResult; + + while (retryCount > 0) { + webDeployResult = await executeWebDeploy(webDeployArguments); + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, false); + } + else { + break; + } + + retryCount--; + } + + if (webDeployArguments.setParametersFile) { + try { + tl.rmRF(webDeployArguments.setParametersFile); + } + catch(error) { + tl.debug('unable to delete setparams file: '); + tl.debug(error); + } + } + + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, true); + throw new Error(webDeployResult.error); + } + } + + private async constructWebDeployArguments(taskParameters: TaskParameters): Promise { + const publishProfile = await this._azureAppServiceUtility.getWebDeployPublishingProfile(); + const webDeployArguments = {} as WebDeployArguments; + + if (await this._azureAppServiceUtility.isSitePublishingCredentialsEnabled()) { + tl.debug("Using Basic authentication."); + webDeployArguments.authType = "Basic"; + webDeployArguments.userName = publishProfile.userName; + webDeployArguments.password = publishProfile.userPWD; + } + else if (!shouldUseMSDeployTokenAuth()) { + throw new Error(tl.loc("BasicAuthNotSupported")); + } + else if (await installedMSDeployVersionSupportsTokenAuth() === false) { + throw new Error(tl.loc("MSDeployNotSupportTokenAuth")); + } + else { + tl.debug("Basic authentication is disabled, using token based authentication."); + webDeployArguments.authType = "Bearer"; + webDeployArguments.password = await this._azureAppServiceUtility.getAuthToken(); + webDeployArguments.userName = "user"; // arbitrary but not empty + } + + webDeployArguments.publishUrl = publishProfile.publishUrl; + webDeployArguments.package = taskParameters.Package; + webDeployArguments.additionalArguments = taskParameters.AdditionalArguments; + webDeployArguments.appName = taskParameters.WebAppName; + webDeployArguments.excludeFilesFromAppDataFlag = taskParameters.ExcludeFilesFromAppDataFlag; + webDeployArguments.removeAdditionalFilesFlag = taskParameters.RemoveAdditionalFilesFlag; + webDeployArguments.takeAppOfflineFlag = taskParameters.TakeAppOfflineFlag; + webDeployArguments.useWebDeploy = taskParameters.UseWebDeploy; + webDeployArguments.virtualApplication = taskParameters.VirtualApplication; + + const setParametersFile = copySetParamFileIfItExists(taskParameters.SetParametersFile); + if (setParametersFile) { + webDeployArguments.setParametersFile = setParametersFile.slice(setParametersFile.lastIndexOf('\\') + 1, setParametersFile.length); + } + + return webDeployArguments; + } + + private async webDeployRecommendationForIssue(taskParameters: TaskParameters, errorCode: string, isRecommendation: boolean) { + switch(errorCode) { + case 'ERROR_CONNECTION_TERMINATED': { + if(!isRecommendation) { + await this._azureAppServiceUtility.pingApplication(); + } + break; + } + case 'ERROR_INSUFFICIENT_ACCESS_TO_SITE_FOLDER': { + tl.warning(tl.loc("Trytodeploywebappagainwithappofflineoptionselected")); + break; + } + case 'WebJobsInProgressIssue': { + tl.warning(tl.loc('WebJobsInProgressIssue')); + break; + } + case 'FILE_IN_USE': { + if(!isRecommendation && taskParameters.RenameFilesFlag) { + await this._azureAppServiceUtility.enableRenameLockedFiles(); + } + else { + tl.warning(tl.loc("Trytodeploywebappagainwithrenamefileoptionselected")); + tl.warning(tl.loc("RunFromZipPreventsFileInUseError")); + } + break; + } + case 'transport connection': { + tl.warning(tl.loc("Updatemachinetoenablesecuretlsprotocol")); + break; + } + case 'ERROR_CERTIFICATE_VALIDATION_FAILED': { + if(isRecommendation) { + tl.warning(tl.loc('ASE_WebDeploySSLIssueRecommendation')); + } + break; + } + default: + break; + } + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/package-lock.json b/Tasks/AzureRmWebAppDeploymentV5/package-lock.json new file mode 100644 index 000000000000..796c15e3892a --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/package-lock.json @@ -0,0 +1,1096 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "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/events": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/events/-/events-3.0.3.tgz", + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==" + }, + "@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/ltx": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/ltx/-/ltx-3.0.6.tgz", + "integrity": "sha512-ZdHUgFEaBVUHI0si050pQkuGzHQC5UU46JsljUUJkGWbsjKeV3RUspJvvdV80Inrnhx8d3JqXw4qCDRX4A/BdA==", + "requires": { + "@types/events": "*" + } + }, + "@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/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/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "@xmldom/xmldom": { + "version": "git+https://github.com/xmldom/xmldom.git#238b1ea8431fae8817812c68d55b4933248af07e", + "from": "git+https://github.com/xmldom/xmldom.git#0.8.6" + }, + "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" + } + }, + "archiver": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha512-5GQRAgpHGPwWIiMzL9lthd+t75fLi8BpRBYtflomSYv2i6+EO9trtwWAm2+zGjIuwKmVmBRknAZFFBSqxYxiJw==", + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "async": { + "version": "2.6.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "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" + } + }, + "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" + } + }, + "azure-pipelines-task-lib": { + "version": "4.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.11.0.tgz", + "integrity": "sha512-svPdgXPmX9j5aLcb+ZmddBsKlkK5TJnlFfgPrDlY8EZAmnR9jLOYiHLLyLph3UO6hoHucsiqvIpH1SBFfH1I8w==", + "requires": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "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" + }, + "dependencies": { + "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==" + } + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.251.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.251.0.tgz", + "integrity": "sha1-9989r2zWGXLLREIAQHuYci00+EM=", + "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=" + }, + "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=" + }, + "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" + } + }, + "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": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } + } + }, + "azure-pipelines-tasks-webdeployment-common": { + "version": "4.243.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-webdeployment-common/-/azure-pipelines-tasks-webdeployment-common-4.243.1.tgz", + "integrity": "sha512-FWjNQDguvLmqfKgCYxcevgvid5RJdv3FrqyrAmMfIe0gLOpyp57yjQ6QCaO5GFc3niWV/MgIxadqlnwrq2haUQ==", + "requires": { + "@types/ltx": "3.0.6", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@xmldom/xmldom": "git+https://github.com/xmldom/xmldom.git#0.8.6", + "archiver": "1.2.0", + "azure-pipelines-task-lib": "^4.2.0", + "ltx": "2.8.0", + "node-stream-zip": "^1.15.0", + "q": "1.4.1", + "semver": "^7.5.4", + "winreg": "1.2.2", + "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": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "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": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "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==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "brace-expansion": { + "version": "1.1.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": { + "version": "5.7.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "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-fill": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha1-MuWJLmNhspsLVFum93YzeNrKKEA=", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha1-Qc/QMrWT45F2pxUzq084SqBP1oE=", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "deasync": { + "version": "0.1.30", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/deasync/-/deasync-0.1.30.tgz", + "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", + "requires": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + } + }, + "debug": { + "version": "4.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "requires": { + "ms": "2.1.2" + } + }, + "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" + } + }, + "dunder-proto": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha1-wvzgmLPI+ImVVJBfQ3e22F2rqoA=", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.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" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=" + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha1-3bVc1HrC4kBwEmC8Ko4x7LZD2UE=", + "requires": { + "es-errors": "^1.3.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha1-Q9090Oe0m4Ky38rRDcgkv3/CZdU=", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + } + }, + "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" + } + } + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "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" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.14.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "requires": { + "hasown": "^2.0.2" + } + }, + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "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=" + }, + "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" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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=" + }, + "ltx": { + "version": "2.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-SJJUrmDgXP0gkUzgErfkaeD+pugM8GYxerTALQa1gTUb5W1wrC4k07GZU+QNZd7MpFqJSYWXTQSUy8Ps03hx5Q==", + "requires": { + "inherits": "^2.0.1" + } + }, + "math-intrinsics": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha1-TgS/h8hapR6Q0HjawiUrTrUmCBc=" + }, + "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" + } + }, + "moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, + "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==" + }, + "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" + }, + "dependencies": { + "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=" + } + } + }, + "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=" + }, + "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-addon-api": { + "version": "1.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "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-stream-zip": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" + }, + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.13.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha1-8UwYPeURMCQ9bRiuFJN1/1DqSIo=" + }, + "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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "qs": { + "version": "6.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.13.1.tgz", + "integrity": "sha1-POX8cr06gXG4XJm5PGXdILfRsW4=", + "requires": { + "side-channel": "^1.0.6" + } + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "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": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "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": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "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==" + }, + "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.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k=", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0=", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "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==" + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "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": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=" + }, + "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" + } + }, + "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.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha1-lw4zljr5p92iKPF+voOZ5fvmOhA=" + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "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" + } + }, + "winreg": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/winreg/-/winreg-1.2.2.tgz", + "integrity": "sha512-I1mQ2HDZbOXm3XctfGPNzm9p/md7FAxHtACVFeBNrnOE4p4b3a0baqNObx1OqHE8DEx25l5CaCDipxFM5FSYOg==" + }, + "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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "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": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + } + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/package.json b/Tasks/AzureRmWebAppDeploymentV5/package.json new file mode 100644 index 000000000000..d6b02956a212 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/package.json @@ -0,0 +1,35 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "AzureRmWebAppDeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "16.18.39", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd new file mode 100644 index 000000000000..fa7c06b0765f --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd @@ -0,0 +1,24 @@ +@echo off + +DEL "mainCmdFile.cmd" + +DEL "kuduPostDeploymentScript.cmd" + +:: Do not delete file if the execution is not completed within time range +:: This can help in retrieving the logs and script result + +if exist "script_result.txt" ( + + echo remove log files + + DEL "stdout.txt" + + DEL "stderr.txt" + + DEL "script_result.txt" +) + +:: Delete the file after execution +echo remove delete_log_file + +DEL "%~f0" >nul 2>&1 diff --git a/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh new file mode 100644 index 000000000000..71eec07fc33d --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +rm "mainCmdFile.sh" + +rm "kuduPostDeploymentScript.sh" + +# Do not delete file if the execution is not completed within time range +# This can help in retrieving the logs and script result + +if [ -f "script_result.txt" ] +then + echo "Removing log files." + rm "stdout.txt" + rm "stderr.txt" + rm "script_result.txt" +else + echo "Execution is not over." +fi + +# Delete the file after execution +echo "Removing the delete_log_file.sh file." + +rm "delete_log_file.sh" diff --git a/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd new file mode 100644 index 000000000000..b4ede19c9c1c --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd @@ -0,0 +1,9 @@ +@echo off + +:: Send stdout and stderr to seperate file +call cmd /c "%Home%\\site\\VSTS_PostDeployment_%1\\kuduPostDeploymentScript.cmd" > "%Home%\\site\\VSTS_PostDeployment_%1\\stdout.txt" 2> "%Home%\\site\\VSTS_PostDeployment_%1\\stderr.txt" + +:: write return code of previous command to script_result file +:: only return code (Numeric code) should present inside script_result + +echo %errorlevel% > "%Home%\\site\\VSTS_PostDeployment_%1\\script_result.txt" \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh new file mode 100644 index 000000000000..6501857c8b43 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# Send stdout and stderr to seperate file +sh "$HOME/site/VSTS_PostDeployment_$1/kuduPostDeploymentScript.sh" 2> "$HOME/site/VSTS_PostDeployment_$1/stderr.txt" 1> "$HOME/site/VSTS_PostDeployment_$1/stdout.txt" +echo "$?" > "$HOME/site/VSTS_PostDeployment_$1/script_result.txt" diff --git a/Tasks/AzureRmWebAppDeploymentV5/task.json b/Tasks/AzureRmWebAppDeploymentV5/task.json new file mode 100644 index 000000000000..204fb48bd9a4 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/task.json @@ -0,0 +1,693 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "Azure App Service deploy", + "description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 0 + }, + "releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "File Transforms & Variable Substitution Options", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "Post Deployment Action", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "Application and Configuration Settings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "Connection type", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile)." + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "defaultValue": "", + "required": true, + "helpMarkDown": "Select the Azure Resource Manager subscription for the deployment.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "Publish profile path", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "Path of the Publish profile created from Visual Studio", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "Publish profile password", + "required": true, + "helpMarkDown": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "App Service type", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "App Service name", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "Deploy to Slot or App Service Environment", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "Resource group", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "Slot", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select an existing Slot other than the Production slot.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "Registry or Namespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerRepository", + "type": "string", + "label": "Image", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "Virtual application", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root." + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "Package or folder", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war." + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Select the framework and version.", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "Startup command ", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "Deployment script type", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471)." + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "Inline Script", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "Deployment script path", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "App settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "Configuration settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "Select deployment method", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app." + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "Choose the deployment method for the app.", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "Take App Offline", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully." + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "SetParameters file", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Optional: location of the SetParameters.xml file to use." + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "Remove additional files at destination", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. " + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "Exclude files from the App_Data folder", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service." + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "Additional arguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471)." + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "Rename locked files", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "XML transformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform." + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "XML variable substitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "JSON variable substitution", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution." + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "Choose the deployment method for the app." + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "Enable clean deployment", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "Deployment mode for complete sync (clean) deployment" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "SetParamFilenotfound0": "Set parameters file not found: %s", + "XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "Runningcommand": "Running command: %s", + "Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "Configfiledoesntexists": "Configuration file %s doesn't exist.", + "Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "AppOfflineModeenabled": "App offline mode enabled.", + "Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "AppOflineModedisabled": "App offline mode disabled.", + "FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "Physicalpathalreadyexists": "Physical path '%s' already exists", + "KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "ScriptFileNotFound": "Script file '%s' not found.", + "InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "stdoutFromScript": "Standard output from script: ", + "stderrFromScript": "Standard error from script: ", + "WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "InvalidPollOption": "Invalid polling option provided: %s.", + "MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "UnableToReadResponseBody": "Unable to read response body. Error: %s", + "UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "RetryToDeploy": "Retrying to deploy the package.", + "FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "GoExeNameNotPresent": "Go exe name is not present", + "WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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", + "XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "InvalidConnectionType": "Invalid service connection type", + "InvalidImageSourceType": "Invalid Image source Type", + "InvalidPublishProfile": "Publish profile file is invalid.", + "ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "DeployLogsURL": "Deploy logs can be viewed at %s", + "AppServiceApplicationURL": "App Service Application URL: %s", + "ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "JarPathNotPresent": "Java jar path is not present", + "FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy .", + "RunFromPackageAppsetting": "NOTE: Run From Package makes wwwroot read-only, so you will receive an error when writing files to this directory." + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/task.loc.json b/Tasks/AzureRmWebAppDeploymentV5/task.loc.json new file mode 100644 index 000000000000..5f06619ea367 --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/task.loc.json @@ -0,0 +1,693 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "ms-resource:loc.group.displayName.FileTransformsAndVariableSubstitution", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptions", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptionsLinux", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "ms-resource:loc.group.displayName.PostDeploymentAction", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "ms-resource:loc.group.displayName.ApplicationAndConfigurationSettings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ConnectionType", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectionType" + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.ConnectedServiceName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.PublishProfilePath", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePath", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "ms-resource:loc.input.label.PublishProfilePassword", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePassword", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppKind", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppKind", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.DeployToSlotOrASEFlag", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.DeployToSlotOrASEFlag", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "ms-resource:loc.input.label.ResourceGroupName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.ResourceGroupName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "ms-resource:loc.input.label.SlotName", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.SlotName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "ms-resource:loc.input.label.DockerNamespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerNamespace" + }, + { + "name": "DockerRepository", + "type": "string", + "label": "ms-resource:loc.input.label.DockerRepository", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerRepository" + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "ms-resource:loc.input.label.DockerImageTag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerImageTag" + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "ms-resource:loc.input.label.VirtualApplication", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "ms-resource:loc.input.help.VirtualApplication" + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.Package", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "ms-resource:loc.input.help.Package" + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStack", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStackFunction", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStackFunction", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "ms-resource:loc.input.label.StartupCommand", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.StartupCommand" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ScriptType", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "ms-resource:loc.input.help.ScriptType" + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "ms-resource:loc.input.label.InlineScript", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "ms-resource:loc.input.label.ScriptPath", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "ms-resource:loc.input.label.WebConfigParameters", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.WebConfigParameters", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AppSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.AppSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.ConfigurationSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.ConfigurationSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.UseWebDeploy", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.UseWebDeploy" + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentType", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentType", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.TakeAppOfflineFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "ms-resource:loc.input.help.TakeAppOfflineFlag" + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.SetParametersFile", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.SetParametersFile" + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveAdditionalFilesFlag", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.RemoveAdditionalFilesFlag" + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.ExcludeFilesFromAppDataFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.ExcludeFilesFromAppDataFlag" + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "ms-resource:loc.input.label.AdditionalArguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArguments" + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RenameFilesFlag", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.RenameFilesFlag" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlTransformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlTransformation" + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlVariableSubstitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlVariableSubstitution" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "ms-resource:loc.input.label.JSONFiles", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.JSONFiles" + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentTypeLinux", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentTypeLinux" + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanDeploymentFlag", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "ms-resource:loc.input.help.CleanDeploymentFlag" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "ms-resource:loc.messages.Invalidwebapppackageorfolderpathprovided", + "SetParamFilenotfound0": "ms-resource:loc.messages.SetParamFilenotfound0", + "XDTTransformationsappliedsuccessfully": "ms-resource:loc.messages.XDTTransformationsappliedsuccessfully", + "GotconnectiondetailsforazureRMWebApp0": "ms-resource:loc.messages.GotconnectiondetailsforazureRMWebApp0", + "ErrorNoSuchDeployingMethodExists": "ms-resource:loc.messages.ErrorNoSuchDeployingMethodExists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "ms-resource:loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp", + "UnabletoretrieveResourceID": "ms-resource:loc.messages.UnabletoretrieveResourceID", + "Successfullyupdateddeploymenthistory": "ms-resource:loc.messages.Successfullyupdateddeploymenthistory", + "Failedtoupdatedeploymenthistory": "ms-resource:loc.messages.Failedtoupdatedeploymenthistory", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ms-resource:loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite", + "Unabletoretrievewebconfigdetails": "ms-resource:loc.messages.Unabletoretrievewebconfigdetails", + "Unabletoretrievewebappsettings": "ms-resource:loc.messages.Unabletoretrievewebappsettings", + "Unabletoupdatewebappsettings": "ms-resource:loc.messages.Unabletoupdatewebappsettings", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "ms-resource:loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved", + "PackageDeploymentSuccess": "ms-resource:loc.messages.PackageDeploymentSuccess", + "PackageDeploymentFailed": "ms-resource:loc.messages.PackageDeploymentFailed", + "Runningcommand": "ms-resource:loc.messages.Runningcommand", + "Deployingwebapplicationatvirtualpathandphysicalpath": "ms-resource:loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath", + "Successfullydeployedpackageusingkuduserviceat": "ms-resource:loc.messages.Successfullydeployedpackageusingkuduserviceat", + "Failedtodeploywebapppackageusingkuduservice": "ms-resource:loc.messages.Failedtodeploywebapppackageusingkuduservice", + "Unabletodeploywebappresponsecode": "ms-resource:loc.messages.Unabletodeploywebappresponsecode", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "ms-resource:loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "ms-resource:loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "ms-resource:loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError", + "Nopackagefoundwithspecifiedpattern": "ms-resource:loc.messages.Nopackagefoundwithspecifiedpattern", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "ms-resource:loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern", + "Trytodeploywebappagainwithappofflineoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithappofflineoptionselected", + "Trytodeploywebappagainwithrenamefileoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithrenamefileoptionselected", + "NOJSONfilematchedwithspecificpattern": "ms-resource:loc.messages.NOJSONfilematchedwithspecificpattern", + "Configfiledoesntexists": "ms-resource:loc.messages.Configfiledoesntexists", + "Failedtowritetoconfigfilewitherror": "ms-resource:loc.messages.Failedtowritetoconfigfilewitherror", + "AppOfflineModeenabled": "ms-resource:loc.messages.AppOfflineModeenabled", + "Failedtoenableappofflinemode": "ms-resource:loc.messages.Failedtoenableappofflinemode", + "AppOflineModedisabled": "ms-resource:loc.messages.AppOflineModedisabled", + "FailedtodisableAppOfflineMode": "ms-resource:loc.messages.FailedtodisableAppOfflineMode", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "ms-resource:loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform", + "XdtTransformationErrorWhileTransforming": "ms-resource:loc.messages.XdtTransformationErrorWhileTransforming", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "ms-resource:loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage", + "Publishusingzipdeploynotsupportedforvirtualapplication": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication", + "Publishusingzipdeploydoesnotsupportwarfile": "ms-resource:loc.messages.Publishusingzipdeploydoesnotsupportwarfile", + "Publishusingrunfromzipwithpostdeploymentscript": "ms-resource:loc.messages.Publishusingrunfromzipwithpostdeploymentscript", + "ResourceDoesntExist": "ms-resource:loc.messages.ResourceDoesntExist", + "EncodeNotSupported": "ms-resource:loc.messages.EncodeNotSupported", + "UnknownFileEncodeError": "ms-resource:loc.messages.UnknownFileEncodeError", + "ShortFileBufferError": "ms-resource:loc.messages.ShortFileBufferError", + "FailedToUpdateAzureRMWebAppConfigDetails": "ms-resource:loc.messages.FailedToUpdateAzureRMWebAppConfigDetails", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "ms-resource:loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails", + "RequestedURLforkuduphysicalpath": "ms-resource:loc.messages.RequestedURLforkuduphysicalpath", + "Physicalpathalreadyexists": "ms-resource:loc.messages.Physicalpathalreadyexists", + "KuduPhysicalpathCreatedSuccessfully": "ms-resource:loc.messages.KuduPhysicalpathCreatedSuccessfully", + "FailedtocreateKuduPhysicalPath": "ms-resource:loc.messages.FailedtocreateKuduPhysicalPath", + "FailedtocheckphysicalPath": "ms-resource:loc.messages.FailedtocheckphysicalPath", + "VirtualApplicationDoesNotExist": "ms-resource:loc.messages.VirtualApplicationDoesNotExist", + "JSONParseError": "ms-resource:loc.messages.JSONParseError", + "JSONvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.JSONvariablesubstitutionappliedsuccessfully", + "XMLvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.XMLvariablesubstitutionappliedsuccessfully", + "failedtoUploadFileToKudu": "ms-resource:loc.messages.failedtoUploadFileToKudu", + "failedtoUploadFileToKuduError": "ms-resource:loc.messages.failedtoUploadFileToKuduError", + "ExecuteScriptOnKudu": "ms-resource:loc.messages.ExecuteScriptOnKudu", + "FailedToRunScriptOnKuduError": "ms-resource:loc.messages.FailedToRunScriptOnKuduError", + "FailedToRunScriptOnKudu": "ms-resource:loc.messages.FailedToRunScriptOnKudu", + "ScriptExecutionOnKuduSuccess": "ms-resource:loc.messages.ScriptExecutionOnKuduSuccess", + "ScriptExecutionOnKuduFailed": "ms-resource:loc.messages.ScriptExecutionOnKuduFailed", + "FailedtoDeleteFileFromKudu": "ms-resource:loc.messages.FailedtoDeleteFileFromKudu", + "FailedtoDeleteFileFromKuduError": "ms-resource:loc.messages.FailedtoDeleteFileFromKuduError", + "ScriptFileNotFound": "ms-resource:loc.messages.ScriptFileNotFound", + "InvalidScriptFile": "ms-resource:loc.messages.InvalidScriptFile", + "RetryForTimeoutIssue": "ms-resource:loc.messages.RetryForTimeoutIssue", + "stdoutFromScript": "ms-resource:loc.messages.stdoutFromScript", + "stderrFromScript": "ms-resource:loc.messages.stderrFromScript", + "WebConfigAlreadyExists": "ms-resource:loc.messages.WebConfigAlreadyExists", + "SuccessfullyGeneratedWebConfig": "ms-resource:loc.messages.SuccessfullyGeneratedWebConfig", + "FailedToGenerateWebConfig": "ms-resource:loc.messages.FailedToGenerateWebConfig", + "FailedToGetKuduFileContent": "ms-resource:loc.messages.FailedToGetKuduFileContent", + "FailedToGetKuduFileContentError": "ms-resource:loc.messages.FailedToGetKuduFileContentError", + "ScriptStatusTimeout": "ms-resource:loc.messages.ScriptStatusTimeout", + "PollingForFileTimeOut": "ms-resource:loc.messages.PollingForFileTimeOut", + "InvalidPollOption": "ms-resource:loc.messages.InvalidPollOption", + "MissingAppTypeWebConfigParameters": "ms-resource:loc.messages.MissingAppTypeWebConfigParameters", + "AutoDetectDjangoSettingsFailed": "ms-resource:loc.messages.AutoDetectDjangoSettingsFailed", + "FailedToApplyTransformation": "ms-resource:loc.messages.FailedToApplyTransformation", + "FailedToApplyTransformationReason1": "ms-resource:loc.messages.FailedToApplyTransformationReason1", + "FailedToApplyTransformationReason2": "ms-resource:loc.messages.FailedToApplyTransformationReason2", + "AutoParameterizationMessage": "ms-resource:loc.messages.AutoParameterizationMessage", + "UnsupportedAppType": "ms-resource:loc.messages.UnsupportedAppType", + "UnableToFetchAuthorityURL": "ms-resource:loc.messages.UnableToFetchAuthorityURL", + "UnableToFetchActiveDirectory": "ms-resource:loc.messages.UnableToFetchActiveDirectory", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ms-resource:loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand", + "FailedToUpdateRuntimeStackAndStartupCommand": "ms-resource:loc.messages.FailedToUpdateRuntimeStackAndStartupCommand", + "SuccessfullyUpdatedWebAppSettings": "ms-resource:loc.messages.SuccessfullyUpdatedWebAppSettings", + "FailedToUpdateAppSettingsInConfigDetails": "ms-resource:loc.messages.FailedToUpdateAppSettingsInConfigDetails", + "UnableToGetAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToGetAzureRMWebAppMetadata", + "UnableToUpdateAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToUpdateAzureRMWebAppMetadata", + "Unabletoretrieveazureregistrycredentials": "ms-resource:loc.messages.Unabletoretrieveazureregistrycredentials", + "UnableToReadResponseBody": "ms-resource:loc.messages.UnableToReadResponseBody", + "UnableToUpdateWebAppConfigDetails": "ms-resource:loc.messages.UnableToUpdateWebAppConfigDetails", + "AddingReleaseAnnotation": "ms-resource:loc.messages.AddingReleaseAnnotation", + "SuccessfullyAddedReleaseAnnotation": "ms-resource:loc.messages.SuccessfullyAddedReleaseAnnotation", + "FailedAddingReleaseAnnotation": "ms-resource:loc.messages.FailedAddingReleaseAnnotation", + "RenameLockedFilesEnabled": "ms-resource:loc.messages.RenameLockedFilesEnabled", + "FailedToEnableRenameLockedFiles": "ms-resource:loc.messages.FailedToEnableRenameLockedFiles", + "WebJobsInProgressIssue": "ms-resource:loc.messages.WebJobsInProgressIssue", + "FailedToFetchKuduAppSettings": "ms-resource:loc.messages.FailedToFetchKuduAppSettings", + "FailedToCreatePath": "ms-resource:loc.messages.FailedToCreatePath", + "FailedToDeleteFile": "ms-resource:loc.messages.FailedToDeleteFile", + "FailedToDeleteFolder": "ms-resource:loc.messages.FailedToDeleteFolder", + "FailedToUploadFile": "ms-resource:loc.messages.FailedToUploadFile", + "FailedToGetFileContent": "ms-resource:loc.messages.FailedToGetFileContent", + "FailedToListPath": "ms-resource:loc.messages.FailedToListPath", + "RetryToDeploy": "ms-resource:loc.messages.RetryToDeploy", + "FailedToGetAppServiceDetails": "ms-resource:loc.messages.FailedToGetAppServiceDetails", + "FailedToGetAppServicePublishingProfile": "ms-resource:loc.messages.FailedToGetAppServicePublishingProfile", + "FailedToUpdateAppServiceMetadata": "ms-resource:loc.messages.FailedToUpdateAppServiceMetadata", + "FailedToGetAppServiceMetadata": "ms-resource:loc.messages.FailedToGetAppServiceMetadata", + "FailedToPatchAppServiceConfiguration": "ms-resource:loc.messages.FailedToPatchAppServiceConfiguration", + "FailedToUpdateAppServiceConfiguration": "ms-resource:loc.messages.FailedToUpdateAppServiceConfiguration", + "FailedToGetAppServiceConfiguration": "ms-resource:loc.messages.FailedToGetAppServiceConfiguration", + "FailedToGetAppServicePublishingCredentials": "ms-resource:loc.messages.FailedToGetAppServicePublishingCredentials", + "FailedToGetAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToGetAppServiceApplicationSettings", + "FailedToUpdateAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToUpdateAppServiceApplicationSettings", + "UpdatingAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatingAppServiceConfigurationSettings", + "UpdatedAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatedAppServiceConfigurationSettings", + "UpdatingAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatingAppServiceApplicationSettings", + "AppServiceApplicationSettingsAlreadyPresent": "ms-resource:loc.messages.AppServiceApplicationSettingsAlreadyPresent", + "AppServiceConnectionStringsAlreadyPresent": "ms-resource:loc.messages.AppServiceConnectionStringsAlreadyPresent", + "UpdatedAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatedAppServiceApplicationSettings", + "MultipleResourceGroupFoundForAppService": "ms-resource:loc.messages.MultipleResourceGroupFoundForAppService", + "PackageDeploymentUsingZipDeployFailed": "ms-resource:loc.messages.PackageDeploymentUsingZipDeployFailed", + "PackageDeploymentInitiated": "ms-resource:loc.messages.PackageDeploymentInitiated", + "PackageDeploymentInitiatedWithOneDeploy": "ms-resource:loc.messages.PackageDeploymentInitiatedWithOneDeploy", + "OneDeployWithIncrementalDeploymentOption": "ms-resource:loc.messages.OneDeployWithIncrementalDeploymentOption", + "WarPackageDeploymentInitiated": "ms-resource:loc.messages.WarPackageDeploymentInitiated", + "FailedToGetDeploymentLogs": "ms-resource:loc.messages.FailedToGetDeploymentLogs", + "GoExeNameNotPresent": "ms-resource:loc.messages.GoExeNameNotPresent", + "WarDeploymentRetry": "ms-resource:loc.messages.WarDeploymentRetry", + "Updatemachinetoenablesecuretlsprotocol": "ms-resource:loc.messages.Updatemachinetoenablesecuretlsprotocol", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "XmlParsingFailed": "ms-resource:loc.messages.XmlParsingFailed", + "PropertyDoesntExistPublishProfile": "ms-resource:loc.messages.PropertyDoesntExistPublishProfile", + "InvalidConnectionType": "ms-resource:loc.messages.InvalidConnectionType", + "InvalidImageSourceType": "ms-resource:loc.messages.InvalidImageSourceType", + "InvalidPublishProfile": "ms-resource:loc.messages.InvalidPublishProfile", + "ASE_SSLIssueRecommendation": "ms-resource:loc.messages.ASE_SSLIssueRecommendation", + "ZipDeployLogsURL": "ms-resource:loc.messages.ZipDeployLogsURL", + "DeployLogsURL": "ms-resource:loc.messages.DeployLogsURL", + "AppServiceApplicationURL": "ms-resource:loc.messages.AppServiceApplicationURL", + "ASE_WebDeploySSLIssueRecommendation": "ms-resource:loc.messages.ASE_WebDeploySSLIssueRecommendation", + "FailedToGetResourceID": "ms-resource:loc.messages.FailedToGetResourceID", + "JarPathNotPresent": "ms-resource:loc.messages.JarPathNotPresent", + "FailedToUpdateApplicationInsightsResource": "ms-resource:loc.messages.FailedToUpdateApplicationInsightsResource", + "RunFromZipPreventsFileInUseError": "ms-resource:loc.messages.RunFromZipPreventsFileInUseError", + "MSDeployNotSupportTokenAuth": "ms-resource:loc.messages.MSDeployNotSupportTokenAuth", + "RunFromPackageAppsetting": "ms-resource:loc.messages.RunFromPackageAppsetting" + } +} \ No newline at end of file diff --git a/Tasks/AzureRmWebAppDeploymentV5/tsconfig.json b/Tasks/AzureRmWebAppDeploymentV5/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/Tasks/AzureRmWebAppDeploymentV5/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5.versionmap.txt b/_generated/AzureRmWebAppDeploymentV5.versionmap.txt new file mode 100644 index 000000000000..d8de51fae2a6 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5.versionmap.txt @@ -0,0 +1,2 @@ +Default|5.251.0 +Node20-225|5.251.1 diff --git a/_generated/AzureRmWebAppDeploymentV5/.npmrc b/_generated/AzureRmWebAppDeploymentV5/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/README.md b/_generated/AzureRmWebAppDeploymentV5/README.md new file mode 100644 index 000000000000..aae6da3440d0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/README.md @@ -0,0 +1,213 @@ +# Azure App Service Deployment: ARM + +## Overview + +The Azure App Service Deployment task is used to update different Azure App Service to deploy [Web Apps](https://azure.microsoft.com/en-in/documentation/articles/app-service-web-overview/), [Functions](https://docs.microsoft.com/en-us/azure/azure-functions/) and [WebJobs](https://azure.microsoft.com/en-us/blog/webjobs-goes-into-full-production/) to Azure. The task works on cross platform Azure Pipelines agents running Windows, Linux or Mac and uses the underlying deployment technologies of [Web Deploy](https://www.iis.net/downloads/microsoft/web-deploy), RunFromPackage, Zip Deploy, Containers and [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API). + +The task works for [ASP.NET](https://www.visualstudio.com/en-us/docs/release/examples/azure/azure-web-apps-from-build-and-release-hubs), [ASP.NET Core](https://www.visualstudio.com/en-us/docs/release/examples/azure/aspnet-core10-azure-web-apps), PHP, Java, Python, Go and [Node.js](https://www.visualstudio.com/en-us/docs/release/examples/nodejs/node-to-azure-webapps) based web applications. + +The task can be used to deploy different Azure App Services like Function App (Windows/Linux/Containers), Web App on Windows, Web App on Linux, Web App for Containers and apps configured under Azure App Service Environments. + +The task is **under development and is available to a limited set of Azure DevOps organizations**. The [video](https://www.youtube.com/watch?v=uQ2qCmaZ_Ag&feature=youtu.be) describes the features that are available in the task currently. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites need to be setup in the target machine(s) for the task to work properly. + +##### Azure Web App or Azure Function + +The task is used to deploy a Web project to an existing Azure Web App. The Web App should exist prior to running the task. The Web App can be created from the [Azure portal](https://azure.microsoft.com/en-in/documentation/videos/azure-app-service-web-apps-with-yochay-kiriaty/) and [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) there. Alternatively, the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) can be used to run [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx) to provision and configure the Web App. + +The task can also be used to deploy [Azure Functions](https://azure.microsoft.com/en-in/services/functions/) (Windows/Linux/Containers). + +##### Azure Subscription + +To deploy to Azure, an Azure subscription has to be linked to Team Foundation Server or to Azure Pipelines using the Services tab in the Account Administration section. Add the Azure subscription to use in the Build or Release Management definition by opening the Account Administration screen (gear icon on the top-right of the screen) and then click on the Services Tab. + +Create the [ARM](https://azure.microsoft.com/en-in/documentation/articles/resource-group-overview/) service endpoint, use **'Azure Resource Manager'** endpoint type, for more details follow the steps listed in the link [here](https://go.microsoft.com/fwlink/?LinkID=623000&clcid=0x409). + +The task does not work with the Azure Classic service endpoint and it will not list these connections in the parameters in the task. + +## Deployment + +Several deployment methods are available in this task. Web Deploy (msdeploy.exe) is the default option. To change the deployment option, expand Additional Deployment Options and enable Select deployment method to choose from additional package-based deployment options. + +Based on the type of Azure App Service and Azure Pipelines agent, the task chooses a suitable deployment technology. The different deployment technologies used by the task are: +* *Web Deploy* + +* *Kudu REST APIs* + +* *Container Registry* + +* *Zip Deploy* + +* *RunFromPackage* + +By default the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* For msdeploy (MSBuild generated package) package, use Web Deploy +* When post deployment script is provided, use Zip Deploy +* When the App Service type is Web App on Linux App, use Zip Deploy +* If War file is provided, use War Deploy +* If Jar file is provided, use Run From Zip +* For all others, use Run From Zip (via Zip Deploy) + +On non-Windows agent (for any App service type), the task relies on [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) to deploy the Web App. + +### Web Deploy + +Web Deploy (msdeploy.exe) is used to deploy the web application to the Azure Web App. Web Deploy Works on a Windows automation agent when the target is a Web App on Windows or Function App. Install it on the agent using the [Microsoft Web Platform Installer](https://www.microsoft.com/web/gallery/install.aspx?appid=wdeploynosmo). The Web Deploy 3.5 needs to be installed without the bundled SQL support. There is no need to choose any custom settings while installing Web Deploy. After installing the Web Deploy is available at C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V3. + +Web Deploy is feature rich and offers options like: +* **Rename locked files\*:** Rename file which are still in use by the web server by enabling msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment + +* **Remove additional files at destination\*:** Deletes files on the Azure App Service that have no matching files in the App Service artifact package or folder getting deployed. + +* **Exclude files from the App_Data folder\*:** Prevent files in the App_Data folder (in the artifact package/folder getting deployed) from being deployed to the Azure App Service + +* **Additional Web Deploy arguments\*:** Arguments that will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.For more examples of Web Deploy operation settings, refer [Web Deploy Operation Settings](https://go.microsoft.com/fwlink/?linkid=838471) + + +### [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) +Works on a Windows as well as Linux automation agent when the target is a Web App on Windows or Web App on Linux (built-in source) or Function App. The task uses Kudu to copy over files to the Azure App service. + +### Container Registry +Works on a Windows as well as Linux automation agent when the target is a Web App for Containers. The task updates the Azure Web App for Containers by setting the right Container registry, repository, image name and tag information. You can also use the task to pass a startup command for the container image. + +### Zip Deploy +Creates a .zip deployment package of the chosen Package or folder and deploys the file contents to the wwwroot folder of the App Service name function app in Azure. This option overwrites all existing contents in the wwwroot folder. For more information, see [Zip deployment for Azure Functions](https://docs.microsoft.com/azure/azure-functions/deployment-zip-push). + +### RunFromPackage +Creates the same deployment package as Zip Deploy. However, instead of deploying files to the wwwroot folder, the entire package is mounted by the Functions runtime. With this option, files in the wwwroot folder become read-only. For more information, see [Run your Azure Functions from a package file](https://docs.microsoft.com/azure/azure-functions/run-functions-from-deployment-package). + +### Parameters of the task +The task is used to deploy a Web project to an existing Azure Web App or Function. The mandatory fields are highlighted with a *. + +* **Azure Subscription\*:** Select the AzureRM Subscription. If none exists, then click on the **Manage** link, to navigate to the Services tab in the Administrators panel. In the tab click on **New Service Endpoint** and select **Azure Resource Manager** from the dropdown. + +* **App Service type\*:** Select the Azure App Service type. The different app types supported are Function App, Web App on Windows, Web App on Linux, Web App for Containers and Azure App Service Environments + +* **App Service Name\*:** Select the name of an existing Azure App Service. Enter the name of the Web App if it was provisioned dynamically using the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) and [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx). + +* **Deploy to Slot:** Select the option to deploy to an existing slot other than the Production slot. Do not select this option if the Web project is being deployed to the Production slot. The Web App itself is the Production slot. + +* **Resource Group:** Select the Azure Resource Group that contains the Azure App Service specified above. Enter the name of the Azure Resource Group if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Slot:** Select the Slot to deploy the Web project to. Enter the name of the Slot if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Virtual Application:** Specify the name of the Virtual Application that has been configured in the Azure portal. The option is not required for deployments to the website root. The Virtual Application should have been [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) prior to deploying the Web project to it using the task. + +* **Package or Folder\*:** Location of the Web App zip package or folder on the automation agent or on a UNC path accessible to the automation agent like, \\\\BudgetIT\\Web\\Deploy\\Fabrikam.zip. Predefined system variables and wild cards like, $(System.DefaultWorkingDirectory)\\\***.zip can be also used here. + +* **Select deployment method:** Select the option to to choose from Web Deploy, Container, Zip Deploy, RunFromPackage, Kudu REST apis + +By default (when 'Select deployment method' is not checked) the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* **Parameters File:** (Optional) The parameter file is used to override the default settings in the web deploy zip package file like, the IIS Web application name or the database connection string. This helps in having a single package that can be deployed across dev, test, staging, and production, with a specific parameter file for each environment. + +* **Remove Additional Files at Destination:** Select the option to delete the files in the Azure App Service that have no matching files in the Web App zip package. This will ensure that during the Web project deployment any additional files in the Azure App Service are deleted, and the only files in the Azure App Service are the ones in the Web App zip package. +This will also remove all files related to any extension (for example Application Insights) installed on this Azure App Service. To prevent this, enable 'Exclude files from App_Data folder' as well. + +* **Exclude Files from the App_Data Folder:** Select the option to prevent files in the App_Data folder from being deployed to the Azure App Service. This is a useful option to select, if a local database or a WebJob has been deployed earlier to the Azure App Service, and they should not be deleted in the subsequent deployments of the Web project. + +* **Take Application Offline:** Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the Web App before the sync operation begins. The file will be removed after the sync operation completes successfully. + +* **Additional Arguments:** Additional Web Deploy arguments that will be appended to the MSDeploy command while deploying the Azure Web App like,-disableLink:AppPoolExtension -disableLink:ContentExtension. A useful parameter for enabling and disabling rules and for skipping syncing of certain folders. + +* **Generate Web.config:** A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. For example, for [Nodejs application, web.config](https://github.com/projectkudu/kudu/wiki/Using-a-custom-web.config-for-Node-apps) will have startup file and iis_node module values. Similarly for Python (Bottle, Django, Flask) the web.config will have details of WSGI handler, Python path etc. The task will generate a new web.config only when the artifact package/folder does not contain an existing web.config. The default values populated by the task can be overriden in the task by using the Web.config parameters field. + +* **Web.config parameters:** Edit values like startup file in the task generated web.config file. The default values populated by the task can be overridden in the task by passing the web.config parameters. This edit feature is **only for the generated web.config**. Feature is useful when [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) is used to install specific Python version by using extensions or when you want to provide a different startup file for Node.js. +In case of Python, the path can be set as an output variable of the [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) and then set as the Python path in the web.config generated by this deploy task. You can try out this feature by selecting any Python, Nodejs, PHP release definition template. + +* **File transformation and variable substitution:** Refer to following links: + * [XML transformation](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-transformation) + * [XML variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-variable-substitution) + * [JSON variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#json-variable-substitution) +* **Deployment script:** +The task provides an option to customize the deployment by providing a script that will run on the Azure App Service once the application artifacts have been copied successfully to the App Service. You can choose to either provide an inline deployment script or point to a script file in your atifact folder. This is very useful when you want to restore your application dependencies on the App service directly. Restoring packages of Node, PHP, Python applications helps in avoiding timeouts when the application dependency results in a large artifact getting copied over from Azure Pipelines Agent to Azure app service. An example of this script is: +``` +@echo off +if NOT exist requirements.txt ( + echo No Requirements.txt found. + EXIT /b 0 +) +if NOT exist "$(PYTHON_EXT)/python.exe" ( + echo Python extension not available >&2 + EXIT /b 1 +) +echo Installing dependencies +call "$(PYTHON_EXT)/python.exe" -m pip install -U setuptools +if %errorlevel% NEQ 0 ( + echo Failed to install setuptools >&2 + EXIT /b 1 +) +call "$(PYTHON_EXT)/python.exe" -m pip install -r requirements.txt +if %errorlevel% NEQ 0 ( + echo Failed to install dependencies>&2 + EXIT /b 1 +) +``` + +* **Runtime Stack:** +Web App on Linux offers two different options to publish your application, one is Custom image deployment (Web App for Containers) and the other is App deployment with a built-in platform image (Web App on Linux). You will see this parameter only when you selected 'Linux Web App' in the App type selection option in the task. + +For Web **Web App for Containers** you need to provide the following details: +* *Registry or Namespace:* +A globally unique top-level domain name for your specific registry or namespace. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Image:* +Image Name of the repository where the container images are stored. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Tag:* +Tags are optional, it is the mechanism that registries use to give Docker images a version. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Startup command:* +Start up command for the container. + +For Web **Web App on Linux** you need to provide the following details: +* *Runtime stack:* Select the framework and version your web app will run on. + +* *Startup command:* +Start up command for the app. For example if you are using PM2 process manager for Nodejs then you can specify the PM2 file here. + +* *Application and Configuration Settings* + +**App settings**: [App settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure#app-settings) contains name/value pairs that your web app will load on start up. Edit web app application settings by following the syntax '-key value'. Value containing spaces should be enclosed in double quotes. +>Example : -Port 5000 -RequestTimeout 5000 +>-WEBSITE_TIME_ZONE "Eastern Standard Time" + +**Configuration settings**: +Edit web app [configuration settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure) following the syntax -key value. Value containing spaces should be enclosed in double quotes. +>Example : -phpVersion 5.6 -linuxFxVersion: node|6.11 + +### Output Variables + +* **Web App Hosted URL:** Provide a name, like FabrikamWebAppURL for the variable for the Azure App Service Hosted URL. The variable can be used as $(variableName), like $(FabrikamWebAppURL) to refer to the Hosted URL of the Azure App Service in subsequent tasks like in the [Run Functional Tests task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/RunDistributedTestsV1) or the [Visual Studio Test task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/VsTestV2). + + +### Troubleshooting : + +- **Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.** + + Service connection used by the task would have been expired or the service principal use must have been removed from the app registrations. [Troubleshoot the affected Azure Resource Manager service connection.](https://docs.microsoft.com/en-us/azure/devops/pipelines/release/azure-rm-endpoint?view=azure-devops) + +- **SSL error** + To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + +- **Managed Service Identity (MSI)** + configure Managed Service Identity (MSI) for virtual machine https://aka.ms/azure-msi-docs + + +- **Publish using zip deploy option is not supported for msBuild package type** + Follow the steps provided in the link https://github.com/microsoft/azure-pipelines-tasks/wiki/Migrating-from-Web-Deploy-to-Run-From-Package-deployment-mechanism + +- **ERROR_FILE_IN_USE** + * For avoiding deployment failure with error code ERROR_FILE_IN_USE, in case of .NET apps targeting Web App on Windows, ensure that 'Rename locked files' and 'Take App Offline' are enabled. For zero downtime deployment use slot swap. + * You can also use `Run From Package` deployment method to avoid resource locking. + +- **Web Job deployment** +When deploying to an App Service with App Insights configured, if you have enabled “Remove additional files at destination” then you also need to enable “Exclude files from the App_Data folder” in order to keep App insights extension in safe state. This is required because App Insights continuous web job gets installed into the App_Data folder. diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..61fdf60095b0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service-Bereitstellung", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Hiermit wird eine Web-, Mobil- oder API-App mithilfe von Docker, Java, .NET, .NET Core, Node.js, PHP, Python oder Ruby für Azure App Service bereitgestellt.", + "loc.instanceNameFormat": "Azure App Service bereitstellen: $(WebAppName)", + "loc.releaseNotes": "Neuigkeiten in Version 4.*
Unterstützung für ZIP Deploy, die Ausführung über Pakete und WAR Deploy [Details](https://aka.ms/appServiceDeploymentMethods)
Unterstützung für App Service-Umgebungen
Verbesserte Benutzeroberfläche zum Ermitteln der von der Aufgabe unterstützten App Service-Typen
\"Aus Paket ausführen\" ist die bevorzugte Bereitstellungsmethode und markiert Dateien im Ordner \"wwwroot\" als schreibgeschützt
Klicken Sie [hier](https://aka.ms/azurermwebdeployreadme), um weitere Informationen zu erhalten.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Optionen für Dateitransformationen und Variablenersetzungen", + "loc.group.displayName.AdditionalDeploymentOptions": "Zusätzliche Bereitstellungsoptionen", + "loc.group.displayName.PostDeploymentAction": "Aktion nach der Bereitstellung", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Anwendungs- und Konfigurationseinstellungen", + "loc.input.label.ConnectionType": "Verbindungstyp", + "loc.input.help.ConnectionType": "Wählen Sie den Dienstverbindungstyp aus, der zum Bereitstellen der Web-App verwendet werden soll.
Wählen Sie \"Veröffentlichungsprofil\" aus, um das von Visual Studio erstellte Veröffentlichungsprofil zu verwenden. [Weitere Informationen](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure-Abonnement", + "loc.input.help.ConnectedServiceName": "Wählen Sie das Azure Resource Manager-Abonnement für die Bereitstellung aus.", + "loc.input.label.PublishProfilePath": "Pfad für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePath": "Pfad des von Visual Studio erstellten Veröffentlichungsprofils", + "loc.input.label.PublishProfilePassword": "Kennwort für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePassword": "Es wird empfohlen, das Kennwort in einer geheimen Variablen zu speichern und diese Variable hier zu verwenden, z. B. $(Password).", + "loc.input.label.WebAppKind": "App Service-Typ", + "loc.input.help.WebAppKind": "Wählen Sie aus zwischen Web-App unter Windows, Web-App unter Linux, Web-App für Container, Funktions-App, Funktions-App unter Linux, Funktions-App für Container und mobile App.", + "loc.input.label.WebAppName": "App Service-Name", + "loc.input.help.WebAppName": "Geben Sie den Namen eines vorhandenen Azure App Service ein, oder wählen Sie ihn aus. Es werden nur App-Dienste für den ausgewählten App-Typ angezeigt.", + "loc.input.label.DeployToSlotOrASEFlag": "In Slot oder App Service-Umgebung bereitstellen", + "loc.input.help.DeployToSlotOrASEFlag": "Wählen Sie die Option für die Bereitstellung in einem vorhandenen Bereitstellungsslot oder in der Azure App Service-Umgebung.
Für beide Ziele benötigt die Aufgabe den Ressourcengruppennamen.
Falls als Bereitstellungsziel ein Slot verwendet wird, erfolgt die Bereitstellung standardmäßig im Produktionsslot. Auch jeder andere vorhandene Slotname kann angegeben werden.
Falls als Bereitstellungsziel eine Azure App Service-Umgebung verwendet wird, behalten Sie den Slotnamen \"production\" bei, und geben Sie nur den Namen der Ressourcengruppe an.", + "loc.input.label.ResourceGroupName": "Ressourcengruppe", + "loc.input.help.ResourceGroupName": "Der Ressourcengruppenname ist erforderlich, wenn als Bereitstellungsziel ein Bereitstellungsslot oder eine App Service-Umgebung verwendet wird.
Geben Sie die Azure-Ressourcengruppe mit der oben angegebenen Azure App Service-Instanz ein, oder wählen Sie sie aus.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Geben Sie einen anderen vorhandenen Slot als den Produktionsslot ein, oder wählen Sie ihn aus.", + "loc.input.label.DockerNamespace": "Registrierung oder Namespace", + "loc.input.help.DockerNamespace": "Eine global eindeutiger Name einer Domäne der obersten Ebene für Ihre spezifische Registrierung oder den Namespace.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name des Repositorys, in dem Containerimages gespeichert werden.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags sind optional. Sie werden von den Registrierungen genutzt, um eine Version für die Docker-Images zu vergeben.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Virtuelle Anwendung", + "loc.input.help.VirtualApplication": "Geben Sie den Namen der virtuellen Anwendung ein, die im Azure-Portal konfiguriert wurde. Die Option ist für Bereitstellungen im App Service-Stamm nicht erforderlich.", + "loc.input.label.Package": "Paket oder Ordner", + "loc.input.help.Package": "Dateipfad zum Paket oder zu einem Ordner mit den durch MSBuild generierten App Service-Inhalten oder zu einer komprimierten ZIP-oder WAR-Datei.
Variablen ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), Platzhalter werden unterstützt.
Beispiel: \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip\" oder \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.war\".", + "loc.input.label.RuntimeStack": "Runtimestapel", + "loc.input.help.RuntimeStack": "Wählen Sie Framework und Version aus.", + "loc.input.label.RuntimeStackFunction": "Runtimestapel", + "loc.input.help.RuntimeStackFunction": "Wählen Sie das Framework und die Version aus. In [diesem Dokument](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) finden Sie die unterstützten Runtimeversionen. Verwenden Sie anstelle alter Werte wie \"DOCKER|microsoft/azure-functions-*\" die neuen Werte aus der Dropdownliste.", + "loc.input.label.StartupCommand": "Startbefehl ", + "loc.input.help.StartupCommand": "Geben Sie den Startbefehl ein. Beispiel:
dotnet exec Dateiname.dll
dotnet Dateiname.dll", + "loc.input.label.ScriptType": "Bereitstellungsskripttyp", + "loc.input.help.ScriptType": "Passen Sie die Bereitstellung durch das Angeben eines Skripts an, das im Azure App Service ausgeführt wird, nachdem die Aufgabe die Bereitstellung erfolgreich abgeschlossen hat. Stellen Sie beispielsweise Pakete für Node-, PHP- oder Python-Anwendungen wieder her. [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inlineskript", + "loc.input.label.ScriptPath": "Bereitstellungsskriptpfad", + "loc.input.label.WebConfigParameters": "Parameter der Datei \"web.config\" für Python-, Node.js-, Go- und Java-Apps generieren", + "loc.input.help.WebConfigParameters": "Ein Standarddatei \"web.config\" wird generiert und in Azure App Service bereitgestellt, wenn diese Datei nicht in der Anwendung vorhanden ist. Die Werte in \"web.config\" können bearbeitet werden und variieren je nach Anwendungsframework. Zum Beispiel enthält \"web.config\" für node.js-Anwendungen Werte für eine Startdatei und ein iis_node-Modul. Dieses Bearbeitungsfeature gilt nur für die generierte Datei \"web.config\". [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App-Einstellungen", + "loc.input.help.AppSettings": "Bearbeiten Sie Web-App-Anwendungseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Konfigurationseinstellungen", + "loc.input.help.ConfigurationSettings": "Bearbeiten Sie Web-App-Konfigurationseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Bereitstellungsmethode auswählen", + "loc.input.help.UseWebDeploy": "Wenn die Option deaktiviert ist, wird die beste Bereitstellungsmethode basierend auf dem App-Typ, dem Paketformat und anderen Parametern automatisch ermittelt.
Klicken Sie auf die Option zum Anzeigen der unterstützten Bereitstellungsmethoden, und wählen Sie eine davon für die Bereitstellung Ihrer App aus.", + "loc.input.label.DeploymentType": "Bereitstellungsmethode", + "loc.input.help.DeploymentType": "Wählen Sie die Bereitstellungsmethode für die App aus.", + "loc.input.label.TakeAppOfflineFlag": "App offline schalten", + "loc.input.help.TakeAppOfflineFlag": "Wählen Sie diese Option aus, um den Azure App Service offline zu schalten, indem vor dem Synchronisierungsvorgang eine Datei \"app_offline.htm\" im App Service-Stammverzeichnis platziert wird. Die Datei wird entfernt, nachdem der Synchronisierungsvorgang erfolgreich abgeschlossen wurde.", + "loc.input.label.SetParametersFile": "SetParameters-Datei", + "loc.input.help.SetParametersFile": "Optional: Speicherort für die zu verwendende Datei \"SetParameters.xml\".", + "loc.input.label.RemoveAdditionalFilesFlag": "Zusätzliche Dateien am Ziel entfernen", + "loc.input.help.RemoveAdditionalFilesFlag": "Wählen Sie diese Option aus, um Dateien im Azure App Service zu löschen, für die keine übereinstimmenden Dateien im Paket oder Ordner des App Service vorhanden sind.

Hierdurch werden auch alle zugehörigen Dateien für Erweiterungen entfernt, die in diesem Azure App Service installiert sind. Um dies zu verhindern, aktivieren Sie das Kontrollkästchen \"Dateien aus App_Data-Ordner ausschließen\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Dateien aus dem Ordner \"App_Data\" ausschließen", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Wählen Sie diese Option aus, um zu verhindern, dass Dateien im Ordner \"App_Data\" in Azure App Service bereitgestellt oder gelöscht werden.", + "loc.input.label.AdditionalArguments": "Zusätzliche Argumente", + "loc.input.help.AdditionalArguments": "Weitere Web Deploy-Argumente mit der Syntax \"-key:value\".
Diese werden angewendet, wenn der Azure App Service bereitgestellt wird. Beispiel: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Weitere Beispiele für Einstellungen für den Web Deploy-Vorgang finden Sie [hier] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Gesperrte Dateien umbenennen", + "loc.input.help.RenameFilesFlag": "Wählen Sie die Option aus, um das msdeploy-Flag MSDEPLOY_RENAME_LOCKED_FILES=1 in den Azure App Service-Anwendungseinstellungen zu aktivieren. Wenn diese Option festgelegt ist, kann \"msdeploy\" gesperrte Dateien umbenennen, die während der App-Bereitstellung gesperrt sind.", + "loc.input.label.XmlTransformation": "XML-Transformation", + "loc.input.help.XmlTransformation": "Die Konfigurationstransformationen werden für \"*.Release.config\" und \"*..config\" in der Datei \"*.config\" ausgeführt.
Konfigurationstransformationen werden vor der Variablenersetzung ausgeführt.
XML-Transformationen werden nur für Windows-Plattformen unterstützt.", + "loc.input.label.XmlVariableSubstitution": "XML-Variablenersetzung", + "loc.input.help.XmlVariableSubstitution": "In der Build- oder Releasepipeline definierte Variablen werden mit den Einträgen \"key\" oder \"name\" in den appSettings-, applicationSettings- und connectionStrings-Abschnitten jeder Konfigurationsdatei und der Datei \"parameters.xml\" abgeglichen. Die Variablenersetzung erfolgt nach den Konfigurationstransformationen.

Hinweis: Wenn in der Releasepipeline und der Umgebung dieselben Variablen definiert wurden, haben die Umgebungsvariablen Vorrang vor den Variablen der Releasepipeline.
", + "loc.input.label.JSONFiles": "JSON-Variablenersetzung", + "loc.input.help.JSONFiles": "Stellen Sie eine durch Zeilenumbrüche getrennte Liste der JSON-Dateien für die Ersetzung der Variablenwerte bereit. Die Dateinamen müssen relativ zum Stammordner angegeben werden.
Um geschachtelte oder hierarchische JSON-Variablen zu ersetzen, geben Sie diese mithilfe von JSONPath-Ausdrücken an.

Um etwa im Beispiel unten den Wert von \"ConnectionString\" zu ersetzen, müssen Sie in der Build- oder Releasepipeline (oder der Umgebung der Releasepipeline) eine Variable als \"Data.DefaultConnection.ConnectionString\" definieren.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Die Variablenersetzung wird nach den Konfigurationstransformationen durchgeführt.

Hinweis: Pipelinevariablen sind von der Ersetzung ausgenommen.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Ungültiges App Service-Paket oder ungültiger App Service-Ordnerpfad angegeben: %s", + "loc.messages.SetParamFilenotfound0": "Datei zum Festlegen der Parameter nicht gefunden: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Die XML-Transformationen wurden erfolgreich angewendet.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Die Dienstverbindungsdetails für Azure App Service wurden abgerufen: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Fehler: Keine solche Bereitstellungsmethode vorhanden.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Die Dienstverbindungsdetails für Azure App Service können nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Die Dienstverbindungsdetails für die Azure-Ressource \"%s\" konnten nicht abgerufen werden. Statuscode: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Der Bereitstellungsverlauf unter \"%s\" wurde erfolgreich aktualisiert.", + "loc.messages.Failedtoupdatedeploymenthistory": "Fehler beim Aktualisieren des Bereitstellungsverlaufs. Fehler: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNUNG: Der Bereitstellungsstatus kann nicht aktualisiert werden: Der SCM-Endpunkt ist für diese Website nicht aktiviert.", + "loc.messages.Unabletoretrievewebconfigdetails": "Die App Service-Konfigurationsdetails können nicht abgerufen werden. Statuscode: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Die App Service-Anwendungseinstellungen können nicht abgerufen werden. [Statuscode: %s, Fehlermeldung: %s]", + "loc.messages.Unabletoupdatewebappsettings": "Die App Service-Anwendungseinstellungen können nicht aktualisiert werden. Statuscode: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Der Bereitstellungsstatus kann nicht aktualisiert werden: Die eindeutige Bereitstellungs-ID kann nicht abgerufen werden.", + "loc.messages.PackageDeploymentSuccess": "Web-Paket für den App Service erfolgreich bereitgestellt.", + "loc.messages.PackageDeploymentFailed": "Fehler beim Bereitstellen des Web-Pakets für den App Service.", + "loc.messages.Runningcommand": "Befehl wird ausgeführt: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Webpaket \"%s\" wird im virtuellen Pfad (physischen Pfad) bereitgestellt: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Das Paket \"%s\" wurde unter Verwendung des Kudu-Diensts erfolgreich unter \"%s\" bereitgestellt.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Fehler beim Bereitstellen des App Service-Pakets mithilfe des Kudu-Diensts: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Der App Service kann nicht bereitgestellt werden. Fehlercode: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Mit MSDeploy generierte Pakete werden nur für Windows-Plattformen unterstützt.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Nicht unterstützte installierte Version %s für MSDeploy gefunden. Version 3 oder höher muss installiert sein.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Der Speicherort von MS Deploy wurde nicht in der Registrierung auf dem Computer gefunden (Fehler: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Es wurde kein Paket mit dem angegebenen Muster gefunden: %s
überprüfen, ob das in der Aufgabe erwähnte Paket als Artefakt im Build oder in einer vorherigen Stage veröffentlicht und im aktuellen Auftrag heruntergeladen wurde.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Mindestens zwei Pakete stimmten mit dem angegebenen Suchmuster überein: %s. Schränken Sie das Suchmuster ein.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Anwendung offline schalten\" erneut bereitzustellen.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Gesperrte Dateien umbenennen\" erneut bereitzustellen.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Keine JSON-Datei stimmte mit dem angegebenen Muster überein: %s", + "loc.messages.Configfiledoesntexists": "Die Konfigurationsdatei \"%s\" ist nicht vorhanden.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Fehler beim Schreiben in die Konfigurationsdatei \"%s\". Fehler: %s ", + "loc.messages.AppOfflineModeenabled": "Der App-Offlinemodus wurde aktiviert.", + "loc.messages.Failedtoenableappofflinemode": "Fehler beim Aktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.AppOflineModedisabled": "Der App-Offlinemodus wurde deaktiviert.", + "loc.messages.FailedtodisableAppOfflineMode": "Fehler beim Deaktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "XML-Transformationen können auf einer Nicht-Windows-Plattform nicht ausgeführt werden.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML-Transformationsfehler beim Transformieren von \"%s\" unter Verwendung von \"%s\".", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Eine Veröffentlichung unter Verwendung von webdeploy-Optionen wird nur unterstützt, wenn der Windows-Agent verwendet wird. ", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Die Veröffentlichung über die ZIP Deploy-Option wird für den msBuild-Pakettyp nicht unterstützt.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Die Veröffentlichung über die ZIP Deploy-Option wird für virtuelle Anwendungen nicht unterstützt.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Bei der Veröffentlichung über die Optionen \"ZIP Deploy\" oder \"RunFromZip\" wird die WAR-Dateibereitstellung nicht unterstützt.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Bei der Veröffentlichung über RunFromZip werden Skripts nach der Bereitstellung möglicherweise nicht unterstützt, wenn diese Änderungen an wwwroot vornehmen, weil der Ordner schreibgeschützt ist.", + "loc.messages.ResourceDoesntExist": "Die Ressource \"%s\" ist nicht vorhanden. Die Ressource muss vor der Bereitstellung vorhanden sein.", + "loc.messages.EncodeNotSupported": "Erkannte Codierung der Datei \"%s\": %s. Eine Variablenersetzung wird für die Dateicodierung \"%s\" nicht unterstützt. Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Die Codierung der Datei \"%s\" wurde nicht erkannt (typeCode: %s). Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Der Dateipuffer ist zu klein, um den Codierungstyp zu erkennen: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Fehler beim Aktualisieren der App Service-Konfigurationsdetails. Fehler: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Die App Service-Konfigurationsdetails wurden erfolgreich aktualisiert.", + "loc.messages.RequestedURLforkuduphysicalpath": "Angeforderte URL für physischen Kudu-Pfad: %s", + "loc.messages.Physicalpathalreadyexists": "Der physische Pfad \"%s\" ist bereits vorhanden.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Der physische Kudu-Pfad wurde erfolgreich erstellt: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Fehler beim Erstellen des physischen Kudu-Pfads. Fehler: %s", + "loc.messages.FailedtocheckphysicalPath": "Fehler beim Überprüfen des physischen Kudu-Pfads. Fehlercode: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Die virtuelle Anwendung ist nicht vorhanden: %s", + "loc.messages.JSONParseError": "Die JSON-Datei konnte nicht analysiert werden: %s. Fehler: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Die JSON-Variablenersetzung wurde erfolgreich angewendet.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML-Variablenersetzung erfolgreich angewendet.", + "loc.messages.failedtoUploadFileToKudu": "Datei \"%s\" kann nicht in Kudu (%s) hochgeladen werden. Statuscode: %s", + "loc.messages.failedtoUploadFileToKuduError": "Hochladen der Datei: %s auf Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ExecuteScriptOnKudu": "Das angegebene Skript wird im Kudu-Dienst ausgeführt.", + "loc.messages.FailedToRunScriptOnKuduError": "Das Skript kann nicht im Kudu-Dienst ausgeführt werden. Fehler: %s", + "loc.messages.FailedToRunScriptOnKudu": "Ausführen des Skripts in Kudu nicht möglich: %s. Statuscode: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Skript in Kudu erfolgreich ausgeführt.", + "loc.messages.ScriptExecutionOnKuduFailed": "Das ausgeführte Skript hat \"%s\" als Rückgabecode zurückgegeben. Fehler: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Die Datei \"%s\" kann nicht aus Kudu (%s) gelöscht werden. Statuscode: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Löschen der Datei: %s von Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ScriptFileNotFound": "Skriptdatei \"%s\" nicht gefunden.", + "loc.messages.InvalidScriptFile": "Ungültige Skriptdatei \"%s\" angegeben. Gültige Erweiterungen sind \".bat\" und \".cmd\" für Windows und \".sh\" für Linux.", + "loc.messages.RetryForTimeoutIssue": "Fehler beim Ausführen des Skripts mit Zeitüberschreitung. Es wird noch mal versucht.", + "loc.messages.stdoutFromScript": "Standardausgabe von Skript:", + "loc.messages.stderrFromScript": "Standardfehler von Skript:", + "loc.messages.WebConfigAlreadyExists": "web.config-Datei ist bereits vorhanden. Sie wird nicht erstellt.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config-Datei erfolgreich erstellt.", + "loc.messages.FailedToGenerateWebConfig": "Fehler beim Erstellen von \"web.config\". %s", + "loc.messages.FailedToGetKuduFileContent": "Dateiinhalt konnte nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Dateiinhalt konnte nicht abgerufen werden: %s. Fehler: %s", + "loc.messages.ScriptStatusTimeout": "Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden.", + "loc.messages.PollingForFileTimeOut": "Der Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden. Sie können das Zeitlimit erhöhen, indem Sie die erforderliche Minutenzahl für die Variable \"appservicedeploy.retrytimeout\" festlegen.", + "loc.messages.InvalidPollOption": "Ungültige Abrufoption angegeben: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Das Attribut \"-appType\" fehlt in den Parametern \"Web.config\". Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" und \"Go\".
Beispiel: \"-appType python_Bottle\" (ohne Anführungszeichen) im Fall von Python Bottle-Framework.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Der Pfad für die Datei \"settings.py\" von DJANGO_SETTINGS_MODULE 'settings.py' wurde nicht gefunden. Überprüfen Sie, ob die Datei \"settings.py\" existiert, oder geben Sie den korrekten Pfad in der Parametereingabe \"Web.config\" im folgenden Format an: \"-DJANGO_SETTINGS_MODULE .settings\".", + "loc.messages.FailedToApplyTransformation": "Die Transformation für das angegebene Paket kann nicht angewendet werden. Führen Sie die folgenden Schritte aus.", + "loc.messages.FailedToApplyTransformationReason1": "1. Prüfen Sie, ob die Transformation für das beim Build generierte MSBuild-Paket bereits angewendet wurde. Ist dies der Fall, entfernen Sie das Tag aus allen Konfigurationen in der CSPROJ-Datei, und führen Sie den Build erneut aus. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Stellen Sie sicher, dass sich die Konfigurationsdatei und die Transformationsdateien im selben Ordner im Paket befinden.", + "loc.messages.AutoParameterizationMessage": "ConnectionString-Attribute in Web.config ist standardmäßig parametrisiert. Beachten Sie, dass die Transformation keine Auswirkungen auf connectionString-Attribute hat, da der Wert bei der Bereitstellung durch Dateien vom Typ \"Parameters.xml\" oder \"SetParameters.xml\" überschrieben wird. Sie können die automatische Parametrisierung deaktivieren, indem Sie beim Erstellung des MSBuild-Pakets die Einstellung \"/p:AutoParameterizationWebConfigConnectionStrings=False\" festlegen.", + "loc.messages.UnsupportedAppType": "App-Typ \"%s\" wird beim Erstellen von \"Web.config\" nicht unterstützt. Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\" und \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Abrufen der Autoritäts-URL nicht möglich.", + "loc.messages.UnableToFetchActiveDirectory": "Abrufen der Active Directory-Ressourcen-ID nicht möglich.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Runtimestapel und Startbefehl erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Fehler beim Aktualisieren des Runtimestapels und des Startbefehls. Fehler: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "App-Einstellungen erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Fehler beim Aktualisieren der App-Einstellungen. Fehler: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Fehler beim Abrufen von AzureRM-WebApp-Metadaten. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM-WebApp-Metadaten können nicht aktualisiert werden. Fehlercode: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Die Anmeldeinformationen für Azure Container Registry konnten nicht abgerufen werden. [Statuscode: %s]", + "loc.messages.UnableToReadResponseBody": "Antworttext konnte nicht gelesen werden. Fehler: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp-Konfigurationsdetails konnten nicht aktualisiert werden. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Releaseanmerkung für Application Insights-Ressource \"%s\" wird hinzugefügt.", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Releaseanmerkung erfolgreich zu Application Insight hinzugefügt: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Fehler beim Hinzufügen einer Releaseanmerkung. %s", + "loc.messages.RenameLockedFilesEnabled": "Umbenennung gesperrter Dateien für App Service aktiviert.", + "loc.messages.FailedToEnableRenameLockedFiles": "Fehler beim Aktivieren der Umbenennung gesperrter Dateien. Fehler: %s", + "loc.messages.WebJobsInProgressIssue": "Einige WebJobs-Instanzen werden gerade ausgeführt und verhindern, dass die Bereitstellung Dateien entfernt. Sie können die Option \"Zusätzliche Dateien am Ziel entfernen\" deaktivieren oder fortlaufende Aufträge vor der Bereitstellung beenden.", + "loc.messages.FailedToFetchKuduAppSettings": "Fehler beim Abrufen von Kudu-App-Einstellungen. Fehler: %s", + "loc.messages.FailedToCreatePath": "Fehler beim Erstellen des Pfads \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFile": "Fehler beim Löschen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFolder": "Fehler beim Löschen des Ordners \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToUploadFile": "Fehler beim Hochladen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToGetFileContent": "Fehler beim Abrufen des Dateiinhalts \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToListPath": "Fehler beim Auflisten von Pfad \"%s\" aus Kudu. Fehler: %s", + "loc.messages.RetryToDeploy": "Es wird erneut versucht, das Paket bereitzustellen.", + "loc.messages.FailedToGetAppServiceDetails": "Fehler beim Abrufen der App Service-Details \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Fehler beim Abrufen des Veröffentlichungsprofils für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Fehler beim Aktualisieren der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Fehler beim Abrufen der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Fehler beim Patchen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Fehler beim Aktualisieren der App-Dienstkonfiguration \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Fehler beim Abrufen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Fehler beim Abrufen der Anmeldeinformationen für die Veröffentlichung für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Fehler beim Abrufen der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Fehler beim Aktualisieren der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Es wird versucht, die App Service-Konfigurationseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Die App Service-Konfigurationseinstellungen wurden aktualisiert.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Es wird versucht, die App Service-Anwendungseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service-Anwendungseinstellungen sind bereits vorhanden.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service-Verbindungszeichenfolgen sind bereits vorhanden.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Die App Service-Anwendungseinstellungen und die Kudu-Anwendungseinstellungen wurden aktualisiert.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Mehrere Ressourcengruppen für App Service \"%s\" gefunden.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Fehler bei der Paketbereitstellung über ZIP Deploy. Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.PackageDeploymentInitiated": "Die Paketbereitstellung über ZIP Deploy wurde eingeleitet.", + "loc.messages.WarPackageDeploymentInitiated": "Die Paketbereitstellung über WAR Deploy wurde eingeleitet.", + "loc.messages.FailedToGetDeploymentLogs": "Fehler beim Abrufen von Bereitstellungsprotokollen. Fehler: %s", + "loc.messages.GoExeNameNotPresent": "Der Name der Go-EXE-Datei ist nicht vorhanden.", + "loc.messages.WarDeploymentRetry": "Die Bereitstellung der WAR-Datei wird wiederholt, weil sie zuvor nicht erfolgreich erweitert wurde.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Stellen Sie sicher, dass der Computer das TLS 1.2-Protokoll oder eine höhere Version verwendet. Weitere Informationen zum Aktivieren von TLS auf Ihrem Computer finden Sie unter https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Ein Zugriffstoken für Azure konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Konfigurieren Sie die verwaltete Dienstidentität (MSI) für den virtuellen Computer (https://aka.ms/azure-msi-docs). Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.XmlParsingFailed": "Die publishProfileXML-Datei konnte nicht analysiert werden. Fehler: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Die [%s]-Eigenschaft ist im Veröffentlichungsprofil nicht vorhanden.", + "loc.messages.InvalidConnectionType": "Ungültiger Dienstverbindungstyp", + "loc.messages.InvalidImageSourceType": "Ungültiger Imagequelltyp", + "loc.messages.InvalidPublishProfile": "Die Veröffentlichungsprofildatei ist ungültig.", + "loc.messages.ASE_SSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie in der Build- oder Releasepipeline eine Variable mit dem Namen VSTS_ARM_REST_IGNORE_SSL_ERRORS auf den Wert TRUE festlegen.", + "loc.messages.ZipDeployLogsURL": "ZIP Deploy-Protokolle können unter %s angezeigt werden.", + "loc.messages.DeployLogsURL": "Bereitstellungsprotokolle können unter %s angezeigt werden.", + "loc.messages.AppServiceApplicationURL": "URL der App Service-Anwendung: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie \"-allowUntrusted\" in zusätzlichen Argumenten der Web Deploy-Option übergeben.", + "loc.messages.FailedToGetResourceID": "Fehler beim Abrufen der Ressourcen-ID für Ressourcentyp \"%s\" und Ressourcenname \"%s\". Fehler: %s", + "loc.messages.JarPathNotPresent": "Der Java-JAR-Pfad ist nicht vorhanden.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Fehler beim Aktualisieren der Application Insights-Ressource \"%s\". Fehler: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Wechseln Sie Web Deploy zum \"Aus Paket ausführen\", um FILE_IN_USE-Fehler zu vermeiden. Beachten Sie, dass \"Aus Paket ausführen\" keine Unterstützung für den msBuild-Pakettyp bietet. Ändern Sie Ihr Paketformat, um diese Bereitstellungsmethode zu verwenden." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..545ed17423d8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,238 @@ +{ + "loc.friendlyName": "Azure App Service deploy", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "loc.instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "loc.releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "File Transforms & Variable Substitution Options", + "loc.group.displayName.AdditionalDeploymentOptions": "Additional Deployment Options", + "loc.group.displayName.AdditionalDeploymentOptionsLinux": "Additional Deployment Options", + "loc.group.displayName.PostDeploymentAction": "Post Deployment Action", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Application and Configuration Settings", + "loc.input.label.ConnectionType": "Connection type", + "loc.input.help.ConnectionType": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure subscription", + "loc.input.help.ConnectedServiceName": "Select the Azure Resource Manager subscription for the deployment.", + "loc.input.label.PublishProfilePath": "Publish profile path", + "loc.input.help.PublishProfilePath": "Path of the Publish profile created from Visual Studio", + "loc.input.label.PublishProfilePassword": "Publish profile password", + "loc.input.help.PublishProfilePassword": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "loc.input.label.WebAppKind": "App Service type", + "loc.input.help.WebAppKind": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "loc.input.label.WebAppName": "App Service name", + "loc.input.help.WebAppName": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "loc.input.label.DeployToSlotOrASEFlag": "Deploy to Slot or App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "loc.input.label.ResourceGroupName": "Resource group", + "loc.input.help.ResourceGroupName": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Enter or Select an existing Slot other than the Production slot.", + "loc.input.label.DockerNamespace": "Registry or Namespace", + "loc.input.help.DockerNamespace": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Virtual application", + "loc.input.help.VirtualApplication": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root.", + "loc.input.label.Package": "Package or folder", + "loc.input.help.Package": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Runtime Stack", + "loc.input.help.RuntimeStack": "Select the framework and version.", + "loc.input.label.RuntimeStackFunction": "Runtime Stack", + "loc.input.help.RuntimeStackFunction": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "loc.input.label.StartupCommand": "Startup command ", + "loc.input.help.StartupCommand": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Deployment script type", + "loc.input.help.ScriptType": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inline Script", + "loc.input.label.ScriptPath": "Deployment script path", + "loc.input.label.WebConfigParameters": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "loc.input.help.WebConfigParameters": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App settings", + "loc.input.help.AppSettings": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Configuration settings", + "loc.input.help.ConfigurationSettings": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Select deployment method", + "loc.input.help.UseWebDeploy": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app.", + "loc.input.label.DeploymentType": "Deployment method", + "loc.input.help.DeploymentType": "Choose the deployment method for the app.", + "loc.input.label.TakeAppOfflineFlag": "Take App Offline", + "loc.input.help.TakeAppOfflineFlag": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully.", + "loc.input.label.SetParametersFile": "SetParameters file", + "loc.input.help.SetParametersFile": "Optional: location of the SetParameters.xml file to use.", + "loc.input.label.RemoveAdditionalFilesFlag": "Remove additional files at destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclude files from the App_Data folder", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service.", + "loc.input.label.AdditionalArguments": "Additional arguments", + "loc.input.help.AdditionalArguments": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rename locked files", + "loc.input.help.RenameFilesFlag": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment", + "loc.input.label.XmlTransformation": "XML transformation", + "loc.input.help.XmlTransformation": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform.", + "loc.input.label.XmlVariableSubstitution": "XML variable substitution", + "loc.input.help.XmlVariableSubstitution": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
", + "loc.input.label.JSONFiles": "JSON variable substitution", + "loc.input.help.JSONFiles": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution.", + "loc.input.label.DeploymentTypeLinux": "Deployment method", + "loc.input.help.DeploymentTypeLinux": "Choose the deployment method for the app.", + "loc.input.label.CleanDeploymentFlag": "Enable clean deployment", + "loc.input.help.CleanDeploymentFlag": "Deployment mode for complete sync (clean) deployment", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "loc.messages.SetParamFilenotfound0": "Set parameters file not found: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "loc.messages.Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "loc.messages.PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "loc.messages.PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "loc.messages.Runningcommand": "Running command: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "loc.messages.Configfiledoesntexists": "Configuration file %s doesn't exist.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "loc.messages.AppOfflineModeenabled": "App offline mode enabled.", + "loc.messages.Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "loc.messages.AppOflineModedisabled": "App offline mode disabled.", + "loc.messages.FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "loc.messages.ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "loc.messages.EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "loc.messages.RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "loc.messages.Physicalpathalreadyexists": "Physical path '%s' already exists", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "loc.messages.FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "loc.messages.JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "loc.messages.failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "loc.messages.failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "loc.messages.FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "Script file '%s' not found.", + "loc.messages.InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "loc.messages.RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "loc.messages.stdoutFromScript": "Standard output from script: ", + "loc.messages.stderrFromScript": "Standard error from script: ", + "loc.messages.WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "loc.messages.FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "loc.messages.PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "loc.messages.InvalidPollOption": "Invalid polling option provided: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "loc.messages.AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "loc.messages.FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "loc.messages.AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "loc.messages.UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "loc.messages.UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "loc.messages.UnableToReadResponseBody": "Unable to read response body. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "loc.messages.RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "loc.messages.FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "loc.messages.FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Retrying to deploy the package.", + "loc.messages.FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "loc.messages.PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "loc.messages.PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "loc.messages.OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "loc.messages.WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "loc.messages.FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "loc.messages.GoExeNameNotPresent": "Go exe name is not present", + "loc.messages.WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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.XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "loc.messages.InvalidConnectionType": "Invalid service connection type", + "loc.messages.InvalidImageSourceType": "Invalid Image source Type", + "loc.messages.InvalidPublishProfile": "Publish profile file is invalid.", + "loc.messages.ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "loc.messages.ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "loc.messages.DeployLogsURL": "Deploy logs can be viewed at %s", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "loc.messages.FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "loc.messages.JarPathNotPresent": "Java jar path is not present", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "loc.messages.MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy .", + "loc.messages.RunFromPackageAppsetting": "NOTE: Run From Package makes wwwroot read-only, so you will receive an error when writing files to this directory." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..f10de1f4b8fc --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Implementación de Azure App Service", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Implementar en Azure App Service una aplicación de API, móvil o web con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Implementación de Azure App Service: $(WebAppName)", + "loc.releaseNotes": "Novedades de la versión 4.*
Compatibilidad con la implementación desde archivo zip, la ejecución desde paquete y la implementación desde archivo WAR [detalles aquí](https://aka.ms/appServiceDeploymentMethods)
Compatibilidad con los entornos de App Service Environment
Mejora de la interfaz de usuario para detectar diferentes tipos de instancias de App Service compatibles con la tarea
La ejecución desde el paquete es el método de implementación preferido, que hace que los archivos de la carpeta wwwroot sean de solo lectura
Haga clic [aquí](https://aka.ms/azurermwebdeployreadme) para obtener más información.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformaciones de archivos y opciones de sustitución de variables", + "loc.group.displayName.AdditionalDeploymentOptions": "Opciones de implementación adicionales", + "loc.group.displayName.PostDeploymentAction": "Acción posterior a la implementación", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Configuración y opciones de la aplicación", + "loc.input.label.ConnectionType": "Tipo de conexión", + "loc.input.help.ConnectionType": "Seleccione el tipo de conexión de servicio que se va a usar para implementar la aplicación web.
Seleccione Perfil de publicación para usar el perfil de publicación creado por Visual Studio. [Más información] (https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Suscripción a Azure", + "loc.input.help.ConnectedServiceName": "Seleccione la suscripción de Azure Resource Manager para la implementación.", + "loc.input.label.PublishProfilePath": "Ruta de acceso del perfil de publicación", + "loc.input.help.PublishProfilePath": "Ruta de acceso del perfil de publicación creado desde Visual Studio", + "loc.input.label.PublishProfilePassword": "Contraseña del perfil de publicación", + "loc.input.help.PublishProfilePassword": "Se recomienda almacenar la contraseña en una variable secreta y utilizar esa variable aquí; por ejemplo, $(Password).", + "loc.input.label.WebAppKind": "Tipo de App Service", + "loc.input.help.WebAppKind": "Elija entre Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers y Mobile App.", + "loc.input.label.WebAppName": "Nombre de App Service", + "loc.input.help.WebAppName": "Escriba o seleccione el nombre de una instancia existente de Azure App Service. Solo se enumerarán las instancias de App Service basadas en el tipo de aplicación seleccionado.", + "loc.input.label.DeployToSlotOrASEFlag": "Implementar en la ranura o en App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Seleccione la opción para implementar en una ranura de implementación o entorno de Azure App Service Environment existente.
Para ambos destinos, la tarea necesita el nombre del grupo de recursos.
En caso de que el destino de implementación sea una ranura, la implementación se realiza de forma predeterminada en la ranura de producción. También se puede proporcionar cualquier otro nombre de ranura existente.
En caso de que el destino de implementación sea un entorno de Azure App Service Environment, deje el nombre de la ranura como \"Producción\" y especifique el nombre del grupo de recursos.", + "loc.input.label.ResourceGroupName": "Grupo de recursos", + "loc.input.help.ResourceGroupName": "El nombre del grupo de recursos es necesario cuando el destino de implementación es una ranura de implementación o una instancia de App Service Environment.
Escriba o seleccione el grupo de recursos de Azure que contiene el servicio de Azure App Service especificado anteriormente.", + "loc.input.label.SlotName": "Ranura", + "loc.input.help.SlotName": "Escriba o seleccione un espacio que no sea el de producción.", + "loc.input.label.DockerNamespace": "Registro o espacio de nombres", + "loc.input.help.DockerNamespace": "Nombre de dominio de nivel superior único global para su espacio de nombres o Registro específico.
Nota: El nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerRepository": "Imagen", + "loc.input.help.DockerRepository": "Nombre del repositorio en el que se almacenan las imágenes del contenedor.
Nota: Un nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerImageTag": "Etiqueta", + "loc.input.help.DockerImageTag": "Las etiquetas son opcionales. Este es el mecanismo que los registros usan para asignar una versión a las imágenes de Docker.
Nota: El nombre de imagen completo tiene el formato: \"'`/`:`\". Por ejemplo, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Aplicación virtual", + "loc.input.help.VirtualApplication": "Especifique el nombre de la aplicación virtual que se ha configurado en Azure Portal. Esta opción no es necesaria para implementaciones en la raíz de App Service.", + "loc.input.label.Package": "Paquete o carpeta", + "loc.input.help.Package": "Ruta de acceso al paquete o carpeta que contiene el contenido de App Service generado por MSBuild o un archivo zip o war comprimido.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), se admiten caracteres comodín.
Por ejemplo, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStack": "Seleccione el marco y la versión.", + "loc.input.label.RuntimeStackFunction": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStackFunction": "Seleccione el marco y la versión. Consulte [este documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) para ver las versiones compatibles del entorno de ejecución. Los valores anteriores, como \"DOCKER|microsoft/azure-functions-*\", están en desuso; use los valores nuevos de la lista desplegable.", + "loc.input.label.StartupCommand": "Comando de inicio ", + "loc.input.help.StartupCommand": "Escriba el comando de inicio. Por ejemplo,
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo de script de implementación", + "loc.input.help.ScriptType": "Para personalizar la implementación, proporcione un script que se ejecute en Azure App Service una vez que la tarea haya completado la implementación correctamente. Por ejemplo, restaure paquetes para aplicaciones de Node, PHP y Python. [Más información](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script en línea", + "loc.input.label.ScriptPath": "Ruta de acceso del script de implementación", + "loc.input.label.WebConfigParameters": "Generar parámetros de web.config para aplicaciones de Python, Node.js, Go y Java", + "loc.input.help.WebConfigParameters": "Se generará un archivo web.config estándar y se implementará en Azure App Service si la aplicación no tiene uno. Los valores de web.config se pueden editar y pueden variar en función del marco de trabajo de la aplicación. Por ejemplo, para la aplicación node.js, web.config tendrá los valores de archivo de inicio y del módulo iis_node. La característica de edición es solo para el web.config generado. [Más información](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Configuración de la aplicación", + "loc.input.help.AppSettings": "Edite la configuración de la aplicación web siguiendo la sintaxis -clave valor. Si un valor contiene espacios, debe ponerlo entre comillas dobles.
Ejemplo: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Opciones de configuración", + "loc.input.help.ConfigurationSettings": "Edite opciones de configuración de aplicación web la sintaxis-valor de clave. Valor que contenga espacios debe incluirse entre comillas dobles.
Ejemplo: - phpVersion 5.6 - linuxFxVersion: nodo|6.11", + "loc.input.label.UseWebDeploy": "Seleccionar el método de implementación", + "loc.input.help.UseWebDeploy": "Si está desactivado, se detectará automáticamente el mejor método de implementación en función de su tipo de aplicación, el formato del paquete y otros parámetros.
Seleccione la opción para ver los métodos de implementación compatibles y elija uno para implementar su aplicación.", + "loc.input.label.DeploymentType": "Método de implementación", + "loc.input.help.DeploymentType": "Elija el método de implementación para la aplicación.", + "loc.input.label.TakeAppOfflineFlag": "Desconectar la aplicación", + "loc.input.help.TakeAppOfflineFlag": "Seleccione esta opción para poner sin conexión Azure App Service colocando el archivo app_offline.htm en el directorio raíz de App Service antes de que comience la operación de sincronización. El archivo se quitará cuando la operación de sincronización finalice correctamente.", + "loc.input.label.SetParametersFile": "Archivo SetParameters", + "loc.input.help.SetParametersFile": "Opcional: ubicación del archivo SetParameters.xml que debe usarse.", + "loc.input.label.RemoveAdditionalFilesFlag": "Quitar archivos adicionales en el destino", + "loc.input.help.RemoveAdditionalFilesFlag": "Seleccione la opción para eliminar archivos en la instancia de Azure App Service que no tiene archivos coincidentes en la carpeta o el paquete de App Service.

Nota: Al hacerlo, también se quitarán todos los archivos relacionados con cualquier extensión instalada en esta instancia de Azure App Service. Para evitarlo, seleccione la casilla \"Excluir archivos de la carpeta App_Data\". ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Excluir archivos de la carpeta App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Seleccione esta opción para evitar que los archivos de la carpeta App_Data se implementen en Azure App Service o se eliminen de ese servicio.", + "loc.input.label.AdditionalArguments": "Argumentos adicionales", + "loc.input.help.AdditionalArguments": "Argumentos adicionales de Web Deploy que siguen la sintaxis -clave:valor.
Se aplicarán cuando se implemente la instancia de Azure App Service. Ejemplo: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Para más ejemplos de configuración de la operación de Web Deploy, consulte [aquí] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Cambiar nombre de archivos bloqueados", + "loc.input.help.RenameFilesFlag": "Seleccione la opción para habilitar la marca de msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 en la configuración de la aplicación de Azure App Service. Si está establecida, la opción permite que msdeploy cambie el nombre de los archivos bloqueados que se bloquean durante la implementación de la aplicación", + "loc.input.label.XmlTransformation": "Transformación XML", + "loc.input.help.XmlTransformation": "Las transformaciones de configuración se ejecutarán para \"*.Release.config\" y \"*..config\" en el \"archivo *.config\".
Las transformaciones de configuración se ejecutarán antes de la sustitución de variables.
Las transformaciones XML solo se admiten para la plataforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sustitución de variables XML", + "loc.input.help.XmlVariableSubstitution": "Las variables que se definen en las canalizaciones de compilación o de versión se compararán con las entradas \"key\" o \"name\" de las secciones appSettings, applicationSettings y connectionStrings de cualquier archivo de configuración y parameters.xml. La sustitución de variable tiene lugar después de las transformaciones de configuración.

Nota: Si las mismas variables están definidas en la canalización de versión y en el entorno, las variables de entorno sustituirán las variables de la canalización de versión.
", + "loc.input.label.JSONFiles": "Sustitución de variables JSON", + "loc.input.help.JSONFiles": "Proporcione una nueva lista separada por líneas de los archivos JSON para sustituir los valores de variable. Los nombres de archivos que se proporcionen deben ser relativos a la carpeta raíz.
Para sustituir las variables JSON anidadas o jerárquicas, especifíquelas mediante expresiones JSONPath.

Por ejemplo, para reemplazar el valor de \"ConnectionString\" en el ejemplo siguiente, debe definir una variable como \"Data.DefaultConnection.ConnectionString\" en la canalización de compilación o versión (o el entorno de la canalización de versión).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sustitución de variables se ejecuta una vez que se transforma la configuración.

Nota: Las variables de la canalización se excluyen de la sustitución.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Paquete App Service o ruta de acceso de carpeta proporcionados no válidos: %s", + "loc.messages.SetParamFilenotfound0": "No se ha encontrado el archivo de parámetros establecido: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Las transformaciones XML se aplicaron correctamente", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Se obtuvieron detalles de conexión de servicio para Azure App Service: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No existe tal método de implementación", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "No se pueden recuperar los detalles de la conexión de servicio para Azure App Service: %s. Código de estado: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "No se pueden recuperar los detalles de la conexión de servicio para el recurso de Azure \"%s\". Código de estado: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "El historial de implementación se actualizó correctamente en %s", + "loc.messages.Failedtoupdatedeploymenthistory": "No se pudo actualizar el historial de implementación. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ADVERTENCIA : no se puede actualizar el estado de implementación, el punto de conexión de SCM no está habilitado para este sitio web", + "loc.messages.Unabletoretrievewebconfigdetails": "No se pueden recuperar los detalles de configuración de la instancia de App Service. Código de estado: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "No se puede recuperar la configuración de aplicación de App Service. [Código de estado: \"%s\", Mensaje de error: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "No se puede actualizar la configuración de aplicación de la instancia de App Service. Código de estado: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "No se puede actualizar el estado de implementación : no se puede recuperar el id. de implementación único", + "loc.messages.PackageDeploymentSuccess": "El paquete web se implementó correctamente en App Service.", + "loc.messages.PackageDeploymentFailed": "No se pudo implementar el paquete web en App Service.", + "loc.messages.Runningcommand": "Ejecutando el comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Implementando el paquete web : %s en una ruta de acceso virtual (ruta de acceso física): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "El paquete %s se implementó correctamente mediante el servicio Kudu en %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "No se pudo implementar el paquete App Service mediante el servicio Kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "No se puede implementar App Service debido al código de error: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Los paquetes generados por MSDeploy solo se admiten para la plataforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Versión instalada no admitida: se encontró %s para MSDeploy, pero la versión mínima admitida es 3 o posterior.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "No se puede encontrar la ubicación de MS Deploy del Registro en la máquina (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No se encontró ningún paquete con el patrón especificado: %s
Compruebe si el paquete mencionado en la tarea se publica como artefacto en la compilación o en una fase anterior y se descarga en el trabajo actual.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Más de un paquete coincidió con el patrón especificado: %s. Restrinja el patrón de búsqueda.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Poner la aplicación sin conexión seleccionada.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Cambiar de nombre archivos bloqueados seleccionada.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Ningún archivo JSON coincidía con un patrón específico: %s.", + "loc.messages.Configfiledoesntexists": "El archivo de configuración %s no existe.", + "loc.messages.Failedtowritetoconfigfilewitherror": "No se pudo escribir en el archivo de configuración %s con el error: %s", + "loc.messages.AppOfflineModeenabled": "Modo de aplicación sin conexión habilitado.", + "loc.messages.Failedtoenableappofflinemode": "No se pudo habilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.AppOflineModedisabled": "Modo de aplicación sin conexión deshabilitado.", + "loc.messages.FailedtodisableAppOfflineMode": "No se pudo deshabilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "No se pueden realizar las transformaciones XML en una plataforma que no es Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Error de transformación XML al transformar %s mediante %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Las opciones de publicación mediante webdeploy solo se admiten cuando se usa el agente de Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publicación mediante la opción de implementación desde un archivo zip no se admite para el tipo de paquete de MSBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publicación mediante la opción de implementación desde un archivo zip no se admite para una aplicación virtual.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publicación mediante las opciones de RunFromZip o de implementación desde un archivo zip no admiten la implementación de archivos war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publicación mediante RunFromZip podría no admitir el script posterior a la implementación si realiza cambios en wwwroot, puesto que la carpeta es de solo lectura.", + "loc.messages.ResourceDoesntExist": "El recurso \"%s\" no existe. Este debe existir antes de la implementación.", + "loc.messages.EncodeNotSupported": "Se detectó una codificación de archivos del archivo %s como %s. No se admite la sustitución de variables con la codificación de archivos %s. Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "No se puede detectar la codificación del archivo %s (typeCode: %s). Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.ShortFileBufferError": "El búfer de archivos es demasiado breve para detectar el tipo de codificación : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "No se pudieron actualizar los detalles de configuración de App Service. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Los detalles de configuración de App Service se actualizaron correctamente", + "loc.messages.RequestedURLforkuduphysicalpath": "Dirección URL solicitada para la ruta de acceso física a Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "La ruta de acceso física \"%s\" ya existe", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "La ruta de acceso física a Kudu se creó correctamente: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "No se pudo crear la ruta de acceso física de Kudu. Error: %s", + "loc.messages.FailedtocheckphysicalPath": "No se pudo comprobar la ruta de acceso física de Kudu. Código de error: %s", + "loc.messages.VirtualApplicationDoesNotExist": "La aplicación virtual no existe: %s", + "loc.messages.JSONParseError": "No se puede analizar el archivo JSON: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sustitución de variable JSON se aplicó correctamente.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Sustitución de variables XML aplicada correctamente.", + "loc.messages.failedtoUploadFileToKudu": "No se puede cargar el archivo %s en Kudu (%s). Código de estado: %s", + "loc.messages.failedtoUploadFileToKuduError": "No se puede cargar el archivo %s en Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Ejecutando el script dado en el servicio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "No se puede ejecutar el script en el servicio Kudu. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "No se puede ejecutar el script en Kudu: %s. Código de estado: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "El script se ejecutó correctamente en Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "El script ejecutado devolvió \"%s\" como código de retorno. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "No se puede eliminar el archivo %s de Kudu (%s). Código de estado: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "No se puede eliminar el archivo %s de Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "No se encuentra el archivo de script \"%s\".", + "loc.messages.InvalidScriptFile": "Se proporcionó un archivo de script \"%s\" no válido. Las extensiones válidas son .bat y .cmd para Windows y .sh para Linux.", + "loc.messages.RetryForTimeoutIssue": "No se pudo ejecutar el script porque se agotó el tiempo de espera. Se reintentará una vez más.", + "loc.messages.stdoutFromScript": "Salida estándar del script: ", + "loc.messages.stderrFromScript": "Error estándar del script: ", + "loc.messages.WebConfigAlreadyExists": "El archivo web.config ya existe. No se va a generar.", + "loc.messages.SuccessfullyGeneratedWebConfig": "El archivo web.config se generó correctamente", + "loc.messages.FailedToGenerateWebConfig": "No se pudo generar el archivo web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "No se puede obtener el contenido del archivo: %s. Código de estado: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "No se puede obtener el contenido del archivo: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "No se pudo recuperar el estado del script porque se agotó el tiempo de espera.", + "loc.messages.PollingForFileTimeOut": "No se puede recuperar el estado del script porque se agotó el tiempo de espera. Puede aumentar el tiempo de espera estableciendo la variable \"appservicedeploy.retrytimeout\" en el número de minutos que sea necesario.", + "loc.messages.InvalidPollOption": "Se ha proporcionado una opción de sondeo no válida: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "El atributo \"-appType\" falta en los parámetros de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" y \"Go\".
Por ejemplo, \"-appType python_Bottle\" (sin comillas) en el caso de la plataforma Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "No se puede detectar la ruta de acceso del archivo \"settings.py\" de DJANGO_SETTINGS_MODULE. Asegúrese de que el archivo \"settings.py\" existe o indique la ruta de acceso correcta en la entrada del parámetro de Web.config siguiendo este formato: \"-DJANGO_SETTINGS_MODULE .settings\"", + "loc.messages.FailedToApplyTransformation": "No se puede aplicar la transformación para el paquete dado. Compruebe lo siguiente.", + "loc.messages.FailedToApplyTransformationReason1": "1. Si la transformación ya se ha aplicado para el paquete generado por MSBuild durante la compilación. Si es así, quite la etiqueta para cada configuración del archivo csproj y compile de nuevo. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Asegúrese de que el archivo de configuración y los archivos de transformación están presentes en la misma carpeta dentro del paquete.", + "loc.messages.AutoParameterizationMessage": "Los atributos de ConnectionString en Web.config están parametrizados de manera predeterminada. Tenga en cuenta que la transformación no tiene efecto en los atributos connectionString porque el valor se invalida durante la implementación por los archivos \"Parameters.xml\" o \"SetParameters.xml\". Puede deshabilitar la parametrización automática estableciendo /p:AutoParameterizationWebConfigConnectionStrings=False durante la generación del paquete MSBuild.", + "loc.messages.UnsupportedAppType": "El tipo de aplicación \"'%s\" no se admite en la generación de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\" y \"'node\"", + "loc.messages.UnableToFetchAuthorityURL": "No se puede recuperar la dirección URL de la autoridad.", + "loc.messages.UnableToFetchActiveDirectory": "No se puede recuperar el id. de recurso de Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "La pila en tiempo de ejecución y el comando de inicio se actualizaron correctamente.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "No se pudieron actualizar la pila en tiempo de ejecución y el comando de inicio. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "La configuración de la aplicación se actualizó correctamente.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "No se pudo actualizar la configuración de la aplicación. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "No se pudieron capturar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "No se pueden actualizar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "No se pueden recuperar las credenciales de Azure Container Registry. [Código de estado: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "No se puede leer el cuerpo de la respuesta. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "No se pueden actualizar los detalles de la configuración de WebApp. Código de estado: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Agregar anotación de versión para el recurso de Application Insights \"%s\".", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "La anotación de versión se agregó correctamente a la instancia de Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "No se pudo agregar la anotación de versión. %s", + "loc.messages.RenameLockedFilesEnabled": "La opción Cambiar nombre de archivos bloqueados está habilitada para la instancia de App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "No se pudo habilitar el cambio de nombre de los archivos bloqueados. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Algunos WebJobs en estado de ejecución impiden que la implementación elimine los archivos. Puede deshabilitar la opción \"Quitar archivos adicionales en el destino\" o detener los trabajos continuos antes de la implementación.", + "loc.messages.FailedToFetchKuduAppSettings": "No se pudo capturar la configuración de la aplicación de Kudu. Error: %s", + "loc.messages.FailedToCreatePath": "No se pudo crear la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "No se pudo eliminar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "No se pudo eliminar la carpeta \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "No se pudo cargar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "No se pudo obtener el contenido del archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToListPath": "No se pudo enumerar la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Reintentando la implementación del paquete.", + "loc.messages.FailedToGetAppServiceDetails": "No se pudieron capturar los detalles de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "No se pudo capturar el perfil de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "No se pudieron actualizar los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "No se pudieron obtener los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "No se pudo aplicar una revisión a la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "No se pudo actualizar la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "No se pudo obtener la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "No se pudieron capturar las credenciales de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "No se pudo obtener la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "No se pudo actualizar la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Intentando actualizar los valores de configuración de la instancia de App Service. Datos: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Se han actualizado los valores de configuración de App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Intentando actualizar la configuración de aplicación de App Service. Datos: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "La configuración de aplicación de App Service ya está presente.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Las cadenas de conexión de App Service ya están presentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Se han actualizado la configuración de aplicación de App Service y la configuración de aplicación de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Se encontraron varios grupos de recursos para la instancia de App Service \"%s\".", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Error al implementar el paquete mediante la implementación de ZIP. Consulte los registros para obtener más detalles.", + "loc.messages.PackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo ZIP.", + "loc.messages.WarPackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo WAR.", + "loc.messages.FailedToGetDeploymentLogs": "No se pudieron obtener los registros de implementación. Error: %s", + "loc.messages.GoExeNameNotPresent": "Falta el nombre del archivo ejecutable de Go", + "loc.messages.WarDeploymentRetry": "Reintentando la implementación del archivo war, ya que no se expandió correctamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Asegúrese de que el equipo usa el protocolo TLS 1.2 o posterior. Consulte https://aka.ms/enableTlsv2 para obtener más información sobre cómo habilitar TLS en la máquina.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "No se pudo capturar el token de acceso para Azure. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Configure Managed Service Identity (MSI) para la máquina virtual \"https://aka.ms/azure-msi-docs\". Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.XmlParsingFailed": "No se puede analizar el archivo publishProfileXML: %s. Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propiedad no existe en el perfil de publicación", + "loc.messages.InvalidConnectionType": "Tipo de conexión de servicio no válido", + "loc.messages.InvalidImageSourceType": "Tipo de origen de imagen no válido", + "loc.messages.InvalidPublishProfile": "El archivo del perfil de publicación no es válido.", + "loc.messages.ASE_SSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe establecer una variable denominada VSTS_ARM_REST_IGNORE_SSL_ERRORS como true en la canalización de compilación o de versión", + "loc.messages.ZipDeployLogsURL": "Los registros de implementación desde un archivo zip pueden verse en %s", + "loc.messages.DeployLogsURL": "Los registros de implementación pueden verse en %s", + "loc.messages.AppServiceApplicationURL": "Dirección URL de la aplicación de App Service: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe pasar -allowUntrusted en argumentos adicionales de la opción de implementación web.", + "loc.messages.FailedToGetResourceID": "No se pudo obtener el identificador del tipo de recurso \"%s\" y el nombre de recurso \"%s\". Error: %s", + "loc.messages.JarPathNotPresent": "La ruta de acceso de jar de Java no está presente.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "No se pudo actualizar el recurso de Application Insights \"%s\". Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Cambie de Web Deploy a la ejecución desde el paquete, que ayuda a evitar el error FILE_IN_USE. Tenga en cuenta que la ejecución desde el paquete no admite el tipo de paquete msBuild. Cambie el formato del paquete para usar este método de implementación." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..735e9149ed5b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Déploiement Azure App Service", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Déployer sur Azure App Service une application web, mobile ou API via Docker, Java, .NET, .NET Core, Node.js, PHP, Python ou Ruby", + "loc.instanceNameFormat": "Déploiement d'Azure App Service : $(WebAppName)", + "loc.releaseNotes": "Nouveautés de la version 4.*
Prend en charge Zip Deploy, l'exécution à partir d'un package, War Deploy [Détails ici](https://aka.ms/appServiceDeploymentMethods)
Prend en charge les environnements App Service
Amélioration de l'IU pour la découverte des différents types d'App Service pris en charge par la tâche
L'exécution à partir d'un package est la méthode de déploiement recommandée. Elle permet de rendre les fichiers du dossier wwwroot accessibles en lecture seule
Cliquez [ici](https://aka.ms/azurermwebdeployreadme) pour plus d'informations.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformations de fichiers et options de substitution de variable", + "loc.group.displayName.AdditionalDeploymentOptions": "Options de déploiement supplémentaires", + "loc.group.displayName.PostDeploymentAction": "Action de postdéploiement", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Paramètres d'application et de configuration", + "loc.input.label.ConnectionType": "Type de connexion", + "loc.input.help.ConnectionType": "Sélectionnez le type de connexion de service à utiliser pour déployer l'application web.
Sélectionnez Publier le profil pour utiliser le profil de publication créé par Visual Studio. [Plus d'informations](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Abonnement Azure", + "loc.input.help.ConnectedServiceName": "Sélectionnez l'abonnement Azure Resource Manager pour le déploiement.", + "loc.input.label.PublishProfilePath": "Chemin du profil de publication", + "loc.input.help.PublishProfilePath": "Chemin du profil de publication créé à partir de Visual Studio", + "loc.input.label.PublishProfilePassword": "Mot de passe du profil de publication", + "loc.input.help.PublishProfilePassword": "Il est recommandé de stocker le mot de passe dans une variable secrète et d'utiliser cette variable ici, par exemple $(Password).", + "loc.input.label.WebAppKind": "Type d'App Service", + "loc.input.help.WebAppKind": "Choisissez parmi Web App sur Windows, Web App sur Linux, Web App pour conteneurs, Application de fonction, Application de fonction sur Linux, Application de fonction pour conteneurs et Mobile App.", + "loc.input.label.WebAppName": "Nom de l'App Service", + "loc.input.help.WebAppName": "Entrez ou sélectionnez le nom d'un Azure App Service existant. Seuls les App Services basés sur le type d'application sélectionné sont listés.", + "loc.input.label.DeployToSlotOrASEFlag": "Déployer sur l'emplacement ou l'environnement App Service", + "loc.input.help.DeployToSlotOrASEFlag": "Sélectionnez l'option permettant d'effectuer un déploiement sur un emplacement de déploiement existant ou sur Azure App Service Environment.
Pour les deux cibles, la tâche a besoin du nom du groupe de ressources.
Si la cible de déploiement est un emplacement, le déploiement est effectué par défaut sur l'emplacement de production. Vous pouvez également indiquer un autre nom d'emplacement existant.
Si la cible de déploiement est un environnement Azure App Service, gardez le nom d'emplacement 'production', et spécifiez simplement le nom du groupe de ressources.", + "loc.input.label.ResourceGroupName": "Groupe de ressources", + "loc.input.help.ResourceGroupName": "Le nom du groupe de ressources est obligatoire quand la cible de déploiement est un emplacement de déploiement ou un environnement App Service.
Entrez ou sélectionnez le groupe de ressources Azure qui contient le service Azure App Service spécifié ci-dessus.", + "loc.input.label.SlotName": "Emplacement", + "loc.input.help.SlotName": "Entrez ou sélectionnez un emplacement existant autre que l'emplacement de production.", + "loc.input.label.DockerNamespace": "Registre ou espace de noms", + "loc.input.help.DockerNamespace": "Nom de domaine de premier niveau de type identificateur global unique pour votre registre ou espace de noms spécifique.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Nom du dépôt où sont stockés les images conteneurs.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Étiquette", + "loc.input.help.DockerImageTag": "Les étiquettes sont facultatives. Il s'agit du mécanisme utilisé par les registres pour donner une version aux images Docker.
Remarque : Le nom d'image complet est au format suivant : '`/`:`'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Application virtuelle", + "loc.input.help.VirtualApplication": "Spécifiez le nom de l'application virtuelle configurée dans le portail Azure. L'option n'est pas nécessaire pour les déploiements sur la racine App Service.", + "loc.input.label.Package": "Package ou dossier", + "loc.input.help.Package": "Chemin de fichier du package ou d'un dossier de contenu App Service généré par MSBuild, ou d'un fichier zip ou war compressé.
Les variables ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Mise en production](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)) et les caractères génériques sont pris en charge.
Exemple : $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip ou $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pile d'exécution", + "loc.input.help.RuntimeStack": "Sélectionnez le framework et la version.", + "loc.input.label.RuntimeStackFunction": "Pile d'exécution", + "loc.input.help.RuntimeStackFunction": "Sélectionnez le framework et la version. Consultez [cette documentation](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) pour accéder aux versions de runtime prises en charge. Les anciennes valeurs telles que 'DOCKER|microsoft/azure-functions-*' sont dépréciées. Utilisez les nouvelles valeurs de la liste déroulante.", + "loc.input.label.StartupCommand": "Commande de démarrage ", + "loc.input.help.StartupCommand": "Entrez la commande de démarrage. Exemple :
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Type du script de déploiement", + "loc.input.help.ScriptType": "Personnalisez le déploiement en fournissant un script qui s'exécute sur Azure App Service, une fois que la tâche a effectué le déploiement avec succès. Par exemple, restaurez les packages des applications Node, PHP et Python. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script Inline", + "loc.input.label.ScriptPath": "Chemin du script de déploiement", + "loc.input.label.WebConfigParameters": "Générer les paramètres web.config pour les applications Python, Node.js, Go et Java", + "loc.input.help.WebConfigParameters": "Un fichier web.config standard va être généré et déployé sur Azure App Service, si l'application n'en a pas. Vous pouvez modifier les valeurs du fichier web.config. Celles-ci varient en fonction du framework d'application. Par exemple, pour l'application node.js, web.config a un fichier de démarrage et des valeurs de module iis_node. Cette fonctionnalité d'édition est réservée au fichier web.config généré. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Paramètres de l'application", + "loc.input.help.AppSettings": "Modifiez les paramètres d'application Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple :-Port 5000 - RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Paramètres de configuration", + "loc.input.help.ConfigurationSettings": "Modifiez les paramètres de configuration Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple : - phpVersion 5.6 -linuxFXVersion : node|6.11", + "loc.input.label.UseWebDeploy": "Sélectionner la méthode de déploiement", + "loc.input.help.UseWebDeploy": "Si l'option est décochée, nous détectons automatiquement la meilleure méthode de déploiement en fonction du type de votre application, du format de votre package et d'autres paramètres.
Sélectionnez l'option permettant d'afficher les méthodes de déploiement prises en charge, puis choisissez-en une pour déployer votre application.", + "loc.input.label.DeploymentType": "Méthode de déploiement", + "loc.input.help.DeploymentType": "Choisissez la méthode de déploiement de l'application.", + "loc.input.label.TakeAppOfflineFlag": "Mettre l'application hors connexion", + "loc.input.help.TakeAppOfflineFlag": "Sélectionnez cette option pour mettre Azure App Service hors connexion en plaçant un fichier app_offline.htm dans le répertoire racine de l'App Service avant le début de l'opération de synchronisation. Le fichier est supprimé une fois l'opération de synchronisation correctement effectuée.", + "loc.input.label.SetParametersFile": "Fichier SetParameters", + "loc.input.help.SetParametersFile": "Facultatif : emplacement du fichier SetParameters.xml à utiliser.", + "loc.input.label.RemoveAdditionalFilesFlag": "Supprimer les fichiers supplémentaires à la destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Sélectionnez l'option permettant de supprimer les fichiers du service Azure App Service qui n'ont aucun fichier correspondant dans le package ou dossier App Service.

Remarque : Tous les fichiers associés à une extension installée sur ce service Azure App Service sont également supprimés. Pour éviter que cela se produise, cochez la case 'Exclure les fichiers du dossier App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclure les fichiers du dossier App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Sélectionnez l'option permettant d'empêcher les fichiers du dossier App_Data d'être déployés/supprimés sur Azure App Service.", + "loc.input.label.AdditionalArguments": "Arguments supplémentaires", + "loc.input.help.AdditionalArguments": "Arguments Web Deploy supplémentaires suivant la syntaxe -key:value.
Ceux-ci sont appliqués au moment du déploiement d'Azure App Service, par exemple : -disableLink:AppPoolExtension -disableLink:ContentExtension.
Pour plus d'exemples de paramètres d'opération Web Deploy, consultez [cette page](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Renommer les fichiers verrouillés", + "loc.input.help.RenameFilesFlag": "Sélectionnez l'option permettant d'activer l'indicateur msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 dans les paramètres d'application Azure App Service. Si cette option est définie, elle permet à msdeploy de renommer les fichiers verrouillés durant le déploiement de l'application", + "loc.input.label.XmlTransformation": "Transformation XML", + "loc.input.help.XmlTransformation": "Les transformations de configuration sont exécutées pour '*Release.config' et '*..config' sur le fichier '*.config'.
Elles sont exécutées avant la substitution de variable.
Les transformations XML sont prises en charge uniquement pour la plateforme Windows.", + "loc.input.label.XmlVariableSubstitution": "Substitution de variable XML", + "loc.input.help.XmlVariableSubstitution": "Les variables définies dans le pipeline de build ou le pipeline de mise en production sont mappées aux entrées 'key' ou 'name' dans les sections appSettings, connectionStrings et applicationSettings d'un fichier config et d'un fichier parameters.xml. La substitution de variable est exécutée après les transformations de configuration.

Remarque : Si les mêmes variables sont définies dans le pipeline de mise en production et dans l'environnement, les variables d'environnement remplacent les variables de pipeline de mise en production.
", + "loc.input.label.JSONFiles": "Substitution de variable JSON", + "loc.input.help.JSONFiles": "Fournissez une liste de fichiers JSON séparés par une nouvelle ligne pour remplacer les valeurs de variables. Les noms de fichiers doivent être indiqués par rapport au dossier racine.
Pour remplacer les variables JSON imbriquées ou hiérarchiques, spécifiez-les à l'aide d'expressions JSONPath.

Par exemple, pour remplacer la valeur de 'ConnectionString' dans l'exemple ci-dessous, vous devez définir une variable en tant que 'Data.DefaultConnection.ConnectionString' dans la définition de build ou de mise en production (ou l'environnement du pipeline de mise en production).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La substitution de variable est exécutée après les transformations de configuration.

Remarque : Les variables de pipeline sont exclues de la substitution.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Chemin de dossier ou package App Service fourni non valide : %s", + "loc.messages.SetParamFilenotfound0": "Fichier de définition de paramètres introuvable : %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Transformations XML correctement appliquées", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Obtention effectuée des détails de la connexion de service d'Azure App Service : '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Erreur : Aucune méthode de déploiement de ce type n'existe", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Impossible de récupérer les détails de la connexion de service d'Azure App Service : %s. Code d'état : %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Impossible de récupérer les détails de connexion de service de la ressource Azure : '%s'. Code d'état : %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Historique de déploiement mis à jour sur %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Échec de la mise à jour de l'historique de déploiement. Erreur : %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVERTISSEMENT : Impossible de mettre à jour l'état de déploiement : le point de terminaison SCM n'est pas activé pour ce site web", + "loc.messages.Unabletoretrievewebconfigdetails": "Impossible de récupérer les détails de la configuration d'App Service. Code d'état : '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Impossible de récupérer les paramètres d'application App Service. [Code d'état : '%s', message d'erreur : '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Impossible de mettre à jour les paramètres d'application d'App Service. Code d'état : '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Impossible de mettre à jour l'état du déploiement : l'ID de déploiement unique ne peut pas être récupéré", + "loc.messages.PackageDeploymentSuccess": "Déploiement réussi du package web sur App Service.", + "loc.messages.PackageDeploymentFailed": "Échec de déploiement du package web sur App Service.", + "loc.messages.Runningcommand": "Exécution de la commande : %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Déploiement du package web : %s sur le chemin virtuel (chemin physique) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Package %s déployé à l'aide du service kudu sur %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Impossible de déployer le package App Service à l'aide du service kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Impossible de déployer App Service en raison du code d'erreur %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Les packages générés par MSDeploy sont uniquement pris en charge par la plateforme Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Version installée non prise en charge : %s trouvé pour MSDeploy. Il doit s'agir au minimum de la version 3 ou d'une version ultérieure", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Emplacement introuvable de MSDeploy dans le Registre de l'ordinateur (Erreur : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Package introuvable avec le modèle spécifié : %s
Vérifiez si le package mentionné dans la tâche est publié en tant qu'artefact dans la build ou à une étape précédente, et s'il est téléchargé dans le travail actuel.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Plusieurs packages correspondent au modèle spécifié : %s. Affinez le modèle de recherche.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Essayez de redéployer App Service avec l'option Mettre l'application hors connexion sélectionnée.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Essayez de redéployer App Service avec l'option Renommer les fichiers verrouillés sélectionnée.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Aucun fichier JSON ne correspond au modèle spécifique : %s.", + "loc.messages.Configfiledoesntexists": "Le fichier de configuration %s n'existe pas.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Échec d'écriture dans le fichier config %s avec l'erreur : %s", + "loc.messages.AppOfflineModeenabled": "Mode hors connexion de l'application activé.", + "loc.messages.Failedtoenableappofflinemode": "Échec de l'activation du mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.AppOflineModedisabled": "Mode hors connexion de l'application désactivé.", + "loc.messages.FailedtodisableAppOfflineMode": "Impossible de désactiver le mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Impossible d'effectuer les transformations XML sur une plateforme non-Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Erreur de transformation XML lors de la transformation de %s à l'aide de %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Les options de publication à l'aide de webdeploy ne sont prises en charge qu'en cas d'utilisation de l'agent Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour le type de package msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour une application virtuelle.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publication à l'aide des options zip deploy ou RunFromZip ne prend pas en charge le déploiement de fichiers war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publication à l'aide de RunFromZip risque de ne pas prendre en charge le script de postdéploiement, s'il apporte des changements à wwwroot, car le dossier est ReadOnly.", + "loc.messages.ResourceDoesntExist": "La ressource '%s' n'existe pas. La ressource doit exister avant le déploiement.", + "loc.messages.EncodeNotSupported": "Encodage du fichier %s en %s détecté. La substitution de variable n'est pas prise en charge avec l'encodage de fichier %s. Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Impossible de détecter l'encodage du fichier %s (typeCode : %s). Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.ShortFileBufferError": "La mémoire tampon de fichier est insuffisante pour détecter le type d'encodage : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Impossible de mettre à jour les informations sur la configuration App Service. Erreur : %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Informations sur la configuration App Service correctement mises à jour", + "loc.messages.RequestedURLforkuduphysicalpath": "URL demandée pour le chemin d'accès physique Kudu : %s", + "loc.messages.Physicalpathalreadyexists": "Le chemin d'accès physique '%s' existe déjà", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Chemin d'accès physique Kudu correctement créé : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Échec de la création du chemin physique de kudu. Erreur : %s", + "loc.messages.FailedtocheckphysicalPath": "Échec de la vérification du chemin physique de kudu. Code d'erreur : %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'application virtuelle %s n'existe pas", + "loc.messages.JSONParseError": "Impossible d'analyser le fichier JSON : %s. Erreur : %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Substitution de variable JSON correctement appliquée.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La substitution de la variable XML a été appliquée.", + "loc.messages.failedtoUploadFileToKudu": "Impossible de charger le fichier %s sur Kudu (%s). Code d'état : %s", + "loc.messages.failedtoUploadFileToKuduError": "Impossible de charger le fichier %s sur Kudu (%s). Erreur : %s", + "loc.messages.ExecuteScriptOnKudu": "Exécution du script donné sur le service Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Impossible d'exécuter le script sur le service Kudu. Erreur : %s", + "loc.messages.FailedToRunScriptOnKudu": "Impossible d'exécuter le script sur Kudu : %s. Code d'état : %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Exécution réussie du script sur Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Le script exécuté a généré le code de retour '%s'. Erreur : %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Impossible de supprimer le fichier %s de Kudu (%s). Code d'état : %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Impossible de supprimer le fichier %s de Kudu (%s). Erreur : %s", + "loc.messages.ScriptFileNotFound": "Le fichier de script '%s' est introuvable.", + "loc.messages.InvalidScriptFile": "Le fichier de script fourni '%s' est non valide. Les extensions valides sont .bat et .cmd pour Windows, et.sh pour Linux", + "loc.messages.RetryForTimeoutIssue": "Échec de l'exécution du script en raison d'un problème de délai d'expiration. Nouvelle tentative.", + "loc.messages.stdoutFromScript": "Sortie standard du script : ", + "loc.messages.stderrFromScript": "Erreur standard du script : ", + "loc.messages.WebConfigAlreadyExists": "Le fichier web.config existe déjà. Aucune génération en cours.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Génération réussie du fichier web.config", + "loc.messages.FailedToGenerateWebConfig": "Échec de génération de web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Impossible d'obtenir le contenu du fichier : %s. Code d'état : %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Impossible d'obtenir le contenu du fichier : %s. Erreur : %s", + "loc.messages.ScriptStatusTimeout": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration.", + "loc.messages.PollingForFileTimeOut": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration. Vous pouvez augmenter la limite du délai d'expiration en affectant le nombre de minutes nécessaires à la variable 'appservicedeploy.retrytimeout'.", + "loc.messages.InvalidPollOption": "Option d'interrogation non valide fournie : %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Il manque l'attribut '-appType' dans les paramètres de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask', 'node' et 'Go'.
Exemple : '-appType python_Bottle' (sans guillemets) dans le cas d'un framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Impossible de détecter le chemin du fichier 'settings.py' pour DJANGO_SETTINGS_MODULE. Vérifiez que le fichier 'settings.py' existe, ou indiquez le chemin approprié dans l'entrée de paramètre de Web.config au format suivant : '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Impossible d'appliquer la transformation pour le package donné. Vérifiez ce qui suit.", + "loc.messages.FailedToApplyTransformationReason1": "1. La transformation est-elle déjà appliquée pour le package MSBuild généré durant la build ? Si la réponse est oui, supprimez la balise pour chaque configuration dans le fichier csproj, puis effectuez une regénération. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Vérifiez que le fichier config et les fichiers de transformation sont présents dans le même dossier à l'intérieur du package.", + "loc.messages.AutoParameterizationMessage": "Les attributs de ConnectionString dans Web.config sont paramétrables par défaut. Notez que la transformation n'a aucun effet sur les attributs de connectionString, car la valeur est remplacée durant le déploiement par les fichiers 'Parameters.xml' ou 'SetParameters.xml'. Vous pouvez désactiver le paramétrage automatique en définissant /p:AutoParameterizationWebConfigConnectionStrings=False durant la génération du package MSBuild.", + "loc.messages.UnsupportedAppType": "Le type d'application '%s' n'est pas pris en charge dans la génération de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask' et 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Impossible de récupérer (fetch) l'URL d'autorité.", + "loc.messages.UnableToFetchActiveDirectory": "Impossible de récupérer (fetch) l'ID de ressource Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Mise à jour réussie de la pile d'exécution et de la commande de démarrage.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Échec de la mise à jour de la pile d'exécution et de la commande de démarrage. Erreur : %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Mise à jour réussie des paramètres de l'application.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Échec de la mise à jour des paramètres de l'application. Erreur : %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Échec de la récupération (fetch) des métadonnées de la WebApp AzureRM. ErrorCode : %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Impossible de mettre à jour les métadonnées de la WebApp AzureRM. Code d'erreur : %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Impossible de récupérer les informations d'identification d'Azure Container Registry.[Code d'état : '%s']", + "loc.messages.UnableToReadResponseBody": "Impossible de lire le corps de la réponse. Erreur : %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Impossible de mettre à jour les détails de configuration de la WebApp. StatusCode : '%s'", + "loc.messages.AddingReleaseAnnotation": "Ajout d'une annotation de mise en production pour la ressource Application Insights '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Ajout réussi de l'annotation de mise en production à Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Échec de l'ajout de l'annotation de mise en production. %s", + "loc.messages.RenameLockedFilesEnabled": "Le renommage des fichiers verrouillés est activé pour App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Échec de l'activation du renommage des fichiers verrouillés. Erreur : %s", + "loc.messages.WebJobsInProgressIssue": "Un petit nombre de WebJobs à l'état en cours d'exécution empêchent le processus de déploiement de supprimer les fichiers. Désactivez l'option Supprimer les fichiers supplémentaires à l'emplacement de destination, ou arrêtez les travaux continus avant le déploiement.", + "loc.messages.FailedToFetchKuduAppSettings": "Échec de la récupération (fetch) des paramètres d'application Kudu. Erreur : %s", + "loc.messages.FailedToCreatePath": "Échec de la création du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFile": "Échec de la suppression du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFolder": "Échec de la suppression du dossier '%s' dans Kudu. Erreur : %s", + "loc.messages.FailedToUploadFile": "Échec du chargement du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToGetFileContent": "Échec de l'obtention du contenu du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToListPath": "Échec du listage du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.RetryToDeploy": "Nouvelle tentative de déploiement du package.", + "loc.messages.FailedToGetAppServiceDetails": "Échec de la récupération (fetch) des détails de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Échec de la récupération (fetch) du profil de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Échec de la mise à jour des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceMetadata": "Échec de l'obtention des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Échec de l'application du correctif à la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Échec de la mise à jour de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Échec de l'obtention de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Échec de la récupération (fetch) des informations d'identification de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Échec de l'obtention des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Échec de la mise à jour des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentative de mise à jour des paramètres de configuration d'App Service. Données : %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Mise à jour effectuée des paramètres de configuration d'App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentative de mise à jour des paramètres d'application d'App Service. Données : %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Les paramètres d'application d'App Service sont déjà présents.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Les chaînes de connexion d'App Service sont déjà présentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Mise à jour effectuée des paramètres d'application d'App Service et des paramètres d'application de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Plusieurs groupes de ressources trouvés pour l'App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Échec du déploiement de package à l'aide de ZIP Deploy. Pour plus d'informations, consultez les journaux.", + "loc.messages.PackageDeploymentInitiated": "Déploiement de package avec ZIP Deploy lancé.", + "loc.messages.WarPackageDeploymentInitiated": "Lancement effectué du déploiement de package à l'aide de WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Échec de l'obtention des journaux de déploiement. Erreur : %s", + "loc.messages.GoExeNameNotPresent": "Nom de l’exe Go absent", + "loc.messages.WarDeploymentRetry": "Nouvelle tentative de déploiement du fichier war, car il ne s'est pas décompressé correctement.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assurez-vous que l'ordinateur utilise le protocole TLS 1.2 ou ultérieur. Consultez https://aka.ms/enableTlsv2 pour plus d'informations sur l'activation de TLS sur votre ordinateur.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Configurez MSI (Managed Service Identity) pour la machine virtuelle 'https://aka.ms/azure-msi-docs'. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Code d'état : %s, message d'état : %s", + "loc.messages.XmlParsingFailed": "Impossible d'analyser le fichier publishProfileXML. Erreur : %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propriété n'existe pas dans le profil de publication", + "loc.messages.InvalidConnectionType": "Type de connexion de service non valide", + "loc.messages.InvalidImageSourceType": "Type de source d'image non valide", + "loc.messages.InvalidPublishProfile": "Le fichier de profil de publication est non valide.", + "loc.messages.ASE_SSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez affecter la valeur true à une variable nommée VSTS_ARM_REST_IGNORE_SSL_ERRORS dans le pipeline de build ou le pipeline de mise en production", + "loc.messages.ZipDeployLogsURL": "Les journaux Zip Deploy peuvent être consultés sur %s", + "loc.messages.DeployLogsURL": "Les journaux de déploiement peuvent être consultés sur %s", + "loc.messages.AppServiceApplicationURL": "URL d'application App Service : %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez passer -allowUntrusted dans des arguments supplémentaires de l'option Web Deploy.", + "loc.messages.FailedToGetResourceID": "Échec de l'obtention de l'ID de ressource pour le type de ressource '%s' et le nom de ressource '%s'. Erreur : %s", + "loc.messages.JarPathNotPresent": "Le chemin du fichier jar Java n'est pas présent", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Échec de la mise à jour de la ressource Application Insights '%s'. Erreur : %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passez de Web Deploy à l'exécution à partir d'un package, ce qui permet d'éviter l'erreur FILE_IN_USE. Notez que l'exécution à partir d'un package ne prend pas en charge le type de package msBuild. Changez le format de votre package pour utiliser cette méthode de déploiement." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..f4bfc0ca0356 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Distribuzione di Servizio app di Azure", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Esegue la distribuzione in Servizio app di Azure di un'app Web, per dispositivi mobili o API con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Distribuzione servizio app di Azure: $(WebAppName)", + "loc.releaseNotes": "Novità della versione 4.*
Supporto di Zip Deploy, Run From Package, War Deploy [Dettagli](https://aka.ms/appServiceDeploymentMethods)
Supporto di Ambienti del servizio app
Interfaccia utente migliorata per l'individuazione dei diversi tipi di servizio app supportati dall'attività
Il metodo di distribuzione preferito è Run From Package, con cui i file nella cartella wwwroot diventano di sola lettura
Per altre informazioni, fare clic [qui](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Opzioni di trasformazioni di file e sostituzioni di variabili", + "loc.group.displayName.AdditionalDeploymentOptions": "Opzioni di distribuzione aggiuntive", + "loc.group.displayName.PostDeploymentAction": "Azione post-distribuzione", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Impostazioni applicazione e configurazione", + "loc.input.label.ConnectionType": "Tipo di connessione", + "loc.input.help.ConnectionType": "Selezionare il tipo di connessione al servizio da usare per distribuire l'app Web.
Selezionare Profilo di pubblicazione per usare il profilo di pubblicazione creato da Visual Studio. [Altre informazioni](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceName": "Selezionare la sottoscrizione di Azure Resource Manager per la distribuzione.", + "loc.input.label.PublishProfilePath": "Percorso del profilo di pubblicazione", + "loc.input.help.PublishProfilePath": "Percorso del profilo di pubblicazione creato da Visual Studio", + "loc.input.label.PublishProfilePassword": "Password del profilo di pubblicazione", + "loc.input.help.PublishProfilePassword": "È consigliabile archiviare la password in una variabile di segreto e usare qui tale variabile, ad esempio $(Password).", + "loc.input.label.WebAppKind": "Tipo del servizio app", + "loc.input.help.WebAppKind": "Consente di scegliere tra App Web in Windows, App Web in Linux, App Web per contenitori, App per le funzioni, App per le funzioni in Linux, App per le funzioni per contenitori e App per dispositivi mobili.", + "loc.input.label.WebAppName": "Nome del servizio app", + "loc.input.help.WebAppName": "Consente di immettere o selezionare il nome di un servizio app di Azure. Verranno elencati solo i servizi app basati sul tipo di app selezionato.", + "loc.input.label.DeployToSlotOrASEFlag": "Distribuisci nello slot o nell'ambiente del servizio app", + "loc.input.help.DeployToSlotOrASEFlag": "Consente di selezionare l'opzione per la distribuzione in uno slot di distribuzione esistente o in un ambiente del servizio app di Azure.
Per entrambe le destinazioni l'attività richiede il nome del gruppo di risorse.
Se la destinazione di distribuzione è uno slot, per impostazione predefinita la distribuzione viene eseguita nello slot di produzione. È anche possibile specificare qualsiasi altro nome di slot esistente.
Se la destinazione di distribuzione è un ambiente del servizio app di Azure, lasciare il nome dello slot impostato su 'produzione' e specificare solo il nome del gruppo di risorse.", + "loc.input.label.ResourceGroupName": "Gruppo di risorse", + "loc.input.help.ResourceGroupName": "Il nome del gruppo di risorse è obbligatorio quando la destinazione di distribuzione è uno slot di distribuzione o un ambiente del servizio app.
Immettere o selezionare il gruppo di risorse di Azure che contiene il servizio app di Azure specificato sopra.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Immettere o selezionare uno slot esistente diverso da quello di produzione.", + "loc.input.label.DockerNamespace": "Registro o spazio dei nomi", + "loc.input.help.DockerNamespace": "Nome di dominio di primo livello univoco a livello globale per il registro o lo spazio dei nomi specifico.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Immagine", + "loc.input.help.DockerRepository": "Nome del repository in cui vengono archiviate le immagini del contenitore.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "I tag sono facoltativi e costituiscono il meccanismo usato dai registri per assegnare una versione alle immagini Docker.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Applicazione virtuale", + "loc.input.help.VirtualApplication": "Consente di specificare il nome dell'applicazione virtuale configurata nel portale di Azure. L'opzione non è necessaria per le distribuzioni nella radice del servizio app.", + "loc.input.label.Package": "Pacchetto o cartella", + "loc.input.help.Package": "Percorso file del pacchetto o di una cartella che include il contenuto del servizio app generato da MSBuild oppure un file WAR o ZIP compresso.
Variabili ( [Compilazione](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Versione](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)). I caratteri jolly sono supportati.
Ad esempio, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Stack di runtime", + "loc.input.help.RuntimeStack": "Consente di selezionare il framework e la versione.", + "loc.input.label.RuntimeStackFunction": "Stack di runtime", + "loc.input.help.RuntimeStackFunction": "Consente di selezionare il framework e la versione. Fare riferimento a [questo documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) per le versioni del runtime supportate. I valori precedenti, come `DOCKER|microsoft/azure-functions-*`, sono deprecati. Usare i nuovi valori dall'elenco a discesa.", + "loc.input.label.StartupCommand": "Comando di avvio ", + "loc.input.help.StartupCommand": "Immettere il comando di avvio, ad esempio
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo dello script di distribuzione", + "loc.input.help.ScriptType": "È possibile personalizzare la distribuzione fornendo uno script che verrà eseguito nel servizio app di Azure una volta completata la distribuzione dell'attività, ad esempio per ripristinare i pacchetti per le applicazioni Node, PHP e Python. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script inline", + "loc.input.label.ScriptPath": "Percorso dello script di distribuzione", + "loc.input.label.WebConfigParameters": "Genera i parametri di web.config per app Python, Node.js, Go e Java", + "loc.input.help.WebConfigParameters": "Verrà generato un file Web.config standard che verrà distribuito nel servizio app di Azure, se non è disponibile per l'applicazione. I valori presenti nel file Web.config sono modificabili e possono variare a seconda del framework dell'applicazione. Ad esempio, per l'applicazione node.js il file Web.config includerà i valori per il file di avvio e il modulo iis_node. Questa funzionalità di modifica è utilizzabile solo per il file Web.config generato. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Impostazioni app", + "loc.input.help.AppSettings": "Consente di modificare le impostazioni applicazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Ora solare fuso orientale\"", + "loc.input.label.ConfigurationSettings": "Impostazioni di configurazione", + "loc.input.help.ConfigurationSettings": "Consente di modificare le impostazioni di configurazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Seleziona il metodo di distribuzione", + "loc.input.help.UseWebDeploy": "Se questa opzione è deselezionata, il metodo di distribuzione migliore verrà rilevato automaticamente in base al tipo di app, al formato del pacchetto e ad altri parametri.
Selezionare l'opzione per visualizzare i metodi di distribuzione supportati e sceglierne uno per la distribuzione dell'app.", + "loc.input.label.DeploymentType": "Metodo di distribuzione", + "loc.input.help.DeploymentType": "Consente di scegliere il metodo di distribuzione per l'app.", + "loc.input.label.TakeAppOfflineFlag": "Porta app offline", + "loc.input.help.TakeAppOfflineFlag": "Consente di selezionare l'opzione per portare offline il servizio app di Azure inserendo un file app_offline.htm nella directory radice del servizio app prima dell'inizio dell'operazione di sincronizzazione. Il file verrà rimosso al termine dell'operazione di sincronizzazione.", + "loc.input.label.SetParametersFile": "File SetParameters", + "loc.input.help.SetParametersFile": "Facoltativo: percorso del file SetParameters.xml da usare.", + "loc.input.label.RemoveAdditionalFilesFlag": "Rimuovi file aggiuntivi nella destinazione", + "loc.input.help.RemoveAdditionalFilesFlag": "Consente di selezionare l'opzione per eliminare nel servizio app di Azure i file per cui non esistono file corrispondenti nella cartella o nel pacchetto del servizio app.

Nota: verranno rimossi anche tutti i file correlati a eventuali estensioni installate in questo servizio app di Azure. Per evitarlo, selezionare la casella di controllo 'Escludi file dalla cartella App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Escludi file dalla cartella App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Consente di selezionare l'opzione per impedire che i file nella cartella App_Data vengano distribuiti nel servizio app di Azure o eliminati da tale servizio.", + "loc.input.label.AdditionalArguments": "Argomenti aggiuntivi", + "loc.input.help.AdditionalArguments": "Argomenti aggiuntivi di Web Deploy conformi alla sintassi -chiave:valore.
Tali argomenti verranno applicati durante la distribuzione del servizio app di Azure. Esempio: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Per altri esempi di impostazioni per le operazioni di Web Deploy, fare clic [qui](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rinomina i file bloccati", + "loc.input.help.RenameFilesFlag": "Consente di selezionare l'opzione per abilitare il flag MSDEPLOY_RENAME_LOCKED_FILES=1 di MSDeploy nelle impostazioni dell'applicazione del servizio app di Azure. Se impostata, l'opzione consente a MSDeploy di rinominare file bloccati che vengono bloccati durante la distribuzione dell'app", + "loc.input.label.XmlTransformation": "Trasformazione XML", + "loc.input.help.XmlTransformation": "Le trasformazioni dei file config verranno eseguite per `*.Release.config` e `*..config` nel file `*.config`.
Le trasformazioni dei file config verranno eseguite prima della sostituzione delle variabili.
Le trasformazioni XML sono supportate solo per la piattaforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sostituzione di variabili XML", + "loc.input.help.XmlVariableSubstitution": "Le variabili definite nelle pipeline di compilazione o di versione verranno confrontate con le voci 'key' o 'name' nelle sezioni appSettings, applicationSettings e connectionStrings di tutti i file config e parameters.xml. La sostituzione delle variabili viene eseguita dopo le trasformazioni dei file config.

Nota: se si definiscono le stesse variabili nella pipeline di versione e nell'ambiente, quelle di ambiente prevarranno su quelle della pipeline di versione.
", + "loc.input.label.JSONFiles": "Sostituzione di variabili JSON", + "loc.input.help.JSONFiles": "Consente di specificare l'elenco di file JSON delimitati da caratteri di nuova riga per sostituire i valori delle variabili. I nomi di file specificati devono essere relativi alla cartella radice.
Per sostituire le variabili JSON annidate o gerarchiche, specificarle usando espressioni JSONPath.

Ad esempio, per sostituire il valore di ‘ConnectionString’ nell'esempio seguente, è necessario definire una variabile come ‘Data.DefaultConnection.ConnectionString’ nella pipeline di compilazione o versione (o nell'ambiente della pipeline di versione).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sostituzione delle variabili viene eseguita dopo le trasformazioni della configurazione.

Nota: le variabili delle pipeline vengono escluse nella sostituzione.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Il percorso specificato per il pacchetto o la cartella del servizio app non è valido: %s", + "loc.messages.SetParamFilenotfound0": "Il file dei parametri del set non è stato trovato: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Le trasformazioni XML sono state applicate", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "I dettagli della connessione al servizio per il servizio app di Azure sono stati recuperati: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Errore: non esiste alcun metodo di distribuzione di questo tipo", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Non è possibile recuperare i dettagli della connessione al servizio per il servizio app di Azure: %s. Codice di stato: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Non è possibile recuperare i dettagli della connessione al servizio per la risorsa di Azure '%s'. Codice di stato: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "L'aggiornamento della cronologia di distribuzione all'indirizzo %s è stato completato", + "loc.messages.Failedtoupdatedeploymenthistory": "Non è stato possibile aggiornare la cronologia di distribuzione. Errore: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVVISO: non è possibile aggiornare lo stato di distribuzione. L'endpoint di Gestione controllo del codice sorgente non è abilitato per questo sito Web", + "loc.messages.Unabletoretrievewebconfigdetails": "Non è possibile recuperare i dettagli di configurazione del servizio app. Codice di stato: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Non è possibile recuperare le impostazioni dell'applicazione del servizio app. [Codice di stato: '%s'. Messaggio di errore: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Non è possibile aggiornare le impostazioni dell'applicazione del servizio app. Codice di stato: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Non è possibile aggiornare lo stato di distribuzione. L'ID distribuzione univoco non è stato recuperato", + "loc.messages.PackageDeploymentSuccess": "Il pacchetto Web è stato distribuito nel servizio app.", + "loc.messages.PackageDeploymentFailed": "Non è stato possibile distribuire il pacchetto Web nel servizio app.", + "loc.messages.Runningcommand": "Esecuzione del comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Distribuzione del pacchetto Web %s nel percorso virtuale (percorso fisico) %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "La distribuzione del pacchetto %s con il servizio Kudu all'indirizzo %s è riuscita", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Non è stato possibile distribuire il pacchetto del servizio app con il servizio Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Non è possibile distribuire il servizio app a causa del codice errore: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "I pacchetti generati da MSDeploy sono supportati solo per la piattaforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "La versione installata non è supportata. La versione trovata per MSDeploy è %s, ma deve essere almeno 3 o successiva", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Il percorso di MSDeploy non è stato trovato dal Registro di sistema nel computer (errore: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Non è stato trovato alcun pacchetto con il criterio specificato: %s
Verificare se il pacchetto menzionato nell'attività viene pubblicato come artefatto nella compilazione o in una fase precedente e quindi scaricato nel processo corrente.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Più pacchetti corrispondono al criterio specificato %s. Restringere i criteri di ricerca.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Porta l'applicazione offline.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Rinomina i file bloccati.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Non sono stati trovati file JSON corrispondenti al criterio specificato: %s.", + "loc.messages.Configfiledoesntexists": "Il file di configurazione %s non esiste.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Non è stato possibile scrivere nel file config %s. Errore: %s", + "loc.messages.AppOfflineModeenabled": "La modalità offline dell'app è abilitata.", + "loc.messages.Failedtoenableappofflinemode": "Non è stato possibile abilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.AppOflineModedisabled": "La modalità offline dell'app è disabilitata.", + "loc.messages.FailedtodisableAppOfflineMode": "Non è stato possibile disabilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Non è possibile eseguire trasformazioni XML su una piattaforma non Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Si è verificato un errore di trasformazione XML durante la trasformazione di %s con %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Le opzioni di pubblicazione con Distribuzione Web sono supportate solo quando si usa l'agente Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La pubblicazione con l'opzione zipdeploy non è supportata per il tipo di pacchetto msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La pubblicazione con l'opzione zipdeploy non è supportata per l'applicazione virtuale.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Se si pubblica usando le opzioni zipdeploy o RunFromZip, la distribuzione di file war non è supportata.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Se si pubblica usando RunFromZip, è possibile che lo script post-distribuzione non sia supportato se apporta modifiche a wwwroot perché la cartella è di sola lettura.", + "loc.messages.ResourceDoesntExist": "La risorsa '%s' non esiste. La risorsa deve esistere prima della distribuzione.", + "loc.messages.EncodeNotSupported": "La codifica rilevata del file %s è %s. La sostituzione delle variabili non è supportata con la codifica file %s. Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Non è possibile rilevare la codifica del file %s (typeCode: %s). Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Il buffer di file è troppo piccolo per il rilevamento del tipo di codifica: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Non è stato possibile aggiornare i dettagli della configurazione del servizio app. Errore: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "I dettagli della configurazione del servizio app sono stati aggiornati", + "loc.messages.RequestedURLforkuduphysicalpath": "È stato richiesto l'URL per il percorso fisico di Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Il percorso fisico '%s' esiste già", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Il percorso fisico di Kudu è stato creato: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Non è stato possibile creare il percorso fisico di Kudu. Errore: %s", + "loc.messages.FailedtocheckphysicalPath": "Non è stato possibile verificare il percorso fisico di Kudu. Codice errore: %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'applicazione virtuale non esiste: %s", + "loc.messages.JSONParseError": "Non è possibile analizzare il file JSON: %s. Errore: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili JSON è stata applicata.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili XML è stata applicata.", + "loc.messages.failedtoUploadFileToKudu": "Non è possibile caricare il file %s in Kudu (%s). Codice di stato: %s", + "loc.messages.failedtoUploadFileToKuduError": "Non è stato possibile caricare il file %s in Kudu (%s). Errore: %s", + "loc.messages.ExecuteScriptOnKudu": "Esecuzione dello script specificato nel servizio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Non è possibile eseguire lo script nel servizio Kudu. Errore: %s", + "loc.messages.FailedToRunScriptOnKudu": "Non è possibile eseguire lo script in Kudu: %s. Codice di stato: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Lo script è stato eseguito in Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Il codice restituito dallo script eseguito è '%s'. Errore: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Non è possibile eliminare il file %s da Kudu (%s). Codice di stato: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Non è possibile eliminare il file %s da Kudu (%s). Errore: %s", + "loc.messages.ScriptFileNotFound": "Il file di script '%s' non è stato trovato.", + "loc.messages.InvalidScriptFile": "Il file di script specificato '%s' non è valido. Le estensioni valide sono bat e cmd per Windows e sh per Linux", + "loc.messages.RetryForTimeoutIssue": "L'esecuzione dello script non è riuscita a causa del timeout. Verrà effettuato un nuovo tentativo.", + "loc.messages.stdoutFromScript": "Output standard dello script: ", + "loc.messages.stderrFromScript": "Errore standard dello script: ", + "loc.messages.WebConfigAlreadyExists": "Il file Web.config esiste già e non verrà generato.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Il file Web.config è stato generato", + "loc.messages.FailedToGenerateWebConfig": "Non è stato possibile generare il file Web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Non è possibile recuperare il contenuto del file: %s. Codice di stato: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Non è possibile recuperare il contenuto del file: %s. Errore: %s", + "loc.messages.ScriptStatusTimeout": "Non è possibile recuperare lo stato dello script a causa del timeout.", + "loc.messages.PollingForFileTimeOut": "Non è possibile recuperare lo stato dello script a causa del timeout. È possibile aumentare il limite di timeout impostando la variabile 'appservicedeploy.retrytimeout' sul numero di minuti necessari.", + "loc.messages.InvalidPollOption": "L'opzione di polling specificata %s non è valida.", + "loc.messages.MissingAppTypeWebConfigParameters": "Nei parametri di Web.config manca l'attributo '-appType'. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask', 'node' e 'Go'.
Esempio: '-appType python_Bottle' (senza virgolette) nel caso del framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Il percorso del file 'settings.py' di DJANGO_SETTINGS_MODULE non è stato rilevato. Assicurarsi che il file 'settings.py' sia esistente oppure specificare il percorso corretto nel campo di input del parametro di Web.config nel formato seguente: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Non è possibile applicare la trasformazione per il pacchetto specificato. Eseguire le verifiche seguenti.", + "loc.messages.FailedToApplyTransformationReason1": "1. Verificare se la trasformazione è già stata applicata per il pacchetto generato da MSBuild durante la compilazione. In caso affermativo, rimuovere il tag per ogni file config nel file csproj e ricompilare. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Assicurarsi che il file config e i file di trasformazione siano presenti nella stessa cartella all'interno del pacchetto.", + "loc.messages.AutoParameterizationMessage": "Per impostazione predefinita, agli attributi di ConnectionString in Web.config sono associati parametri. Si noti che la trasformazione non ha effetto sugli attributi di ConnectionString perché durante la distribuzione il valore viene sostituito dai file 'Parameters.xml' o 'SetParameters.xml'. Per disabilitare l'aggiunta automatica di parametri, impostare /p:AutoParameterizationWebConfigConnectionStrings=False durante la generazione del pacchetto MSBuild.", + "loc.messages.UnsupportedAppType": "Il tipo di app '%s' non è supportato nella generazione di Web.config. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask' e 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Non è possibile recuperare l'URL dell'autorità.", + "loc.messages.UnableToFetchActiveDirectory": "Non è possibile recuperare l'ID risorsa di Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Lo stack di runtime e il comando di avvio sono stati aggiornati.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Non è stato possibile aggiornare lo stack di runtime e il comando di avvio. Errore: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Le impostazioni dell'app sono state aggiornate.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Non è stato possibile aggiornare le impostazioni dell'app. Errore: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Non è stato possibile recuperare i metadati dell'app Web AzureRM. Codice errore: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Non è possibile aggiornare i metadati dell'app Web di AzureRM. Codice errore: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Non è possibile recuperare le credenziali di Registro Azure Container. [Codice di stato: '%s']", + "loc.messages.UnableToReadResponseBody": "Non è possibile leggere il corpo della risposta. Errore: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Non è possibile aggiornare i dettagli di configurazione dell'app Web. Codice di stato: '%s'", + "loc.messages.AddingReleaseAnnotation": "Aggiunta dell'annotazione versione per la risorsa '%s' di Application Insights", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "L'annotazione versione è stata aggiunta alla risorsa di Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Non è stato possibile aggiungere l'annotazione versione. %s", + "loc.messages.RenameLockedFilesEnabled": "La ridenominazione dei file bloccati è abilitata per il servizio app.", + "loc.messages.FailedToEnableRenameLockedFiles": "Non è stato possibile abilitare la ridenominazione de file bloccati. Errore: %s", + "loc.messages.WebJobsInProgressIssue": "Qualche processo Web nello stato in esecuzione impedisce alla distribuzione di rimuovere i file. È possibile disabilitare l'opzione 'Rimuovi file aggiuntivi nella destinazione' oppure arrestare i processi continui prima della distribuzione.", + "loc.messages.FailedToFetchKuduAppSettings": "Non è stato possibile recuperare le impostazioni dell'app Kudu. Errore: %s", + "loc.messages.FailedToCreatePath": "Non è stato possibile creare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFile": "Non è stato possibile eliminare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFolder": "Non è stato possibile eliminare la cartella '%s' da Kudu. Errore: %s", + "loc.messages.FailedToUploadFile": "Non è stato possibile caricare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToGetFileContent": "Non è stato possibile ottenere il contenuto '%s/%s' del file da Kudu. Errore: %s", + "loc.messages.FailedToListPath": "Non è stato possibile elencare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.RetryToDeploy": "Verrà effettuato un nuovo tentativo di distribuzione del pacchetto.", + "loc.messages.FailedToGetAppServiceDetails": "Non è stato possibile recuperare i dettagli del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Non è stato possibile recuperare il profilo di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Non è stato possibile aggiornare i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Non è stato possibile ottenere i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Non è stato possibile correggere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Non è stato possibile aggiornare la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Non è stato possibile ottenere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Non è stato possibile recuperare le credenziali di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Non è stato possibile ottenere le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Non è stato possibile aggiornare le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentativo di aggiornamento delle impostazioni di configurazione del servizio app. Dati: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Le impostazioni di configurazione del servizio app sono state aggiornate.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentativo di aggiornamento delle impostazioni applicazione del servizio app. Dati: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Le impostazioni applicazione del servizio app sono già presenti.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Le stringhe di connessione del servizio app sono già presenti.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Le impostazioni applicazione del servizio app e le impostazioni applicazione di Kudu sono state aggiornate.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Sono stati trovati più gruppi di risorse per il servizio app '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "La distribuzione del pacchetto con zipdeploy non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.PackageDeploymentInitiated": "La distribuzione del pacchetto con zipdeploy è stata avviata.", + "loc.messages.WarPackageDeploymentInitiated": "La distribuzione del pacchetto con WAR Deploy è stata avviata.", + "loc.messages.FailedToGetDeploymentLogs": "Non è stato possibile ottenere i log di distribuzione. Errore: %s", + "loc.messages.GoExeNameNotPresent": "Il nome dell'eseguibile Go non è presente", + "loc.messages.WarDeploymentRetry": "Verrà effettuato un nuovo tentativo di distribuzione del file WAR perché in precedenza non si è espanso correttamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assicurarsi che il computer usi il protocollo TLS 1.2 o superiore. Per altre informazioni su come abilitare TLS nel computer, vedere https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Non è stato possibile recuperare il token di accesso per Azure. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Configurare l'identità del servizio gestita per la macchina virtuale 'https://aka.ms/azure-msi-docs'. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.XmlParsingFailed": "Non è possibile analizzare il file XML del profilo di pubblicazione. Errore: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La proprietà non esiste nel profilo di pubblicazione", + "loc.messages.InvalidConnectionType": "Il tipo di connessione al servizio non è valido", + "loc.messages.InvalidImageSourceType": "Il tipo di origine immagini non è valido", + "loc.messages.InvalidPublishProfile": "Il file del profilo di pubblicazione non è valido.", + "loc.messages.ASE_SSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario impostare su true una variabile denominata VSTS_ARM_ARM_REST_IGNORE_SSL_ERRORS nella pipeline di compilazione o versione", + "loc.messages.ZipDeployLogsURL": "I log di zipdeploy possono essere visualizzati in %s", + "loc.messages.DeployLogsURL": "I log di distribuzione possono essere visualizzati in %s", + "loc.messages.AppServiceApplicationURL": "URL dell'applicazione del servizio app: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario passare -allowUntrusted negli argomenti aggiuntivi dell'opzione di distribuzione Web.", + "loc.messages.FailedToGetResourceID": "Non è stato possibile ottenere l'ID risorsa per il tipo di risorsa '%s' e il nome di risorsa '%s'. Errore: %s", + "loc.messages.JarPathNotPresent": "Il percorso del file jar Java non è presente", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Non è stato possibile aggiornare la risorsa '%s' di Application Insights. Errore: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passare da Distribuzione Web a Run From Package, che consente di evitare errori FILE_IN_USE. Tenere presente che Run From Package non supporta il tipo di pacchetto msBuild. Per usare questo metodo di distribuzione, modificare il formato del pacchetto." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c363ab7cf9cb --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service デプロイ", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker、Java、.NET、.NET Core、Node.js、PHP、Python、Ruby を使用して、Web、モバイル、API アプリを Azure App Service にデプロイします", + "loc.instanceNameFormat": "Azure App Service の配置: $(WebAppName)", + "loc.releaseNotes": "バージョン 4.* での変更点
Zip Deploy、Run From Package、War Deploy のサポート [詳細はこちら](https://aka.ms/appServiceDeploymentMethods)
App Service Environment のサポート
タスクによってサポートされる複数のアプリ サービス タイプを見つけるための、UI の向上
推奨されるデプロイ方法は、wwwroot フォルダー内のファイルが読み取り専用になる Run From Package です。
詳細については、[こちら](https://aka.ms/azurermwebdeployreadme)をクリックしてください。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "ファイルの変換と変数の置換のオプション", + "loc.group.displayName.AdditionalDeploymentOptions": "追加の配置オプション", + "loc.group.displayName.PostDeploymentAction": "配置後アクション", + "loc.group.displayName.ApplicationAndConfigurationSettings": "アプリケーションと構成の設定", + "loc.input.label.ConnectionType": "接続の種類", + "loc.input.help.ConnectionType": "Web アプリの配置に使用するサービス接続の種類を選択してください。
Visual Studio で作成された公開プロファイルを使用するには、[公開プロファイル] を選択します。[詳細情報](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceName": "デプロイ用の Azure Resource Manager サブスクリプションを選択します。", + "loc.input.label.PublishProfilePath": "プロファイルのパスの公開", + "loc.input.help.PublishProfilePath": "Visual Studio から作成された公開プロファイルのパス", + "loc.input.label.PublishProfilePassword": "プロファイルのパスワードの公開", + "loc.input.help.PublishProfilePassword": "パスワードは秘密の変数に保管し、ここではその変数を使用することをお勧めします。例: $(Password)。", + "loc.input.label.WebAppKind": "App Service の種類", + "loc.input.help.WebAppKind": "Web App on Windows、Web App on Linux、Web App for Containers、関数アプリ、Linux 上の 関数アプリ、コンテナー向け 関数アプリ、モバイル アプリから選択します。", + "loc.input.label.WebAppName": "App Service の名前", + "loc.input.help.WebAppName": "既存の Azure App Service の名前を入力するか、選択します。選択するアプリの種類に基づく App Service のみが一覧表示されます。", + "loc.input.label.DeployToSlotOrASEFlag": "スロットまたは App Service Environment に配置する", + "loc.input.help.DeployToSlotOrASEFlag": "既存の配置スロットまたは Azure App Service Environment に配置するためのオプションを選択します。
どちらのターゲットでも、タスクにはリソース グループ名が必要です。
配置ターゲットがスロットの場合、配置は既定で運用スロットに実施されます。他の既存のスロット名を指定することもできます。
配置ターゲットが Azure App Service Environment の場合、スロット名を 'production' のままにして、リソース グループ名だけを指定します。", + "loc.input.label.ResourceGroupName": "リソース グループ", + "loc.input.help.ResourceGroupName": "配置ターゲットが配置スロットまたは App Service Environment の場合、リソース グループ名が必要です。
上記で指定された Azure App Service を含む Azure リソース グループを入力するか選択します。", + "loc.input.label.SlotName": "スロット", + "loc.input.help.SlotName": "運用スロット以外の既存のスロットを入力または選択してください。", + "loc.input.label.DockerNamespace": "レジストリまたは名前空間", + "loc.input.help.DockerNamespace": "特定のレジストリまたは名前空間をグローバルに識別する一意の最上位ドメイン名です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "イメージ", + "loc.input.help.DockerRepository": "コンテナー イメージが格納されるリポジトリの名前です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "タグ", + "loc.input.help.DockerImageTag": "タグは省略可能です。これは、レジストリで Docker イメージにバージョンを付けるために使う機構です。
メモ: 完全修飾イメージ名の形式は '`/`:`' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "仮想アプリケーション", + "loc.input.help.VirtualApplication": "Azure Portal に構成された仮想アプリケーションの名前を指定します。App Service ルートに配置する場合には、このオプションは不要です。", + "loc.input.label.Package": "パッケージまたはフォルダー", + "loc.input.help.Package": "MSBuild で生成されたアプリ サービスのコンテンツが入ったパッケージまたはフォルダー、あるいは圧縮された zip または war ファイルへのファイル パス。
変数 ([ビルド](https://docs.microsoft.com/vsts/pipelines/build/variables) |[リリース](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables))、ワイルドカードを使用できます。
たとえば、$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip または $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "ランタイム スタック", + "loc.input.help.RuntimeStack": "フレームワークとバージョンを選択します。", + "loc.input.label.RuntimeStackFunction": "ランタイム スタック", + "loc.input.help.RuntimeStackFunction": "フレームワークとバージョンを選択します。サポートされているランタイム バージョンについては、[こちらのドキュメント](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)をご覧ください。`DOCKER|microsoft/azure-functions-*` などの前の値は非推奨であるため、ドロップダウンから新しい値をお使いください。", + "loc.input.label.StartupCommand": "スタートアップ コマンド ", + "loc.input.help.StartupCommand": "スタートアップ コマンドを入力してください。例:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "配置スクリプトの種類", + "loc.input.help.ScriptType": "タスクで配置が正常に完了したときに Azure App Service 上で実行されるスクリプトを提供して、配置をカスタマイズします。たとえば、Node、PHP、Python アプリケーション用のパッケージを復元します。[詳細](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "インライン スクリプト", + "loc.input.label.ScriptPath": "配置スクリプトのパス", + "loc.input.label.WebConfigParameters": "Python、Node.js、Go、Java アプリ向けの web.config パラメーターを生成する", + "loc.input.help.WebConfigParameters": "アプリケーションに web.config がない場合は、標準の web.config が生成され、Azure App Service に配置されます。web.config 内の値は編集可能で、アプリケーション フレームワークに基づいて変えることができます。たとえば、node.js アプリケーションの場合、スタートアップ ファイルと iis_node モジュールの値を web.config 内に設定します。この編集機能は、生成される web.config のためにのみ使用できます。[詳細情報](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "アプリ設定", + "loc.input.help.AppSettings": "構文 -key value の後に続く Web App アプリケーションの設定を編集します。スペースが含まれる値は二重引用符で囲む必要があります。
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "構成設定", + "loc.input.help.ConfigurationSettings": "構文 -key value の後に続く Web App 構成の設定を編集します。スペースが含まれる値は、二重引用符で囲む必要があります。
例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "配置方法を選択する", + "loc.input.help.UseWebDeploy": "チェック ボックスをオフにすると、アプリの種類、パッケージ形式、その他のパラメーターに基づいて最適な配置方法が自動的に検出されます。
サポートされる配置方法を確認して、アプリの配置に使用する方法を選択するには、オプションを選択してください。", + "loc.input.label.DeploymentType": "配置方法", + "loc.input.help.DeploymentType": "アプリの配置方法を選択します。", + "loc.input.label.TakeAppOfflineFlag": "アプリをオフラインにする", + "loc.input.help.TakeAppOfflineFlag": "Azure App Service をオフラインにする場合、このオプションを選択します。オフラインにするには、同期操作を開始する前に App Service のルート ディレクトリに app_offline.htm ファイルを配置します。このファイルは、同期操作が正常に完了すると削除されます。", + "loc.input.label.SetParametersFile": "SetParameters ファイル", + "loc.input.help.SetParametersFile": "省略可能: 使用する SetParameters.xml ファイルの場所。", + "loc.input.label.RemoveAdditionalFilesFlag": "ターゲットで追加ファイルを削除する", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service パッケージまたはフォルダー内に一致するファイルがない Azure App Service 上のファイルを削除する場合、このオプションを選択します。

注: これにより、この Azure App Service にインストールされたあらゆる拡張機能に関連するファイルも全部削除されます。これを避けるには、[App_Data フォルダーのファイルを除外する] チェックボックスを選択します。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data フォルダーのファイルを除外する", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data フォルダー内のファイルが Azure App Service に配置されないようにする場合、または Azure App Service から削除されないようにする場合、このオプションを選択します。", + "loc.input.label.AdditionalArguments": "追加引数", + "loc.input.help.AdditionalArguments": "構文 -key:value に続くその他の Web 配置の引数。
これらの引数は、Azure App Service を配置するときに適用されます。例: -disableLink:AppPoolExtension -disableLink:ContentExtension。
Web 配置操作の設定に関するその他の例については、[ここ](https://go.microsoft.com/fwlink/?linkid=838471) を参照してください。", + "loc.input.label.RenameFilesFlag": "ロックされたファイルの名前を変更する", + "loc.input.help.RenameFilesFlag": "Azure App Service のアプリケーション設定で msdeploy フラグ FLAGMSDEPLOY_RENAME_LOCKED_FILES=1 を有効にするには、このオプションを選択します。このオプションを設定すると、アプリの配置中にロックされたファイルの名前を MSDeploy で変更できるようになります", + "loc.input.label.XmlTransformation": "XML 変換", + "loc.input.help.XmlTransformation": "`*.config ファイル` 上の `*.Release.config` と `*..config` に対する構成変換が実行されます。
構成変換は変数置換の前に実行されます。
XML 変換は、Windows プラットフォームの場合のみサポートされます。", + "loc.input.label.XmlVariableSubstitution": "XML 変数置換", + "loc.input.help.XmlVariableSubstitution": "ビルド パイプラインまたはリリース パイプラインで定義された変数は、任意の構成ファイルと parameters.xml の appSettings、applicationSettings、connectionStrings セクションの 'key' または 'name' エントリと照合されます。変数置換は config 変換の後に実行されます。

注: リリース パイプラインと環境内で同じ変数が定義されている場合、環境変数はリリース パイプライン変数よりも優先されます。
", + "loc.input.label.JSONFiles": "JSON 変数置換", + "loc.input.help.JSONFiles": "JSON ファイルの行区切り一覧を新しく提供して、変数値を置換します。ルート フォルダーの相対ファイル名を提供します。
入れ子または階層の JSON 変数を置換するには、JSONPath 式を使用して指定します。

たとえば、下のサンプル内の ‘ConnectionString’ 値を置き換えるには、ビルドまたはリリース パイプライン (またはリリース パイプラインの環境) 内で変数を ‘Data.DefaultConnection.ConnectionString’ として定義する必要があります。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
変数置換は構成変換の後に実行されます。

メモ: 置換では、パイプライン変数は除外されます。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "無効な App Service パッケージまたはフォルダー パスが指定されました: %s", + "loc.messages.SetParamFilenotfound0": "Set パラメーター ファイルが見つかりません: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 変換が正常に適用されました", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service のサービス接続の詳細を取得しました: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "エラー: そのような配置方法はありません", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service のサービス接続の詳細を取得できません: %s。状態コード: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure Resource のサービス接続の詳細を取得できません: '%s'。状態コード: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "配置履歴が %s で正常に更新されました", + "loc.messages.Failedtoupdatedeploymenthistory": "配置履歴を更新できませんでした。エラー: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 配置状態を更新できません: この Web サイトでは SCM エンドポイントが有効になっていません", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service の構成の詳細を取得できません。状態コード: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service のアプリケーションの設定を取得できません。[状態コード: '%s'、エラー メッセージ: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "App Service のアプリケーションの設定を更新できません。状態コード: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "配置の状態を更新できません: 一意の配置 ID を取得できません", + "loc.messages.PackageDeploymentSuccess": "Web パッケージを App Service に正常に配置できました。", + "loc.messages.PackageDeploymentFailed": "Web パッケージを App Service に配置できませんでした。", + "loc.messages.Runningcommand": "コマンドを実行しています: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Web パッケージ: %s を仮想パス (物理パス) へ配置しています: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "kudu サービスにより、パッケージ %s が %s に配置されました", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu サービスを使用して App Service パッケージをデプロイできませんでした: %s", + "loc.messages.Unabletodeploywebappresponsecode": "エラー コードにより、App Service を配置できません: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy が生成したパッケージは Windows プラットフォームでのみサポートされます。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy のサポートされていないバージョン: %s がインストールされています。バージョンは 3 以降である必要があります", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "コンピューター上のレジストリから、MS Deploy の場所を特定できません (エラー: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "指定されたパターン %s のパッケージが見つかりませんでした
タスクに指定されているパッケージがビルドまたは前のステージで成果物として公開されており、現在のジョブにダウンロードされているかどうかをご確認ください。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定したパターンと一致するパッケージが複数あります: %s。検索パターンを絞り込んでください。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[アプリケーションをオフラインにする] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[ロックされたファイルの名前を変更する] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "指定のパターンと一致する JSON ファイルはありません: %s。", + "loc.messages.Configfiledoesntexists": "構成ファイル %s がありません。", + "loc.messages.Failedtowritetoconfigfilewitherror": "構成ファイル %s への書き込みに失敗しました。エラー: %s", + "loc.messages.AppOfflineModeenabled": "アプリのオフライン モードが有効です。", + "loc.messages.Failedtoenableappofflinemode": "アプリのオフライン モードを有効にできませんでした。状態コード: %s (%s)", + "loc.messages.AppOflineModedisabled": "アプリのオフライン モードが無効です。", + "loc.messages.FailedtodisableAppOfflineMode": "アプリのオフライン モードを無効にできませんでした。状態コード: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "非 Windows プラットフォームでは XML 変換を実行できません。", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s の %s による変換中に XML 変換エラーが発生しました。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Web 配置オプションによる公開は、Windows エージェントを使用している場合のみサポートされます", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 配置オプションによる公開は、msBuild パッケージの種類ではサポートされていません。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 配置オプションによる公開は、仮想アプリケーションではサポートされていません。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 配置または RunFromZip オプションによる公開は、war ファイルの配置をサポートしていません。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "フォルダーが ReadOnly のため、RunFromZip による公開は、wwwroot に変更を加える場合は配置後スクリプトをサポートしない可能性があります。", + "loc.messages.ResourceDoesntExist": "リソース '%s' がありません。リソースは配置前に存在している必要があります。", + "loc.messages.EncodeNotSupported": "ファイル %s のファイル エンコードが %s として検出されました。ファイル エンコード %s では変数置換はサポートされていません。サポートされているエンコードは UTF-8 と UTF-16 LE です。", + "loc.messages.UnknownFileEncodeError": "ファイル %s (typeCode: %s) のエンコードを検出できません。サポートされているエンコードは UTF-8 および UTF-16 LE です。", + "loc.messages.ShortFileBufferError": "ファイル バッファーが短すぎてエンコードの種類を検出できません: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 構成の詳細を更新できませんでした。エラー: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 構成の詳細が正常に更新されました", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 物理パスに関して URL が要求されました: %s", + "loc.messages.Physicalpathalreadyexists": "物理パス '%s' は既に存在しています", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理パスが正常に作成されました: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 物理パスを作成することができませんでした。エラー: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 物理パスを確認できませんでした。エラー コード: %s", + "loc.messages.VirtualApplicationDoesNotExist": "仮想アプリケーションがありません: %s", + "loc.messages.JSONParseError": "JSON ファイルを解析できません: %s。エラー: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 変数置換が正常に適用されました。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 変数の置換が正常に適用されました。", + "loc.messages.failedtoUploadFileToKudu": "ファイル %s を Kudu (%s) にアップロードできません。状態コード: %s", + "loc.messages.failedtoUploadFileToKuduError": "ファイル %s を Kudu (%s) にアップロードできません。エラー: %s", + "loc.messages.ExecuteScriptOnKudu": "指定されたスクリプトを Kudu サービス上で実行しています。", + "loc.messages.FailedToRunScriptOnKuduError": "スクリプトを Kudu サービス上で実行できません。エラー: %s", + "loc.messages.FailedToRunScriptOnKudu": "スクリプトを Kudu (%s) 上で実行できません。状態コード: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "スクリプトを Kudu 上で正常に実行できました。", + "loc.messages.ScriptExecutionOnKuduFailed": "実行したスクリプトからリターン コードとして '%s' が返されました。エラー: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "ファイル %s を Kudu (%s) から削除できません。状態コード: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "ファイル %s を Kudu (%s) から削除できません。エラー: %s", + "loc.messages.ScriptFileNotFound": "スクリプト ファイル '%s' が見つかりません。", + "loc.messages.InvalidScriptFile": "無効なスクリプト ファイル '%s' が指定されました。有効な拡張子は、Windows の場合は .bat と .cmd、Linux の場合は .sh です", + "loc.messages.RetryForTimeoutIssue": "タイムアウトの問題でスクリプトを実行できませんでした。もう一度お試しください。", + "loc.messages.stdoutFromScript": "スクリプトからの標準出力: ", + "loc.messages.stderrFromScript": "スクリプトからの標準エラー出力: ", + "loc.messages.WebConfigAlreadyExists": "web.config ファイルは既に存在します。生成しません。", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config ファイルを正常に生成できました", + "loc.messages.FailedToGenerateWebConfig": "web.config を生成できませんでした。%s", + "loc.messages.FailedToGetKuduFileContent": "ファイルの内容を取得できません: %s。状態コード: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "ファイルの内容を取得できません: %s。エラー: %s", + "loc.messages.ScriptStatusTimeout": "タイムアウトのため、スクリプトの状態をフェッチできません。", + "loc.messages.PollingForFileTimeOut": "タイムアウトのため、スクリプトの状態をフェッチできません。タイムアウト制限を延長するには、'appservicedeploy.retrytimeout' 変数を必要な時間 (分) に設定します。", + "loc.messages.InvalidPollOption": "指定されたポーリング オプションが無効です: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "属性 '-appType' が Web.config パラメーターにありません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node'、'Go' です。
たとえば、Python Bottle フレームワークの場合は、'-appType python_Bottle' (sans-quotes) を指定します。", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE の 'settings.py' ファイル パスを検出できません。'settings.py' ファイルが存在することを確認するか、次の形式で Web.config パラメーター入力に正しいパスを指定してください: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "指定されたパッケージに変換を適用することはできません。次の点をご確認ください。", + "loc.messages.FailedToApplyTransformationReason1": "1. ビルド中、MSBuild によって生成されたパッケージに対して変換が既に適用されたかどうか。適用された場合は、csproj ファイル内の各構成の タグを削除してから、リビルドします。", + "loc.messages.FailedToApplyTransformationReason2": "2. 構成ファイルと変換ファイルがパッケージ内の同じフォルダーに存在すること。", + "loc.messages.AutoParameterizationMessage": "Web.config の ConnectionString 属性は既定でパラメーター化されています。'Parameters.xml' ファイルまたは 'SetParameters.xml' ファイルによって値が配置中に上書きされるため、変換が connectionString 属性に影響を与えることはありません。自動パラメーター化は、MSBuild パッケージの生成中に /p:AutoParameterizationWebConfigConnectionStrings=False のように設定することによって無効にできます。", + "loc.messages.UnsupportedAppType": "アプリの種類 '%s' が Web.config 生成でサポートされていません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node' です。", + "loc.messages.UnableToFetchAuthorityURL": "機関の URL をフェッチできません。", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory リソース ID をフェッチできません。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドが正常に更新されました。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドの更新に失敗しました。エラー: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "アプリの設定が正常に更新されました。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "アプリ設定の更新に失敗しました。エラー: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp メタデータをフェッチできませんでした。ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp メタデータを更新できません。エラー コード: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure コンテナー レジストリの資格情報を取得できません。[状態コード: '%s']", + "loc.messages.UnableToReadResponseBody": "応答本文を読み取ることができません。エラー: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 構成の詳細を更新できません。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights リソース ’%s’ のリリース コメントを追加しています", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight にリリース コメントが正常に追加されました: %s", + "loc.messages.FailedAddingReleaseAnnotation": "リリース コメントを追加できませんでした。%s", + "loc.messages.RenameLockedFilesEnabled": "App Service で [ロックされたファイルの名前を変更する] が有効です。", + "loc.messages.FailedToEnableRenameLockedFiles": "[ロックされたファイルの名前を変更する] を有効にできませんでした。エラー: %s", + "loc.messages.WebJobsInProgressIssue": "実行状態の Web ジョブが少数あるため、配置でファイルを削除できません。[Remove additional files at destination] (同期先で追加のファイルを削除する) オプションを無効にするか、配置の前に継続ジョブを停止することができます。", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu アプリ設定をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToCreatePath": "Kudu からパス '%s' を作成することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFile": "Kudu からファイル '%s/%s' を削除することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFolder": "Kudu からフォルダー '%s' を削除できませんでした。エラー: %s", + "loc.messages.FailedToUploadFile": "Kudu からファイル '%s/%s' をアップロードできませんでした。エラー: %s", + "loc.messages.FailedToGetFileContent": "Kudu からファイル コンテンツ '%s/%s' を取得できませんでした。エラー: %s", + "loc.messages.FailedToListPath": "Kudu からパス '%s' の一覧を取得できませんでした。エラー: %s", + "loc.messages.RetryToDeploy": "パッケージの配置を再試行しています。", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' の詳細をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' の公開プロファイルをフェッチできませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' のメタデータの更新に失敗しました。エラー: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' のメタデータの取得に失敗しました。エラー: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' の構成を修正できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 構成を更新できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 構成を取得できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' の公開資格情報をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を取得できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を更新できませんでした。エラー: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 構成の設定を更新しようとしています。データ: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 構成の設定が更新されました。", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service アプリケーションの設定を更新しようとしています。データ: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service アプリケーション設定は既に存在します。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 接続文字列は既に存在します。", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service アプリケーション設定と Kudu アプリケーション設定が更新されました。", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s' に複数のリソース グループが見つかりました。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 配置を使用したパッケージ配置に失敗しました。詳細についてはログを参照してください。", + "loc.messages.PackageDeploymentInitiated": "ZIP 配置を使用したパッケージ配置を開始しました。", + "loc.messages.WarPackageDeploymentInitiated": "WAR 配置を使用したパッケージ配置が開始しました。", + "loc.messages.FailedToGetDeploymentLogs": "配置ログを取得できませんでした。エラー: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名が存在しません", + "loc.messages.WarDeploymentRetry": "war ファイルは前回正常に展開されなかったため、展開を再試行しています。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "マシンで TLS 1.2 プロトコル以上を使用していることを確認します。お使いのマシンで TLS を有効にする方法について詳しくは、https://aka.ms/enableTlsv2 をご確認ください。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure 用のアクセス トークンをフェッチできませんでした。状態コード: %s、状態メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。仮想マシンのマネージド サービス ID (MSI) を構成してください 'https://aka.ms/azure-msi-docs'。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML ファイルを解析できません。エラー: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] プロパティが公開プロファイル内に存在しません", + "loc.messages.InvalidConnectionType": "無効なサービス接続の種類", + "loc.messages.InvalidImageSourceType": "無効な画像ソースの種類", + "loc.messages.InvalidPublishProfile": "公開プロファイルのファイルが無効です。", + "loc.messages.ASE_SSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があり、それを解決するには、VSTS_ARM_REST_IGNORE_SSL_ERRORS という名前の変数の値をビルド定義またはリリース パイプラインで true に設定する必要があります。", + "loc.messages.ZipDeployLogsURL": "Zip 配置のログは、%s で確認できます", + "loc.messages.DeployLogsURL": "配置ログは %s で確認できます", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があります。これを解決するには、Web 配置オプションの追加引数に -allowUntrusted を渡す必要があります。", + "loc.messages.FailedToGetResourceID": "リソースの種類 '%s'、リソース名 '%s' のリソース ID を取得できませんでした。エラー: %s", + "loc.messages.JarPathNotPresent": "Java jar パスが存在しません", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' リソースを更新できませんでした。エラー: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Web 配置から Run From Package に移動します。これは、FILE_IN_USE エラーを回避するのに役立ちます。Run From Package では、msBuild パッケージの種類はサポートされていません。この配置方法を使用するには、パッケージ形式を変更してください。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..b73547991743 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 배포", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker, Java, .NET, .NET Core, Node.js, PHP, Python 또는 Ruby를 사용하는 웹, 모바일 또는 API 앱을 Azure App Service에 배포합니다.", + "loc.instanceNameFormat": "Azure App Service 배포: $(WebAppName)", + "loc.releaseNotes": "버전 4.*의 새로운 기능
zip 배포, 패키지에서 실행, war 배포 지원 [자세한 정보](https://aka.ms/appServiceDeploymentMethods)
App Service Environment 지원
작업에서 지원하는 다양한 App Service 유형을 검색하기 위한 향상된 UI
'패키지에서 실행'이 기본 배포 방법으로, wwwroot 폴더의 파일을 읽기 전용으로 설정
자세한 내용을 보려면 [여기](https://aka.ms/azurermwebdeployreadme)를 클릭하세요.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "파일 변환 및 변수 대체 옵션", + "loc.group.displayName.AdditionalDeploymentOptions": "추가 배포 옵션", + "loc.group.displayName.PostDeploymentAction": "배포 후 작업", + "loc.group.displayName.ApplicationAndConfigurationSettings": "응용 프로그램 및 구성 설정", + "loc.input.label.ConnectionType": "연결 형식", + "loc.input.help.ConnectionType": "웹앱을 배포하는 데 사용할 서비스 연결 형식을 선택합니다.
Visual Studio에서 만든 게시 프로필을 사용하려면 게시 프로필을 선택합니다. [자세한 정보](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 구독", + "loc.input.help.ConnectedServiceName": "배포에 대한 Azure Resource Manager 구독을 선택합니다.", + "loc.input.label.PublishProfilePath": "게시 프로필 경로", + "loc.input.help.PublishProfilePath": "Visual Studio에서 만든 게시 프로필의 경로", + "loc.input.label.PublishProfilePassword": "게시 프로필 암호", + "loc.input.help.PublishProfilePassword": "비밀 변수에 암호를 저장하고 여기서 해당 변수를 사용하는 것이 좋습니다(예: $(Password)).", + "loc.input.label.WebAppKind": "App Service 유형", + "loc.input.help.WebAppKind": "Windows의 웹앱, Web App on Linux, Web App for Containers, 함수 앱, Linux의 함수 앱, 컨테이너용 함수 앱 및 모바일 앱 중에서 선택합니다.", + "loc.input.label.WebAppName": "App Service 이름", + "loc.input.help.WebAppName": "기존 Azure App Service의 이름을 입력하거나 선택합니다. 선택한 앱 유형을 기반으로 하는 앱 서비스만 나열됩니다.", + "loc.input.label.DeployToSlotOrASEFlag": "슬롯 또는 App Service Environment에 배포", + "loc.input.help.DeployToSlotOrASEFlag": "기존 배포 슬롯 또는 Azure App Service Environment에 배포하는 옵션을 선택합니다.
두 대상 모두, 작업에 리소스 그룹 이름이 필요합니다.
배포 대상이 슬롯인 경우 기본적으로 프로덕션 슬롯에 배포가 수행됩니다. 다른 기존 슬롯 이름을 제공할 수도 있습니다.
배포 대상이 Azure App Service Environment인 경우 슬롯 이름을 '프로덕션'으로 두고 리소스 그룹 이름만 지정하세요.", + "loc.input.label.ResourceGroupName": "리소스 그룹", + "loc.input.help.ResourceGroupName": "배포 대상이 배포 슬롯 또는 App Service Environment인 경우 리소스 그룹 이름이 필요합니다.
위에서 지정한 Azure App Service를 포함하는 Azure 리소스 그룹을 입력하거나 선택합니다.", + "loc.input.label.SlotName": "슬롯", + "loc.input.help.SlotName": "프로덕션 슬롯이 아닌 기존 슬롯을 입력하거나 선택합니다.", + "loc.input.label.DockerNamespace": "레지스트리 또는 네임스페이스", + "loc.input.help.DockerNamespace": "특정 레지스트리 또는 네임스페이스의 전역적으로 고유한 최상위 도메인 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerRepository": "이미지", + "loc.input.help.DockerRepository": "컨테이너 이미지가 저장된 리포지토리의 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerImageTag": "태그", + "loc.input.help.DockerImageTag": "태그는 선택 사항입니다. 태그는 레지스트리에서 Docker 이미지에 버전을 지정하는 데 사용하는 메커니즘입니다.
참고: 정규화된 이미지 이름은 '`/`:`' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.VirtualApplication": "가상 응용 프로그램", + "loc.input.help.VirtualApplication": "Azure Portal에서 구성된 가상 응용 프로그램의 이름을 지정합니다. App Service 루트에 배포할 경우 이 옵션은 필요하지 않습니다.", + "loc.input.label.Package": "패키지 또는 폴더", + "loc.input.help.Package": "패키지, MSBuild에서 생성된 App Service 콘텐츠를 포함하는 폴더 또는 압축된 zip 또는 war 파일의 파일 경로입니다.
변수([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), 와일드카드가 지원됩니다.
예: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 또는 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "런타임 스택", + "loc.input.help.RuntimeStack": "프레임워크 및 버전을 선택합니다.", + "loc.input.label.RuntimeStackFunction": "런타임 스택", + "loc.input.help.RuntimeStackFunction": "프레임워크 및 버전을 선택합니다. 지원되는 런타임 버전은 [관련 문서](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)를 참조하세요. 'DOCKER|microsoft/azure-functions-*' 같은 이전 값은 사용되지 않습니다. 드롭다운에서 새 값을 사용하세요.", + "loc.input.label.StartupCommand": "시작 명령 ", + "loc.input.help.StartupCommand": "시작 명령을 입력합니다. 예:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "배포 스크립트 형식", + "loc.input.help.ScriptType": "작업이 배포를 완료한 후 Azure App Service에서 실행할 스크립트를 제공하여 배포를 사용자 지정합니다. 예를 들어 Node, PHP, Python 응용 프로그램용 패키지를 복원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "인라인 스크립트", + "loc.input.label.ScriptPath": "배포 스크립트 경로", + "loc.input.label.WebConfigParameters": "Python, Node.js, Go 및 Java 앱에 대한 web.config 매개 변수 생성", + "loc.input.help.WebConfigParameters": "애플리케이션에 없는 경우 표준 Web.config가 생성되어 Azure App Service에 배포됩니다. web.config의 값은 편집 가능하며, 애플리케이션 프레임워크에 따라 달라집니다. 예를 들어 node.js 애플리케이션의 경우 web.config에 시작 파일 및 iis_node 모듈 값이 포함됩니다. 이 편집 기능은 생성된 web.config에만 사용됩니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "앱 설정", + "loc.input.help.AppSettings": "구문 -key 값 다음에 오는 웹앱 응용 프로그램 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "구성 설정", + "loc.input.help.ConfigurationSettings": "구문 -key 값 다음에 오는 웹앱 구성 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
예 : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "배포 방법 선택", + "loc.input.help.UseWebDeploy": "선택 취소하면, 앱 유형, 패키지 형식 및 기타 매개 변수를 기준으로 가장 적합한 배포 방법이 자동 검색됩니다.
지원되는 배포 방법을 표시하는 옵션을 선택하고, 앱 배포 방법을 선택합니다.", + "loc.input.label.DeploymentType": "배포 방법", + "loc.input.help.DeploymentType": "앱의 배포 방법을 선택합니다.", + "loc.input.label.TakeAppOfflineFlag": "앱을 오프라인으로 전환", + "loc.input.help.TakeAppOfflineFlag": "동기화 작업이 시작되기 전에 App Service의 루트 디렉터리에 app_offline.htm 파일을 배치하여 Azure App Service를 오프라인 상태로 전환하려면 이 옵션을 선택합니다. 이 파일은 동기화 작업이 완료된 후 제거됩니다.", + "loc.input.label.SetParametersFile": "SetParameters 파일", + "loc.input.help.SetParametersFile": "옵션: 사용할 SetParameters.xml 파일의 위치입니다.", + "loc.input.label.RemoveAdditionalFilesFlag": "대상에서 추가 파일 제거", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service 패키지 또는 폴더에 일치하는 파일이 없는 Azure App Service의 파일을 삭제하는 옵션을 선택합니다.

참고: 이 경우 Azure App Service에 설치된 확장과 관련된 모든 파일도 제거됩니다. 이를 방지하려면 'App_Data 폴더에서 파일 제외' 확인란을 선택합니다. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일 제외", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일이 Azure App Service에 배포되거나 Azure App Service에서 삭제되지 않게 하려면 이 옵션을 선택합니다.", + "loc.input.label.AdditionalArguments": "추가 인수", + "loc.input.help.AdditionalArguments": "구문 -key:value 다음에 오는 추가 웹 배포 인수입니다.
이 인수는 Azure App Service를 배포할 때 적용됩니다. 예: -disableLink:AppPoolExtension -disableLink:ContentExtension.
웹 배포 작업 설정의 추가 예제는 [여기](https://go.microsoft.com/fwlink/?linkid=838471)를 참조하세요.", + "loc.input.label.RenameFilesFlag": "잠겨 있는 파일 이름 바꾸기", + "loc.input.help.RenameFilesFlag": "Azure App Service 응용 프로그램 설정에서 msdeploy 플래그 MSDEPLOY_RENAME_LOCKED_FILES=1을 사용하도록 설정하려면 이 옵션을 선택합니다. 이 옵션을 설정하면 msdeploy에서 앱 배포 중 잠겨 있는 파일의 이름을 바꿀 수 있습니다.", + "loc.input.label.XmlTransformation": "XML 변환", + "loc.input.help.XmlTransformation": "`*.config 파일`에서 `*.Release.config` 및 `*..config`에 대한 구성 변환이 실행됩니다.
구성 변환은 변수 대체 전에 실행됩니다.
XML 변환은 Windows 플랫폼에서만 지원됩니다.", + "loc.input.label.XmlVariableSubstitution": "XML 변수 대체", + "loc.input.help.XmlVariableSubstitution": "빌드 또는 릴리스 파이프라인에서 정의된 변수가 구성 파일 및 parameters.xml의 appSettings, applicationSettings 및 connectionStrings 섹션에 있는 'key' 또는 'name' 항목과 일치됩니다. 구성 변환 후에 변수 대체가 실행됩니다.

참고: 릴리스 파이프라인 및 환경에서 동일한 변수가 정의된 경우 환경 변수가 릴리스 파이프라인 변수를 대체합니다.
", + "loc.input.label.JSONFiles": "JSON 변수 대체", + "loc.input.help.JSONFiles": "변수 값을 대체할 JSON 파일을 줄 바꿈으로 구분된 목록으로 제공합니다. 파일 이름은 루트 폴더에 상대적으로 지정해야 합니다.
중첩되거나 계층적인 JSON 변수를 대체하려면 JSONPath 식을 사용하여 지정합니다.

예를 들어 아래 샘플에서 'ConnectionString' 값을 대체하려면 빌드 또는 릴리스 파이프라인(또는 릴리스 파이프라인의 환경)에서 변수를 'Data.DefaultConnection.ConnectionString'으로 정의해야 합니다.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
변수 대체는 구성 변환 후 실행됩니다.

참고: 파이프라인 변수는 대체에서 제외됩니다.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "잘못된 App Service 패키지 또는 폴더 경로를 제공했습니다. %s", + "loc.messages.SetParamFilenotfound0": "매개 변수 설정 파일을 찾을 수 없습니다. %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 변환을 적용했습니다.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service '%s'에 대한 서비스 연결 정보를 가져왔습니다.", + "loc.messages.ErrorNoSuchDeployingMethodExists": "오류: 해당 배포 방법이 없습니다.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service %s에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s(%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure 리소스 '%s'에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "%s에서 배포 기록을 업데이트했습니다.", + "loc.messages.Failedtoupdatedeploymenthistory": "배포 기록을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "경고: 배포 상태를 업데이트할 수 없습니다. 이 웹 사이트에는 SCM 엔드포인트를 사용할 수 없습니다.", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service 구성 정보를 검색할 수 없습니다. 상태 코드: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service 응용 프로그램 설정을 검색할 수 없습니다[상태 코드: '%s', 오류 메시지: '%s'].", + "loc.messages.Unabletoupdatewebappsettings": "App Service 응용 프로그램 설정을 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "배포 상태를 업데이트할 수 없습니다. 고유한 배포 ID를 검색할 수 없습니다.", + "loc.messages.PackageDeploymentSuccess": "웹 패키지를 App Service에 배포했습니다.", + "loc.messages.PackageDeploymentFailed": "웹 패키지를 App Service에 배포하지 못했습니다.", + "loc.messages.Runningcommand": "%s 명령을 실행하고 있습니다.", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "웹 패키지 %s을(를) 가상 경로(실제 경로) %s(%s)에 배포하는 중입니다.", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Kudu 서비스를 사용하여 %s 패키지를 %s에 배포했습니다.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu 서비스를 사용하여 App Service 패키지를 배포하지 못했습니다. %s", + "loc.messages.Unabletodeploywebappresponsecode": "오류 코드로 인해 App Service를 배포할 수 없습니다. %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 생성 패키지는 Windows 플랫폼에만 지원됩니다.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy에 대해 지원되지 않는 설치된 버전 %s을(를) 찾았습니다. 버전은 3 이상이어야 합니다.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "컴퓨터의 레지스트리에서 MS 배포의 위치를 찾을 수 없습니다(오류: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "지정된 패턴의 패키지를 찾을 수 없습니다. %s
작업에 언급된 패키지가 빌드 또는 이전 스테이지에서 아티팩트로 게시되고 현재 작업에 다운로드되는지 확인합니다.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "지정한 패턴 %s과(와) 일치하는 패키지가 두 개 이상 있습니다. 검색 패턴을 제한하세요.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[응용 프로그램을 오프라인으로 만들기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[잠겨 있는 파일 이름 바꾸기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "특정 패턴과 일치하는 JSON 파일이 없음: %s", + "loc.messages.Configfiledoesntexists": "구성 파일 %s이(가) 없습니다.", + "loc.messages.Failedtowritetoconfigfilewitherror": "구성 파일 %s에 쓰지 못했습니다(오류: %s).", + "loc.messages.AppOfflineModeenabled": "앱 오프라인 모드를 사용하도록 설정했습니다.", + "loc.messages.Failedtoenableappofflinemode": "앱 오프라인 모드를 사용하도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.AppOflineModedisabled": "앱 오프라인 모드를 사용하지 않도록 설정했습니다.", + "loc.messages.FailedtodisableAppOfflineMode": "앱 오프라인 모드를 사용하지 않도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Windows가 아닌 플랫폼에서는 XML 변환을 수행할 수 없습니다.", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s을(를) 변환(%s 사용)하는 동안 XML 변환 오류가 발생했습니다.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "웹 배포 옵션을 사용한 게시는 Windows 에이전트를 사용할 경우에만 지원됩니다.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 배포 옵션을 사용한 게시는 msBuild 패키지 형식에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 배포 옵션을 사용한 게시는 가상 애플리케이션에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 배포 또는 RunFromZip 옵션을 사용한 게시에서는 war 파일 배포를 지원하지 않습니다.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "폴더가 읽기 전용이므로 wwwroot를 변경하는 경우 RunFromZip을 사용한 게시에서 배포 후 스크립트를 지원하지 않을 수 있습니다.", + "loc.messages.ResourceDoesntExist": "'%s' 리소스가 없습니다. 배포 전에 리소스가 있어야 합니다.", + "loc.messages.EncodeNotSupported": "%s 파일에 대한 파일 인코딩이 %s(으)로 검색되었습니다. 파일 인코딩 %s을(를) 사용할 경우 변수 대체가 지원되지 않습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.UnknownFileEncodeError": "%s 파일(typeCode: %s)에 대한 인코딩을 검색할 수 없습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.ShortFileBufferError": "파일 버퍼가 너무 짧아서 인코딩 형식을 검색할 수 없습니다. %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트했습니다.", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 실제 경로의 요청된 URL: %s", + "loc.messages.Physicalpathalreadyexists": "실제 경로 '%s'이(가) 이미 있습니다.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 실제 경로를 만들었습니다. %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 실제 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 실제 경로를 확인하지 못했습니다. 오류 코드: %s", + "loc.messages.VirtualApplicationDoesNotExist": "가상 응용 프로그램이 없습니다. %s", + "loc.messages.JSONParseError": "JSON 파일 %s을(를) 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 변수 대체를 적용했습니다.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 변수 대체를 적용했습니다.", + "loc.messages.failedtoUploadFileToKudu": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 상태 코드: %s", + "loc.messages.failedtoUploadFileToKuduError": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 오류: %s", + "loc.messages.ExecuteScriptOnKudu": "Kudu 서비스에서 지정된 스크립트를 실행하는 중입니다.", + "loc.messages.FailedToRunScriptOnKuduError": "Kudu 서비스에서 스크립트를 실행할 수 없습니다. 오류: %s", + "loc.messages.FailedToRunScriptOnKudu": "Kudu에서 스크립트를 실행할 수 없음: %s. 상태 코드: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Kudu에서 스크립트를 실행했습니다.", + "loc.messages.ScriptExecutionOnKuduFailed": "실행된 스크립트에서 반환 코드로 '%s'을(를) 반환했습니다. 오류: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 상태 코드: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 오류: %s", + "loc.messages.ScriptFileNotFound": "스크립트 파일 '%s'을(를) 찾을 수 없습니다.", + "loc.messages.InvalidScriptFile": "잘못된 스크립트 파일 '%s'이(가) 제공되었습니다. 유효한 확장명은 Windows의 경우 .bat 및 .cmd이고, Linux의 경우 .sh입니다.", + "loc.messages.RetryForTimeoutIssue": "시간 초과 문제로 스크립트 실행에 실패했습니다. 다시 시도하는 중입니다.", + "loc.messages.stdoutFromScript": "스크립트의 표준 출력: ", + "loc.messages.stderrFromScript": "스크립트의 표준 오류: ", + "loc.messages.WebConfigAlreadyExists": "web.config 파일이 이미 있습니다. 생성하지 않습니다.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config 파일을 생성했습니다.", + "loc.messages.FailedToGenerateWebConfig": "web.config를 생성하지 못했습니다. %s", + "loc.messages.FailedToGetKuduFileContent": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.FailedToGetKuduFileContentError": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.ScriptStatusTimeout": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다.", + "loc.messages.PollingForFileTimeOut": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다. 'appservicedeploy.retrytimeout' 변수를 필요한 시간(분)으로 설정하여 시간 제한을 늘릴 수 있습니다.", + "loc.messages.InvalidPollOption": "잘못된 폴링 옵션이 제공됨: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 매개 변수에 '-appType' 특성이 없습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 'node' 및 'Go'입니다.
예를 들어 Python Bottle 프레임워크의 경우 '-appType python_Bottle' (sans-quotes)입니다.", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE 'settings.py' 파일 경로를 검색할 수 없습니다. 'settings.py' 파일이 존재하는지 확인하거나 Web.config 매개 변수 입력에 '-DJANGO_SETTINGS_MODULE .settings' 형식으로 올바른 경로를 제공하세요.", + "loc.messages.FailedToApplyTransformation": "지정된 패키지에 변환을 적용할 수 없습니다. 다음을 확인하세요.", + "loc.messages.FailedToApplyTransformationReason1": "1. 빌드 중 생성된 MSBuild 패키지에 대해 변환이 이미 적용되었는지 여부를 확인합니다. 그런 경우 csproj 파일에서 각 구성에 대해 태그를 제거하고 다시 빌드합니다. ", + "loc.messages.FailedToApplyTransformationReason2": "2. 구성 파일 및 변환 파일이 패키지 내의 동일한 폴더에 있는지 확인합니다.", + "loc.messages.AutoParameterizationMessage": "Web.config의 ConnectionString 특성은 기본적으로 매개 변수가 있습니다. 'Parameters.xml' 또는 'SetParameters.xml' 파일로 배포 중 값이 재정의되므로 변환은 connectionString 특성에 아무런 영향을 미치지 않습니다. MSBuild 패키지 생성 중 p:AutoParameterizationWebConfigConnectionStrings=False를 설정하여 자동 매개 변수화를 사용하지 않도록 설정할 수 있습니다.", + "loc.messages.UnsupportedAppType": "Web.config 생성에서 '%s' 앱 형식이 지원되지 않습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 및 'node'입니다.", + "loc.messages.UnableToFetchAuthorityURL": "기관 URL을 페치할 수 없습니다.", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory 리소스 ID를 페치할 수 없습니다.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트했습니다.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "앱 설정을 업데이트했습니다.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "앱 설정을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 페치하지 못했습니다. 오류 코드: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 업데이트할 수 없습니다. 오류 코드: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure Container Registry 자격 증명을 검색할 수 없습니다.[상태 코드: '%s']", + "loc.messages.UnableToReadResponseBody": "응답 본문을 읽을 수 없습니다. 오류: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 구성 정보를 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights 리소스 '%s'에 대한 릴리스 주석을 추가하는 중", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight에 릴리스 주석 추가함: %s", + "loc.messages.FailedAddingReleaseAnnotation": "릴리스 주석을 추가하지 못했습니다. %s", + "loc.messages.RenameLockedFilesEnabled": "App Service에 대해 잠긴 파일 이름 바꾸기를 사용할 수 있습니다.", + "loc.messages.FailedToEnableRenameLockedFiles": "잠긴 파일 이름 바꾸기를 사용하도록 설정하지 못했습니다. 오류: %s", + "loc.messages.WebJobsInProgressIssue": "실행 상태의 WebJobs가 거의 없으므로 배포에서 파일을 제거할 수 없습니다. 배포 전에 연속 작업을 중지하거나 '대상에서 추가 파일 제거' 옵션을 사용하지 않을 수 있습니다.", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu 앱 설정을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToCreatePath": "Kudu에서 '%s' 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFile": "Kudu에서 '%s/%s' 파일을 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFolder": "Kudu에서 '%s' 폴더를 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToUploadFile": "Kudu에서 '%s/%s' 파일을 업로드하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetFileContent": "Kudu에서 파일 콘텐츠 '%s/%s'을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToListPath": "Kudu에서 '%s' 경로를 나열하지 못했습니다. 오류: %s", + "loc.messages.RetryToDeploy": "패키지 배포를 다시 시도하는 중입니다.", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' 정보를 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' 게시 프로필을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' 메타데이터를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' 메타데이터를 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' 구성을 패치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 구성을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 구성을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' 게시 자격 증명을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트했습니다.", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service 애플리케이션 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 애플리케이션 설정이 이미 있습니다.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 연결 문자열이 이미 있습니다.", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service 응용 프로그램 설정 및 Kudu 응용 프로그램 설정을 업데이트했습니다.", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s'에 대한 리소스 그룹이 여러 개 있습니다.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 배포를 사용한 패키지 배포에 실패했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.PackageDeploymentInitiated": "ZIP 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.WarPackageDeploymentInitiated": "WAR 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.FailedToGetDeploymentLogs": "배포 로그를 가져오지 못했습니다. 오류: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 이름이 없습니다.", + "loc.messages.WarDeploymentRetry": "이전에 war 파일이 확장되지 않았으므로 war 파일 배포를 다시 시도합니다.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "머신에서 TLS 1.2 프로토콜 이상을 사용 중인지 확인하세요. 머신에서 TLS를 사용하도록 설정하는 방법에 대해 자세히 알아보려면 https://aka.ms/enableTlsv2를 참조하세요.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 가상 머신에 대한 MSI(관리 서비스 ID)를 구성하세요('https://aka.ms/azure-msi-docs'). 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML 파일을 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 속성이 게시 프로필에 없습니다.", + "loc.messages.InvalidConnectionType": "잘못된 서비스 연결 형식", + "loc.messages.InvalidImageSourceType": "잘못된 이미지 소스 유형", + "loc.messages.InvalidPublishProfile": "게시 프로필 파일이 잘못되었습니다.", + "loc.messages.ASE_SSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우, 자체 서명된 인증서를 사용하는 중일 수 있으며 오류를 해결하려면 이름이 VSTS_ARM_REST_IGNORE_SSL_ERRORS인 변수를 빌드 또는 릴리스 파이프라인에서 true 값으로 설정해야 합니다.", + "loc.messages.ZipDeployLogsURL": "zip 배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.DeployLogsURL": "배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.AppServiceApplicationURL": "App Service 애플리케이션 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우 자체 서명된 인증서를 사용하는 것 같으며, 오류를 해결하려면 웹 배포 옵션의 추가 인수에 -allowUntrusted를 전달해야 합니다.", + "loc.messages.FailedToGetResourceID": "리소스 종류 '%s' 및 리소스 이름 '%s'의 리소스 ID를 가져오지 못했습니다. 오류: %s", + "loc.messages.JarPathNotPresent": "Java jar 경로가 없습니다.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' 리소스를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "'웹 배포'에서 FILE_IN_USE 오류 방지에 도움이 되는 '패키지에서 실행'으로 전환하세요. '패키지에서 실행'은 msBuild 패키지 형식을 지원하지 않습니다. 이 배포 방법을 사용하려면 패키지 형식을 변경하세요." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..d5539e3edd48 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Развертывание Службы приложений Azure", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Развертывание веб-приложения, мобильного приложения или приложения API в Службе приложений Azure с помощью Docker, Java, .NET, .NET Core, Node.js, PHP, Python или Ruby", + "loc.instanceNameFormat": "Развертывание службы приложений Azure: $(WebAppName)", + "loc.releaseNotes": "Новые возможности в версии 4.*
Поддерживается развертывание из ZIP-файла, запуск из пакета, развертывание WAR-файла [Подробности здесь](https://aka.ms/appServiceDeploymentMethods)
Поддерживаются среды службы приложений
Улучшен пользовательский интерфейс для обнаружения различных типов службы приложений, поддерживаемых задачей
Предпочтительным методом развертывания является запуск из пакета, при котором файлы в папке wwwroot становятся доступными только для чтения
Чтобы получить дополнительные сведения, щелкните [здесь](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Параметры преобразования файлов и подстановки переменных", + "loc.group.displayName.AdditionalDeploymentOptions": "Дополнительные параметры развертывания", + "loc.group.displayName.PostDeploymentAction": "Действие после развертывания", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Параметры приложения и конфигурации", + "loc.input.label.ConnectionType": "Тип подключения", + "loc.input.help.ConnectionType": "Выберите тип подключения службы, который будет использоваться для развертывания веб-приложения.
Выберите \"Профиль публикации\" для использования профиля публикации, созданного в Visual Studio. [Дополнительные сведения](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Подписка Azure", + "loc.input.help.ConnectedServiceName": "Выберите подписку на Azure Resource Manager для развертывания.", + "loc.input.label.PublishProfilePath": "Путь к профилю публикации", + "loc.input.help.PublishProfilePath": "Путь к профилю публикации, созданному в Visual Studio", + "loc.input.label.PublishProfilePassword": "Пароль профиля публикации", + "loc.input.help.PublishProfilePassword": "Рекомендуется хранить пароль в секретной переменной и использовать ее здесь, например $(Password).", + "loc.input.label.WebAppKind": "Тип службы приложений", + "loc.input.help.WebAppKind": "Выберите веб-приложение в Windows, веб-приложение в Linux, веб-приложение для контейнеров, приложение-функцию, приложение-функцию в Linux, приложение-функцию для контейнеров или мобильное приложение.", + "loc.input.label.WebAppName": "Имя службы приложений", + "loc.input.help.WebAppName": "Введите или выберите имя существующей службы приложений Azure. Будут перечислены только службы приложений для выбранного типа приложения.", + "loc.input.label.DeployToSlotOrASEFlag": "Развернуть в слоте или среде службы приложений", + "loc.input.help.DeployToSlotOrASEFlag": "Выберите вариант развертывания в существующем слоте развертывания или в среде службы приложений Azure.
В обоих случаях задаче требуется имя группы ресурсов.
Если целью развертывания является слот, по умолчанию оно выполняется в рабочем слоте. Можно также указать имя любого другого существующего слота.
Если целью развертывания является среда службы приложений Azure, оставьте имя слота \"рабочий\" и укажите имя группы ресурсов.", + "loc.input.label.ResourceGroupName": "Группа ресурсов", + "loc.input.help.ResourceGroupName": "Имя группы ресурсов является обязательным, если цель развертывания — слот развертывания или среда службы приложений.
Введите или выберите группу ресурсов Azure, которая содержит указанную выше службу приложений Azure.", + "loc.input.label.SlotName": "Слот", + "loc.input.help.SlotName": "Введите или выберите существующий слот вместо рабочего слота.", + "loc.input.label.DockerNamespace": "Реестр или пространство имен", + "loc.input.help.DockerNamespace": "Глобально уникальное доменное имя верхнего уровня для реестра или пространства имен.
Примечание. Полное доменное имя имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Образ", + "loc.input.help.DockerRepository": "Имя репозитория, в котором хранятся образы контейнера.
Примечание. Полное доменное имя образа имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Тег", + "loc.input.help.DockerImageTag": "Теги необязательны, они используются в реестрах для указания версий образов Docker.
Примечание. Полное доменное имя образа имеет следующий формат: \"`/`:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Виртуальное приложение", + "loc.input.help.VirtualApplication": "Укажите имя виртуального приложения, настроенного на портале Azure. Параметр не является обязательным для развертываний в корне службы приложений.", + "loc.input.label.Package": "Пакет или папка", + "loc.input.help.Package": "Путь к файлу пакета или папке с содержимым службы приложений, созданным MSBuild, или к сжатому ZIP- или WAR-файлу.
Поддерживаются переменные ([сборки](https://docs.microsoft.com/vsts/pipelines/build/variables) | [выпуска](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), а также подстановочные знаки.
Примеры: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip или $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Стек среды выполнения", + "loc.input.help.RuntimeStack": "Выберите платформу и версию.", + "loc.input.label.RuntimeStackFunction": "Стек среды выполнения", + "loc.input.help.RuntimeStackFunction": "Выберите платформу и версию. Поддерживаемые версии среды выполнения приведены в [следующем документе](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages). Старые значения, такие как \"DOCKER|microsoft/azure-functions-*\", являются нерекомендуемыми, используйте новые значения из раскрывающегося списка.", + "loc.input.label.StartupCommand": "Команда запуска ", + "loc.input.help.StartupCommand": "Введите команду запуска, например
dotnet exec имя_файла.dll
dotnet имя_файла.dll", + "loc.input.label.ScriptType": "Тип сценария развертывания", + "loc.input.help.ScriptType": "Настройте развертывание, указав скрипт, который будет выполнен в службе приложений Azure по окончании развертывания. Например: восстановите пакеты для приложений Node, PHP и Python. [Дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Встроенный скрипт", + "loc.input.label.ScriptPath": "Путь к сценарию развертывания", + "loc.input.label.WebConfigParameters": "Создание параметров файла web.config для приложений Python, Node.js, Go и Java", + "loc.input.help.WebConfigParameters": "Если в приложении отсутствует стандартный файл web.config, он будет сгенерирован и развернут в Службе приложений Azure. Значения в файле web.config можно изменить. Они могут меняться в зависимости от исполняющей среды. Например, в файле web.config приложения node.js имеются загрузочный файл и модульные значения iis_node. Возможность редактирования доступна только для сгенерированного файла web.config. [Подробнее](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Параметры приложения", + "loc.input.help.AppSettings": "Измените параметры веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Параметры конфигурации", + "loc.input.help.ConfigurationSettings": "Измените параметры настройки веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Выбор метода развертывания", + "loc.input.help.UseWebDeploy": "Если этот флажок не установлен, оптимальный метод развертывания определяется автоматически в соответствии с типом приложения, форматом пакета и другими параметрами.
Выберите этот параметр, чтобы просмотреть поддерживаемые методы развертывания и выбрать один из них для своего приложения.", + "loc.input.label.DeploymentType": "Метод развертывания", + "loc.input.help.DeploymentType": "Выберите метод развертывания для приложения.", + "loc.input.label.TakeAppOfflineFlag": "Перевести приложение в автономный режим", + "loc.input.help.TakeAppOfflineFlag": "Выберите этот параметр, чтобы перевести службу приложений Azure в автономный режим путем размещения файла app_offline.htm в корневом каталоге службы приложений перед началом операции синхронизации. Файл будет удален после успешного завершения синхронизации.", + "loc.input.label.SetParametersFile": "Файл SetParameters", + "loc.input.help.SetParametersFile": "Дополнительно: расположение используемого файла SetParameters.xml.", + "loc.input.label.RemoveAdditionalFilesFlag": "Удалять дополнительные файлы в месте назначения", + "loc.input.help.RemoveAdditionalFilesFlag": "Выберите этот параметр, чтобы удалить файлы в службе приложений Azure, для которых отсутствуют соответствующие файлы или папки в службе приложений.

Примечание. При этом также будут удалены все файлы, связанные со всеми расширениями, установленными в этой службе приложений Azure App. Чтобы этого избежать, установите флажок \"Исключить файлы из папки App_Data\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Исключить файлы из папки App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Выберите этот параметр, чтобы заблокировать развертывание файлов из папки App_Data в службе приложений Azure или их удаление из этой службы.", + "loc.input.label.AdditionalArguments": "Дополнительные аргументы", + "loc.input.help.AdditionalArguments": "Дополнительные аргументы веб-развертывания, использующие синтаксис -ключ:значение.
Они будут применяться при развертывании службы приложений Azure, например -disableLink:AppPoolExtension -disableLink:ContentExtension.
Другие примеры рабочих параметров веб-развертывания см. [здесь](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Переименовывать заблокированные файлы", + "loc.input.help.RenameFilesFlag": "Выберите этот параметр, чтобы включить в msdeploy флаг MSDEPLOY_RENAME_LOCKED_FILES=1 в параметрах приложения службы приложений Azure. Если этот параметр установлен, msdeploy может переименовывать файлы, заблокированные во время развертывания приложения", + "loc.input.label.XmlTransformation": "XML-преобразование", + "loc.input.help.XmlTransformation": "Преобразования конфигурации будут выполнены для \"*.Release.config\" и \"*..config\" в файле \"*.config\".
Преобразования конфигурации запускаются перед подстановкой переменных.
XML-преобразования поддерживаются только на платформе Windows.", + "loc.input.label.XmlVariableSubstitution": "Подстановка XML-переменных", + "loc.input.help.XmlVariableSubstitution": "Переменные, заданные в конвейерах сборки или выпуска, будут сопоставлены с записями key или name в разделах appSettings, applicationSettings и connectionStrings всех файлов конфигурации и parameters.xml. Подстановка переменных выполняется после преобразований конфигурации.

Примечание. Если одни и те же переменные заданы в конвейере выпуска и в среде, то переменные среды имеют приоритет над переменными из конвейера выпуска.
", + "loc.input.label.JSONFiles": "Подстановка переменных JSON", + "loc.input.help.JSONFiles": "Укажите разделенный переносами строки список JSON-файлов для подстановки значений переменных. Имена файлов следует указывать относительно корневой папки.
Чтобы подставить вложенные или иерархические переменные JSON, укажите их с помощью выражений JSONPath.

Например, чтобы заменить значение ConnectionString в примере ниже, следует определить переменную как Data.DefaultConnection.ConnectionString в конвейере сборки или выпуска (или среде конвейера выпуска).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Подстановка переменных запускается после преобразований конфигураций.

Примечание. Переменные конвейера исключены из подстановки.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Указан недопустимый путь к пакету службы приложений или папке: %s", + "loc.messages.SetParamFilenotfound0": "Заданный файл параметров не найден: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML-преобразования успешно применены.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Получены сведения о подключении к службе приложений Azure: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Ошибка: такого метода развертывания не существует.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Не удалось получить данные о подключении к Службе приложений Azure: %s. Код состояния: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Не удалось получить сведения о подключении к службе для ресурса Azure: \"%s\". Код состояния: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Журнал развертывания (%s) успешно обновлен.", + "loc.messages.Failedtoupdatedeploymenthistory": "Не удалось обновить журнал развертывания. Ошибка: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ПРЕДУПРЕЖДЕНИЕ: невозможно обновить состояние развертывания, конечная точка SCM не включена для этого веб-сайта.", + "loc.messages.Unabletoretrievewebconfigdetails": "Не удалось получить сведения о конфигурации службы приложений. Код состояния: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Не удалось извлечь параметры приложения службы приложений. [Код состояния: \"%s\", сообщение об ошибке: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "Не удалось обновить параметры приложения службы приложений. Код состояния: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Не удается обновить состояние развертывания: не удается получить уникальный идентификатор развертывания.", + "loc.messages.PackageDeploymentSuccess": "Веб-пакет успешно развернут в службе приложений.", + "loc.messages.PackageDeploymentFailed": "Не удалось развернуть веб-пакет в службе приложений.", + "loc.messages.Runningcommand": "Запуск команды: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Развертывание веб-пакета %s по виртуальному пути (физическому пути): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Пакет %s успешно развернут при помощи службы Kudu в %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Не удалось развернуть пакет службы приложений при помощи службы Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Не удалось развернуть службу приложений из-за ошибки: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Пакеты, созданные при помощи MSDeploy, поддерживаются только для платформы Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Установленная версия MSDeploy (%s) не поддерживается. Должна быть установлена версия 3 или более поздняя.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Не удалось определить расположение MS Deploy при помощи реестра на компьютере (ошибка: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Не удалось найти пакет с указанным шаблоном: %s
Проверьте, публикуется ли пакет, упомянутый в задаче, как артефакт в сборке или на предыдущем этапе и скачан ли он в текущем задании.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Указанному шаблону соответствует несколько пакетов: %s. Ограничьте шаблон поиска.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Отключить приложение от сети\".", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Переименовывать заблокированные файлы\".", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Не найден файл JSON, соответствующий заданному шаблону: %s.", + "loc.messages.Configfiledoesntexists": "Файл конфигурации %s не существует.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Сбой записи в файл конфигурации %s. Ошибка: %s.", + "loc.messages.AppOfflineModeenabled": "Автономный режим для приложения включен.", + "loc.messages.Failedtoenableappofflinemode": "Не удалось включить автономный режим для приложения. Код состояния: %s (%s).", + "loc.messages.AppOflineModedisabled": "Автономный режим для приложения отключен.", + "loc.messages.FailedtodisableAppOfflineMode": "Не удалось отключить автономный режим для приложения. Код состояния: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Невозможно выполнить XML-преобразования на платформе, отличной от Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Ошибка XML-преобразования при преобразовании %s с помощью %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Публикация при помощи веб-развертывания поддерживается только при использовании агента для Windows.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Публикация путем развертывания из ZIP-файла не поддерживается для типа пакета msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Публикация путем развертывания из ZIP-файла не поддерживается для виртуального приложения.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "При публикации с помощью развертывания из ZIP-файла или RunFromZip не поддерживается развертывание WAR-файла.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "При публикации с помощью RunFromZip скрипт, выполняемый после развертывания, может не поддерживаться, если он вносит изменения в wwwroot, так как эта папка доступна только для чтения.", + "loc.messages.ResourceDoesntExist": "Ресурс \"%s\" не существует. Он должен существовать перед началом развертывания.", + "loc.messages.EncodeNotSupported": "Обнаруженная кодировка файла %s — %s. Подстановка переменных не поддерживается для кодировки %s. Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Не удается определить кодировку файла %s (typeCode: %s). Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Слишком короткий файловый буфер для обнаружения типа кодировки: %s.", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Не удалось изменить конфигурацию службы приложений. Ошибка: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Конфигурация службы приложений успешно изменена.", + "loc.messages.RequestedURLforkuduphysicalpath": "Запрошенный URL-адрес для физического пути Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Физический путь \"%s\" уже существует.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Физический путь Kudu успешно создан: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Не удалось создать физический путь Kudu. Ошибка: %s", + "loc.messages.FailedtocheckphysicalPath": "Не удалось проверить физический путь Kudu. Код ошибки: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Виртуальное приложение не существует: %s", + "loc.messages.JSONParseError": "Не удалось проанализировать JSON-файл: %s. Ошибка: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Подстановка переменных JSON успешно применена.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Подстановка переменных XML применена.", + "loc.messages.failedtoUploadFileToKudu": "Не удалось отправить файл %s в Kudu (%s). Код состояния: %s", + "loc.messages.failedtoUploadFileToKuduError": "Не удалось передать файл %s в Kudu (%s). Ошибка: %s", + "loc.messages.ExecuteScriptOnKudu": "Выполнение указанного скрипта в службе Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Не удалось выполнить скрипт в службе Kudu. Ошибка: %s", + "loc.messages.FailedToRunScriptOnKudu": "Не удалось выполнить скрипт в службе Kudu: %s. Код состояния: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Сценарий успешно выполнен в Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Выполненный сценарий вернул код \"%s\". Ошибка: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Не удалось удалить файл %s из Kudu (%s). Код состояния: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Не удалось удалить файл %s из Kudu (%s). Ошибка: %s", + "loc.messages.ScriptFileNotFound": "Файл сценария \"%s\" не найден.", + "loc.messages.InvalidScriptFile": "Указан недопустимый файл скрипта \"%s\". Допустимые расширения: .bat и .cmd в Windows, .sh в Linux", + "loc.messages.RetryForTimeoutIssue": "Сбои выполнения сценария из-за превышения времени ожидания. Выполняется повторная попытка.", + "loc.messages.stdoutFromScript": "Стандартные выходные данные сценария: ", + "loc.messages.stderrFromScript": "Стандартная ошибка сценария: ", + "loc.messages.WebConfigAlreadyExists": "Файл web.config уже существует. Он не будет сгенерирован.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Файл web.config успешно сгенерирован.", + "loc.messages.FailedToGenerateWebConfig": "Не удалось сгенерировать файл web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Не удалось получить содержимое файла: %s. Код состояния: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Не удалось получить содержимое файла: %s. Ошибка: %s", + "loc.messages.ScriptStatusTimeout": "Не удалось получить состояние сценария, так как превышено время ожидания.", + "loc.messages.PollingForFileTimeOut": "Не удалось получить состояние сценария, так как превышено время ожидания. Чтобы увеличить время ожидания, задайте для переменной \"appservicedeploy.retrytimeout\" требуемое количество минут.", + "loc.messages.InvalidPollOption": "Указан недопустимый параметр опроса: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Атрибут \"-appType\" отсутствует в параметрах Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" и \"Go\".
Например, \"-appType python_Bottle\" (без кавычек), если используется платформа Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Не удалось обнаружить путь к файлу \"settings.py\" DJANGO_SETTINGS_MODULE. Убедитесь, что файл \"settings.py\" существует, или укажите правильный путь во входных данных параметра Web.config в следующем формате: \"-DJANGO_SETTINGS_MODULE <имя_папки>.settings\".", + "loc.messages.FailedToApplyTransformation": "Не удается применить преобразование для указанного пакета. Проверьте следующее.", + "loc.messages.FailedToApplyTransformationReason1": "1. Применено ли преобразование к созданному пакету MSBuild во время сборки. Если это так, удалите тег для каждой конфигурации в CSPROJ-файле и повторите сборку. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Убедитесь, что файлы конфигурации и преобразования находятся в одной и той же папке в пакете.", + "loc.messages.AutoParameterizationMessage": "Атрибуты ConnectionString в Web.config параметризованы по умолчанию. Обратите внимание, что преобразование не влияет на атрибуты connectionString, так как значение переопределяется во время развертывания файлом \"Parameters.xml\" или \"SetParameters.xml\". Вы можете отключить автоматическую параметризацию, задав /p:AutoParameterizationWebConfigConnectionStrings=False во время создания пакета MSBuild.", + "loc.messages.UnsupportedAppType": "Тип приложения \"%s\" не поддерживается при создании Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\" и \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Не удается получить URL-адрес центра.", + "loc.messages.UnableToFetchActiveDirectory": "Не удается получить идентификатор ресурса Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Стек времени выполнения и команда запуска успешно обновлены.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Не удалось обновить стек времени выполнения и команду запуска. Ошибка: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Параметры приложения успешно обновлены.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Не удалось обновить параметры приложения. Ошибка: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Не удалось получить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Не удалось обновить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Не удалось получить учетные данные реестра контейнеров Azure. [Код состояния: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "Не удалось прочитать текст ответа. Ошибка: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Не удалось обновить сведения о конфигурации WebApp. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Добавление примечаний к выпуску для ресурса Application Insights \"%s\"", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Примечания к выпуску успешно добавлены в Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Не удалось добавить примечания к выпуску. %s", + "loc.messages.RenameLockedFilesEnabled": "Переименование заблокированных файлов для службы приложений включено.", + "loc.messages.FailedToEnableRenameLockedFiles": "Не удалось включить переименование заблокированных файлов. Ошибка: %s", + "loc.messages.WebJobsInProgressIssue": "Невозможно удалить файлы в развертывании, так как запущено несколько веб-заданий. Отключите параметр \"Удалить дополнительные файлы в месте назначения\" или остановите непрерывные задания перед развертыванием.", + "loc.messages.FailedToFetchKuduAppSettings": "Не удалось получить параметры приложения Kudu. Ошибка: %s", + "loc.messages.FailedToCreatePath": "Не удалось создать путь \"%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFile": "Не удалось удалить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFolder": "Не удалось удалить папку \"%s\" из Kudu. Ошибка: %s.", + "loc.messages.FailedToUploadFile": "Не удалось отправить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToGetFileContent": "Не удалось получить содержимое файла \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToListPath": "Не удалось получить список элементов для пути \"%s\" из Kudu. Ошибка: %s", + "loc.messages.RetryToDeploy": "Повторная попытка развертывания пакета.", + "loc.messages.FailedToGetAppServiceDetails": "Не удалось получить сведения о службе приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Не удалось получить профиль публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Не удалось обновить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Не удалось получить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Не удалось изменить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Не удалось обновить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Не удалось получить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Не удалось получить учетные данные публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Не удалось получить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Не удалось обновить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Выполняется попытка изменить параметры конфигурации Службы приложений. Данные: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Параметры конфигурации службы приложений обновлены.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Выполняется попытка изменить параметры приложения Службы приложений. Данные: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Параметры приложения Службы приложений уже существуют.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Строки подключений Службы приложений уже существуют.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Параметры приложений службы приложений и параметры приложений Kudu обновлены.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Для службы приложений \"%s\" найдено несколько групп ресурсов.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Не удалось выполнить развертывание пакета с помощью развертывания ZIP-файла. Дополнительные сведения см. в журналах.", + "loc.messages.PackageDeploymentInitiated": "Запущено развертывание пакета с помощью ZIP Deploy.", + "loc.messages.WarPackageDeploymentInitiated": "Запущено развертывание пакета с помощью WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Не удалось получить журналы развертывания. Ошибка: %s", + "loc.messages.GoExeNameNotPresent": "Отсутствует имя EXE-файла Go", + "loc.messages.WarDeploymentRetry": "Повторяется попытка развертывания WAR-файла, так как он не был развернут раньше.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Компьютер должен использовать протокол TLS 1.2 или более поздней версии. Дополнительные сведения о том, как включить TLS на вашем компьютере: https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Не удалось получить маркер доступа для Azure. Код состояния: %s, сообщение о состоянии: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Настройте управляемое удостоверение службы (MSI) для виртуальной машины \"https://aka.ms/azure-msi-docs\". Код состояния: %s; сообщения о состоянии: %s.", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Код состояния: %s, сообщение о состоянии: %s.", + "loc.messages.XmlParsingFailed": "Не удалось проанализировать файл publishProfileXML. Ошибка: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Свойство [%s] отсутствует в профиле публикации", + "loc.messages.InvalidConnectionType": "Недопустимый тип подключения к службе", + "loc.messages.InvalidImageSourceType": "Недопустимый тип источника образа", + "loc.messages.InvalidPublishProfile": "Недопустимый файл профиля публикации.", + "loc.messages.ASE_SSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо установить значение true для переменной VSTS_ARM_REST_IGNORE_SSL_ERRORS в конвейере сборки или выпуска", + "loc.messages.ZipDeployLogsURL": "Журналы развертывания из ZIP-файла можно просмотреть в %s", + "loc.messages.DeployLogsURL": "Журналы развертывания можно просмотреть в %s", + "loc.messages.AppServiceApplicationURL": "URL-адрес приложения службы приложений: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо передать -allowUntrusted в дополнительных аргументах параметра веб-развертывания.", + "loc.messages.FailedToGetResourceID": "Не удалось получить идентификатор ресурса для ресурса с типом \"%s\" и именем \"%s\". Ошибка: %s", + "loc.messages.JarPathNotPresent": "Отсутствует путь к jar-файлу Java.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Не удалось обновить ресурс Application Insights \"%s\". Ошибка: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Переход от веб-развертывания к запуску из пакета, что помогает избежать ошибки FILE_IN_USE. Обратите внимание, что запуск из пакета не поддерживает тип пакета msBuild. Измените формат пакета, чтобы использовать этот метод развертывания." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..99bb677d364e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure 应用服务部署", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 向 Azure 应用服务部署 Web、移动或 API 应用", + "loc.instanceNameFormat": "Azure 应用服务部署: $(WebAppName)", + "loc.releaseNotes": "版本 4.* 中的新增功能
支持 Zip 部署、从包运行、War 部署[在此处获取详细信息](https://aka.ms/appServiceDeploymentMethods)
支持应用服务环境
改进了用于发现任务支持的不同应用服务类型的 UI
从包运行是首选的部署方法,它使 wwwroot 文件夹中的文件成为只读文件
单击[此处](https://aka.ms/azurermwebdeployreadme)以获取更多信息。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "文件转换和变量替换选项", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署选项", + "loc.group.displayName.PostDeploymentAction": "部署后操作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "应用程序和配置设置", + "loc.input.label.ConnectionType": "连接类型", + "loc.input.help.ConnectionType": "选择要用于部署 Web 应用的服务连接类型。
选择发布配置文件以使用 Visual Studio 创建的发布配置文件。[更多信息](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure 订阅", + "loc.input.help.ConnectedServiceName": "为部署选择 Azure 资源管理器订阅。", + "loc.input.label.PublishProfilePath": "发布配置文件路径", + "loc.input.help.PublishProfilePath": "从 Visual Studio 中创建的发布配置文件的路径", + "loc.input.label.PublishProfilePassword": "发布配置文件密码", + "loc.input.help.PublishProfilePassword": "建议将密码存储在机密变量中,并在此处使用该变量,例如 $(Password)。", + "loc.input.label.WebAppKind": "应用服务类型", + "loc.input.help.WebAppKind": "从后列选项中选择: Windows 上的 Web 应用、Linux 上的 Web 应用、用于容器的 Web 应用、Linux 上的函数应用、用于容器和移动应用的函数应用。", + "loc.input.label.WebAppName": "应用服务名称", + "loc.input.help.WebAppName": "输入或选择现有 Azure 应用服务的名称。只会列出基于所选应用类型的应用服务。", + "loc.input.label.DeployToSlotOrASEFlag": "部署到槽或应用服务环境", + "loc.input.help.DeployToSlotOrASEFlag": "选择要部署到现有部署槽或 Azure 应用服务环境的选项。
对于这两个目标,任务需要资源组名称。
如果部署目标是槽,默认部署到生产槽。此外还可以提供任何其他现有的槽名称。
如果部署目标是 Azure 应用服务环境,则将槽名称保留为“生产”并指定资源组名称即可。", + "loc.input.label.ResourceGroupName": "资源组", + "loc.input.help.ResourceGroupName": "当部署目标是部署槽或应用服务环境时,需要资源组名称。
输入或选择包含上面指定的 Azure 应用服务的 Azure 资源组。", + "loc.input.label.SlotName": "槽", + "loc.input.help.SlotName": "输入或选择生产槽以外的现有槽。", + "loc.input.label.DockerNamespace": "注册表或命名空间", + "loc.input.help.DockerNamespace": "特定注册表或命名空间的全局唯一顶级域名。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "用于存储容器映像的存储库的名称。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerImageTag": "标记", + "loc.input.help.DockerImageTag": "标记为可选项,它是注册表用以对 Docker 映像提供版本的机制。
注意: 完全限定的映射名称格式应为:“`/`:`”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.VirtualApplication": "虚拟应用程序", + "loc.input.help.VirtualApplication": "指定 Azure 门户中已配置的虚拟应用程序的名称。对于以应用服务根目录为目标的部署,此选项并非必需。", + "loc.input.label.Package": "包或文件夹", + "loc.input.help.Package": "包的文件路径或一个包含由 MSBuild 生成的应用服务内容或压缩的 zip 或 war 文件的文件夹。
变量([生成](https://docs.microsoft.com/vsts/pipelines/build/variables) | [发布](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支持通配符。
例如,$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 或 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "运行时堆栈", + "loc.input.help.RuntimeStack": "选择框架和版本。", + "loc.input.label.RuntimeStackFunction": "运行时堆栈", + "loc.input.help.RuntimeStackFunction": "选择框架和版本。请查看[此文档](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages),了解受支持的运行时版本。\"DOCKER|microsoft/azure-functions-*\" 等旧值已被弃用,请使用下拉列表中的新值。", + "loc.input.label.StartupCommand": "启动命令", + "loc.input.help.StartupCommand": "输入启动命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署脚本类型", + "loc.input.help.ScriptType": "任务成功完成部署后,通过提供可在 Azure 应用服务上运行的脚本自定义部署。例如 Node、PHP 和 Python 应用程序的还原包。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "内联脚本", + "loc.input.label.ScriptPath": "部署脚本路径", + "loc.input.label.WebConfigParameters": "生成适用于 Python、Node.js、Go 和 Java 应用的 web.config 参数", + "loc.input.help.WebConfigParameters": "如果应用程序中没有标准的 Web.config,系统将生成一个并将其部署到 Azure 应用服务。Web.config 中的值可进行编辑,并且可能因应用程序框架而异。例如,对于 node.js 应用程序,web.config 将包含启动文件和 iis_node module 模块值。此编辑功能仅适用于生成的 web.config。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "应用设置", + "loc.input.help.AppSettings": "按照语法 -key 值编辑 Web 应用应用程序设置。包含空格的值应括在双引号中。
示例: -Port 5000 -RequestTimeout
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "配置设置", + "loc.input.help.ConfigurationSettings": "按照语法 -key 值编辑 Web 应用配置设置。包含空格的值应括在双引号中。
示例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "选择部署方法", + "loc.input.help.UseWebDeploy": "如果未选中,将根据应用类型、包格式和其他参数自动检测最佳部署方法。
选择此选项以查看支持的部署方法,并选择一个用于部署应用。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "选择应用的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "使应用脱机", + "loc.input.help.TakeAppOfflineFlag": "选择该选项,通过在同步操作开始前将 app_offline.htm 文件放入应用服务的根目录而使 Azure 应用服务脱机。同步操作成功完成后,将删除该文件。", + "loc.input.label.SetParametersFile": "SetParameters 文件", + "loc.input.help.SetParametersFile": "可选: 要使用的 SetParameters.xml 文件的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "删除目标中的其他文件", + "loc.input.help.RemoveAdditionalFilesFlag": "选择该选项可删除 Azure 应用服务上在应用服务包或文件夹中没有匹配文件的文件。

注意: 这该将删除与安装在此 Azure 应用服务上的任何扩展相关的所有文件。为防止出现这种情况,请选中“从 App_Data 文件夹中排除文件”复选框。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 文件夹中的文件", + "loc.input.help.ExcludeFilesFromAppDataFlag": "选择该选项以阻止将 App_Data 文件夹中的文件部署到 Azure 应用服务/从 Azure 应用服务删除。", + "loc.input.label.AdditionalArguments": "其他参数", + "loc.input.help.AdditionalArguments": "语法 -key:value 后的其他 Web 部署参数。
部署 Azure 应用服务时将应用这些参数。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
有关 Web 部署操作设置的更多示例,请参阅[此处](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重命名锁定的文件", + "loc.input.help.RenameFilesFlag": "选择此选项可在 Azure 应用服务应用程序设置中启用 msdeploy 标志 MSDEPLOY_RENAME_LOCKED_FILES=1。如果设定,此选项可使 msdeploy 重命名在应用部署期间锁定的锁定文件", + "loc.input.label.XmlTransformation": "XML 转换", + "loc.input.help.XmlTransformation": "将在 \"*.config file\" 上为 \"*.Release.config\" 和 \"*..config\" 运行配置转换。
配置转换将在变量替换前运行。
仅 Windows 平台支持 XML 转换。", + "loc.input.label.XmlVariableSubstitution": "XML 变量替换", + "loc.input.help.XmlVariableSubstitution": "生成或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的 \"key\" 或 \"name\" 条目进行匹配。变量替换在配置变换后运行。

注意: 如果在发布管道和环境中定义了相同的变量,则环境变量将取代发布管道变量。
", + "loc.input.label.JSONFiles": "JSON 变量替换", + "loc.input.help.JSONFiles": "提供 JSON 文件的新行分隔列表,用于替换变量值。将相对于根文件夹来提供文件名。
要替代嵌套或层次结构式 JSON 变量,请使用 JSONPath 表达式指定它们。

例如,若要替换下面示例中的 \"ConnectionString\" 的值,需要在生成或发布管道(或发布管道的环境)中将变量定义为 \"Data.DefaultConnection.ConnectionString\"。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
变量替换在配置转换后运行。

注意: 管道变量排除在替换之外。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供了无效的应用服务包或文件夹路径: %s", + "loc.messages.SetParamFilenotfound0": "设置的参数文件未找到: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 转换已成功应用", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "已获取 Azure 应用服务“%s”的服务连接详细信息", + "loc.messages.ErrorNoSuchDeployingMethodExists": "错误: 不存在此种部署方法", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "无法检索 Azure 应用服务 %s 的服务连接详细信息。状态代码: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "无法检索 Azure 资源“%s”的服务连接详细信息。状态代码: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功在 %s 更新了部署历史记录", + "loc.messages.Failedtoupdatedeploymenthistory": "未能更新部署历史记录。错误: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 无法更新部署状态: SCM 终结点没有为此网站启用", + "loc.messages.Unabletoretrievewebconfigdetails": "无法检索应用配置详细信息。状态代码:“%s”", + "loc.messages.Unabletoretrievewebappsettings": "无法检索应用服务应用程序设置。[状态代码: %s, 错误消息: %s]", + "loc.messages.Unabletoupdatewebappsettings": "无法更新应用服务应用程序设置。状态代码:“%s”", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "无法更新部署状态: 无法检索唯一部署 ID", + "loc.messages.PackageDeploymentSuccess": "已成功将 Web 包部署到应用服务。", + "loc.messages.PackageDeploymentFailed": "未能将 Web 包部署到应用服务。", + "loc.messages.Runningcommand": "正在运行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正在部署 Web 包 %s,部署位置: 虚拟路径 %s (物理路径 %s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功部署了包 %s (通过在 %s 使用 kudu 服务)", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "未能使用 kudu 服务 %s 部署应用服务包", + "loc.messages.Unabletodeploywebappresponsecode": "错误代码 %s 导致无法部署应用服务", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 生成的包仅受 Windows 平台支持。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "为 MSDeploy 找到了不受支持的已安装版本 %s。版本应至少为 3 或以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "无法从计算机的注册表上找到 MS 部署的位置(错误: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "未找到具有指定模式的包: %s
请检查任务中提及的包是否在版本或上一阶段中作为项目发布,以及是否已在当前作业中下载。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定的模式 %s 有多个匹配的包。请限制搜索模式。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "再次尝试使用所选“使应用程序脱机”选项部署应用服务。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "再次尝试使用所选“重命名锁定文件”选项部署应用服务。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "没有与特定模式 %s 匹配的 JSON 文件。", + "loc.messages.Configfiledoesntexists": "配置文件 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "未能写入配置文件 %s,错误为 %s", + "loc.messages.AppOfflineModeenabled": "已启用应用脱机模式。", + "loc.messages.Failedtoenableappofflinemode": "未能启用应用脱机模式。状态代码: %s (%s)", + "loc.messages.AppOflineModedisabled": "已禁用应用脱机模式。", + "loc.messages.FailedtodisableAppOfflineMode": "未能禁用应用脱机模式。状态代码: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "无法在非 Windows 平台上执行 XML 转换。", + "loc.messages.XdtTransformationErrorWhileTransforming": "转换 %s (通过使用 %s)时出现 XML 转换错误。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "仅当使用 Windows 代理时才支持使用 webdeploy 选项进行发布", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 包类型不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虚拟应用程序不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip 部署或 RunFromZip 选项执行的发布不支持 war 文件部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果对 wwwroot 进行更改,则使用 RunFromZip 发布可能不支持后期部署脚本,因为该文件夹为只读。", + "loc.messages.ResourceDoesntExist": "资源“%s”不存在。资源应在部署前就已存在。", + "loc.messages.EncodeNotSupported": "检测到文件 %s 的文件编码为 %s。不支持使用文件编码 %s 进行变量替换。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "无法检测文件 %s (类型代码: %s)的编码。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "文件缓冲区太短,无法检测编码类型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "未能更新应用服务配置详细信息。错误: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新应用服务配置详细信息。", + "loc.messages.RequestedURLforkuduphysicalpath": "kudu 物理路径的请求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "物理路径 \"%s\" 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理路径已成功创建: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "未能创建 kudu 物理路径。错误: %s", + "loc.messages.FailedtocheckphysicalPath": "未能检查 kudu 物理路径。错误代码: %s", + "loc.messages.VirtualApplicationDoesNotExist": "不存在虚拟应用程序: %s", + "loc.messages.JSONParseError": "无法分析 JSON 文件: %s。错误: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 变量替换已成功应用。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功应用 XML 变量替换。", + "loc.messages.failedtoUploadFileToKudu": "无法将文件 %s 上传到 Kudu (%s)。状态代码: %s", + "loc.messages.failedtoUploadFileToKuduError": "无法将文件 %s 上传到 Kudu (%s)。错误: %s", + "loc.messages.ExecuteScriptOnKudu": "正在 Kudu 服务上执行给定脚本。", + "loc.messages.FailedToRunScriptOnKuduError": "无法在 Kudu 服务上运行该脚本。错误: %s", + "loc.messages.FailedToRunScriptOnKudu": "无法在 Kudu 上运行该脚本: %s。状态代码: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上执行脚本。", + "loc.messages.ScriptExecutionOnKuduFailed": "已执行的脚本返回了“%s”作为返回代码。错误: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "无法从 Kudu (%s) 删除文件: %s。状态代码: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "无法删除文件 %s (位于 Kudu (%s)上)。错误: %s", + "loc.messages.ScriptFileNotFound": "找不到脚本文件“%s”。", + "loc.messages.InvalidScriptFile": "提供的脚本文件“%s”无效。有效的扩展名为 .bat 和 .cmd (对于 Windows)和 .sh (对于 Linux)", + "loc.messages.RetryForTimeoutIssue": "由于出现超时问题,脚本执行失败。请重试。", + "loc.messages.stdoutFromScript": "脚本中的标准输出:", + "loc.messages.stderrFromScript": "脚本中的标准错误:", + "loc.messages.WebConfigAlreadyExists": "web.config 文件已存在。不再生成。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功生成 web.config 文件", + "loc.messages.FailedToGenerateWebConfig": "未能生成 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "无法获取文件内容: %s。状态代码: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "无法获取文件内容: %s。错误: %s", + "loc.messages.ScriptStatusTimeout": "因为超时,无法提取脚本状态。", + "loc.messages.PollingForFileTimeOut": "因为超时,无法提取脚本状态。通过将 \"appservicedeploy.retrytimeout\" 变量设置为所需分钟数可以增加超时限制。", + "loc.messages.InvalidPollOption": "提供的轮询选项无效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 参数中缺少属性 \"-appType\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\"、\"node\" 和 \"Go\"。
例如,如果是 Python Bottle 框架,则应为 \"-appType python_Bottle\" (不带引号)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "无法检测 DJANGO_SETTINGS_MODULE \"settings.py\" 文件路径。请确保 \"settings.py\" 文件存在或采用格式 \"-DJANGO_SETTINGS_MODULE .settings\" 在 Web.config 参数输出中提供正确的路径", + "loc.messages.FailedToApplyTransformation": "无法对给定的包应用转换。请验证以下各项。", + "loc.messages.FailedToApplyTransformationReason1": "1. 在生成期间是否已对 MSBuild 生成的包应用转换。如果已应用,请删除 csproj 文件中每个配置的 标记,然后重新生成。", + "loc.messages.FailedToApplyTransformationReason2": "2. 确保配置文件和转换文件位于包内的同一个文件夹中。", + "loc.messages.AutoParameterizationMessage": "默认情况下,Web.config 中的 connectionString 属性已参数化。请注意,转换对 connectionString 属性无影响,因为在通过 \"Parameters.xml\" 或 \"SetParameters.xml\" 文件进行部署期间,该值将被重写。可通过在 MSBuild 包生成期间设置 /p:AutoParameterizationWebConfigConnectionStrings=False 来禁用自动参数化。", + "loc.messages.UnsupportedAppType": "Web.config 生成中不支持应用类型 \"%s\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\" 和 \"node\"", + "loc.messages.UnableToFetchAuthorityURL": "无法提取授权 URL。", + "loc.messages.UnableToFetchActiveDirectory": "无法提取 Active Directory 资源 ID。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新运行时堆栈和启动命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "未能更新运行时堆栈和启动命令。错误: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新应用设置。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "未能更新应用设置。错误: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "未能提取 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "无法更新 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "无法检索 Azure 容器注册表凭据。[状态代码: “%s”]", + "loc.messages.UnableToReadResponseBody": "无法读取响应正文。错误: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "无法更新 WebApp 配置详细信息。状态代码:“%s”", + "loc.messages.AddingReleaseAnnotation": "正在添加 Application Insights 资源“%s”的发布注释", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功向 Application Insights 添加发布注释: %s", + "loc.messages.FailedAddingReleaseAnnotation": "未能添加发布注释。%s", + "loc.messages.RenameLockedFilesEnabled": "已对应用服务启用“重命名已锁定文件”。", + "loc.messages.FailedToEnableRenameLockedFiles": "未能启用“重命名已锁定文件”。错误: %s", + "loc.messages.WebJobsInProgressIssue": "几个处于运行状态的 Web 作业阻止部署删除这些文件。可禁用“删除目标处的其他文件”选项或在部署前停止连续作业。", + "loc.messages.FailedToFetchKuduAppSettings": "未能提取 Kudu 应用设置。错误: %s", + "loc.messages.FailedToCreatePath": "未能从 Kudu 创建路径“%s”。错误: %s", + "loc.messages.FailedToDeleteFile": "未能从 Kudu 删除文件“%s/%s”。错误: %s", + "loc.messages.FailedToDeleteFolder": "未能从 Kudu 删除文件夹“%s”。错误: %s", + "loc.messages.FailedToUploadFile": "未能从 Kudu 上传文件“%s/%s”。错误: %s", + "loc.messages.FailedToGetFileContent": "未能从 Kudu 获取文件内容“%s/%s”。错误: %s", + "loc.messages.FailedToListPath": "未能从 Kudu 列出路径“%s”。错误: %s", + "loc.messages.RetryToDeploy": "正在重新尝试部署包。", + "loc.messages.FailedToGetAppServiceDetails": "未能提取应用服务“%s”详细信息。错误: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "未能提取应用服务“%s”发布配置文件。错误: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "未能更新应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToGetAppServiceMetadata": "未能获取应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "未能修补应用服务“%s”配置。错误: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "未能更新应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "未能获取应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "未能提取应用服务“%s”发布凭据。错误: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "未能获取应用服务“%s”应用程序设置。错误: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "未能更新应用服务“%s”应用程序设置。错误: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在尝试更新应用服务配置设置。数据: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新应用服务配置设置。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在尝试更新应用服务应用程序设置。数据: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "应用服务应用程序设置已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "应用服务连接字符串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新应用服务应用程序设置和 Kudu 应用程序设置。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到了应用服务“%s”的多个资源组。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP 部署的包部署失败。有关更多详细信息,请参阅日志。", + "loc.messages.PackageDeploymentInitiated": "已启动使用 ZIP 部署的包部署。", + "loc.messages.WarPackageDeploymentInitiated": "已启动使用 WAR 部署的包部署。", + "loc.messages.FailedToGetDeploymentLogs": "未能获取部署日志。错误: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名称不存在", + "loc.messages.WarDeploymentRetry": "正在重试 war 文件部署,因为它之前未成功扩展。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "请确保计算机使用的是 TLS 1.2 协议或更高版本。请访问 https://aka.ms/enableTlsv2 获取有关如何在计算机中启用 TLS 的详细信息。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "无法提取 Azure 的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "无法提取托管服务主体的访问令牌。请为虚拟机配置托管服务标识(MSI)(https://aka.ms/azure-msi-docs)。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "无法提取托管服务主体的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.XmlParsingFailed": "无法分析 publishProfileXML 文件,错误: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s]发布配置文件中不存在属性", + "loc.messages.InvalidConnectionType": "无效的服务连接类型", + "loc.messages.InvalidImageSourceType": "无效的映像源类型", + "loc.messages.InvalidPublishProfile": "发布配置文件无效。", + "loc.messages.ASE_SSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在生成或发布管道中,将名为 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的变量设置为 true 值", + "loc.messages.ZipDeployLogsURL": "可以在 %s 查看 Zip 部署日志", + "loc.messages.DeployLogsURL": "可在 %s 查看部署日志", + "loc.messages.AppServiceApplicationURL": "应用服务应用程序 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在 Web 部署选项的其他参数中传递 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "未能获取资源类型“%s”和资源名称“%s”的资源 ID。错误: %s", + "loc.messages.JarPathNotPresent": "Java jar 路径不存在", + "loc.messages.FailedToUpdateApplicationInsightsResource": "未能更新 Application Insights“%s”资源。错误: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "从 Web 部署移动到 RunFrom 包,这有助于避免 FILE_IN_USE 错误。请注意,“从包运行”不支持 msBuild 包类型。请更改包格式以使用此部署方法。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..7bcbc1329826 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 部署", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 對 Azure App Service 部署 Web、行動或 API 應用程式", + "loc.instanceNameFormat": "Azure App Service 部署: $(WebAppName)", + "loc.releaseNotes": "4.* 版的新功能 (預覽)
支援 Zip 部署、Run From Package (從套件執行)、War 部署 ([詳細資料在此](https://aka.ms/appServiceDeploymentMethods))
支援 App Service 環境
改善 UI,以供探索工作所支援的各種應用程式服務類型
「從套件執行」為偏好的部署方法,會使 wwwroot 資料夾中的檔案變成唯讀
如需詳細資訊,請按一下[這裡](https://aka.ms/azurermwebdeployreadme)。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "檔案轉換及變數替代選項", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署選項", + "loc.group.displayName.PostDeploymentAction": "部署後動作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "應用程式和組態設定", + "loc.input.label.ConnectionType": "連線類型", + "loc.input.help.ConnectionType": "請選取要用來部署 Web 應用程式的服務連線類型。
請選取發佈設定檔以使用 Visual Studio 建立的發佈設定檔。[詳細資訊](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceName": "選取部署的 Azure Resource Manager 訂用帳戶。", + "loc.input.label.PublishProfilePath": "發行設定檔的路徑", + "loc.input.help.PublishProfilePath": "從 Visual Studio 所建立之發佈設定檔的路徑", + "loc.input.label.PublishProfilePassword": "發行設定檔的密碼", + "loc.input.help.PublishProfilePassword": "建議您將密碼儲存在祕密變數中,並在此處使用該變數,例如 $(Password)。", + "loc.input.label.WebAppKind": "App Service 類型", + "loc.input.help.WebAppKind": "從 Windows 上的 Web 應用程式、Linux 上的 Web 應用程式、用於容器的 Web App、函數應用程式、Linux 上的函數應用程式、用於容器的函數應用程式及行動裝置應用程式中選擇。", + "loc.input.label.WebAppName": "App Service 名稱", + "loc.input.help.WebAppName": "輸入或選取現有 Azure App Service 的名稱。僅依選取的應用程式類型列出應用程式服務。", + "loc.input.label.DeployToSlotOrASEFlag": "將部署到位置或 App Service 環境", + "loc.input.help.DeployToSlotOrASEFlag": "請選取選項以部署至現有的部署位置或 Azure App Service 環境。
對於這兩個目標而言,工作都需要資源群組名稱。
假如部署目標是位置,預設會對生產位置進行部署。此外,也能提供任何其他現有的位置名稱。
假如部署目標是 Azure App Service 環境,請將位置名稱保留為 ‘production’,並請僅指定資源群組名稱。", + "loc.input.label.ResourceGroupName": "資源群組", + "loc.input.help.ResourceGroupName": "當部署目標為部署位置或 App Service 環境時,資源群組名稱為必要項。
請輸入或選取包含上方所指定 Azure App Service 的 Azure 資源群組。", + "loc.input.label.SlotName": "位置", + "loc.input.help.SlotName": "請輸入或選取現有的位置,而不是生產位置。", + "loc.input.label.DockerNamespace": "登錄或命名空間", + "loc.input.help.DockerNamespace": "您的特定登錄或命名空間的全域唯一頂層網域名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "容器映像儲存所在的存放庫名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "標記", + "loc.input.help.DockerImageTag": "標記是選擇項,這是登錄提供版本給 Docker 映像時所使用的機制。
注意: 完整映像名稱的格式為: '`/`:`'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "虛擬應用程式", + "loc.input.help.VirtualApplication": "指定在 Azure 入口網站中設定的虛擬應用程式名稱。若要部署到 App Service 的根目錄,則無須使用此選項。", + "loc.input.label.Package": "套件或資料夾", + "loc.input.help.Package": "包含應用程式服務內容的套件或資料夾路徑,產生該內容的來源為 MSBuild,或壓縮的 zip 或 war 檔案。
變數 ( [組建](https://docs.microsoft.com/vsts/pipelines/build/variables) | [發行](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支援使用萬用字元。
例如 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "執行階段堆疊", + "loc.input.help.RuntimeStack": "選取架構及版本。", + "loc.input.label.RuntimeStackFunction": "執行階段堆疊", + "loc.input.help.RuntimeStackFunction": "選取架構和版本。如需支援的執行階段版本,請參閱[本文件](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)。`DOCKER|microsoft/azure-functions-*` 等舊值已淘汰,請使用下拉式清單中的新值。", + "loc.input.label.StartupCommand": "啟動命令 ", + "loc.input.help.StartupCommand": "輸入啟動命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署指令碼類型", + "loc.input.help.ScriptType": "當工作已成功完成部署時,就提供將在 Azure App Service 上執行的指令碼以自訂部署。例如,還原 Node、PHP、Python 應用程式的套件。[深入了解](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "內嵌指令碼", + "loc.input.label.ScriptPath": "部署指令碼路徑", + "loc.input.label.WebConfigParameters": "產生 Python、Node.js、Go 和 Java 應用程式的 web.config 參數", + "loc.input.help.WebConfigParameters": "若應用程式沒有標準 Web.config,會予以產生並部署至 Azure App Service。Web.config 中的值可編輯,並會因應用程式架構而有所不同。例如若是 node.js 應用程式,web.config 會具有啟動檔案和 iis_node 模組值。此編輯功能僅適用於所產生的 web.config。[深入了解](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "應用程式設定", + "loc.input.help.AppSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "組態設定", + "loc.input.help.ConfigurationSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例 -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "選取部署方法", + "loc.input.help.UseWebDeploy": "若取消選取,我們會根據您的應用程式類型、套件格式及其他參數,自動偵測最適合的部署方法。
選取選項即可檢視支援的部署方法,並請選擇一項以部署應用程式。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "選擇應用程式的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "將應用程式設為離線", + "loc.input.help.TakeAppOfflineFlag": "選取此選項可在同步作業開始之前,將 app_offline.htm 檔案置於 App Service 的根目錄中而使此 Azure App Service 離線。此檔案將會在同步作業成功完成後移除。", + "loc.input.label.SetParametersFile": "SetParameters 檔案", + "loc.input.help.SetParametersFile": "選擇性: 要使用之 SetParameters.xml 檔案的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "移除目的地的其他檔案", + "loc.input.help.RemoveAdditionalFilesFlag": "選取此選項可刪除在 Azure App Service 上,於 App Service 套件或資料夾中沒有任何相符檔案的檔案。

注意: 這也會移除與此 Azure App Service 上所安裝之任何延伸模組相關的所有檔案。若要避免,請選取 'Exclude files from App_Data folder' 核取方塊。 ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 資料夾內的檔案", + "loc.input.help.ExcludeFilesFromAppDataFlag": "選取此選項可避免將 App_Data 資料夾中的檔案部署至 Azure App Service 或從中刪除。", + "loc.input.label.AdditionalArguments": "其他引數", + "loc.input.help.AdditionalArguments": "其他 Web Deploy 引數,接在 -key:value 語法後方。
部署 Azure App Service 時會加以套用。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
如需其他 Web Deploy 作業設定範例,請參閱[這裡](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重新命名鎖定的檔案", + "loc.input.help.RenameFilesFlag": "選取此選項可在 Azure App Service 應用程式設定中啟用 MSDeploy 旗標 MSDEPLOY_RENAME_LOCKED_FILES=1。若設定此選項,MSDeploy 即可為鎖定於應用程式部署期間的鎖定檔案重新命名", + "loc.input.label.XmlTransformation": "XML 轉換", + "loc.input.help.XmlTransformation": "將為 `*.config file` 上 `*.Release.config` 及 `*.<環境名稱>.config` 執行的組態轉換。
將會在變數替代前執行組態轉換。
只有在 Windows 平台上才支援 XML 轉換。", + "loc.input.label.XmlVariableSubstitution": "XML 變數替代", + "loc.input.help.XmlVariableSubstitution": "組建或發行管線中定義的變數,會與組態檔及 parameters.xml 中 appSettings、applicationSettings 及 connectionStrings 的 'key' 或 'name' 項目進行比對。變數替代會在組態轉換後執行。

注意: 若發行管線與環境所定義的變數相同,則環境變數會取代發行管線變數。
", + "loc.input.label.JSONFiles": "JSON 變數替代", + "loc.input.help.JSONFiles": "提供新行分隔的 JSON 檔案清單,以替代變數值。提供的檔案名稱必須相對於根資料夾。
若要替代巢狀或階層式 JSON 變數,請使用 JSONPath 運算式加以指定。

例如,若要取代下方範例中的 ‘ConnectionString’ 值,您必須在組建/發行管線 (或發行管線的環境) 中定義 ‘Data.DefaultConnection.ConnectionString’ 這樣的變數。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
變數替代會在組態轉換之後執行。

注意: 管線變數不在替代範圍內。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供的 App Service 套件或資料夾路徑無效: %s", + "loc.messages.SetParamFilenotfound0": "找不到設定參數檔案: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "已成功套用 XML 轉換", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "取得 Azure App Service 的服務連線詳細資料: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "錯誤: 此類部署方法不存在", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "無法擷取 Azure App Service 的服務連線詳細資料 : %s。狀態碼: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "無法擷取 Azure 資源的服務連線詳細資料:'%s'。狀態碼: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功於 %s 更新部署歷程記錄", + "loc.messages.Failedtoupdatedeploymenthistory": "無法更新部署歷程記錄。錯誤: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 無法更新部署狀態: 此網站未啟用 SCM 端點", + "loc.messages.Unabletoretrievewebconfigdetails": "無法擷取 App Service 組態詳細資料。狀態碼: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "無法擷取 App Service 應用程式設定。[狀態碼: '%s',錯誤訊息: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "無法更新 App Service 應用程式設定。狀態碼: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "無法更新部署狀態: 無法擷取唯一部署識別碼", + "loc.messages.PackageDeploymentSuccess": "已成功將 Web 套件部署到 App Service。", + "loc.messages.PackageDeploymentFailed": "無法將 Web 套件部署到 App Service。", + "loc.messages.Runningcommand": "正在執行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正於虛擬路徑 (實體路徑) 部署網頁套件 %s: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功使用 Kudu 服務部署套件 %s 於 %s ", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "無法部署使用 Kudu 服務的 App Service 套件: %s", + "loc.messages.Unabletodeploywebappresponsecode": "因以下錯誤碼而無法部署 App Service: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "僅 Windows 平台支援 MSDeploy 產生的套件。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "發現對 MSDeploy 安裝了不受支援的版本: %s。版本至少應為 3 (含) 以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "電腦上的登錄找不到 MS 部署的位置 (錯誤: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "找不到具有指定模式的套件: %s
請確認工作中所提及的套件已在組建或上一個階段中發行為成品,並已在目前的作業中下載。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "有多個套件與指定模式相符: %s。請縮小搜尋模式範圍。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "請先選取 [讓應用程式成為離線狀態] 選項,然後嘗試再次部署 App Service。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "請先選取 [重新命名鎖定的檔案] 選項,然後嘗試再次部署 App Service。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "沒有符合特定模式 %s 的 JSON 檔案。", + "loc.messages.Configfiledoesntexists": "組態檔 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "無法寫入組態檔 %s,錯誤為: %s", + "loc.messages.AppOfflineModeenabled": "已啟用 [應用程式離線] 模式。", + "loc.messages.Failedtoenableappofflinemode": "無法啟用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.AppOflineModedisabled": "已停用 [應用程式離線] 模式。", + "loc.messages.FailedtodisableAppOfflineMode": "無法停用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "無法在非 Windows 平台執行 XML 轉換。", + "loc.messages.XdtTransformationErrorWhileTransforming": "轉換 %s (使用 %s) 時發生 XML 轉換錯誤。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "僅限使用 Windows 代理程式時才可使用 webdeploy 選項發佈", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 套件類型不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虛擬應用程式不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip deploy 或 RunFromZip 發佈的選項不支援 war 檔案部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果使用 RunFromZip 發佈會對 wwwroot 進行變更,就可能會因為資料夾是唯讀的,而不支援部署後指令碼。", + "loc.messages.ResourceDoesntExist": "資源 '%s' 不存在。應具備資源才可部署。", + "loc.messages.EncodeNotSupported": "偵測到檔案 %s 的檔案編碼為 %s。檔案編碼 %s 不支援變數替代。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "無法偵測檔案 %s 的編碼 (typeCode: %s)。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "檔案緩衝區太短而無法偵測編碼類型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "無法更新 App Service 組態詳細資料。錯誤: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新 App Service 組態詳細資料", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 實體路徑的要求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "實體路徑 '%s' 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "已成功建立 Kudu 實體路徑: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "無法建立 Kudu 實體路徑。錯誤 : %s", + "loc.messages.FailedtocheckphysicalPath": "無法檢查 Kudu 實體路徑。錯誤碼: %s", + "loc.messages.VirtualApplicationDoesNotExist": "虛擬應用程式不存在: %s", + "loc.messages.JSONParseError": "無法剖析 JSON 檔案: %s。錯誤: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "已成功套用 JSON 變數替代。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功套用替代的 XML 變數。", + "loc.messages.failedtoUploadFileToKudu": "無法將檔案 %s 上傳到 Kudu (%s)。狀態碼: %s", + "loc.messages.failedtoUploadFileToKuduError": "無法將檔案 %s 上傳到 Kudu (%s)。錯誤: %s", + "loc.messages.ExecuteScriptOnKudu": "正在於 Kudu 服務上執行指定的指令碼。", + "loc.messages.FailedToRunScriptOnKuduError": "無法在 Kudu 服務上執行指令碼。錯誤: %s", + "loc.messages.FailedToRunScriptOnKudu": "無法在 Kudu 上執行指令碼: %s。狀態碼: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上執行指令碼。", + "loc.messages.ScriptExecutionOnKuduFailed": "執行的指令碼傳回了下列傳回碼: '%s'。錯誤: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "無法從 Kudu (%s) 刪除檔案 %s。狀態碼: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "無法從下列 Kudu 刪除檔案 %s: %s。錯誤: %s", + "loc.messages.ScriptFileNotFound": "找不到指令碼檔案 '%s'。", + "loc.messages.InvalidScriptFile": "提供的指令檔 '%s' 無效。有效的副檔名為 .bat 與 .cmd (Windows),以及 .sh (Linux)", + "loc.messages.RetryForTimeoutIssue": "因為逾時,導致指令碼執行失敗。請重試。", + "loc.messages.stdoutFromScript": "指令碼的標準輸出:", + "loc.messages.stderrFromScript": "指令碼的標準錯誤:", + "loc.messages.WebConfigAlreadyExists": "已有 web.config 檔案。未產生任何檔案。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功產生 web.config 檔案", + "loc.messages.FailedToGenerateWebConfig": "無法產生 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "無法取得檔案內容: %s。狀態碼: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "無法取得檔案內容: %s。錯誤: %s", + "loc.messages.ScriptStatusTimeout": "因為逾時,所以無法擷取指令碼狀態。", + "loc.messages.PollingForFileTimeOut": "因為逾時,所以無法擷取指令碼狀態。您可以將 'appservicedeploy.retrytimeout' 變數設定為所需的分鐘數來提高逾時限制。", + "loc.messages.InvalidPollOption": "提供的輪詢選項無效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 參數中缺少屬性 '-appType'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask'、'node' 和 'Go'。
假如是 Python Bottle 架構,即為 '-appType python_Bottle' (不含括號)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "偵測不到 DJANGO_SETTINGS_MODULE 'settings.py' 檔案路徑。請確定 'settings.py' 檔案存在,或依下列格式在 Web.config 參數輸入中提供正確的路徑: '-DJANGO_SETTINGS_MODULE <資料夾名稱>.settings'", + "loc.messages.FailedToApplyTransformation": "無法對指定的套件套用轉換。請確認下列事項。", + "loc.messages.FailedToApplyTransformationReason1": "1. 是否已對建置期間由 MSBuild 產生的套件套用轉換。若已套用,請移除 csproj 檔案中每項設定的 標記,然後重建。", + "loc.messages.FailedToApplyTransformationReason2": "2. 確認組態檔與轉換檔皆位於套件內的同一個資料夾中。", + "loc.messages.AutoParameterizationMessage": "根據預設,Web.config 中的 ConnectionString 屬性已經過參數化。請注意,轉換對 connectionString 屬性無效,因為 'Parameters.xml' 或 'SetParameters.xml' 檔案已於部署期間覆寫該值。您可在產生 MSBuild 套件期間設定 /p:AutoParameterizationWebConfigConnectionStrings=False,停用自動參數化。", + "loc.messages.UnsupportedAppType": "產生 Web.config 時不支援應用程式類型 '%s'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask' 與 'node'", + "loc.messages.UnableToFetchAuthorityURL": "無法擷取授權單位 URL。", + "loc.messages.UnableToFetchActiveDirectory": "無法擷取 Active Directory 資源識別碼。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新執行階段堆疊與啟動命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "無法更新執行階段堆疊與啟動命令。錯誤: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新應用程式設定。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "無法更新應用程式設定。錯誤: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "無法擷取 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "無法更新 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "無法擷取 Azure Container Registry 認證。[狀態碼: '%s']", + "loc.messages.UnableToReadResponseBody": "無法讀取回應主體。錯誤: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "無法更新 WebApp 組態詳細資料。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "正在新增 Application Insights 資源 '%s' 的版本註釋", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功將版本註釋新增至 Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "無法新增版本註釋。%s", + "loc.messages.RenameLockedFilesEnabled": "將為 App Service 啟用的已鎖定檔案重新命名。", + "loc.messages.FailedToEnableRenameLockedFiles": "無法允許已鎖定重新命名的檔案。錯誤: %s", + "loc.messages.WebJobsInProgressIssue": "有幾個處於執行狀態的 WebJob 導致部署無法移除檔案。您可以在部署前停用 [移除目的地的其他檔案] 選項或停止連續的作業。", + "loc.messages.FailedToFetchKuduAppSettings": "無法擷取 Kudu 應用程式設定。錯誤: %s", + "loc.messages.FailedToCreatePath": "無法從 Kudu 建立路徑 '%s'。錯誤: %s", + "loc.messages.FailedToDeleteFile": "無法從 Kudu 刪除檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToDeleteFolder": "無法從 Kudu 刪除資料夾 '%s'。錯誤: %s", + "loc.messages.FailedToUploadFile": "無法從 Kudu 上傳檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToGetFileContent": "無法從 Kudu 取得檔案內容 '%s/%s'。錯誤: %s", + "loc.messages.FailedToListPath": "無法從 Kudu 列出路徑 '%s'。錯誤: %s", + "loc.messages.RetryToDeploy": "正在重試部署套件。", + "loc.messages.FailedToGetAppServiceDetails": "無法擷取 App Service '%s' 詳細資料。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "無法擷取 App Service '%s' 發佈設定檔。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "無法更新 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToGetAppServiceMetadata": "無法取得 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "無法修補 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "無法更新 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "無法取得 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "無法擷取 App Service '%s' 發佈認證。錯誤: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "無法取得 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "無法更新 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在嘗試更新 App Service 組態設定。資料: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新 App Service 組態設定。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在嘗試更新 App Service 應用程式設定。資料: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 應用程式設定已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 連接字串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新 App Service 應用程式設定與 Kudu 應用程式設定。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到 App Service '%s' 的多個資源群組。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP Deploy 的套件部署失敗。如需詳細資料,請查看記錄。", + "loc.messages.PackageDeploymentInitiated": "已起始使用 ZIP Deploy 部署套件。", + "loc.messages.WarPackageDeploymentInitiated": "已開始使用 WAR Deploy 部署套件。", + "loc.messages.FailedToGetDeploymentLogs": "無法取得部署記錄。錯誤: %s", + "loc.messages.GoExeNameNotPresent": "沒有 Go 可執行檔的名稱", + "loc.messages.WarDeploymentRetry": "因為 war 檔案稍早未成功展開,所以正在重試其部署。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "請確定電腦目前使用 TLS 1.2 通訊協定或更高的版本。請查看 https://aka.ms/enableTlsv2,以取得如何於您的電腦上啟用 TLS 的詳細資訊。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "無法擷取 Azure 的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "無法擷取受控服務主體的存取權杖。請設定虛擬機器的受控服務識別 (MSI) (https://aka.ms/azure-msi-docs)。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "無法擷取受控服務主體的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.XmlParsingFailed": "無法剖析 publishProfileXML 檔案,錯誤: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 屬性不存在於發佈設定檔中", + "loc.messages.InvalidConnectionType": "服務連線類型無效", + "loc.messages.InvalidImageSourceType": "映像來源類型無效", + "loc.messages.InvalidPublishProfile": "發佈設定檔的檔案無效。", + "loc.messages.ASE_SSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在建置或發行管線中將名為 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的變數設為 true 值", + "loc.messages.ZipDeployLogsURL": "可於 %s 檢視 Zip 部署記錄", + "loc.messages.DeployLogsURL": "在 %s 可檢視部署記錄檔", + "loc.messages.AppServiceApplicationURL": "App Service 應用程式 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在 Web 部署選項的其他引數中傳遞 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "無法取得資源類型 '%s' 和資源名稱 '%s' 的資源識別碼。錯誤: %s", + "loc.messages.JarPathNotPresent": "沒有 Java 的 jar 路徑", + "loc.messages.FailedToUpdateApplicationInsightsResource": "無法更新 Application Insights '%s' 資源。錯誤: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "從 Web Deploy 移至 RunFrom Package 可協助避免 FILE_IN_USE 錯誤。請注意,Run From Package 不支援 msBuild 套件類型。請變更您的套件格式以使用此部署方法。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/.npmrc b/_generated/AzureRmWebAppDeploymentV5/Tests/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..5737c680118f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,69 @@ +import tl = require('azure-pipelines-task-lib'); +import { AzureRmWebAppDeploymentProvider } from '../deploymentProvider/AzureRmWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); + +export class AzureRmWebAppDeploymentProviderL0Tests { + + public static async startAzureRmWebAppDeploymentProviderL0Tests() { + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps(); + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled(); + await AzureRmWebAppDeploymentProviderL0Tests.testForVirtualApplication(); + await AzureRmWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus(); + } + + public static async testForPreDeploymentSteps() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps should succeeded but failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with slot enabled failed with error'); + } + } + + public static async testForVirtualApplication() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + taskParameters.VirtualApplication = "VirtualApplication"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with virtual application should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with virtual application failed with error'); + } + } + + public static async testForUpdateDeploymentStatus() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + await azureRmWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus steps should succeeded but failed with error'); + } + } + +} + +AzureRmWebAppDeploymentProviderL0Tests.startAzureRmWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..0bf907fcc75e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/AzureRmWebAppDeploymentProviderTests.ts @@ -0,0 +1,41 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class AzureRmWebAppDeploymentProviderTests { + + public static startAzureRmWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'AzureRmWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +AzureRmWebAppDeploymentProviderTests.startAzureRmWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..2029bd44bab3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,115 @@ +import tl = require('azure-pipelines-task-lib'); +import { BuiltInLinuxWebAppDeploymentProvider } from '../deploymentProvider/BuiltInLinuxWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockLinuxAppSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockLinuxAppSettings(); + +export class BuiltInLinuxWebAppDeploymentProviderL0Tests { + + public static async startBuiltInLinuxWebAppDeploymentProviderL0Tests() { + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage(); + } + + public static async testForPreDeploymentSteps_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for built in linux web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with folder package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with war package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.jar" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with jar package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with jar package should succeeded but failed with error'); + } + } + +} + +BuiltInLinuxWebAppDeploymentProviderL0Tests.startBuiltInLinuxWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..3995adce9d91 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts @@ -0,0 +1,80 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class BuiltInLinuxWebAppDeploymentProviderTests { + + public static startBuiltInLinuxWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'BuiltInLinuxWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + + +} + +BuiltInLinuxWebAppDeploymentProviderTests.startBuiltInLinuxWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..6cc81a9913d1 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,70 @@ +import tl = require('azure-pipelines-task-lib'); +import { ContainerWebAppDeploymentProvider } from '../deploymentProvider/ContainerWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockContainerDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockContainerDeploySettings(); + +export class ContainerWebAppDeploymentProviderL0Tests { + + public static async startContainerWebAppDeploymentProviderL0Tests() { + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForDeployWebSteps_ContainerWebApp(); + } + + public static async testForPreDeploymentSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for container web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = null; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'Web app Deployment steps for container should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'Deployment web app steps for container failed with error'); + } + } + +} + +ContainerWebAppDeploymentProviderL0Tests.startContainerWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..fb1d790687ac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/ContainerWebAppDeploymentProviderTests.ts @@ -0,0 +1,43 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class ContainerWebAppDeploymentProviderTests { + + public static startContainerWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'ContainerWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + tr.setInput("DockerNamespace", "DockerNamespace"); + tr.setInput("DockerRepository", "DockerRepository"); + tr.setInput("DockerImageTag","DockerImageTag"); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + + } + +} + +ContainerWebAppDeploymentProviderTests.startContainerWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts new file mode 100644 index 000000000000..552c63e6d0fe --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryL0Tests.ts @@ -0,0 +1,177 @@ +import tl = require('azure-pipelines-task-lib'); +import { DeploymentFactory } from '../deploymentProvider/DeploymentFactory'; +import { IWebAppDeploymentProvider } from '../deploymentProvider/IWebAppDeploymentProvider'; +import { TaskParametersUtility, TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +export class DeploymentFactoryL0Tests { + + public static async startDeploymentFactoryL0Tests() { + await DeploymentFactoryL0Tests.testForLinuxWebDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWarDeployProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider() + await DeploymentFactoryL0Tests.testForPublishProfileProvider(); + await DeploymentFactoryL0Tests.testForContainerWebAppDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWebDeployProvider_UserSelected() + } + + public static async testForLinuxWebDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var linuxWebAppDeploymentProvider: IWebAppDeploymentProvider = await new DeploymentFactory(taskParameters).GetDeploymentProvider(); + if(linuxWebAppDeploymentProvider.constructor.name === "BuiltInLinuxWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'LinuxWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed with error.'+error); + } + } + + public static async testForWindowsWebAppRunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.isMSBuildPackage = () :Promise => {return Promise.resolve(false)}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWarDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWarDeployProvider.constructor.name === "WindowsWebAppWarDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWarDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWebDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.webDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWebDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWebDeployProvider.constructor.name === "WindowsWebAppWebDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWebDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.zipDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppRunFromZipProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.runFromZip; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppRunFromZipProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppRunFromZipProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForPublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ConnectionType = "PublishProfile"; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var publishProfileProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(publishProfileProvider.constructor.name === "PublishProfileWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'PublishProfileWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + + public static async testForContainerWebAppDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = true; + taskParameters.isBuiltinLinuxWebApp = false; + taskParameters.isContainerWebApp = true; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var containerWebAppDeploymentProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(containerWebAppDeploymentProvider.constructor.name === "ContainerWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'ContainerWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + +} + +DeploymentFactoryL0Tests.startDeploymentFactoryL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts new file mode 100644 index 000000000000..6cbde3e31e5a --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/DeploymentFactoryTests.ts @@ -0,0 +1,19 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class DeploymentFactoryTests { + + public static startDeploymentFactoryTests() { + let tp = path.join(__dirname, 'DeploymentFactoryL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setAgentsData(); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +DeploymentFactoryTests.startDeploymentFactoryTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0.ts new file mode 100644 index 000000000000..b2eb464a706f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0.ts @@ -0,0 +1,236 @@ +import * as path from "path"; +import * as assert from "assert"; +import * as ttm from "azure-pipelines-task-lib/mock-test"; +import tl = require('azure-pipelines-task-lib'); + +var AppServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service.js"); +var KuduServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service-kudu-tests.js"); +var ApplicationInsightsTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-appinsights-tests.js"); +var ResourcesTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-resource-tests.js"); + +const tmpDir = path.join(__dirname, 'temp'); + +describe('AzureRmWebAppDeployment Suite', function() { + this.timeout(60000); + this.beforeAll(done => { + tl.mkdirP(tmpDir); + done(); + }); + this.afterAll(done => { + tl.rmRF(tmpDir); + done(); + }); + + before((done) => { + if(!tl.exist(path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/node_modules'))) { + tl.cp(path.join( __dirname, 'node_modules'), path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests'), '-rf', true); + } + + done(); + }); + + ApplicationInsightsTests.ApplicationInsightsTests(); + AppServiceTests.AzureAppServiceMockTests(); + KuduServiceTests.KuduServiceTests(); + ResourcesTests.ResourcesTests(); + + it('AzureRmWebAppDeploymentV4 DeploymentFactoryTests', (done: MochaDone) => { + let tp = path.join(__dirname,'DeploymentFactoryTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('LinuxWebAppDeploymentProvider should be excepted.'), 'Should have printed: LinuxWebAppDeploymentProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppWarDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppWarDeployProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider should be expected.'); + assert(tr.stdOutContained('PublishProfileWebAppDeploymentProvider should be excepted.'), 'Should have printed: PublishProfileWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('ContainerWebAppDeploymentProvider should be excepted.'), 'Should have printed: ContainerWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppWebDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppWebDeployProvider for user selected should be excepted.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 AzureRmWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'AzureRmWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('PreDeployment steps with slot enabled should succeeded'), 'Should have printed: PreDeployment steps withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('PreDeployment steps with virtual application should succeeded'), 'Should have printed: PreDeployment steps with slot enabled should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 BuiltInLinuxWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'BuiltInLinuxWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess'); + assert(tr.stdOutContained('Skipped updating the SCM value'), 'Should have printed: Skipped updating the SCM value'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with zip package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with folder package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with war package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with war package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with jar package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with jar package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 ContainerWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'ContainerWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for container web app should succeeded'), 'Should have printed: PreDeployment steps for container web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for container web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for container web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'), 'Should have printed: loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceConfigurationSettings'), 'Should have printed: loc_mock_UpdatedAppServiceConfigurationSettings'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('Web app Deployment steps for container should succeeded'), 'Should have printed: Web app Deployment steps for container should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppRunFromZipProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppRunFromZipProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for run from zip should succeeded'), 'Should have printed: PreDeployment steps for run from zip should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for run from zip with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for run from zip with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.') + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'), 'Should have printed: loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with folder package succeeded.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWarDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWarDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for war deploy should succeeded'), 'Should have printed: PreDeployment steps for war deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for war deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for war deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for war deploy steps with war package succeeded'), 'Should have printed: DeployWebAppStep for war deploy steps with war package succeeded.') + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('loc_mock_WarPackageDeploymentInitiated'), 'Should have printed: loc_mock_WarPackageDeploymentInitiated.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppZipDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppZipDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for zip deploy should succeeded'), 'Should have printed: PreDeployment steps for zip deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for zip deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for zip deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with zip package succeeded.') + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with folder package succeeded.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + done(); + } + catch(error) { + done(error); + } + }); + + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWebDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWebDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for web deploy should succeeded'), 'Should have printed: PreDeployment steps for web deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for web deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for web deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 PublishProfileWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'PublishProfileWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for publish profile should succeeded'), 'Should have printed: PreDeployment steps for publish profile should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=SiteUrl'), 'Should have printed: set AppServiceApplicationUrl=SiteUrl'); + assert(tr.stdOutContained('UpdateDeploymentStatus for publish profile steps should succeeded'), 'Should have printed: UpdateDeploymentStatus for publish profile steps should succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'), 'Should have printed: DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 Validate TaskParameters', (done: MochaDone) => { + let tp = path.join(__dirname,'TaskParametersTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'), 'Should have printed: SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + assert(tr.stdOutContained('msbuild package PRESENT'), 'Should have printed: msbuild package PRESENT'); + done(); + } + catch(error) { + console.log(tr.stdout); + console.log(tr.stderr); + done(error); + } + }); + +}); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts new file mode 100644 index 000000000000..1e1459c9eec6 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0GenerateWebConfigForNode.ts @@ -0,0 +1,283 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('GenerateWebConfig','true'); +tr.setInput('WebConfigParameters','-appType node -Handler iisnode -NodeStartFile server.js'); +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "temp_web_package_random_path/web.config": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function() { + console.log('App Service availability check.'); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + } +}); + +tr.registerMock('./ParameterParserUtility', { + parse: function (data) { + return { + "appType": { + "value": "node" + }, + "Handler": { + "value": "iisnode" + }, + "NodeStartFile": { + "value": "server.js" + } + } + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(webConfigPath,options) { + return ""; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts new file mode 100644 index 000000000000..bb1e5decedef --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0LinuxBuiltinImage.ts @@ -0,0 +1,236 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('ImageSource', "Builtin Image"); +tr.setInput('WebAppKind', "applinux"); +tr.setInput('RuntimeStack', "dummy|version"); +tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function(Url, port) { + console.log("Testing availability of the webApp"); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated web app config details"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getWebAppAppSettings: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var appSettings = { + properties: { + } + }; + return appSettings; + }, + updateWebAppAppSettings: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName){ + console.log("Successfully updated webApp app-settings"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function () { + return false; + }, + canUseWebDeploy: function () { + return false; + }, + findfiles: function () { + return ['linuxPkg']; + }, + isMSDeployPackage: function () { + return false; + } +}); +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts new file mode 100644 index 000000000000..b69c217af9d7 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsDefault.ts @@ -0,0 +1,217 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts new file mode 100644 index 000000000000..3bebf8379159 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailArchive.ts @@ -0,0 +1,230 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = true; + return isParamFilePresent; + } +}); + +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + unzip: zipUtility.unzip, + getArchivedEntries: zipUtility.getArchivedEntries +}); + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts new file mode 100644 index 000000000000..a584aa554afd --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFailParamPkg.ts @@ -0,0 +1,213 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + }, + containsParamFile: function(webAppPackage: string) { + var taskResult = mockTask.execSync("cmd", ['/C',"DefaultWorkingDirectory\\msDeployParam.bat"]); + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js", { + getArchivedEntries: function( webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts new file mode 100644 index 000000000000..fe9247e0807f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsFolderPkg.ts @@ -0,0 +1,237 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock('webdeployment-common/ziputility.js', { + archiveFolder : function() { + console.log('Folder Archiving Successful'); + } +}); + +tr.registerMock('webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts new file mode 100644 index 000000000000..ed36177767db --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsParamFileinPkg.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "cmd" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Linux" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..8fa7ec87fa34 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0NonWindowsXdtTransformationFail.ts @@ -0,0 +1,185 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + archiveFolder: function() { + return "DefaultWorkingDirectory\\temp_web_package.zip" + }, + getArchivedEntries: function() { + return { + entries: ['Web.config', 'Web.debug.config'] + } + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts new file mode 100644 index 000000000000..826ec50f3335 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScript.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "File Path", null, 'myscript.cmd', false, false); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts new file mode 100644 index 000000000000..07b0f60c6d58 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0RunPostDeploymentScriptForLinux.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "Inline Script", "run command xyz", null, false, true); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts new file mode 100644 index 000000000000..094f74ff0059 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsAllInput.ts @@ -0,0 +1,232 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('RemoveAdditionalFilesFlag', 'true'); +tr.setInput('ExcludeFilesFromAppDataFlag', 'true'); +tr.setInput('TakeAppOfflineFlag', 'false'); +tr.setInput('VirtualApplication', 'virtualApp'); +tr.setInput('AdditionalArguments', 'additionalArguments'); +tr.setInput('WebAppUri', 'someuri'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp/virtualApp\' -skip:Directory=App_Data additionalArguments -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths : function() { + return ["/virtualApp", "/test/path"] + }, + ensurePhysicalPathExists: function() { + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts new file mode 100644 index 000000000000..47fc64f9c0dc --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefault.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + return { }; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts new file mode 100644 index 000000000000..cfb4c7d8bb2e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsDefaultReleaseAnnotationFail.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern": ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg": [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function (webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs: msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath: function () { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if (deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [['Object'], ['Object'], ['Object']], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function (publishingProfile, isDeploymentSuccess, customMessage) { + if (isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings: function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string) { + var appSettings = { + properties: { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings: function () { + return true; + }, + updateAzureRMWebAppConfigDetails: function () { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function () { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function () { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + throw "Random error"; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end": () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function (fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts new file mode 100644 index 000000000000..ad27403c48d7 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailDefault.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: any = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 1, + "stdout": "Failed to Deploy WebSite" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\error.txt": true + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY" : "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT" : "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "release.releaseId": '1', + "release.releaseName": "Release-1", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "DefaultWorkingDirectory\\error.txt": true + } +}; + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + shouldRetryMSDeploy: msDeployUtility.shouldRetryMSDeploy, + redirectMSDeployErrorToConsole : msDeployUtility.redirectMSDeployErrorToConsole, + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + var retryFunction; + return { + "isWriteStreamObj": true, + "on": (name, functionOnFinish) => { retryFunction = functionOnFinish;}, + "end" : () => { + if(retryFunction != null) { + retryFunction(); + } + return true; + } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts new file mode 100644 index 000000000000..3dda39d63518 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFailSetParamFile.ts @@ -0,0 +1,167 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'invalidparameterFile.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "invalidparameterFile.xml": { + "isFile" : false + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "osType": { + "osType": "Windows" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "findMatch": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts new file mode 100644 index 000000000000..0e16cec39849 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsFolderPkg.ts @@ -0,0 +1,211 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "msdeploy": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:IisApp=\'webAppPkg\' -dest:iisApp=\'mytestapp\',ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent":{ + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has been triggered"); + }, + "end" : () => { return true; } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + }, + fstat: fs.fstat, + read: fs.read, + open: fs.open, + writeFile: fs.writeFile, + symlink: fs.symlink, + stat: fs.stat +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts new file mode 100644 index 000000000000..c36cdcb27a2b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsManyPackage.ts @@ -0,0 +1,180 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'C:/pattern/**/*.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "match": { + "C:/pattern/**/*.zip":["webAppPkg1", "webAppPkg2"] + }, + "find" : { + "C:/pattern/":["C:/pattern/webAppPkg.zip", "C:/pattern/webAppPkg1.zip"] + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts new file mode 100644 index 000000000000..bf8eef36d07f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsNoPackage.ts @@ -0,0 +1,175 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'Invalid_webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "Invalid_webAppPkg": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts new file mode 100644 index 000000000000..92c4fbc4a6e8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsParamFileinPkg.ts @@ -0,0 +1,219 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "msdeploy" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Windows" + }, + "rmRF": { + "DefaultWorkingDirectory\\tempSetParameters.xml": { + "success": true + } + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -setParamFile=tempSetParameters.xml -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\tempSetParameters.xml": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts new file mode 100644 index 000000000000..c5ad17b9ec24 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsSpecificSlot.ts @@ -0,0 +1,225 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('DeployToSlotFlag', 'true'); +tr.setInput('ResourceGroupName', 'mytestappRg'); +tr.setInput('SlotName', 'testslot'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl-testslot/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp__testslot\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return []; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts new file mode 100644 index 000000000000..c0a9e1693f38 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformation.ts @@ -0,0 +1,278 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = 'true'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "msdeploy": "msdeploy", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i verbose": { + "code": 0, + "stdout": "ctt execution successful" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return true; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..b5c7a3c79fac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0WindowsXdtTransformationFail.ts @@ -0,0 +1,227 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = "false"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts new file mode 100644 index 000000000000..95867a366375 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/L0XdtTransformationFailMSBuildPackage.ts @@ -0,0 +1,226 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..73aeb2693678 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,56 @@ +import tl = require('azure-pipelines-task-lib'); +import { PublishProfileWebAppDeploymentProvider } from '../deploymentProvider/PublishProfileWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class PublishProfileWebAppDeploymentProviderL0Tests { + + public static async startPublishProfileWebAppDeploymentProviderL0Tests() { + await PublishProfileWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_PublishProfileProvider(); + } + + public static async testForPreDeploymentSteps_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for publish profile should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for publish profile failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.UpdateDeploymentStatus(true); + tl.setResult(tl.TaskResult.Succeeded, 'UpdateDeploymentStatus for publish profile steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for publish profile steps failed with error'); + } + } + + public static async testForDeployWebAppStep_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for publish profile steps steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for publish profile steps steps failed with error'+ error); + } + } + +} + +PublishProfileWebAppDeploymentProviderL0Tests.startPublishProfileWebAppDeploymentProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..e0844fd33b28 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/PublishProfileWebAppDeploymentProviderTests.ts @@ -0,0 +1,63 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument } from './utils'; + +export class PublishProfileWebAppDeploymentProviderTests { + + public static startPublishProfileWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'PublishProfileWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + tr.setInput("ConnectionType", "PublishProfile"); + tr.setInput('PublishProfilePath', 'publishxml.pubxml'); + tr.setInput('PublishProfilePassword', 'password'); + tr.setInput('Package', 'webAppPkg.zip'); + + setEndpointData(); + setAgentsData(); + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu', { + Kudu: function(A, B, C) { + return { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + } + } + }); + + + tr.registerMock('../operations/PublishProfileUtility', { + PublishProfileUtility: function(A) { + return { + GetPropertyValuefromPublishProfile : function(B) { + return "SiteUrl"; + } + } + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +PublishProfileWebAppDeploymentProviderTests.startPublishProfileWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts new file mode 100644 index 000000000000..764e7f213c03 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersLinuxAppL0Tests.ts @@ -0,0 +1,34 @@ +import tl = require('azure-pipelines-task-lib'); +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; + +function ValidatePostDeploymentInput() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + if (taskParameters.AppSettings.indexOf('-SCM_COMMAND_IDLE_TIMEOUT') != -1) { + tl.setResult(tl.TaskResult.Succeeded, 'SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'SCM_COMMAND_IDLE_TIMEOUT variable NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +async function ValidateMsBuildPackage() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + const isMsBuildType = await taskParameters.Package.isMSBuildPackage(); + if (isMsBuildType) { + tl.setResult(tl.TaskResult.Succeeded, 'msbuild package PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'msbuild package NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +ValidatePostDeploymentInput(); +ValidateMsBuildPackage(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts new file mode 100644 index 000000000000..9fbb4d0d4eab --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/TaskParametersTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setAgentsData, setEndpointData, mockTaskArgument } from './utils'; + +import path = require('path'); +import * as JSZip from "jszip" +import * as uuid from 'uuid'; +import * as fs from 'fs'; + +const tempDir = path.join(__dirname, 'temp'); + +setEndpointData(); + +export class TaskParametersTests { + public static async ValidateLinuxAppTaskParameters() { + let tp = path.join(__dirname, 'TaskParametersLinuxAppL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + const zipFilePath = await TaskParametersTests.createSampleZipFile(tempDir); + + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', zipFilePath); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', zipFilePath); + tr.setInput('ScriptType', 'Inline Script'); + tr.setInput('InlineScript','npm install --production'); + setAgentsData() + + const answers = mockTaskArgument(); + answers.exist[zipFilePath] = true; + answers.stats[zipFilePath] = { "isFile": true }; + answers.checkPath[zipFilePath] = true; + + tr.setAnswers(answers); + tr.run(); + } + + public static async createSampleZipFile(tempDir: string): Promise { + const zip = new JSZip(); + zip.file("index.html", "index"); + zip.file("parameters.xml", "parameters"); + zip.file("systemInfo.xml", "systemInfo"); + zip.file("file:../s.txt", `1\n`); + + const content = await zip.generateAsync({ type: "nodebuffer" }); + const outZipPath = path.join(tempDir, `${uuid.v1()}.zip`); + fs.writeFileSync(outZipPath, content); + return outZipPath; + } +} + +TaskParametersTests.ValidateLinuxAppTaskParameters(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts new file mode 100644 index 000000000000..d723b6482a1c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilityFailureTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net') + .get("/") + .reply(299, {"statusCode":"299", "statusMessage": "Fail"}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts new file mode 100644 index 000000000000..6d56b67d8547 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WebAppAvailabilitySuccessTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net/') + .get("/") + .reply(200, {}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts new file mode 100644 index 000000000000..afe94231e8d6 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppRunFromZipProvider } from '../deploymentProvider/WindowsWebAppRunFromZipProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppRunFromZipProviderL0Tests { + + public static async startWindowsWebAppRunFromZipProviderL0Tests() { + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentSteps_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForUpdateDeploymentStatus_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStep_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStepForFolder_RunFromZipProvider(); + } + + public static async testForPreDeploymentSteps_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in run from zip failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for run from zip with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for run from zip steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppRunFromZipProviderL0Tests.startWindowsWebAppRunFromZipProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts new file mode 100644 index 000000000000..9f176751a5a1 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppRunFromZipProviderTests.ts @@ -0,0 +1,82 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppRunFromZipProviderTests { + + public static startWindowsWebAppRunFromZipProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppRunFromZipProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppRunFromZipProviderTests.startWindowsWebAppRunFromZipProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts new file mode 100644 index 000000000000..f6e6f446b222 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderL0Tests.ts @@ -0,0 +1,78 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWarDeployProvider } from '../deploymentProvider/WindowsWebAppWarDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppWarDeployProviderL0Tests { + + public static async startWindowsWebAppWarDeployProviderL0Tests() { + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentSteps_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForUpdateDeploymentStatus_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForDeployWebAppStep_WarDeployProvider(); + } + + public static async testForPreDeploymentSteps_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for war deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for war deploy steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for war deploy steps with war package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWarDeployProviderL0Tests.startWindowsWebAppWarDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts new file mode 100644 index 000000000000..81fd7dcc2b07 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWarDeployProviderTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWarDeployProviderTests { + + public static startWindowsWebAppWarDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWarDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWarDeployProviderTests.startWindowsWebAppWarDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts new file mode 100644 index 000000000000..e0a2d5e9062f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderL0Tests.ts @@ -0,0 +1,89 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWebDeployProvider } from '../deploymentProvider/WindowsWebAppWebDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppWebDeployProviderL0Tests { + + public static async startWindowsWebAppWebDeployProviderL0Tests() { + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentSteps_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForUpdateDeploymentStatus_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStep_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStepForVirtualApplication_WebDeployProvider(); + } + + public static async testForPreDeploymentSteps_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for web deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForVirtualApplication_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + taskParameters.VirtualApplication = "VirtualApplication"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with virtual application with zip package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWebDeployProviderL0Tests.startWindowsWebAppWebDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts new file mode 100644 index 000000000000..85f07ba20ebb --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppWebDeployProviderTests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWebDeployProviderTests { + + public static startWindowsWebAppWebDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWebDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + }, + extractZIP: function(J, K){ + + }, + listDir: function(L){ + return "VirtualApplication"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWebDeployProviderTests.startWindowsWebAppWebDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts new file mode 100644 index 000000000000..8061a036fe02 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppZipDeployProvider } from '../deploymentProvider/WindowsWebAppZipDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppZipDeployProviderL0Tests { + + public static async startWindowsWebAppZipDeployProviderL0Tests() { + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentSteps_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForUpdateDeploymentStatus_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStep_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStepForFolder_ZipDeployProvider(); + } + + public static async testForPreDeploymentSteps_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for zip deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppZipDeployProviderL0Tests.startWindowsWebAppZipDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts new file mode 100644 index 000000000000..4c012622208d --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/WindowsWebAppZipDeployProviderTests.ts @@ -0,0 +1,79 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppZipDeployProviderTests { + + public static startWindowsWebAppZipDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppZipDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppZipDeployProviderTests.startWindowsWebAppZipDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts new file mode 100644 index 000000000000..4b4c62c316ff --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/mock_utils.ts @@ -0,0 +1,310 @@ +export var nock = require('nock'); + +export function mockAzureARMPreDeploymentSteps() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resources?$filter=resourceType%20EQ%20%27Microsoft.Web%2FSites%27%20AND%20name%20EQ%20%27mytestapp%27&api-version=2016-07-01") + .reply(200, { + value: [{ + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/microsoft.web/sites/mytestapp", + name: "MOCK_APP_INSIGHTS_NAME", + type: "microsoft.insights/components", + tags: {}, + properties: {} + }] + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/publishingcredentials/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/publishingcredentials/$mytestapp", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + publishingUserName: "$mytestapp", + publishingPassword: "MOCK_APP_SERVICE_MSDEPLOY_PASSWORD", + scmUri: "https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net" + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/publishxml?api-version=2016-08-01") + .reply(200,` + + + `).persist(); + + nock('https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net', + { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }). + put('/api/deployments/MOCK_DEPLOYMENT_ID').reply(200, { + type: 'Deployment', + url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID' + }); + + // linux built in app + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true, + "virtualApplications": [ {"physicalPath" : "physicalPath", "virtualPath": "/virtualApplication" }] + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).patch("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true + } + }).persist(); +} + +export function mockLinuxAppSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT": "/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); +} + +export function mockRunFromZipSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); +} + +export function mockZipDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); +} + +export function mockContainerDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/package-lock.json b/_generated/AzureRmWebAppDeploymentV5/Tests/package-lock.json new file mode 100644 index 000000000000..302728831d57 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/package-lock.json @@ -0,0 +1,145 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "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==", + "dev": true + }, + "nock": { + "version": "13.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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==", + "dev": true + }, + "propagate": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + } + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/package.json b/_generated/AzureRmWebAppDeploymentV5/Tests/package.json new file mode 100644 index 000000000000..756191a90e5b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "azurermappservicedeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/Tests/utils.ts b/_generated/AzureRmWebAppDeploymentV5/Tests/utils.ts new file mode 100644 index 000000000000..9b1aa18cb2c3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/Tests/utils.ts @@ -0,0 +1,87 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); + +export function extendObject(output, target) { + output = output || {}; + + if (target) { + for (var key in target) { + if (target.hasOwnProperty(key)) { + output[key] = target[key]; + } + } + } + + return output; +} + +export function setEndpointData() { + process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"MOCK_SPN_ID\",\"serviceprincipalkey\":\"MOCK_SPN_KEY\",\"tenantid\":\"MOCK_TENANT_ID\"},\"scheme\":\"ServicePrincipal\"}"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "MOCK_SPN_ID"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "MOCK_SPN_KEY"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "MOCK_TENANT_ID"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "MOCK_SUBSCRIPTION_NAME"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "MOCK_SUBSCRIPTION_ID"; + process.env["ENDPOINT_URL_AzureRMSpn"] = "https://management.azure.com/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ENVIRONMENTAUTHORITYURL"] = "https://login.windows.net/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ACTIVEDIRECTORYSERVICEENDPOINTRESOURCEID"] = "https://management.azure.com/"; +} + +export function setAgentsData() { + process.env['TASK_TEST_TRACE'] = "1"; + process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; + process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; + process.env["AGENT_NAME"] = "author"; + process.env["AGENT_TEMPDIRECTORY"] = process.cwd(); + process.env["BUILD_BUILDID"] = 'Build.BuildId'; + process.env["USE_MSAL"] = "false"; +} + +export function mockTaskArgument(): ma.TaskLibAnswers{ + // provide answers for task mock + let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "publishxml.pubxml": { + "isFile": true + }, + "webAppPkg": { + "isDirectory": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "publishxml.pubxml": true, + "publishxml": true, + "webAppPkg": true + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "publishxml.pubxml": true, + "publishxml": true + } + } + + return a; +} + +export function mockTaskInputParameters(tr) { + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', 'webAppPkg.zip'); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt b/_generated/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt new file mode 100644 index 000000000000..23bf6b698d0c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/ThirdPartyNotices.txt @@ -0,0 +1,2248 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Azure App Service Deploy incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. abbrev (https://github.com/isaacs/abbrev-js) +2. Archiver (https://github.com/archiverjs/node-archiver) +3. archiver-utils (https://github.com/archiverjs/archiver-utils) +4. async (https://github.com/caolan/async) +5. balanced-match (https://github.com/juliangruber/balanced-match) +6. binary (https://github.com/substack/node-binary) +7. bl (Buffer List) (https://github.com/rvagg/bl) +8. brace-expansion (https://github.com/juliangruber/brace-expansion) +9. buffer-crc32 (https://github.com/brianloveswords/buffer-crc32) +10. buffers (DefinitelyTyped) (https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/buffers) +11. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +12. buffer-shims (https://github.com/calvinmetcalf/buffer-shims) +13. chainsaw (https://github.com/substack/node-chainsaw) +14. compress-commons (https://github.com/archiverjs/node-compress-commons) +15. concat-map (https://github.com/substack/node-concat-map) +16. core-util-is (https://github.com/isaacs/core-util-is) +17. Crc32-stream (https://github.com/archiverjs/node-crc32-stream) +18. Ctt (https://ctt.codeplex.com) +19. decompress-zip (https://github.com/bower/decompress-zip) +20. end-of-stream (https://github.com/mafintosh/end-of-stream) +21. fs.realpath (https://github.com/isaacs/fs.realpath) +22. Glob (https://github.com/isaacs/node-glob) +23. graceful-fs (https://github.com/isaacs/node-graceful-fs) +24. hoek (https://github.com/hapijs/hoek) +25. inflight (https://github.com/npm/inflight) +26. inherits (https://github.com/isaacs/inherits) +27. isarray (https://github.com/juliangruber/isarray/) +28. isemail (https://github.com/hapijs/isemail) +29. joi (https://github.com/hapijs/joi) +30. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +31. lazystream (https://github.com/jpommerening/node-lazystream) +32. lodash (https://lodash.com/) + Includes:File(s) copyright John Resig (http://ejohn.org/blog/javascript-micro-templating/) + Includes:File(s) copyright Laura Doktorova (https://github.com/olado/doT) +33. lodash.once (https://github.com/lodash/lodash) +34. Ltx (https://github.com/node-xmpp/ltx) +35. minimatch (https://github.com/isaacs/minimatch) +36. mkpath (https://github.com/jrajav/mkpath) +37. Mockery (https://github.com/mfncooper/mockery) +38. Moment (https://github.com/moment/moment) +39. ms (https://github.com/zeit/ms) +40. Node.js (https://nodejs.org/) +41. node-ecdsa-sig-formatter (https://github.com/Brightspace/node-ecdsa-sig-formatter) +42. node-jwa (https://github.com/brianloveswords/node-jwa) +43. node-jws (https://github.com/brianloveswords/node-jws) +44. node-tar (https://github.com/npm/node-tar/) +45. node-uuid (https://github.com/broofa/node-uuid/) +46. nopt (https://github.com/npm/nopt) +47. normalize-path (https://github.com/jonschlinkert/normalize-path) +48. OpenSSL (http://www.openssl.org) +49. once (https://github.com/isaacs/once) +50. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +51. process-nextick-args (https://github.com/calvinmetcalf/process-nextick-args) +52. Q (https://github.com/kriskowal/q) +53. readable-stream (https://github.com/isaacs/readable-stream) +54. safe-buffer (https://github.com/feross/safe-buffer) +55. sax js (https://github.com/isaacs/sax-js) +56. semver (https://github.com/npm/node-semver/) +57. ShellJS (https://github.com/shelljs/shelljs) +58. string_decoder (https://github.com/rvagg/string_decoder) +59. tar-stream (https://github.com/mafintosh/tar-stream) +60. topo (https://github.com/hapijs/topo) +61. touch (https://github.com/isaacs/node-touch) +62. traverse (https://github.com/substack/js-traverse) +63. tunnel (https://github.com/koichik/node-tunnel) +64. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +65. util-deprecate (https://github.com/TooTallNate/util-deprecate) +66. VSTS-task-lib (https://github.com/Microsoft/vsts-task-lib) +67. winreg (https://github.com/fresc81/node-winreg) +68. wrappy (https://github.com/npm/wrappy) +69. Xml2JS (https://github.com/Leonidas-from-XIV/node-xml2js) +70. Xmlbuilder (https://github.com/oozcitak/xmlbuilder-js) +71. xtend (https://github.com/Raynos/xtend) +72. zip-stream (https://github.com/archiverjs/node-zip-stream) +73. uuid (https://github.com/kelektiv/node-uuid) +74. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +75. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +76. @types/mocha (https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% abbrev NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF abbrev NOTICES, INFORMATION, AND LICENSE + +%% Archiver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Archiver NOTICES, INFORMATION, AND LICENSE + +%% archiver-utils NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Chris Talkington. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF archiver-utils NOTICES, INFORMATION, AND LICENSE + +%% async NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2010-2016 Caolan McMahon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF async NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% binary NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF binary NOTICES, INFORMATION, AND LICENSE + +%% bl (Buffer List) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) +Copyright (c) 2014 bl contributors + +bl contributors listed at https://github.com/rvagg/bl#contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF bl (Buffer List) NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-crc32 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License + +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF buffer-crc32 NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE + +%% buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is licensed under the MIT license. + +Copyrights are respective of each contributor listed at the beginning of each definition file. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE + +%% buffer-shims NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2016 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** + +========================================= +END OF buffer-shims NOTICES, INFORMATION, AND LICENSE + +%% chainsaw NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF chainsaw NOTICES, INFORMATION, AND LICENSE + +%% compress-commons NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF compress-commons NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% Crc32-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Crc32-stream NOTICES, INFORMATION, AND LICENSE + +%% Ctt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. +========================================= +END OF Ctt NOTICES, INFORMATION, AND LICENSE + +%% decompress-zip NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Bower Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF decompress-zip NOTICES, INFORMATION, AND LICENSE + +%% end-of-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF end-of-stream NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license, as follows: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% Glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF Glob NOTICES, INFORMATION, AND LICENSE + +%% graceful-fs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF graceful-fs NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% isemail NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES, INFORMATION, AND LICENSE + +%% joi NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES, INFORMATION, AND LICENSE + +%% jsonwebtoken NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES, INFORMATION, AND LICENSE + +%% lazystream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 J. Pommerening, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF lazystream NOTICES, INFORMATION, AND LICENSE + +%% lodash NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +========================================= +// Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/) + +Copyright 2008 John Resig + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +// Based on Laura Doktorova's doT.js (https://github.com/olado/doT). + +Copyright (c) 2011 Laura Doktorova + +Software includes portions from jQote2 Copyright (c) 2010 aefxx, +http://aefxx.com/ licensed under the MIT license. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF lodash NOTICES, INFORMATION, AND LICENSE + +%% lodash.once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES, INFORMATION, AND LICENSE + +%% Ltx NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Stephan Maka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +========================================= +END OF Ltx NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mkpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (C) 2012 Jonathan Rajavuori + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF mkpath NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following +terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +END OF Moment NOTICES, INFORMATION, AND LICENSE + +%% ms NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES, INFORMATION, AND LICENSE + +%% Node.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. +========================================= +END OF Node.js NOTICES, INFORMATION, AND LICENSE + +%% node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% node-jwa NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES, INFORMATION, AND LICENSE + +%% node-jws NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES, INFORMATION, AND LICENSE + +%% node-tar NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License +Copyright (c) Isaac Z. Schlueter and Contributors +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF node-tar NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% nopt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF nopt NOTICES, INFORMATION, AND LICENSE + +%% normalize-path NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014-2015, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF normalize-path NOTICES, INFORMATION, AND LICENSE + +%% OpenSSL NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/) + * + * 4. The names OpenSSL Toolkit and OpenSSL Project must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called OpenSSL + * nor may OpenSSL appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/) + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com) + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * This product includes software written by Tim Hudson (tjh@cryptsoft.com) + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] +========================================= +END OF OpenSSL NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +path-is-absolute + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +node.js: + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% Q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009�2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +The file q.js is prefaced by the following additional third-party subcomponent information: + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +========================================= +END OF Q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + + +%% sax js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax js NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% tar-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tar-stream NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES, INFORMATION, AND LICENSE + +%% touch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF touch NOTICES, INFORMATION, AND LICENSE + +%% traverse NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: +http://www.opensource.org/licenses/mit-license.php + +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF traverse NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% underscore.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore.js NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the Software), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% VSTS-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF VSTS-task-lib NOTICES, INFORMATION, AND LICENSE + +%% winreg NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is released under BSD 2-Clause License. + +Copyright (c) 2016, Paul Bottin All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF winreg NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% Xml2JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF Xml2JS NOTICES, INFORMATION, AND LICENSE + +%% Xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF Xmlbuilder NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES, INFORMATION, AND LICENSE + +%% zip-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF zip-stream NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Includes Chris Veness' SHA1 + +Copyright (c) 2014 Chris Veness + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE diff --git a/_generated/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts b/_generated/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts new file mode 100644 index 000000000000..a77a66ee795b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/azurermwebappdeployment.ts @@ -0,0 +1,40 @@ +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); +import { TaskParameters, TaskParametersUtility } from './operations/TaskParameters'; +import { DeploymentFactory } from './deploymentProvider/DeploymentFactory'; +import * as Endpoint from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; + +async function main() { + let isDeploymentSuccess: boolean = true; + + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + tl.setResourcePath(path.join( __dirname, 'node_modules/azure-pipelines-tasks-webdeployment-common/module.json')); + var taskParams: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParams); + var deploymentProvider = await deploymentFactory.GetDeploymentProvider(); + + tl.debug("Predeployment Step Started"); + await deploymentProvider.PreDeploymentStep(); + + tl.debug("Deployment Step Started"); + + await deploymentProvider.DeployWebAppStep(); + + } + catch(error) { + tl.debug("Deployment Failed with Error: " + error); + isDeploymentSuccess = false; + tl.setResult(tl.TaskResult.Failed, error); + } + finally { + if(deploymentProvider != null) { + await deploymentProvider.UpdateDeploymentStatus(isDeploymentSuccess); + } + Endpoint.dispose(); + tl.debug(isDeploymentSuccess ? "Deployment Succeded" : "Deployment failed"); + + } +} + +main(); diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..728449091d96 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/AzureRmWebAppDeploymentProvider.ts @@ -0,0 +1,90 @@ +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { TaskParameters } from '../operations/TaskParameters'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { AzureResourceFilterUtility } from '../operations/AzureResourceFilterUtility'; +import { KuduServiceUtility } from '../operations/KuduServiceUtility'; +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +import { PackageUtility } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { AzureDeployPackageArtifactAlias } from '../operations/Constants'; + +export class AzureRmWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + protected taskParams:TaskParameters; + protected appService: AzureAppService; + protected kuduService: Kudu; + protected appServiceUtility: AzureAppServiceUtility; + protected kuduServiceUtility: KuduServiceUtility; + protected virtualApplicationPath: string = ""; + protected azureEndpoint: AzureEndpoint; + protected activeDeploymentID; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + let packageArtifactAlias = this.taskParams.Package ? PackageUtility.getArtifactAlias(this.taskParams.Package.getPath()) : null; + tl.setVariable(AzureDeployPackageArtifactAlias, packageArtifactAlias); + } + + public async PreDeploymentStep() { + + if (this.taskParams.WebAppKind.includes("functionAppContainer")){ + tl.warning(`Recommendation: Use Azure Functions for container Task to deploy Function app.`); + } + else if (this.taskParams.WebAppKind.includes("functionApp")){ + tl.warning(`Recommendation: Use Azure Functions Task to deploy Function app.`); + } + + this.azureEndpoint = await new AzureRMEndpoint(this.taskParams.connectedServiceName).getEndpoint(); + console.log(tl.loc('GotconnectiondetailsforazureRMWebApp0', this.taskParams.WebAppName)); + if(!this.taskParams.DeployToSlotOrASEFlag) { + this.taskParams.ResourceGroupName = await AzureResourceFilterUtility.getResourceGroupName(this.azureEndpoint, this.taskParams.WebAppName); + } + + this.appService = new AzureAppService(this.azureEndpoint, this.taskParams.ResourceGroupName, this.taskParams.WebAppName, + this.taskParams.SlotName, this.taskParams.WebAppKind); + this.appServiceUtility = new AzureAppServiceUtility(this.appService); + + this.kuduService = await this.appServiceUtility.getKuduService(); + this.kuduServiceUtility = new KuduServiceUtility(this.kuduService); + tl.debug(`Resource Group: ${this.taskParams.ResourceGroupName}`); + } + + public async DeployWebAppStep() {} + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + this.activeDeploymentID = await this.kuduServiceUtility.updateDeploymentStatus(isDeploymentSuccess, null, {'type': 'Deployment', slotName: this.appService.getSlot()}); + tl.debug('Active DeploymentId :'+ this.activeDeploymentID); + } + + if(this.appServiceUtility) { + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + } + + protected async PostDeploymentStep() { + if(this.taskParams.AppSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.AppSettings); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSettings); + } + + if(this.taskParams.ConfigurationSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.ConfigurationSettings); + await this.appServiceUtility.updateConfigurationSettings(customApplicationSettings); + } + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams, this.virtualApplicationPath); + } + + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..2d2371181ca4 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts @@ -0,0 +1,123 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import path = require('path'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentTypeLinux } from '../operations/TaskParameters'; + +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE true'; +const linuxFunctionRuntimeSettingName: string = '-FUNCTIONS_WORKER_RUNTIME '; + +const linuxFunctionRuntimeSettingValue = new Map([ + [ 'DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0', 'dotnet ' ], + [ 'DOCKER|microsoft/azure-functions-node8:2.0', 'node ' ], + [ 'DOCKER|microsoft/azure-functions-python3.6:2.0', 'python '], + [ 'DOTNET|2.2', 'dotnet ' ], + [ 'DOTNET|3.1', 'dotnet ' ], + [ 'JAVA|8', 'java ' ], + [ 'JAVA|11', 'java ' ], + [ 'NODE|8', 'node ' ], + [ 'NODE|10', 'node ' ], + [ 'NODE|12', 'node ' ], + [ 'NODE|14', 'node ' ], + [ 'PYTHON|3.6', 'python '], + [ 'PYTHON|3.7', 'python '], + [ 'PYTHON|3.8', 'python '] +]); + +export class BuiltInLinuxWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let packageType = this.taskParams.Package.getPackageType(); + let deploymentMethodtelemetry = packageType === PackageType.war ? '{"deploymentMethod":"War Deploy"}' : '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug('Performing Linux built-in package deployment'); + var isNewValueUpdated: boolean = false; + + if(this.taskParams.isFunctionApp) { + var linuxFunctionRuntimeSetting = ""; + if(this.taskParams.RuntimeStack){ + linuxFunctionRuntimeSetting = linuxFunctionRuntimeSettingName + linuxFunctionRuntimeSettingValue.get(this.taskParams.RuntimeStack); + } + var linuxFunctionAppSetting = linuxFunctionRuntimeSetting + linuxFunctionStorageSetting; + var customApplicationSetting = ParameterParser.parse(linuxFunctionAppSetting); + isNewValueUpdated = await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + var zipDeploy: boolean = this.taskParams.DeploymentTypeLinux === DeploymentTypeLinux.zipDeploy; + var isClean: boolean = this.taskParams.CleanDeploymentFlag; + if (!zipDeploy && !isClean) { + console.log(tl.loc('OneDeployWithIncrementalDeploymentOption')); + } + + switch(packageType){ + case PackageType.folder: + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + let archivedWebPackage = await zipUtility.archiveFolder(this.taskParams.Package.getPath(), "", tempPackagePath); + tl.debug("Compressed folder into zip " + archivedWebPackage); + await this.InvokeDeploymentMethod(zipDeploy, archivedWebPackage, 'Zip', isClean); + + break; + + case PackageType.zip: + await this.InvokeDeploymentMethod(zipDeploy, this.taskParams.Package.getPath(), 'Zip', isClean); + + break; + + case PackageType.jar: + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ this.taskParams.Package.getPath()); + var folderPath = await webCommonUtility.generateTemporaryFolderForDeployment(false, this.taskParams.Package.getPath(), PackageType.jar); + var output = await webCommonUtility.archiveFolderForDeployment(false, folderPath); + var webPackage = output.webDeployPkg; + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ webPackage); + await this.InvokeDeploymentMethod(zipDeploy, webPackage, 'Jar', isClean); + + break; + + case PackageType.war: + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + break; + + default: + throw new Error(tl.loc('Invalidwebapppackageorfolderpathprovided', this.taskParams.Package.getPath())); + } + + await this.appServiceUtility.updateStartupCommandAndRuntimeStack(this.taskParams.RuntimeStack, this.taskParams.StartupCommand); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + } + + private async InvokeDeploymentMethod(zipDeploy: boolean, packagePath: string, packageType: string, isClean: boolean){ + if (zipDeploy) { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(packagePath, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, true); + } + else { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingOneDeploy(packagePath, isClean, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, packageType, true); + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..542ab8d73728 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/ContainerWebAppDeploymentProvider.ts @@ -0,0 +1,25 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { ContainerBasedDeploymentUtility } from '../operations/ContainerBasedDeploymentUtility'; +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE false'; + +export class ContainerWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + tl.debug("Performing container based deployment."); + + if(this.taskParams.isFunctionApp) { + var customApplicationSetting = ParameterParser.parse(linuxFunctionStorageSetting); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + let containerDeploymentUtility: ContainerBasedDeploymentUtility = new ContainerBasedDeploymentUtility(this.appService); + await containerDeploymentUtility.deployWebAppImage(this.taskParams); + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams); + } + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts new file mode 100644 index 000000000000..a6cd9ec9f01b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/DeploymentFactory.ts @@ -0,0 +1,99 @@ +import { TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import * as Constant from '../operations/Constants' +import { PublishProfileWebAppDeploymentProvider } from './PublishProfileWebAppDeploymentProvider'; +import { BuiltInLinuxWebAppDeploymentProvider } from './BuiltInLinuxWebAppDeploymentProvider'; +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { WindowsWebAppWebDeployProvider } from './WindowsWebAppWebDeployProvider'; +import { WindowsWebAppZipDeployProvider } from './WindowsWebAppZipDeployProvider'; +import { WindowsWebAppRunFromZipProvider } from './WindowsWebAppRunFromZipProvider'; +import { ContainerWebAppDeploymentProvider } from './ContainerWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { WindowsWebAppWarDeployProvider } from './WindowsWebAppWarDeployProvider'; + +export class DeploymentFactory { + + private _taskParams: TaskParameters; + + constructor(taskParams: TaskParameters) { + this._taskParams = taskParams; + } + + public async GetDeploymentProvider(): Promise { + switch(this._taskParams.ConnectionType) { + case Constant.ConnectionType.PublishProfile: + return new PublishProfileWebAppDeploymentProvider(this._taskParams); + case Constant.ConnectionType.AzureRM: + if(this._taskParams.isLinuxApp) { + tl.debug("Depolyment started for linux app service"); + return await this._getLinuxDeploymentProvider(); + } if(this._taskParams.isHyperVContainerApp) { + tl.debug("Depolyment started for hyperV container app service"); + return await this._getContainerDeploymentProvider(); + } + else { + tl.debug("Depolyment started for windows app service"); + return await this._getWindowsDeploymentProvider() + } + default: + throw new Error(tl.loc('InvalidConnectionType')); + } + } + + private async _getLinuxDeploymentProvider(): Promise { + if(this._taskParams.isBuiltinLinuxWebApp) { + return new BuiltInLinuxWebAppDeploymentProvider(this._taskParams); + } else if(this._taskParams.isContainerWebApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getContainerDeploymentProvider(): Promise { + if(this._taskParams.isHyperVContainerApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getWindowsDeploymentProvider(): Promise { + tl.debug("Package type of deployment is: "+ this._taskParams.Package.getPackageType()); + switch(this._taskParams.Package.getPackageType()){ + case PackageType.war: + return new WindowsWebAppWarDeployProvider(this._taskParams); + case PackageType.jar: + return new WindowsWebAppZipDeployProvider(this._taskParams); + default: + return await this._getWindowsDeploymentProviderForZipAndFolderPackageType(); + } + } + + private async _getWindowsDeploymentProviderForZipAndFolderPackageType(): Promise { + if(this._taskParams.UseWebDeploy) { + return await this._getUserSelectedDeploymentProviderForWindow(); + } else { + var _isMSBuildPackage = await this._taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage || this._taskParams.VirtualApplication) { + return new WindowsWebAppWebDeployProvider(this._taskParams); + } else if(this._taskParams.ScriptType) { + return new WindowsWebAppZipDeployProvider(this._taskParams); + } else { + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + } + + private async _getUserSelectedDeploymentProviderForWindow(): Promise { + switch(this._taskParams.DeploymentType){ + case DeploymentType.webDeploy: + return new WindowsWebAppWebDeployProvider(this._taskParams); + case DeploymentType.zipDeploy: + return new WindowsWebAppZipDeployProvider(this._taskParams); + case DeploymentType.runFromZip: + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + +} diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..3ed6e50c86f4 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/IWebAppDeploymentProvider.ts @@ -0,0 +1,5 @@ +export interface IWebAppDeploymentProvider{ + PreDeploymentStep(); + DeployWebAppStep(); + UpdateDeploymentStatus(isDeploymentSuccess: boolean); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..363fc8557366 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts @@ -0,0 +1,143 @@ +import { IWebAppDeploymentProvider } from "./IWebAppDeploymentProvider"; +import { TaskParameters } from "../operations/TaskParameters"; +import { PublishProfileUtility, PublishingProfile } from '../operations/PublishProfileUtility'; +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import * as Constant from '../operations/Constants'; +import tl = require('azure-pipelines-task-lib/task'); +import fs = require('fs'); +import path = require('path'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +const DEFAULT_RETRY_COUNT = 3; + +export class PublishProfileWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + private taskParams: TaskParameters; + private publishProfileUtility: PublishProfileUtility; + private origWebPackage: string; + private modWebPackage: string; + private bakWebPackage: string; + private origEnvPath: string; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + } + + public async PreDeploymentStep() { + this.publishProfileUtility = new PublishProfileUtility(this.taskParams.PublishProfilePath); + try { + var siteUrl = await this.publishProfileUtility.GetPropertyValuefromPublishProfile(Constant.PublishProfileXml.SiteUrlToLaunchAfterPublish); + await AzureAppServiceUtility.pingApplication(siteUrl); + tl.setVariable('AppServiceApplicationUrl', siteUrl); + } + catch (error){ + tl.debug('Unable to ping webapp, Error: ' + error); + } + } + + public async DeployWebAppStep() { + if(!tl.osType().match(/^Win/)){ + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + tl.debug("Performing the deployment of webapp using publish profile."); + + var applyFileTransformFlag = this.taskParams.JSONFiles.length != 0 || this.taskParams.XmlTransformation || this.taskParams.XmlVariableSubstitution; + if(applyFileTransformFlag) { + await this.ApplyFileTransformation(); + } + + var msDeployPublishingProfile: PublishingProfile = await this.publishProfileUtility.GetTaskParametersFromPublishProfileFile(this.taskParams); + var deployCmdFilePath = this.GetDeployCmdFilePath(); + + await this.SetMsdeployEnvPath(); + var cmdArgs:string = this.GetDeployScriptCmdArgs(msDeployPublishingProfile); + + var retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + var retryCount = (retryCountParam && !(isNaN(Number(retryCountParam)))) ? Number(retryCountParam): DEFAULT_RETRY_COUNT; + + try { + while(true) { + try { + retryCount -= 1; + await this.publishProfileUtility.RunCmd(deployCmdFilePath, cmdArgs); + break; + } + catch (error) { + if(retryCount == 0) { + throw error; + } + console.log(error); + console.log(tl.loc('RetryToDeploy')); + } + } + console.log(tl.loc('PackageDeploymentSuccess')); + } + catch (error) { + tl.error(tl.loc('PackageDeploymentFailed')); + tl.debug(JSON.stringify(error)); + msDeployUtility.redirectMSDeployErrorToConsole(); + throw Error(error.message); + } + finally { + this.ResetMsdeployEnvPath(); + if(applyFileTransformFlag) { + this.ResetFileTransformation(); + } + } + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean){ } + + private async SetMsdeployEnvPath() { + var msDeployPath = await msDeployUtility.getMSDeployFullPath(); + var msDeployDirectory = msDeployPath.slice(0, msDeployPath.lastIndexOf('\\') + 1); + this.origEnvPath = process.env.PATH; + process.env.PATH = msDeployDirectory + ";" + process.env.PATH ; + } + + private async ResetMsdeployEnvPath() { + process.env.PATH = this.origEnvPath; + } + + private GetDeployCmdFilePath(): string { + var webPackagePath = this.taskParams.Package.getPath(); + var packageDir = path.dirname(webPackagePath); + return packageUtility.PackageUtility.getPackagePath(packageDir + "\\*.deploy.cmd"); + } + + private GetDeployScriptCmdArgs(msDeployPublishingProfile:any): string { + var deployCmdArgs: string = " /Y /A:basic \"/U:" + msDeployPublishingProfile.UserName + "\" \"\\\"/P:" + msDeployPublishingProfile.UserPWD + + "\\\"\" \"\\\"/M:" + "https://" + msDeployPublishingProfile.PublishUrl + "/msdeploy.axd?site=" + msDeployPublishingProfile.WebAppName + "\\\"\""; + + if(msDeployPublishingProfile.TakeAppOfflineFlag) { + deployCmdArgs += ' -enableRule:AppOffline'; + } + + if(msDeployPublishingProfile.RemoveAdditionalFilesFlag) { + deployCmdArgs += " -enableRule:DoNotDeleteRule"; + } + + if(this.taskParams.AdditionalArguments) { + deployCmdArgs += " " + this.taskParams.AdditionalArguments; + } + + return deployCmdArgs; + } + + private async ApplyFileTransformation() { + this.origWebPackage = packageUtility.PackageUtility.getPackagePath(this.taskParams.Package); + this.modWebPackage = await FileTransformsUtility.applyTransformations(this.origWebPackage, this.taskParams); + this.bakWebPackage = this.origWebPackage + ".bak"; + fs.renameSync(this.origWebPackage, this.bakWebPackage); + fs.renameSync(this.modWebPackage, this.origWebPackage); + } + + private ResetFileTransformation() { + tl.rmRF(this.origWebPackage); + fs.renameSync(this.bakWebPackage, this.origWebPackage); + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts new file mode 100644 index 000000000000..165930ea5baa --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppRunFromZipProvider.ts @@ -0,0 +1,68 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +const oldRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP'; +const runFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE 1'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppRunFromZipProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Run from Package"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.runFromZip) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var addCustomApplicationSetting = ParameterParser.parse(runFromZipAppSetting); + var deleteCustomApplicationSetting = ParameterParser.parse(oldRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(addCustomApplicationSetting, deleteCustomApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + await this.kuduServiceUtility.deployUsingRunFromZip(webPackage, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.taskParams.ScriptType && this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + } + else { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts new file mode 100644 index 000000000000..fba9f86f6519 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWarDeployProvider.ts @@ -0,0 +1,36 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + + +export class WindowsWebAppWarDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"War Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + + await this.kuduServiceUtility.warmpUp(); + + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + await this.PostDeploymentStep(); + } + + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts new file mode 100644 index 000000000000..55467fa83d97 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppWebDeployProvider.ts @@ -0,0 +1,53 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import * as Constant from '../operations/Constants'; +import { WebDeployUtility } from '../operations/WebDeployUtility'; +import { Package } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP -WEBSITE_RUN_FROM_PACKAGE'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export class WindowsWebAppWebDeployProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + var physicalPath: string = Constant.SiteRoot; + var webPackage = this.taskParams.Package.getPath(); + + if(this.taskParams.VirtualApplication) { + physicalPath = await this.appServiceUtility.getPhysicalPath(this.taskParams.VirtualApplication); + await this.kuduServiceUtility.createPathIfRequired(physicalPath); + this.virtualApplicationPath = physicalPath; + } + + webPackage = await FileTransformsUtility.applyTransformations(webPackage, this.taskParams); + this.taskParams.Package = new Package(webPackage); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting) + await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if (deployUtility.canUseWebDeploy(this.taskParams.UseWebDeploy)) { + const webDeployUtility = new WebDeployUtility(this.appServiceUtility); + const deploymentMethodtelemetry = '{"deploymentMethod":"Web Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Performing the deployment of webapp."); + + if (tl.getPlatform() !== tl.Platform.Windows) { + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + await webDeployUtility.publishUsingWebDeploy(this.taskParams); + } + else { + const deploymentMethodtelemetry = '{"deploymentMethod":"Zip API"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp package : "); + await this.kuduServiceUtility.deployWebPackage(webPackage, physicalPath, this.taskParams.VirtualApplication, this.taskParams.TakeAppOfflineFlag); + } + + await this.PostDeploymentStep(); + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts new file mode 100644 index 000000000000..9d3429714c79 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/deploymentProvider/WindowsWebAppZipDeployProvider.ts @@ -0,0 +1,64 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE -WEBSITE_RUN_FROM_ZIP'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppZipDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.zipDeploy) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(webPackage, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/icon.png b/_generated/AzureRmWebAppDeploymentV5/icon.png new file mode 100644 index 000000000000..9ee7be815737 Binary files /dev/null and b/_generated/AzureRmWebAppDeploymentV5/icon.png differ diff --git a/_generated/AzureRmWebAppDeploymentV5/icon.svg b/_generated/AzureRmWebAppDeploymentV5/icon.svg new file mode 100644 index 000000000000..4b1d57e6a85b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_generated/AzureRmWebAppDeploymentV5/make.json b/_generated/AzureRmWebAppDeploymentV5/make.json new file mode 100644 index 000000000000..541eb613f8ec --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/make.json @@ -0,0 +1,28 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "ctt.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/ctt/1.6/ctt.zip", + "dest": "./" + } + ] + }, + "cp": [ + { + "source": "postDeploymentScript", + "options": "-R" + } + ], + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base", + "node_modules/https-proxy-agent/node_modules/agent-base" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts new file mode 100644 index 000000000000..e9286351c825 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/AzureAppServiceUtility.ts @@ -0,0 +1,336 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +var parseString = require('xml2js').parseString; +import Q = require('q'); +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { AzureAppServiceUtility as AzureAppServiceUtilityCommon } from 'azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility'; + +//todo replace this class with azure-arm-rest/azureAppServiceUtility +export class AzureAppServiceUtility { + private _appService: AzureAppService; + constructor(appService: AzureAppService) { + this._appService = appService; + } + + public async updateScmTypeAndConfigurationDetails(): Promise { + try { + var configDetails = await this._appService.getConfiguration(); + var scmType: string = configDetails.properties.scmType; + let shouldUpdateMetadata = false; + if (scmType && scmType.toLowerCase() === "none") { + configDetails.properties.scmType = 'VSTSRM'; + tl.debug('updating SCM Type to VSTS-RM'); + await this._appService.updateConfiguration(configDetails); + tl.debug('updated SCM Type to VSTS-RM'); + shouldUpdateMetadata = true; + } + else if (scmType && scmType.toLowerCase() == "vstsrm") { + tl.debug("SCM Type is VSTSRM"); + shouldUpdateMetadata = true; + } + else { + tl.debug(`Skipped updating the SCM value. Value: ${scmType}`); + } + + if (shouldUpdateMetadata) { + tl.debug('Updating metadata with latest pipeline details'); + let newMetadataProperties = this._getNewMetadata(); + let siteMetadata = await this._appService.getMetadata(); + let skipUpdate = true; + for (let property in newMetadataProperties) { + if (siteMetadata.properties[property] !== newMetadataProperties[property]) { + siteMetadata.properties[property] = newMetadataProperties[property]; + skipUpdate = false; + } + } + + if (!skipUpdate) { + await this._appService.patchMetadata(siteMetadata.properties); + tl.debug('Updated metadata with latest pipeline details'); + console.log(tl.loc("SuccessfullyUpdatedAzureRMWebAppConfigDetails")); + } + else { + tl.debug("No changes in metadata properties, skipping update."); + } + } + } + catch (error) { + tl.warning(tl.loc("FailedToUpdateAzureRMWebAppConfigDetails", error)); + } + } + + public async getWebDeployPublishingProfile(): Promise { + var publishingProfile = await this._appService.getPublishingProfileWithSecrets(); + var defer = Q.defer(); + parseString(publishingProfile, (error, result) => { + if(!!error) { + defer.reject(error); + } + var publishProfile = result && result.publishData && result.publishData.publishProfile ? result.publishData.publishProfile : null; + if(publishProfile) { + for (var index in publishProfile) { + if (publishProfile[index].$ && publishProfile[index].$.publishMethod === "MSDeploy") { + defer.resolve(result.publishData.publishProfile[index].$); + } + } + } + + defer.reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + + return defer.promise; + } + + public async getApplicationURL(virtualApplication?: string): Promise { + let webDeployProfile: any = await this.getWebDeployPublishingProfile(); + return await webDeployProfile.destinationAppUrl + ( virtualApplication ? "/" + virtualApplication : "" ); + } + + public async pingApplication(): Promise { + try { + var applicationUrl: string = await this.getApplicationURL(); + + if(!applicationUrl) { + tl.debug("Application Url not found."); + return; + } + await AzureAppServiceUtility.pingApplication(applicationUrl); + } catch(error) { + tl.debug("Unable to ping App Service. Error: ${error}"); + } + } + + public static async pingApplication(applicationUrl: string) { + if(!applicationUrl) { + tl.debug('Application Url empty.'); + return; + } + try { + var webRequest = new webClient.WebRequest(); + webRequest.method = 'GET'; + webRequest.uri = applicationUrl; + let webRequestOptions: webClient.WebRequestOptions = {retriableErrorCodes: [], retriableStatusCodes: [], retryCount: 1, retryIntervalInSeconds: 5, retryRequestTimedout: true}; + var response = await webClient.sendRequest(webRequest, webRequestOptions); + tl.debug(`App Service status Code: '${response.statusCode}'. Status Message: '${response.statusMessage}'`); + } + catch(error) { + tl.debug(`Unable to ping App Service. Error: ${error}`); + } + } + + public async getKuduService(): Promise { + + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.getKuduService(); + + } + + public async isSitePublishingCredentialsEnabled(): Promise { + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.isSitePublishingCredentialsEnabled(); + } + + public async getAuthToken(): Promise { + const token = await this._appService._client.getCredentials().getToken(); + tl.setSecret(token); + return token; + } + + public async getPhysicalPath(virtualApplication: string): Promise { + + if(!virtualApplication) { + return '/site/wwwroot'; + } + + virtualApplication = (virtualApplication.startsWith("/")) ? virtualApplication.substr(1) : virtualApplication; + + var physicalToVirtualPathMap = await this._getPhysicalToVirtualPathMap(virtualApplication); + + if(!physicalToVirtualPathMap) { + throw Error(tl.loc("VirtualApplicationDoesNotExist", virtualApplication)); + } + + tl.debug(`Virtual Application Map: Physical path: '${physicalToVirtualPathMap.physicalPath}'. Virtual path: '${physicalToVirtualPathMap.virtualPath}'.`); + return physicalToVirtualPathMap.physicalPath; + } + + public async updateConfigurationSettings(properties: any) : Promise { + for(var property in properties) { + if(!!properties[property] && properties[property].value !== undefined) { + properties[property] = properties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceConfigurationSettings', JSON.stringify(properties))); + await this._appService.patchConfiguration({'properties': properties}); + console.log(tl.loc('UpdatedAppServiceConfigurationSettings')); + } + + public async updateAndMonitorAppSettings(addProperties: any, deleteProperties?: any): Promise { + for(var property in addProperties) { + if(!!addProperties[property] && addProperties[property].value !== undefined) { + addProperties[property] = addProperties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceApplicationSettings', JSON.stringify(addProperties))); + var isNewValueUpdated: boolean = await this._appService.patchApplicationSettings(addProperties, deleteProperties); + + if(!!isNewValueUpdated) { + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + } + else { + console.log(tl.loc('AppServiceApplicationSettingsAlreadyPresent')); + return isNewValueUpdated; + } + + var kuduService = await this.getKuduService(); + var noOftimesToIterate: number = 12; + tl.debug('retrieving values from Kudu service to check if new values are updated'); + while(noOftimesToIterate > 0) { + var kuduServiceAppSettings = await kuduService.getAppSettings(); + var propertiesChanged: boolean = true; + for(var property in addProperties) { + if(kuduServiceAppSettings[property] != addProperties[property]) { + tl.debug('New properties are not updated in Kudu service :('); + propertiesChanged = false; + break; + } + } + for(var property in deleteProperties) { + if(kuduServiceAppSettings[property]) { + tl.debug('Deleted properties are not reflected in Kudu service :('); + propertiesChanged = false; + break; + } + } + + if(propertiesChanged) { + tl.debug('New properties are updated in Kudu service.'); + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + return isNewValueUpdated; + } + + noOftimesToIterate -= 1; + await webClient.sleepFor(5); + } + + tl.debug('Timing out from app settings check'); + return isNewValueUpdated; + } + + public async enableRenameLockedFiles(): Promise { + try { + var webAppSettings = await this._appService.getApplicationSettings(); + if(webAppSettings && webAppSettings.properties) { + if(webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES !== '1') { + tl.debug(`Rename locked files value found to be ${webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES}. Updating the value to 1`); + await this.updateAndMonitorAppSettings({ 'MSDEPLOY_RENAME_LOCKED_FILES' : '1' }); + console.log(tl.loc('RenameLockedFilesEnabled')); + } + else { + tl.debug('Rename locked files is already enabled in App Service'); + } + } + } + catch(error) { + throw new Error(tl.loc('FailedToEnableRenameLockedFiles', error)); + } + } + + public async updateStartupCommandAndRuntimeStack(runtimeStack: string, startupCommand?: string): Promise { + var configDetails = await this._appService.getConfiguration(); + var appCommandLine: string = configDetails.properties.appCommandLine; + startupCommand = (!!startupCommand) ? startupCommand : appCommandLine; + var linuxFxVersion: string = configDetails.properties.linuxFxVersion; + runtimeStack = (!!runtimeStack) ? runtimeStack : linuxFxVersion; + + if (appCommandLine != startupCommand || runtimeStack != linuxFxVersion) { + await this.updateConfigurationSettings({linuxFxVersion: runtimeStack, appCommandLine: startupCommand}); + } + else { + tl.debug(`Skipped updating the values. linuxFxVersion: ${linuxFxVersion} : appCommandLine: ${appCommandLine}`) + } + } + + private async _getPhysicalToVirtualPathMap(virtualApplication: string): Promise { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = null; + var virtualPath = "/" + virtualApplication; + var appConfigSettings = await this._appService.getConfiguration(); + var virtualApplicationMappings = appConfigSettings.properties && appConfigSettings.properties.virtualApplications; + + if(virtualApplicationMappings) { + for( var mapping of virtualApplicationMappings ) { + if(mapping.virtualPath.toLowerCase() == virtualPath.toLowerCase()) { + physicalPath = mapping.physicalPath; + break; + } + } + } + + return physicalPath ? { + 'virtualPath': virtualPath, + 'physicalPath': physicalPath + }: null; + } + + private _getNewMetadata(): any { + var collectionUri = tl.getVariable("system.teamfoundationCollectionUri"); + var projectId = tl.getVariable("system.teamprojectId"); + var releaseDefinitionId = tl.getVariable("release.definitionId"); + + // Log metadata properties based on whether task is running in build OR release. + + let newProperties = { + VSTSRM_ProjectId: projectId, + VSTSRM_AccountId: tl.getVariable("system.collectionId") + } + + if(!!releaseDefinitionId) { + // Task is running in Release + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + tl.debug("Artifact Source Alias is: "+ artifactAlias); + + let buildDefinitionUrl = ""; + let buildDefintionId = ""; + + if (artifactAlias) { + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + // Get build definition info only when artifact type is build. + if (artifactType && artifactType.toLowerCase() == "build") { + + buildDefintionId = tl.getVariable("build.definitionId"); + let buildProjectId = tl.getVariable("build.projectId") || projectId; + let artifactBuildDefinitionId = tl.getVariable("release.artifacts." + artifactAlias + ".definitionId"); + let artifactBuildProjectId = tl.getVariable("release.artifacts." + artifactAlias + ".projectId"); + + if (artifactBuildDefinitionId && artifactBuildProjectId) { + buildDefintionId = artifactBuildDefinitionId; + buildProjectId = artifactBuildProjectId; + } + + buildDefinitionUrl = collectionUri + buildProjectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + } + } + + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + newProperties["VSTSRM_ReleaseDefinitionId"] = releaseDefinitionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl; + newProperties["VSTSRM_ConfiguredCDEndPoint"] = collectionUri + projectId + "/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?definitionId=" + releaseDefinitionId; + } + else { + // Task is running in Build + let buildDefintionId = tl.getVariable("system.definitionId"); + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + let buildDefinitionUrl = collectionUri + projectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl + newProperties["VSTSRM_ConfiguredCDEndPoint"] = buildDefinitionUrl; + } + + return newProperties; + } + +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts new file mode 100644 index 000000000000..091a77d51a06 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/AzureResourceFilterUtility.ts @@ -0,0 +1,20 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { Resources } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-resource'; + +export class AzureResourceFilterUtility { + public static async getResourceGroupName(endpoint: AzureEndpoint, resourceName: string): Promise { + const azureResources: Resources = new Resources(endpoint); + const resources: Array = await azureResources.getResources('Microsoft.Web/Sites', resourceName); + const resourceGroupIds: string[] = [...new Set(resources.map(r => r.id as string))]; + if(!resourceGroupIds || resourceGroupIds.length == 0) { + throw new Error(tl.loc('ResourceDoesntExist', resourceName)); + } + else if(resourceGroupIds.length > 1) { + throw new Error(tl.loc('MultipleResourceGroupFoundForAppService', resourceName)); + } + else { + return resourceGroupIds[0].split("/")[4]; + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/Constants.ts b/_generated/AzureRmWebAppDeploymentV5/operations/Constants.ts new file mode 100644 index 000000000000..3289e7f10524 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/Constants.ts @@ -0,0 +1,19 @@ +export const ConnectionType = { + PublishProfile: "PublishProfile", + AzureRM: "AzureRM" +} + +export const SiteRoot: string = '/site/wwwroot'; + +export const PublishProfileXml = { + ExcludeApp_Data: "ExcludeApp_Data", + EnableMSDeployAppOffline: "EnableMSDeployAppOffline", + SkipExtraFilesOnServer: "SkipExtraFilesOnServer", + SiteUrlToLaunchAfterPublish: "SiteUrlToLaunchAfterPublish", + MSDeployServiceURL: "MSDeployServiceURL", + DeployIisAppPath: "DeployIisAppPath", + MSDeploy: "MSDeploy", + UserName: "UserName" +} + +export const AzureDeployPackageArtifactAlias = "Azure_App_Service_Deploy_PackageArtifactAlias"; \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts new file mode 100644 index 000000000000..8390173487b8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/ContainerBasedDeploymentUtility.ts @@ -0,0 +1,226 @@ +import tl = require('azure-pipelines-task-lib/task'); +import url = require('url'); +import util = require('util'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +enum registryTypes { + "AzureContainerRegistry", + "Registry", // TODO: Rename it to DockerHub while supporting all the registry types. Also add all these registry types in Task.json in ImageSource pick list. + "PrivateRegistry" +} + +export class ContainerBasedDeploymentUtility { + private _appService: AzureAppService; + private _appServiceUtility: AzureAppServiceUtility; + + constructor(appService: AzureAppService) { + this._appService = appService; + this._appServiceUtility = new AzureAppServiceUtility(appService); + } + + public async deployWebAppImage(taskParameters: TaskParameters): Promise { + let imageName: string = this._getDockerHubImageName(); + tl.debug("Deploying an image " + imageName + " to the webapp " + this._appService.getName()); + + tl.debug("Updating the webapp configuration."); + await this._updateConfigurationDetails(taskParameters, imageName); + + tl.debug('Updating web app settings'); + await this._updateApplicationSettings(taskParameters, imageName); + } + + private async _updateApplicationSettings(taskParameters: TaskParameters, imageName: string): Promise { + var appSettingsParameters = taskParameters.AppSettings; + appSettingsParameters = appSettingsParameters ? appSettingsParameters.trim() : ""; + appSettingsParameters = await this._getContainerRegistrySettings(imageName, null) + ' ' + appSettingsParameters; + var appSettingsNewProperties = parse(appSettingsParameters); + await this._appServiceUtility.updateAndMonitorAppSettings(appSettingsNewProperties); + } + + private async _updateConfigurationDetails(taskParameters: TaskParameters, imageName: string): Promise { + var startupCommand: string = taskParameters.StartupCommand; + var configSettingsParameters = taskParameters.ConfigurationSettings; + var appSettingsNewProperties = !!configSettingsParameters ? parse(configSettingsParameters.trim()): { }; + if(!!startupCommand) { + appSettingsNewProperties.appCommandLine = { + 'value': startupCommand + } + } + + if (taskParameters.isHyperVContainerApp){ + appSettingsNewProperties.windowsFxVersion = { + 'value': "DOCKER|" + imageName + } + } + else { + appSettingsNewProperties.linuxFxVersion = { + 'value': "DOCKER|" + imageName + } + } + + tl.debug(`CONATINER UPDATE CONFIG VALUES : ${appSettingsNewProperties}`); + await this._appServiceUtility.updateConfigurationSettings(appSettingsNewProperties); + } + + private getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _getAzureContainerImageName(): string { + var registry = tl.getInput('AzureContainerRegistryLoginServer', true) + ".azurecr.io"; + var image = tl.getInput('AzureContainerRegistryImage', true); + var tag = tl.getInput('AzureContainerRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _constructImageName(namespace, repository, tag): string { + var imageName = null; + /* + Special Case : If release definition is not linked to build artifacts + then $(Build.BuildId) variable don't expand in release. So clearing state + of dockerImageTag if $(Build.BuildId) not expanded in value of dockerImageTag. + */ + if(tag && (tag.trim() == "$(Build.BuildId)")) { + tag = null; + } + + if(tag) { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase() + ":" + tag; + } else { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase(); + } + + return imageName.replace(/ /g,""); + } + + private _getPrivateRegistryImageName(): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var loginServer = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'url', true); + + var registry = url.parse(loginServer).hostname; + var image = tl.getInput('PrivateRegistryImage', true); + var tag = tl.getInput('PrivateRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _updateWebAppSettings(appSettingsParameters, webAppSettings): void { + // In case of public repo, clear the connection details of a registry + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', true); + + // Uncomment the below lines while supprting all registry types. + // if(dockerRespositoryAccess === "public") + // { + // deleteRegistryConnectionSettings(webAppSettings); + // } + + var parsedAppSettings = parse(appSettingsParameters); + for (var settingName in parsedAppSettings) { + var setting = settingName.trim(); + var settingVal = parsedAppSettings[settingName].value; + settingVal = settingVal ? settingVal.trim() : ""; + + if(setting) { + webAppSettings["properties"][setting] = settingVal; + } + } + } + + private _getImageName(): string { + var registryType = tl.getInput('ImageSource', true); + var imageName = null; + + switch(registryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + imageName = this._getAzureContainerImageName(); + break; + + case registryTypes[registryTypes.Registry]: + imageName = this._getDockerHubImageName(); + break; + + case registryTypes[registryTypes.PrivateRegistry]: + imageName = this._getPrivateRegistryImageName(); + break; + } + + return imageName; + } + + private async _getContainerRegistrySettings(imageName, endPoint): Promise { + var containerRegistryType: string = 'Registry'; + var containerRegistrySettings: string = "-DOCKER_CUSTOM_IMAGE_NAME " + imageName; + var containerRegistryAuthParamsFormatString: string = "-DOCKER_REGISTRY_SERVER_URL %s -DOCKER_REGISTRY_SERVER_USERNAME %s -DOCKER_REGISTRY_SERVER_PASSWORD %s"; + + switch(containerRegistryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + containerRegistrySettings = await this._getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + + case registryTypes[registryTypes.Registry]: + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', false); + if(dockerRespositoryAccess === "private") + { + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + } + break; + + case registryTypes[registryTypes.PrivateRegistry]: + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + } + + return containerRegistrySettings; + } + + private async _getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString): Promise { + var registryServerName = tl.getInput('AzureContainerRegistryLoginServer', true); + var registryUrl = "https://" + registryServerName + ".azurecr.io"; + tl.debug("Azure Container Registry Url: " + registryUrl); + + var registryName = tl.getInput('AzureContainerRegistry', true); + var resourceGroupName = '';// await azureRESTUtility.getResourceGroupName(endPoint, registryName, "Microsoft.ContainerRegistry/registries"); + tl.debug("Resource group name of a registry: " + resourceGroupName); + + var creds = null //await azureRESTUtility.getAzureContainerRegistryCredentials(endPoint, registryName, resourceGroupName); + tl.debug("Successfully retrieved the registry credentials"); + + var username = creds.username; + var password = creds["passwords"][0].value; + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var username = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'username', true); + var password = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'password', true); + var registryUrl = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'registry', true); + + tl.debug("Docker or Private Container Registry Url: " + registryUrl); + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _deleteRegistryConnectionSettings(webAppSettings): void { + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_URL"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_USERNAME"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_PASSWORD"]; + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts new file mode 100644 index 000000000000..5483a5ca2376 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/FileTransformsUtility.ts @@ -0,0 +1,37 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var fileTransformationsUtility = require('azure-pipelines-tasks-webdeployment-common/fileTransformationsUtility.js'); +var generateWebConfigUtil = require('azure-pipelines-tasks-webdeployment-common/webconfigutil.js'); + +export class FileTransformsUtility { + + private static rootDirectoryPath: string = "D:\\home\\site\\wwwroot"; + public static async applyTransformations(webPackage: string, taskParams: TaskParameters): Promise { + tl.debug("WebConfigParameters is "+ taskParams.WebConfigParameters); + var applyFileTransformFlag = taskParams.JSONFiles.length != 0 || taskParams.XmlTransformation || taskParams.XmlVariableSubstitution; + if (applyFileTransformFlag || taskParams.WebConfigParameters) { + var isFolderBasedDeployment: boolean = tl.stats(webPackage).isDirectory(); + var folderPath = await deployUtility.generateTemporaryFolderForDeployment(isFolderBasedDeployment, webPackage, taskParams.Package.getPackageType()); + if (taskParams.WebConfigParameters) { + tl.debug('parsing web.config parameters'); + var webConfigParameters = parse(taskParams.WebConfigParameters); + generateWebConfigUtil.addWebConfigFile(folderPath, webConfigParameters, this.rootDirectoryPath); + } + + if (applyFileTransformFlag) { + var isMSBuildPackage = !isFolderBasedDeployment && (await deployUtility.isMSDeployPackage(webPackage)); + fileTransformationsUtility.fileTransformations(isFolderBasedDeployment, taskParams.JSONFiles, taskParams.XmlTransformation, taskParams.XmlVariableSubstitution, folderPath, isMSBuildPackage); + } + + var output = await deployUtility.archiveFolderForDeployment(isFolderBasedDeployment, folderPath); + webPackage = output.webDeployPkg; + } + else { + tl.debug('File Tranformation not enabled'); + } + + return webPackage; + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts new file mode 100644 index 000000000000..85bf06da55ba --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/KuduServiceUtility.ts @@ -0,0 +1,576 @@ +import tl = require('azure-pipelines-task-lib/task'); +import Q = require('q'); +import path = require('path'); + +import { DeploymentType, TaskParameters } from './TaskParameters'; + +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { KUDU_DEPLOYMENT_CONSTANTS } from 'azure-pipelines-tasks-azure-arm-rest/constants'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; + +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +const physicalRootPath: string = '/site/wwwroot'; +const deploymentFolder: string = 'site/deployments'; +const manifestFileName: string = 'manifest'; +const VSTS_ZIP_DEPLOY: string = 'VSTS_ZIP_DEPLOY'; +const VSTS_ONE_DEPLOY: string = 'VSTS_ONE_DEPLOY'; +const VSTS_DEPLOY: string = 'VSTS'; + +export class KuduServiceUtility { + private _appServiceKuduService: Kudu; + private _deploymentID: string; + + constructor(kuduService: Kudu) { + this._appServiceKuduService = kuduService; + } + + public async createPathIfRequired(phsyicalPath: string): Promise { + var listDir = await this._appServiceKuduService.listDir(phsyicalPath); + if(listDir == null) { + await this._appServiceKuduService.createPath(phsyicalPath); + } + } + + public async updateDeploymentStatus(taskResult: boolean, DeploymentID: string, customMessage: any): Promise { + try { + let requestBody = this._getUpdateHistoryRequest(taskResult, DeploymentID, customMessage); + return await this._appServiceKuduService.updateDeployment(requestBody); + } + catch(error) { + tl.warning(error); + } + } + + public async runPostDeploymentScript(taskParams: TaskParameters, directoryPath?: string): Promise { + var uniqueID = this.getDeploymentID(); + let vstsPostDeploymentFolderPath: string = path.join(physicalRootPath.substring(1), '..', 'VSTS_PostDeployment_' + uniqueID); + try { + var rootDirectoryPath = directoryPath || physicalRootPath.substring(1); + + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, true); + } + + var scriptFile = this._getPostDeploymentScript(taskParams.ScriptType, taskParams.InlineScript, taskParams.ScriptPath, taskParams.isLinuxApp); + var fileExtension : string = taskParams.isLinuxApp ? '.sh' : '.cmd'; + var mainCmdFilePath = path.join(__dirname, '..', 'postDeploymentScript', 'mainCmdFile' + fileExtension); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'mainCmdFile' + fileExtension, mainCmdFilePath); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'kuduPostDeploymentScript' + fileExtension, scriptFile.filePath); + console.log(tl.loc('ExecuteScriptOnKudu')); + var cmdFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\mainCmdFile' + fileExtension; + var scriprResultPath = '/site/VSTS_PostDeployment_' + uniqueID; + if (taskParams.isLinuxApp){ + cmdFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/mainCmdFile' + fileExtension; + } + await this.runCommand(rootDirectoryPath, cmdFilePath + ' ' + uniqueID, 30, scriprResultPath, 'script_result.txt'); + await this._printPostDeploymentLogs(vstsPostDeploymentFolderPath); + + } + catch(error) { + if(taskParams.UseWebDeploy && taskParams.DeploymentType === DeploymentType.runFromZip) { + var debugMode = tl.getVariable('system.debug'); + if(debugMode && debugMode.toLowerCase() == 'true') { + tl.warning(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + else { + console.log(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + } + throw Error(tl.loc('FailedToRunScriptOnKuduError', error)); + } + finally { + try { + let deleteFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\delete_log_file' + fileExtension; + if(taskParams.isLinuxApp) { + deleteFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/delete_log_file' + fileExtension; + } + + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'delete_log_file' + fileExtension, path.join(__dirname, '..', 'postDeploymentScript', 'deleteLogFile' + fileExtension)); + await this.runCommand(vstsPostDeploymentFolderPath, deleteFilePath); + await this._appServiceKuduService.deleteFolder(vstsPostDeploymentFolderPath); + } + catch(error) { + tl.debug('Unable to delete log files : ' + error); + } + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, false); + } + } + } + + public getDeploymentID(): string { + if(this._deploymentID) { + return this._deploymentID; + } + + var buildUrl = tl.getVariable('build.buildUri'); + var releaseUrl = tl.getVariable('release.releaseUri'); + + var buildId = tl.getVariable('build.buildId'); + var releaseId = tl.getVariable('release.releaseId'); + + var buildNumber = tl.getVariable('build.buildNumber'); + var releaseName = tl.getVariable('release.releaseName'); + + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + + var commitId = tl.getVariable('build.sourceVersion'); + var repoName = tl.getVariable('build.repository.name'); + var repoProvider = tl.getVariable('build.repository.provider'); + + var buildOrReleaseUrl = "" ; + var deploymentID: string = (releaseId ? releaseId : buildId) + Date.now().toString(); + + return deploymentID; + } + + public async deployWebPackage(packagePath: string, physicalPath: string, virtualPath: string, appOffline?: boolean): Promise { + physicalPath = physicalPath ? physicalPath : physicalRootPath; + try { + if(appOffline) { + await this._appOfflineKuduService(physicalPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if(tl.stats(packagePath).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + packagePath = await zipUtility.archiveFolder(packagePath, "", tempPackagePath); + tl.debug("Compressed folder " + packagePath + " into zip : " + packagePath); + } + else if(packagePath.toLowerCase().endsWith('.war')) { + physicalPath = await this._warFileDeployment(packagePath, physicalPath, virtualPath); + } + + await this._appServiceKuduService.extractZIP(packagePath, physicalPath); + if(appOffline) { + await this._appOfflineKuduService(physicalPath, false); + } + + console.log(tl.loc("Successfullydeployedpackageusingkuduserviceat", packagePath, physicalPath)); + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingZipDeploy(packagePath: string, appOffline?: boolean, customMessage?: any, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + let queryParameters: Array = [ + 'isAsync=true', + 'deployer=' + VSTS_ZIP_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.zipDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingOneDeploy(packagePath: string, isClean: boolean, appOffline?: boolean, customMessage?: any, packageType?:string, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiatedWithOneDeploy')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if (!packageType){ + tl.debug('No package type provided. Defaulting to zip package type'); + packageType = PackageType[PackageType.zip]; + } + + let queryParameters: Array = [ + 'async=true', + 'deployer=' + VSTS_ONE_DEPLOY, + 'type=' + packageType, + 'clean=' + isClean + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.oneDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingRunFromZip(packagePath: string, customMessage?: any) : Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'deployer=' + VSTS_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + await this._appServiceKuduService.zipDeploy(packagePath, queryParameters); + + console.log(tl.loc('PackageDeploymentSuccess')); + console.log(tl.loc('RunFromPackageAppsetting')); + + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingWarDeploy(packagePath: string, customMessage?: any, targetFolderName?: any): Promise { + try { + console.log(tl.loc('WarPackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'isAsync=true' + ]; + + if(targetFolderName) { + queryParameters.push('name=' + encodeURIComponent(targetFolderName)); + } + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + let deploymentDetails = await this._appServiceKuduService.warDeploy(packagePath, queryParameters); + await this._processDeploymentResponse(deploymentDetails); + console.log(tl.loc('PackageDeploymentSuccess')); + + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async postZipDeployOperation(oldDeploymentID: string, activeDeploymentID: string): Promise { + try { + tl.debug(`ZIP DEPLOY - Performing post zip-deploy operation: ${oldDeploymentID} => ${activeDeploymentID}`); + let manifestFileContent = await this._appServiceKuduService.getFileContent(`${deploymentFolder}/${oldDeploymentID}`, manifestFileName); + if(!!manifestFileContent) { + let tempManifestFile: string = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), manifestFileName); + tl.writeFile(tempManifestFile, manifestFileContent); + await this._appServiceKuduService.uploadFile(`${deploymentFolder}/${activeDeploymentID}`, manifestFileName, tempManifestFile); + } + tl.debug('ZIP DEPLOY - Performed post-zipdeploy operation.'); + } + catch(error) { + tl.debug(`Failed to execute post zip-deploy operation: ${JSON.stringify(error)}.`); + } + } + + public async warmpUp() { + try { + + tl.debug('warming up Kudu Service'); + await this._appServiceKuduService.getAppSettings(); + tl.debug('warmed up Kudu Service'); + + } + catch(error) { + tl.debug('Failed to warm-up Kudu: ' + error.toString()); + } + } + + private async _processDeploymentResponse(deploymentDetails: any): Promise { + try { + var kuduDeploymentDetails = await this._appServiceKuduService.getDeploymentDetails(deploymentDetails.id); + tl.debug(`logs from kudu deploy: ${kuduDeploymentDetails.log_url}`); + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED || tl.getVariable('system.debug') && tl.getVariable('system.debug').toLowerCase() == 'true') { + await this._printZipDeployLogs(kuduDeploymentDetails.log_url); + } + else { + console.log(tl.loc('DeployLogsURL', kuduDeploymentDetails.log_url)); + } + } + catch(error) { + tl.debug(`Unable to fetch logs for kudu Deploy: ${JSON.stringify(error)}`); + } + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED) { + throw tl.loc('PackageDeploymentUsingZipDeployFailed'); + } + } + + private async _printZipDeployLogs(log_url: string): Promise { + if(!log_url) { + return; + } + + var deploymentLogs = await this._appServiceKuduService.getDeploymentLogs(log_url); + for(var deploymentLog of deploymentLogs) { + console.log(`${deploymentLog.message}`); + + if(deploymentLog.details_url) { + await this._printZipDeployLogs(deploymentLog.details_url); + } + } + } + + private async _printPostDeploymentLogs(physicalPath: string) : Promise { + var stdoutLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stdout.txt'); + var stderrLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stderr.txt'); + var scriptReturnCode = await this._appServiceKuduService.getFileContent(physicalPath, 'script_result.txt'); + + if(scriptReturnCode == null) { + throw new Error('File not found in Kudu Service. ' + 'script_result.txt'); + } + + if(stdoutLog) { + console.log(tl.loc('stdoutFromScript')); + console.log(stdoutLog); + } + if(stderrLog) { + console.log(tl.loc('stderrFromScript')); + if(scriptReturnCode != '0') { + tl.error(stderrLog); + throw Error(tl.loc('ScriptExecutionOnKuduFailed', scriptReturnCode, stderrLog)); + } + else { + console.log(stderrLog); + } + } + } + + private async runCommand(physicalPath: string, command: string, timeOutInMinutes?: number, pollFolderPath?: string, pollFile?: string): Promise { + try { + await this._appServiceKuduService.runCommand(physicalPath, command); + } + catch(error) { + if(!!pollFolderPath && !!pollFile && timeOutInMinutes > 0 && error.toString().indexOf('Request timeout: /api/command') != -1) { + tl.debug('Request timeout occurs. Trying to poll for file: ' + pollFile); + await this._pollForFile(pollFolderPath, pollFile, timeOutInMinutes); + } + else { + if(typeof error.valueOf() == 'string') { + throw error; + } + + throw `${error.statusCode} - ${error.statusMessage}`; + } + } + } + + private _getPostDeploymentScript(scriptType, inlineScript, scriptPath, isLinux): any { + if(scriptType === 'Inline Script') { + tl.debug('creating kuduPostDeploymentScript_local file'); + var scriptFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), isLinux ? 'kuduPostDeploymentScript_local.sh' : 'kuduPostDeploymentScript_local.cmd'); + tl.writeFile(scriptFilePath, inlineScript); + tl.debug('Created temporary script file : ' + scriptFilePath); + return { + "filePath": scriptFilePath, + "isCreated": true + }; + } + if(!tl.exist(scriptPath)) { + throw Error(tl.loc('ScriptFileNotFound', scriptPath)); + } + var scriptExtension = path.extname(scriptPath); + if(isLinux){ + if(scriptExtension != '.sh'){ + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } else { + if(scriptExtension != '.bat' && scriptExtension != '.cmd') { + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } + tl.debug('postDeployment script path to execute : ' + scriptPath); + return { + filePath: scriptPath, + isCreated: false + } + } + + private async _warFileDeployment(packagePath: string, physicalPath: string, virtualPath?: string): Promise { + tl.debug('WAR: webAppPackage = ' + packagePath); + let warFile = path.basename(packagePath.slice(0, packagePath.length - '.war'.length)); + let warExt = packagePath.slice(packagePath.length - '.war'.length) + tl.debug('WAR: warFile = ' + warFile); + warFile = warFile + ((virtualPath) ? "/" + virtualPath : ""); + tl.debug('WAR: warFile = ' + warFile); + physicalPath = physicalPath + "/webapps/" + warFile; + await this.createPathIfRequired(physicalPath); + return physicalPath; + + } + + private async _appOfflineKuduService(physicalPath: string, enableFeature: boolean): Promise { + if(enableFeature) { + tl.debug('Trying to enable app offline mode.'); + var appOfflineFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), 'app_offline_temp.htm'); + tl.writeFile(appOfflineFilePath, '

App Service is offline.

'); + await this._appServiceKuduService.uploadFile(physicalPath, 'app_offline.htm', appOfflineFilePath); + tl.debug('App Offline mode enabled.'); + } + else { + tl.debug('Trying to disable app offline mode.'); + await this._appServiceKuduService.deleteFile(physicalPath, 'app_offline.htm'); + tl.debug('App Offline mode disabled.'); + } + } + + private async _pollForFile(physicalPath: string, fileName: string, timeOutInMinutes: number): Promise { + var attempts: number = 0; + const retryInterval: number = 10; + if(tl.getVariable('appservicedeploy.retrytimeout')) { + timeOutInMinutes = Number(tl.getVariable('appservicedeploy.retrytimeout')); + tl.debug('Retry timeout in minutes provided by user: ' + timeOutInMinutes); + } + + var timeOutInSeconds = timeOutInMinutes * 60; + var noOfRetry = timeOutInSeconds / retryInterval; + + tl.debug(`Polling started for file: ${fileName} with retry count: ${noOfRetry}`); + + while (attempts < noOfRetry) { + attempts += 1; + var fileContent: string = await this._appServiceKuduService.getFileContent(physicalPath, fileName); + if(fileContent == null) { + tl.debug('File: ' + fileName + ' not found. retry after 5 seconds. Attempt: ' + attempts); + await webClient.sleepFor(5); + } + else { + tl.debug('Found file: ' + fileName); + return ; + } + } + + if(attempts == noOfRetry) { + throw new Error(tl.loc('PollingForFileTimeOut')); + } + } + + private _getUpdateHistoryRequest(isDeploymentSuccess: boolean, deploymentID?: string, customMessage?: any): any { + + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + var status = isDeploymentSuccess ? KUDU_DEPLOYMENT_CONSTANTS.SUCCESS : KUDU_DEPLOYMENT_CONSTANTS.FAILED; + var releaseId = tl.getVariable('release.releaseId'); + var releaseName = tl.getVariable('release.releaseName'); + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + let buildId = '', buildNumber = '', buildProject = '', commitId = '', repoProvider = '', repoName = '', branch = '', repositoryUrl = '', author = ''; + + if (releaseId && artifactAlias) { + // Task is running in release determine build information of selected artifact using artifactAlias + author = tl.getVariable('release.requestedfor') || tl.getVariable('agent.name'); + tl.debug(`Artifact Source Alias is: ${artifactAlias}`); + + commitId = tl.getVariable(`release.artifacts.${artifactAlias}.sourceVersion`); + repoProvider = tl.getVariable(`release.artifacts.${artifactAlias}.repository.provider`); + repoName = tl.getVariable(`release.artifacts.${artifactAlias}.repository.name`); + branch = tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranchname`) || tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranch`); + + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + if (artifactType && artifactType.toLowerCase() == "tfvc") { + repositoryUrl = `${collectionUrl}${buildProject}/_versionControl`; + repoProvider = "tfsversioncontrol"; + } + else if(artifactType && artifactType.toLowerCase() == "build") { + buildId = tl.getVariable(`release.artifacts.${artifactAlias}.buildId`); + buildNumber = tl.getVariable(`release.artifacts.${artifactAlias}.buildNumber`); + buildProject = tl.getVariable(`release.artifacts.${artifactAlias}.projectId`); + } + else { + repositoryUrl = tl.getVariable(`release.artifacts.${artifactAlias}.repository.uri`); + } + } + else { + // Task is running in build OR artifact alias not found so use primary artifact variables + author = tl.getVariable('build.requestedfor') || tl.getVariable('agent.name'); + + buildId = tl.getVariable('build.buildId'); + buildNumber = tl.getVariable('build.buildNumber'); + buildProject = teamProject; + + commitId = tl.getVariable('build.sourceVersion'); + repoName = tl.getVariable('build.repository.name'); + repoProvider = tl.getVariable('build.repository.provider'); + repositoryUrl = tl.getVariable("build.repository.uri") || ""; + branch = tl.getVariable("build.sourcebranchname") || tl.getVariable("build.sourcebranch"); + } + + deploymentID = !!deploymentID ? deploymentID : this.getDeploymentID(); + + var message = { + type : "deployment", + commitId : commitId, + buildId : buildId, + releaseId : releaseId, + buildNumber : buildNumber, + releaseName : releaseName, + repoProvider : repoProvider, + repoName : repoName, + collectionUrl : collectionUrl, + teamProject : teamProject, + buildProjectUrl: buildProject ? collectionUrl + buildProject : "", + repositoryUrl: repositoryUrl, + branch: branch, + teamProjectName: tl.getVariable("system.teamproject") + }; + + if(!!customMessage) { + // Append Custom Messages to original message + for(var attribute in customMessage) { + message[attribute] = customMessage[attribute]; + } + + } + var deploymentLogType: string = message['type']; + var active: boolean = false; + if(deploymentLogType.toLowerCase() === "deployment" && isDeploymentSuccess) { + active = true; + } + + return { + id: deploymentID, + active : active, + status : status, + message : JSON.stringify(message), + author : author, + deployer : 'VSTS' + }; + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts new file mode 100644 index 000000000000..147ab48de5e3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/PublishProfileUtility.ts @@ -0,0 +1,123 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import fs = require('fs'); +import * as Constant from './Constants'; +import path = require('path'); +import Q = require('q'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var parseString = require('xml2js').parseString; +const ERROR_FILE_NAME = "error.txt"; + +export interface PublishingProfile{ + PublishUrl:string; + UserName: string; + UserPWD: string; + WebAppName: string; + TakeAppOfflineFlag: boolean; + RemoveAdditionalFilesFlag: boolean; +} + +export class PublishProfileUtility { + + private _publishProfileJs: any = null; + private _publishProfilePath: string; + + constructor(publishProfilePath: string) { + this._publishProfilePath = publishProfilePath; + } + + public async GetTaskParametersFromPublishProfileFile(taskParams: TaskParameters): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + var msDeployPublishingProfile: PublishingProfile = { + WebAppName: this._publishProfileJs.DeployIisAppPath[0], + TakeAppOfflineFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.EnableMSDeployAppOffline) ? + this._publishProfileJs.EnableMSDeployAppOffline[0] : false, + RemoveAdditionalFilesFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.SkipExtraFilesOnServer) ? + this._publishProfileJs.SkipExtraFilesOnServer[0] : false, + PublishUrl: this._publishProfileJs.MSDeployServiceURL[0], + UserName: this._publishProfileJs.UserName[0], + UserPWD: taskParams.PublishProfilePassword + } + return msDeployPublishingProfile; + } + + public async GetPropertyValuefromPublishProfile(propertyKey: string): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + return new Promise ((response, reject) => { + this._publishProfileJs.hasOwnProperty(propertyKey) ? + response(this._publishProfileJs[propertyKey][0]) : reject(tl.loc('PropertyDoesntExistPublishProfile', propertyKey)); + }); + } + + private async GetPublishProfileJsonFromFile(): Promise { + return new Promise((response, reject) => { + var pubxmlFile = packageUtility.PackageUtility.getPackagePath(this._publishProfilePath); + var publishProfileXML = fs.readFileSync(pubxmlFile); + parseString(publishProfileXML, (error, result) => { + if(!!error) { + reject(tl.loc('XmlParsingFailed', error)); + } + var propertyGroup = result && result.Project && result.Project.PropertyGroup ? result.Project.PropertyGroup : null; + if(propertyGroup) { + for (var index in propertyGroup) { + if (propertyGroup[index] && propertyGroup[index].WebPublishMethod[0] === Constant.PublishProfileXml.MSDeploy) { + if(!propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.MSDeployServiceURL) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.DeployIisAppPath) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.UserName)) { + reject(tl.loc('InvalidPublishProfile')); + } + tl.debug("Publish Profile: " + JSON.stringify(propertyGroup[index])); + response(propertyGroup[index]); + } + } + } + reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + }); + } + + public async RunCmd(cmdTool: string, cmdArgs: string) { + var deferred = Q.defer(); + var cmdError = null; + var errorFile = path.join(tl.getVariable('System.DefaultWorkingDirectory'), ERROR_FILE_NAME); + var errObj = fs.createWriteStream(errorFile); + errObj.on('finish', () => { + if(cmdError) { + deferred.reject(cmdError); + } else { + deferred.resolve(); + } + }); + + try { + await tl.exec(cmdTool, cmdArgs, { + errStream: errObj, + outStream: process.stdout, + failOnStdErr: true, + windowsVerbatimArguments: true, + // shell should be true, otherwise see https://github.com/microsoft/azure-pipelines-tasks/issues/17634 + // workaround https://github.com/nodejs/node/issues/7367#issuecomment-229728704 + shell: true + }); + } catch (error) { + cmdError = error; + } finally { + errObj.end(); + } + + return deferred.promise; + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts new file mode 100644 index 000000000000..1ed0aef6bcaf --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/ReleaseAnnotationUtility.ts @@ -0,0 +1,93 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { AzureApplicationInsights, ApplicationInsightsResources} from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-appinsights'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +var uuidV4 = require("uuid/v4"); + +export async function addReleaseAnnotation(endpoint: AzureEndpoint, azureAppService: AzureAppService, isDeploymentSuccess: boolean): Promise { + try { + var appSettings = await azureAppService.getApplicationSettings(); + var instrumentationKey = appSettings && appSettings.properties && appSettings.properties.APPINSIGHTS_INSTRUMENTATIONKEY; + if(instrumentationKey) { + let appinsightsResources: ApplicationInsightsResources = new ApplicationInsightsResources(endpoint); + var appInsightsResources = await appinsightsResources.list(null, [`$filter=InstrumentationKey eq '${instrumentationKey}'`]); + if(appInsightsResources.length > 0) { + var appInsights: AzureApplicationInsights = new AzureApplicationInsights(endpoint, appInsightsResources[0].id.split('/')[4], appInsightsResources[0].name); + var releaseAnnotationData = getReleaseAnnotation(isDeploymentSuccess); + await appInsights.addReleaseAnnotation(releaseAnnotationData); + console.log(tl.loc("SuccessfullyAddedReleaseAnnotation", appInsightsResources[0].name)); + } + else { + tl.debug(`Unable to find Application Insights resource with Instrumentation key ${instrumentationKey}. Skipping adding release annotation.`); + } + } + else { + tl.debug(`Application Insights is not configured for the App Service. Skipping adding release annotation.`); + } + } + catch(error) { + console.log(tl.loc("FailedAddingReleaseAnnotation", error)); + } +} + +function getReleaseAnnotation(isDeploymentSuccess: boolean): {[key: string]: any} { + let annotationName = "Release Annotation"; + let releaseUri = tl.getVariable("Release.ReleaseUri"); + let buildUri = tl.getVariable("Build.BuildUri"); + + if (!!releaseUri) { + annotationName = `${tl.getVariable("Release.DefinitionName")} - ${tl.getVariable("Release.ReleaseName")}`; + } + else if (!!buildUri) { + annotationName = `${tl.getVariable("Build.DefinitionName")} - ${tl.getVariable("Build.BuildNumber")}`; + } + + let releaseAnnotationProperties = { + "Label": isDeploymentSuccess ? "Success" : "Error", // Label decides the icon for release annotation + "Deployment Uri": getDeploymentUri(), + "BuildNumber": getPipelineVariable("Build.BuildNumber"), + "BuildRepositoryName": getPipelineVariable("Build.Repository.Name"), + "BuildRepositoryProvider": getPipelineVariable("Build.Repository.Provider"), + "SourceBranch": getPipelineVariable("Build.SourceBranch"), + "ReleaseId": getPipelineVariable("Release.ReleaseId"), + "ReleaseDescription": getPipelineVariable("Release.ReleaseDescription"), + "ReleaseDefinitionName": getPipelineVariable("Release.DefinitionName"), + "ReleaseEnvironmentName": getPipelineVariable("Release.EnvironmentName"), + "ReleaseRequestedFor": getPipelineVariable("Release.RequestedForId") || getPipelineVariable("Release.RequestedFor") + }; + + let releaseAnnotation = { + "AnnotationName": annotationName, + "Category": "Deployment", + "EventTime": new Date(), + "Id": uuidV4(), + "Properties": JSON.stringify(releaseAnnotationProperties) + }; + + return releaseAnnotation; +} + +function getDeploymentUri(): string { + let buildUri = tl.getVariable("Build.BuildUri"); + let releaseWebUrl = tl.getVariable("Release.ReleaseWebUrl"); + let collectionUrl = tl.getVariable('System.TeamFoundationCollectionUri'); + let teamProject = tl.getVariable('System.TeamProjectId'); + let buildId = tl.getVariable('build.buildId'); + + if (!!releaseWebUrl) { + return releaseWebUrl; + } + + if (!!buildUri) { + return `${collectionUrl}${teamProject}/_build?buildId=${buildId}&_a=summary`; + } + + return ""; +} + +function getPipelineVariable(variableName: string): string | undefined { + let variable = tl.getVariable(variableName); + //we dont want to set a variable to be empty string + return !!variable ? variable : undefined; +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts b/_generated/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts new file mode 100644 index 000000000000..a0efa0c2f176 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/TaskParameters.ts @@ -0,0 +1,313 @@ +import tl = require('azure-pipelines-task-lib/task'); +import * as Constant from '../operations/Constants' +import { Package, PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export enum DeploymentType { + webDeploy, + zipDeploy, + runFromZip, + warDeploy +} + +export enum DeploymentTypeLinux { + oneDeploy, + zipDeploy +} + +type AdditionalArgumentsTelemetry = { + deploymentMethod: DeploymentType; + doubleQuoteCount: number; + singleQuoteCount: number; + escapeCharCount: number; + spaceCharCount: number; + totalArgs: number; +} +export class TaskParametersUtility { + public static getParameters(): TaskParameters { + var taskParameters: TaskParameters = { + ConnectionType: tl.getInput('ConnectionType', true), + WebAppKind: tl.getInput('WebAppKind', false), + DeployToSlotOrASEFlag: tl.getBoolInput('DeployToSlotOrASEFlag', false), + GenerateWebConfig: tl.getBoolInput('GenerateWebConfig', false), + WebConfigParameters: tl.getInput('WebConfigParameters', false), + XmlTransformation: tl.getBoolInput('XmlTransformation', false), + JSONFiles: tl.getDelimitedInput('JSONFiles', '\n', false), + XmlVariableSubstitution: tl.getBoolInput('XmlVariableSubstitution', false), + TakeAppOfflineFlag: tl.getBoolInput('TakeAppOfflineFlag', false), + RenameFilesFlag: tl.getBoolInput('RenameFilesFlag', false), + AdditionalArguments: tl.getInput('AdditionalArguments', false), + ScriptType: tl.getInput('ScriptType', false), + InlineScript: tl.getInput('InlineScript', false), + ScriptPath : tl.getPathInput('ScriptPath', false), + DockerNamespace: tl.getInput('DockerNamespace', false), + AppSettings: tl.getInput('AppSettings', false), + StartupCommand: tl.getInput('StartupCommand', false), + ConfigurationSettings: tl.getInput('ConfigurationSettings', false) + } + + if(taskParameters.ConnectionType === Constant.ConnectionType.PublishProfile) { + this._initializeDefaultParametersForPublishProfile(taskParameters); + return taskParameters; + } + + taskParameters.connectedServiceName = tl.getInput('ConnectedServiceName', true); + taskParameters.WebAppName = tl.getInput('WebAppName', true); + taskParameters.isFunctionApp = taskParameters.WebAppKind.indexOf("function") != -1; + taskParameters.isLinuxApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.indexOf("Linux") !=-1 || taskParameters.WebAppKind.indexOf("Container") != -1); + taskParameters.isHyperVContainerApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.toLowerCase().indexOf("hyperv") !=-1 && taskParameters.WebAppKind.toLowerCase().indexOf("container") != -1); + taskParameters.isBuiltinLinuxWebApp = taskParameters.WebAppKind.indexOf('Linux') != -1; + taskParameters.isContainerWebApp =taskParameters.WebAppKind.indexOf('Container') != -1; + taskParameters.ResourceGroupName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('ResourceGroupName', false) : null; + taskParameters.SlotName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('SlotName', false) : null; + + var endpointTelemetry = '{"endpointId":"' + taskParameters.connectedServiceName + '"}'; + console.log("##vso[telemetry.publish area=TaskEndpointId;feature=AzureRmWebAppDeployment]" + endpointTelemetry); + + if(!taskParameters.isContainerWebApp){ + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + tl.debug("intially web config parameters :" + taskParameters.WebConfigParameters); + if(taskParameters.Package.getPackageType() === PackageType.jar && (!taskParameters.isLinuxApp)) { + if(!taskParameters.WebConfigParameters) { + taskParameters.WebConfigParameters = "-appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-appType java_springboot") < 0) { + taskParameters.WebConfigParameters += " -appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH D:\\home\\site\\wwwroot\\*.jar") >= 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("D:\\home\\site\\wwwroot\\*.jar", jarPath); + } else if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH ") < 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters += " -JAR_PATH " + jarPath; + } + if(taskParameters.WebConfigParameters.indexOf("-Dserver.port=%HTTP_PLATFORM_PORT%") > 0) { + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("-Dserver.port=%HTTP_PLATFORM_PORT%", ""); + } + tl.debug("web config parameters :" + taskParameters.WebConfigParameters); + } + } + + taskParameters.UseWebDeploy = !taskParameters.isLinuxApp ? tl.getBoolInput('UseWebDeploy', false) : false; + + if(taskParameters.isLinuxApp && taskParameters.isBuiltinLinuxWebApp) { + if(taskParameters.isFunctionApp) { + taskParameters.RuntimeStack = tl.getInput('RuntimeStackFunction', false); + } + else { + taskParameters.RuntimeStack = tl.getInput('RuntimeStack', false); + } + taskParameters.TakeAppOfflineFlag = false; + } + if (!taskParameters.isFunctionApp && !taskParameters.isLinuxApp) { + taskParameters.VirtualApplication = tl.getInput('VirtualApplication', false); + taskParameters.VirtualApplication = taskParameters.VirtualApplication && taskParameters.VirtualApplication.startsWith('/') + ? taskParameters.VirtualApplication.substr(1) : taskParameters.VirtualApplication; + } + + if(taskParameters.UseWebDeploy) { + taskParameters.DeploymentType = this.getDeploymentType(tl.getInput('DeploymentType', false)); + if(taskParameters.DeploymentType == DeploymentType.webDeploy) { + taskParameters.RemoveAdditionalFilesFlag = tl.getBoolInput('RemoveAdditionalFilesFlag', false); + taskParameters.SetParametersFile = tl.getPathInput('SetParametersFile', false); + taskParameters.ExcludeFilesFromAppDataFlag = tl.getBoolInput('ExcludeFilesFromAppDataFlag', false) + taskParameters.AdditionalArguments = tl.getInput('AdditionalArguments', false) || ''; + } + } + else if(taskParameters.isLinuxApp) { + taskParameters.DeploymentTypeLinux = this.getDeploymentTypeLinux(tl.getInput('DeploymentTypeLinux', false)); + taskParameters.CleanDeploymentFlag = tl.getBoolInput('CleanDeploymentFlag', false); + } + else { + // Retry Attempt is passed by default + taskParameters.AdditionalArguments = '-retryAttempts:6 -retryInterval:10000'; + } + if (taskParameters.DeploymentType === DeploymentType.runFromZip) { + taskParameters.TakeAppOfflineFlag = false; + } + + if(taskParameters.isLinuxApp && taskParameters.ScriptType) { + this.UpdateLinuxAppTypeScriptParameters(taskParameters); + } + + try { + var additionalArgsTelemetry = this._getAdditionalArgumentsTelemetry(taskParameters.AdditionalArguments, taskParameters.DeploymentType); + console.log("##vso[telemetry.publish area=AdditionalArgumentsVerification;feature=AzureRmWebAppDeployment]" + JSON.stringify(additionalArgsTelemetry)); + } catch (error) { + // Ignore errors in telemetry + }; + + return taskParameters; + } + + private static _initializeDefaultParametersForPublishProfile(taskParameters: TaskParameters): void { + taskParameters.PublishProfilePath = tl.getInput('PublishProfilePath', true); + taskParameters.PublishProfilePassword = tl.getInput('PublishProfilePassword', true); + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + taskParameters.AdditionalArguments = "-retryAttempts:6 -retryInterval:10000"; + } + + private static UpdateLinuxAppTypeScriptParameters(taskParameters: TaskParameters) { + let retryTimeoutValue = tl.getVariable('appservicedeploy.retrytimeout'); + let timeoutAppSettings = retryTimeoutValue ? Number(retryTimeoutValue) * 60 : 1800; + + tl.debug(`setting app setting SCM_COMMAND_IDLE_TIMEOUT to ${timeoutAppSettings}`); + if(taskParameters.AppSettings) { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings} ` + taskParameters.AppSettings; + } + else { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings}`; + } + } + + private static getDeploymentType(type): DeploymentType { + switch(type) { + case "webDeploy": return DeploymentType.webDeploy; + case "zipDeploy": return DeploymentType.zipDeploy; + case "runFromZip": return DeploymentType.runFromZip; + case "warDeploy": return DeploymentType.warDeploy; + } + } + + private static getDeploymentTypeLinux(type): DeploymentTypeLinux { + switch(type) { + case "oneDeploy": return DeploymentTypeLinux.oneDeploy; + case "zipDeploy": return DeploymentTypeLinux.zipDeploy; + } + } + + private static _getAdditionalArgumentsTelemetry(additionalArguments: string, deploymentType: DeploymentType): AdditionalArgumentsTelemetry { + const telemetry = { + deploymentMethod: deploymentType, + doubleQuoteCount: 0, + singleQuoteCount: 0, + escapeCharCount: 0, + spaceCharCount: 0, + totalArgs: 0 + } + + if (!additionalArguments) return telemetry; + + const parsedArgs = this.parseAdditionalArguments(additionalArguments); + const escapedChars = new RegExp(/[\\\^\.\*\?\-\&\|\(\)\<\>\t\n\r\f]/); + const separator = ","; + + parsedArgs.forEach(function (arg) { + let formattedArg = ''; + let equalsSignEncountered = false; + for (let i = 0; i < arg.length; i++) { + const char = arg.charAt(i); + if (char == separator && equalsSignEncountered) { + equalsSignEncountered = false; + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + telemetry.totalArgs++; + formattedArg = ''; + continue; + } + if (equalsSignEncountered) { + formattedArg += char; + } + if (char == '=') { + equalsSignEncountered = true; + } + }; + + if (formattedArg.length > 0) { + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + + telemetry.totalArgs++;; + } + }); + + return telemetry; + } + + /** + * Parses additional arguments for the msdeploy command-line utility. + * @param {string} additionalArguments - The additional arguments to parse. + * @returns {string[]} An array of parsed arguments. + */ + private static parseAdditionalArguments(additionalArguments: string): string[] { + var parsedArgs = []; + var isInsideQuotes = false; + for (let i = 0; i < additionalArguments.length; i++) { + var arg = ''; + var qouteSymbol = ''; + let char = additionalArguments.charAt(i); + // command parse start + if (char === '-') { + while (i < additionalArguments.length) { + char = additionalArguments.charAt(i); + const prevSym = additionalArguments.charAt(i - 1); + // If we reach space and we are not inside quotes, then it is the end of the argument + if (char === ' ' && !isInsideQuotes) break; + // If we reach unescaped comma and we inside qoutes we assume that it is the end of quoted line + if (isInsideQuotes && char === qouteSymbol && prevSym !== '\\') { + isInsideQuotes = false; + qouteSymbol = ''; + // If we reach unescaped comma and we are not inside qoutes we assume that it is the beggining of quoted line + } else if (!isInsideQuotes && (char === '"' || char === "'") && prevSym !== '\\') { + isInsideQuotes = !isInsideQuotes; + qouteSymbol = char; + } + + arg += char; + i += 1; + } + parsedArgs.push(arg); + } + } + return parsedArgs; + } +} + +export interface TaskParameters { + ConnectionType: string; + connectedServiceName?: string; + PublishProfilePath?: string; + PublishProfilePassword?: string; + WebAppName?: string; + WebAppKind?: string; + DeployToSlotOrASEFlag?: boolean; + ResourceGroupName?: string; + SlotName?: string; + VirtualApplication?: string; + Package?: Package; + GenerateWebConfig?: boolean; + WebConfigParameters?: string; + XmlTransformation?: boolean; + JSONFiles?: string[]; + XmlVariableSubstitution?: boolean; + UseWebDeploy?: boolean; + DeploymentType?: DeploymentType; + DeploymentTypeLinux?: DeploymentTypeLinux; + CleanDeploymentFlag?: boolean; + RemoveAdditionalFilesFlag?: boolean; + SetParametersFile?: string; + ExcludeFilesFromAppDataFlag?: boolean; + TakeAppOfflineFlag?: boolean; + RenameFilesFlag?: boolean; + AdditionalArguments?: string; + ScriptType?: string; + InlineScript?: string; + ScriptPath ?: string; + DockerNamespace?: string; + AppSettings?: string; + StartupCommand?: string; + RuntimeStack?: string; + ConfigurationSettings?: string; + /** Additional parameters */ + isLinuxApp?: boolean; + isHyperVContainerApp?: boolean; + isBuiltinLinuxWebApp?: boolean; + isContainerWebApp?: boolean; + isFunctionApp?: boolean; +} diff --git a/_generated/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts b/_generated/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts new file mode 100644 index 000000000000..00dcbff4683c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/operations/WebDeployUtility.ts @@ -0,0 +1,135 @@ +import tl = require('azure-pipelines-task-lib/task'); + +import { WebDeployArguments, WebDeployResult, shouldUseMSDeployTokenAuth, installedMSDeployVersionSupportsTokenAuth } from 'azure-pipelines-tasks-webdeployment-common/msdeployutility'; +import { executeWebDeploy } from 'azure-pipelines-tasks-webdeployment-common/deployusingmsdeploy'; +import { copySetParamFileIfItExists } from 'azure-pipelines-tasks-webdeployment-common/utility'; + +import { TaskParameters } from './TaskParameters'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +const DEFAULT_RETRY_COUNT = 3; + +export class WebDeployUtility { + + private readonly _azureAppServiceUtility: AzureAppServiceUtility; + + constructor(azureAppServiceUtility: AzureAppServiceUtility) { + this._azureAppServiceUtility = azureAppServiceUtility; + } + + public async publishUsingWebDeploy(taskParameters: TaskParameters) { + const webDeployArguments = await this.constructWebDeployArguments(taskParameters); + const retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + let retryCount = (retryCountParam && !isNaN(Number(retryCountParam))) ? Number(retryCountParam) : DEFAULT_RETRY_COUNT; + let webDeployResult: WebDeployResult; + + while (retryCount > 0) { + webDeployResult = await executeWebDeploy(webDeployArguments); + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, false); + } + else { + break; + } + + retryCount--; + } + + if (webDeployArguments.setParametersFile) { + try { + tl.rmRF(webDeployArguments.setParametersFile); + } + catch(error) { + tl.debug('unable to delete setparams file: '); + tl.debug(error); + } + } + + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, true); + throw new Error(webDeployResult.error); + } + } + + private async constructWebDeployArguments(taskParameters: TaskParameters): Promise { + const publishProfile = await this._azureAppServiceUtility.getWebDeployPublishingProfile(); + const webDeployArguments = {} as WebDeployArguments; + + if (await this._azureAppServiceUtility.isSitePublishingCredentialsEnabled()) { + tl.debug("Using Basic authentication."); + webDeployArguments.authType = "Basic"; + webDeployArguments.userName = publishProfile.userName; + webDeployArguments.password = publishProfile.userPWD; + } + else if (!shouldUseMSDeployTokenAuth()) { + throw new Error(tl.loc("BasicAuthNotSupported")); + } + else if (await installedMSDeployVersionSupportsTokenAuth() === false) { + throw new Error(tl.loc("MSDeployNotSupportTokenAuth")); + } + else { + tl.debug("Basic authentication is disabled, using token based authentication."); + webDeployArguments.authType = "Bearer"; + webDeployArguments.password = await this._azureAppServiceUtility.getAuthToken(); + webDeployArguments.userName = "user"; // arbitrary but not empty + } + + webDeployArguments.publishUrl = publishProfile.publishUrl; + webDeployArguments.package = taskParameters.Package; + webDeployArguments.additionalArguments = taskParameters.AdditionalArguments; + webDeployArguments.appName = taskParameters.WebAppName; + webDeployArguments.excludeFilesFromAppDataFlag = taskParameters.ExcludeFilesFromAppDataFlag; + webDeployArguments.removeAdditionalFilesFlag = taskParameters.RemoveAdditionalFilesFlag; + webDeployArguments.takeAppOfflineFlag = taskParameters.TakeAppOfflineFlag; + webDeployArguments.useWebDeploy = taskParameters.UseWebDeploy; + webDeployArguments.virtualApplication = taskParameters.VirtualApplication; + + const setParametersFile = copySetParamFileIfItExists(taskParameters.SetParametersFile); + if (setParametersFile) { + webDeployArguments.setParametersFile = setParametersFile.slice(setParametersFile.lastIndexOf('\\') + 1, setParametersFile.length); + } + + return webDeployArguments; + } + + private async webDeployRecommendationForIssue(taskParameters: TaskParameters, errorCode: string, isRecommendation: boolean) { + switch(errorCode) { + case 'ERROR_CONNECTION_TERMINATED': { + if(!isRecommendation) { + await this._azureAppServiceUtility.pingApplication(); + } + break; + } + case 'ERROR_INSUFFICIENT_ACCESS_TO_SITE_FOLDER': { + tl.warning(tl.loc("Trytodeploywebappagainwithappofflineoptionselected")); + break; + } + case 'WebJobsInProgressIssue': { + tl.warning(tl.loc('WebJobsInProgressIssue')); + break; + } + case 'FILE_IN_USE': { + if(!isRecommendation && taskParameters.RenameFilesFlag) { + await this._azureAppServiceUtility.enableRenameLockedFiles(); + } + else { + tl.warning(tl.loc("Trytodeploywebappagainwithrenamefileoptionselected")); + tl.warning(tl.loc("RunFromZipPreventsFileInUseError")); + } + break; + } + case 'transport connection': { + tl.warning(tl.loc("Updatemachinetoenablesecuretlsprotocol")); + break; + } + case 'ERROR_CERTIFICATE_VALIDATION_FAILED': { + if(isRecommendation) { + tl.warning(tl.loc('ASE_WebDeploySSLIssueRecommendation')); + } + break; + } + default: + break; + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/package-lock.json b/_generated/AzureRmWebAppDeploymentV5/package-lock.json new file mode 100644 index 000000000000..796c15e3892a --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/package-lock.json @@ -0,0 +1,1096 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "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/events": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/events/-/events-3.0.3.tgz", + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==" + }, + "@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/ltx": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/ltx/-/ltx-3.0.6.tgz", + "integrity": "sha512-ZdHUgFEaBVUHI0si050pQkuGzHQC5UU46JsljUUJkGWbsjKeV3RUspJvvdV80Inrnhx8d3JqXw4qCDRX4A/BdA==", + "requires": { + "@types/events": "*" + } + }, + "@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/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/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "@xmldom/xmldom": { + "version": "git+https://github.com/xmldom/xmldom.git#238b1ea8431fae8817812c68d55b4933248af07e", + "from": "git+https://github.com/xmldom/xmldom.git#0.8.6" + }, + "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" + } + }, + "archiver": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha512-5GQRAgpHGPwWIiMzL9lthd+t75fLi8BpRBYtflomSYv2i6+EO9trtwWAm2+zGjIuwKmVmBRknAZFFBSqxYxiJw==", + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "async": { + "version": "2.6.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "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" + } + }, + "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" + } + }, + "azure-pipelines-task-lib": { + "version": "4.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.11.0.tgz", + "integrity": "sha512-svPdgXPmX9j5aLcb+ZmddBsKlkK5TJnlFfgPrDlY8EZAmnR9jLOYiHLLyLph3UO6hoHucsiqvIpH1SBFfH1I8w==", + "requires": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "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" + }, + "dependencies": { + "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==" + } + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.251.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.251.0.tgz", + "integrity": "sha1-9989r2zWGXLLREIAQHuYci00+EM=", + "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=" + }, + "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=" + }, + "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" + } + }, + "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": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } + } + }, + "azure-pipelines-tasks-webdeployment-common": { + "version": "4.243.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-webdeployment-common/-/azure-pipelines-tasks-webdeployment-common-4.243.1.tgz", + "integrity": "sha512-FWjNQDguvLmqfKgCYxcevgvid5RJdv3FrqyrAmMfIe0gLOpyp57yjQ6QCaO5GFc3niWV/MgIxadqlnwrq2haUQ==", + "requires": { + "@types/ltx": "3.0.6", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@xmldom/xmldom": "git+https://github.com/xmldom/xmldom.git#0.8.6", + "archiver": "1.2.0", + "azure-pipelines-task-lib": "^4.2.0", + "ltx": "2.8.0", + "node-stream-zip": "^1.15.0", + "q": "1.4.1", + "semver": "^7.5.4", + "winreg": "1.2.2", + "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": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "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": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "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==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "brace-expansion": { + "version": "1.1.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": { + "version": "5.7.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "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-fill": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha1-MuWJLmNhspsLVFum93YzeNrKKEA=", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha1-Qc/QMrWT45F2pxUzq084SqBP1oE=", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "deasync": { + "version": "0.1.30", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/deasync/-/deasync-0.1.30.tgz", + "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", + "requires": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + } + }, + "debug": { + "version": "4.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "requires": { + "ms": "2.1.2" + } + }, + "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" + } + }, + "dunder-proto": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha1-wvzgmLPI+ImVVJBfQ3e22F2rqoA=", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.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" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=" + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha1-3bVc1HrC4kBwEmC8Ko4x7LZD2UE=", + "requires": { + "es-errors": "^1.3.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha1-Q9090Oe0m4Ky38rRDcgkv3/CZdU=", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + } + }, + "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" + } + } + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "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" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.14.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "requires": { + "hasown": "^2.0.2" + } + }, + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "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=" + }, + "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" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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=" + }, + "ltx": { + "version": "2.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-SJJUrmDgXP0gkUzgErfkaeD+pugM8GYxerTALQa1gTUb5W1wrC4k07GZU+QNZd7MpFqJSYWXTQSUy8Ps03hx5Q==", + "requires": { + "inherits": "^2.0.1" + } + }, + "math-intrinsics": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha1-TgS/h8hapR6Q0HjawiUrTrUmCBc=" + }, + "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" + } + }, + "moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, + "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==" + }, + "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" + }, + "dependencies": { + "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=" + } + } + }, + "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=" + }, + "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-addon-api": { + "version": "1.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "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-stream-zip": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" + }, + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.13.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha1-8UwYPeURMCQ9bRiuFJN1/1DqSIo=" + }, + "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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "qs": { + "version": "6.13.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.13.1.tgz", + "integrity": "sha1-POX8cr06gXG4XJm5PGXdILfRsW4=", + "requires": { + "side-channel": "^1.0.6" + } + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "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": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "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": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "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==" + }, + "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.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha1-w/z/nE2pMnhIczNeyXZfqU/2a8k=", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha1-EMtZhCYxFdO3oOM2WR4pCoMK+K0=", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "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" + }, + "dependencies": { + "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==" + } + } + }, + "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==" + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "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": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=" + }, + "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" + } + }, + "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.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha1-lw4zljr5p92iKPF+voOZ5fvmOhA=" + }, + "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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "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" + } + }, + "winreg": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/winreg/-/winreg-1.2.2.tgz", + "integrity": "sha512-I1mQ2HDZbOXm3XctfGPNzm9p/md7FAxHtACVFeBNrnOE4p4b3a0baqNObx1OqHE8DEx25l5CaCDipxFM5FSYOg==" + }, + "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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "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": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + } + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/package.json b/_generated/AzureRmWebAppDeploymentV5/package.json new file mode 100644 index 000000000000..d6b02956a212 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/package.json @@ -0,0 +1,35 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "AzureRmWebAppDeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "16.18.39", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd new file mode 100644 index 000000000000..fa7c06b0765f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.cmd @@ -0,0 +1,24 @@ +@echo off + +DEL "mainCmdFile.cmd" + +DEL "kuduPostDeploymentScript.cmd" + +:: Do not delete file if the execution is not completed within time range +:: This can help in retrieving the logs and script result + +if exist "script_result.txt" ( + + echo remove log files + + DEL "stdout.txt" + + DEL "stderr.txt" + + DEL "script_result.txt" +) + +:: Delete the file after execution +echo remove delete_log_file + +DEL "%~f0" >nul 2>&1 diff --git a/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh new file mode 100644 index 000000000000..71eec07fc33d --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/deleteLogFile.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +rm "mainCmdFile.sh" + +rm "kuduPostDeploymentScript.sh" + +# Do not delete file if the execution is not completed within time range +# This can help in retrieving the logs and script result + +if [ -f "script_result.txt" ] +then + echo "Removing log files." + rm "stdout.txt" + rm "stderr.txt" + rm "script_result.txt" +else + echo "Execution is not over." +fi + +# Delete the file after execution +echo "Removing the delete_log_file.sh file." + +rm "delete_log_file.sh" diff --git a/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd new file mode 100644 index 000000000000..b4ede19c9c1c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.cmd @@ -0,0 +1,9 @@ +@echo off + +:: Send stdout and stderr to seperate file +call cmd /c "%Home%\\site\\VSTS_PostDeployment_%1\\kuduPostDeploymentScript.cmd" > "%Home%\\site\\VSTS_PostDeployment_%1\\stdout.txt" 2> "%Home%\\site\\VSTS_PostDeployment_%1\\stderr.txt" + +:: write return code of previous command to script_result file +:: only return code (Numeric code) should present inside script_result + +echo %errorlevel% > "%Home%\\site\\VSTS_PostDeployment_%1\\script_result.txt" \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh new file mode 100644 index 000000000000..6501857c8b43 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/postDeploymentScript/mainCmdFile.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# Send stdout and stderr to seperate file +sh "$HOME/site/VSTS_PostDeployment_$1/kuduPostDeploymentScript.sh" 2> "$HOME/site/VSTS_PostDeployment_$1/stderr.txt" 1> "$HOME/site/VSTS_PostDeployment_$1/stdout.txt" +echo "$?" > "$HOME/site/VSTS_PostDeployment_$1/script_result.txt" diff --git a/_generated/AzureRmWebAppDeploymentV5/task.json b/_generated/AzureRmWebAppDeploymentV5/task.json new file mode 100644 index 000000000000..b541924ae2e0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/task.json @@ -0,0 +1,697 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "Azure App Service deploy", + "description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 0 + }, + "releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "File Transforms & Variable Substitution Options", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "Post Deployment Action", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "Application and Configuration Settings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "Connection type", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile)." + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "defaultValue": "", + "required": true, + "helpMarkDown": "Select the Azure Resource Manager subscription for the deployment.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "Publish profile path", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "Path of the Publish profile created from Visual Studio", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "Publish profile password", + "required": true, + "helpMarkDown": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "App Service type", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "App Service name", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "Deploy to Slot or App Service Environment", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "Resource group", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "Slot", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select an existing Slot other than the Production slot.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "Registry or Namespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerRepository", + "type": "string", + "label": "Image", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "Virtual application", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root." + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "Package or folder", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war." + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Select the framework and version.", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "Startup command ", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "Deployment script type", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471)." + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "Inline Script", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "Deployment script path", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "App settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "Configuration settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "Select deployment method", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app." + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "Choose the deployment method for the app.", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "Take App Offline", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully." + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "SetParameters file", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Optional: location of the SetParameters.xml file to use." + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "Remove additional files at destination", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. " + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "Exclude files from the App_Data folder", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service." + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "Additional arguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471)." + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "Rename locked files", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "XML transformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform." + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "XML variable substitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "JSON variable substitution", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution." + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "Choose the deployment method for the app." + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "Enable clean deployment", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "Deployment mode for complete sync (clean) deployment" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "SetParamFilenotfound0": "Set parameters file not found: %s", + "XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "Runningcommand": "Running command: %s", + "Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "Configfiledoesntexists": "Configuration file %s doesn't exist.", + "Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "AppOfflineModeenabled": "App offline mode enabled.", + "Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "AppOflineModedisabled": "App offline mode disabled.", + "FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "Physicalpathalreadyexists": "Physical path '%s' already exists", + "KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "ScriptFileNotFound": "Script file '%s' not found.", + "InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "stdoutFromScript": "Standard output from script: ", + "stderrFromScript": "Standard error from script: ", + "WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "InvalidPollOption": "Invalid polling option provided: %s.", + "MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "UnableToReadResponseBody": "Unable to read response body. Error: %s", + "UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "RetryToDeploy": "Retrying to deploy the package.", + "FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "GoExeNameNotPresent": "Go exe name is not present", + "WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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", + "XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "InvalidConnectionType": "Invalid service connection type", + "InvalidImageSourceType": "Invalid Image source Type", + "InvalidPublishProfile": "Publish profile file is invalid.", + "ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "DeployLogsURL": "Deploy logs can be viewed at %s", + "AppServiceApplicationURL": "App Service Application URL: %s", + "ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "JarPathNotPresent": "Java jar path is not present", + "FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy .", + "RunFromPackageAppsetting": "NOTE: Run From Package makes wwwroot read-only, so you will receive an error when writing files to this directory." + }, + "_buildConfigMapping": { + "Default": "5.251.0", + "Node20-225": "5.251.1" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/task.loc.json b/_generated/AzureRmWebAppDeploymentV5/task.loc.json new file mode 100644 index 000000000000..85f2d9f0cbc8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/task.loc.json @@ -0,0 +1,697 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "ms-resource:loc.group.displayName.FileTransformsAndVariableSubstitution", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptions", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptionsLinux", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "ms-resource:loc.group.displayName.PostDeploymentAction", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "ms-resource:loc.group.displayName.ApplicationAndConfigurationSettings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ConnectionType", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectionType" + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.ConnectedServiceName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.PublishProfilePath", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePath", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "ms-resource:loc.input.label.PublishProfilePassword", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePassword", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppKind", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppKind", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.DeployToSlotOrASEFlag", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.DeployToSlotOrASEFlag", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "ms-resource:loc.input.label.ResourceGroupName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.ResourceGroupName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "ms-resource:loc.input.label.SlotName", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.SlotName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "ms-resource:loc.input.label.DockerNamespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerNamespace" + }, + { + "name": "DockerRepository", + "type": "string", + "label": "ms-resource:loc.input.label.DockerRepository", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerRepository" + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "ms-resource:loc.input.label.DockerImageTag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerImageTag" + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "ms-resource:loc.input.label.VirtualApplication", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "ms-resource:loc.input.help.VirtualApplication" + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.Package", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "ms-resource:loc.input.help.Package" + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStack", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStackFunction", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStackFunction", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "ms-resource:loc.input.label.StartupCommand", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.StartupCommand" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ScriptType", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "ms-resource:loc.input.help.ScriptType" + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "ms-resource:loc.input.label.InlineScript", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "ms-resource:loc.input.label.ScriptPath", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "ms-resource:loc.input.label.WebConfigParameters", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.WebConfigParameters", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AppSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.AppSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.ConfigurationSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.ConfigurationSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.UseWebDeploy", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.UseWebDeploy" + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentType", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentType", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.TakeAppOfflineFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "ms-resource:loc.input.help.TakeAppOfflineFlag" + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.SetParametersFile", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.SetParametersFile" + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveAdditionalFilesFlag", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.RemoveAdditionalFilesFlag" + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.ExcludeFilesFromAppDataFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.ExcludeFilesFromAppDataFlag" + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "ms-resource:loc.input.label.AdditionalArguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArguments" + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RenameFilesFlag", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.RenameFilesFlag" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlTransformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlTransformation" + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlVariableSubstitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlVariableSubstitution" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "ms-resource:loc.input.label.JSONFiles", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.JSONFiles" + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentTypeLinux", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentTypeLinux" + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanDeploymentFlag", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "ms-resource:loc.input.help.CleanDeploymentFlag" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "ms-resource:loc.messages.Invalidwebapppackageorfolderpathprovided", + "SetParamFilenotfound0": "ms-resource:loc.messages.SetParamFilenotfound0", + "XDTTransformationsappliedsuccessfully": "ms-resource:loc.messages.XDTTransformationsappliedsuccessfully", + "GotconnectiondetailsforazureRMWebApp0": "ms-resource:loc.messages.GotconnectiondetailsforazureRMWebApp0", + "ErrorNoSuchDeployingMethodExists": "ms-resource:loc.messages.ErrorNoSuchDeployingMethodExists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "ms-resource:loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp", + "UnabletoretrieveResourceID": "ms-resource:loc.messages.UnabletoretrieveResourceID", + "Successfullyupdateddeploymenthistory": "ms-resource:loc.messages.Successfullyupdateddeploymenthistory", + "Failedtoupdatedeploymenthistory": "ms-resource:loc.messages.Failedtoupdatedeploymenthistory", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ms-resource:loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite", + "Unabletoretrievewebconfigdetails": "ms-resource:loc.messages.Unabletoretrievewebconfigdetails", + "Unabletoretrievewebappsettings": "ms-resource:loc.messages.Unabletoretrievewebappsettings", + "Unabletoupdatewebappsettings": "ms-resource:loc.messages.Unabletoupdatewebappsettings", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "ms-resource:loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved", + "PackageDeploymentSuccess": "ms-resource:loc.messages.PackageDeploymentSuccess", + "PackageDeploymentFailed": "ms-resource:loc.messages.PackageDeploymentFailed", + "Runningcommand": "ms-resource:loc.messages.Runningcommand", + "Deployingwebapplicationatvirtualpathandphysicalpath": "ms-resource:loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath", + "Successfullydeployedpackageusingkuduserviceat": "ms-resource:loc.messages.Successfullydeployedpackageusingkuduserviceat", + "Failedtodeploywebapppackageusingkuduservice": "ms-resource:loc.messages.Failedtodeploywebapppackageusingkuduservice", + "Unabletodeploywebappresponsecode": "ms-resource:loc.messages.Unabletodeploywebappresponsecode", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "ms-resource:loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "ms-resource:loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "ms-resource:loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError", + "Nopackagefoundwithspecifiedpattern": "ms-resource:loc.messages.Nopackagefoundwithspecifiedpattern", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "ms-resource:loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern", + "Trytodeploywebappagainwithappofflineoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithappofflineoptionselected", + "Trytodeploywebappagainwithrenamefileoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithrenamefileoptionselected", + "NOJSONfilematchedwithspecificpattern": "ms-resource:loc.messages.NOJSONfilematchedwithspecificpattern", + "Configfiledoesntexists": "ms-resource:loc.messages.Configfiledoesntexists", + "Failedtowritetoconfigfilewitherror": "ms-resource:loc.messages.Failedtowritetoconfigfilewitherror", + "AppOfflineModeenabled": "ms-resource:loc.messages.AppOfflineModeenabled", + "Failedtoenableappofflinemode": "ms-resource:loc.messages.Failedtoenableappofflinemode", + "AppOflineModedisabled": "ms-resource:loc.messages.AppOflineModedisabled", + "FailedtodisableAppOfflineMode": "ms-resource:loc.messages.FailedtodisableAppOfflineMode", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "ms-resource:loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform", + "XdtTransformationErrorWhileTransforming": "ms-resource:loc.messages.XdtTransformationErrorWhileTransforming", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "ms-resource:loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage", + "Publishusingzipdeploynotsupportedforvirtualapplication": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication", + "Publishusingzipdeploydoesnotsupportwarfile": "ms-resource:loc.messages.Publishusingzipdeploydoesnotsupportwarfile", + "Publishusingrunfromzipwithpostdeploymentscript": "ms-resource:loc.messages.Publishusingrunfromzipwithpostdeploymentscript", + "ResourceDoesntExist": "ms-resource:loc.messages.ResourceDoesntExist", + "EncodeNotSupported": "ms-resource:loc.messages.EncodeNotSupported", + "UnknownFileEncodeError": "ms-resource:loc.messages.UnknownFileEncodeError", + "ShortFileBufferError": "ms-resource:loc.messages.ShortFileBufferError", + "FailedToUpdateAzureRMWebAppConfigDetails": "ms-resource:loc.messages.FailedToUpdateAzureRMWebAppConfigDetails", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "ms-resource:loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails", + "RequestedURLforkuduphysicalpath": "ms-resource:loc.messages.RequestedURLforkuduphysicalpath", + "Physicalpathalreadyexists": "ms-resource:loc.messages.Physicalpathalreadyexists", + "KuduPhysicalpathCreatedSuccessfully": "ms-resource:loc.messages.KuduPhysicalpathCreatedSuccessfully", + "FailedtocreateKuduPhysicalPath": "ms-resource:loc.messages.FailedtocreateKuduPhysicalPath", + "FailedtocheckphysicalPath": "ms-resource:loc.messages.FailedtocheckphysicalPath", + "VirtualApplicationDoesNotExist": "ms-resource:loc.messages.VirtualApplicationDoesNotExist", + "JSONParseError": "ms-resource:loc.messages.JSONParseError", + "JSONvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.JSONvariablesubstitutionappliedsuccessfully", + "XMLvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.XMLvariablesubstitutionappliedsuccessfully", + "failedtoUploadFileToKudu": "ms-resource:loc.messages.failedtoUploadFileToKudu", + "failedtoUploadFileToKuduError": "ms-resource:loc.messages.failedtoUploadFileToKuduError", + "ExecuteScriptOnKudu": "ms-resource:loc.messages.ExecuteScriptOnKudu", + "FailedToRunScriptOnKuduError": "ms-resource:loc.messages.FailedToRunScriptOnKuduError", + "FailedToRunScriptOnKudu": "ms-resource:loc.messages.FailedToRunScriptOnKudu", + "ScriptExecutionOnKuduSuccess": "ms-resource:loc.messages.ScriptExecutionOnKuduSuccess", + "ScriptExecutionOnKuduFailed": "ms-resource:loc.messages.ScriptExecutionOnKuduFailed", + "FailedtoDeleteFileFromKudu": "ms-resource:loc.messages.FailedtoDeleteFileFromKudu", + "FailedtoDeleteFileFromKuduError": "ms-resource:loc.messages.FailedtoDeleteFileFromKuduError", + "ScriptFileNotFound": "ms-resource:loc.messages.ScriptFileNotFound", + "InvalidScriptFile": "ms-resource:loc.messages.InvalidScriptFile", + "RetryForTimeoutIssue": "ms-resource:loc.messages.RetryForTimeoutIssue", + "stdoutFromScript": "ms-resource:loc.messages.stdoutFromScript", + "stderrFromScript": "ms-resource:loc.messages.stderrFromScript", + "WebConfigAlreadyExists": "ms-resource:loc.messages.WebConfigAlreadyExists", + "SuccessfullyGeneratedWebConfig": "ms-resource:loc.messages.SuccessfullyGeneratedWebConfig", + "FailedToGenerateWebConfig": "ms-resource:loc.messages.FailedToGenerateWebConfig", + "FailedToGetKuduFileContent": "ms-resource:loc.messages.FailedToGetKuduFileContent", + "FailedToGetKuduFileContentError": "ms-resource:loc.messages.FailedToGetKuduFileContentError", + "ScriptStatusTimeout": "ms-resource:loc.messages.ScriptStatusTimeout", + "PollingForFileTimeOut": "ms-resource:loc.messages.PollingForFileTimeOut", + "InvalidPollOption": "ms-resource:loc.messages.InvalidPollOption", + "MissingAppTypeWebConfigParameters": "ms-resource:loc.messages.MissingAppTypeWebConfigParameters", + "AutoDetectDjangoSettingsFailed": "ms-resource:loc.messages.AutoDetectDjangoSettingsFailed", + "FailedToApplyTransformation": "ms-resource:loc.messages.FailedToApplyTransformation", + "FailedToApplyTransformationReason1": "ms-resource:loc.messages.FailedToApplyTransformationReason1", + "FailedToApplyTransformationReason2": "ms-resource:loc.messages.FailedToApplyTransformationReason2", + "AutoParameterizationMessage": "ms-resource:loc.messages.AutoParameterizationMessage", + "UnsupportedAppType": "ms-resource:loc.messages.UnsupportedAppType", + "UnableToFetchAuthorityURL": "ms-resource:loc.messages.UnableToFetchAuthorityURL", + "UnableToFetchActiveDirectory": "ms-resource:loc.messages.UnableToFetchActiveDirectory", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ms-resource:loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand", + "FailedToUpdateRuntimeStackAndStartupCommand": "ms-resource:loc.messages.FailedToUpdateRuntimeStackAndStartupCommand", + "SuccessfullyUpdatedWebAppSettings": "ms-resource:loc.messages.SuccessfullyUpdatedWebAppSettings", + "FailedToUpdateAppSettingsInConfigDetails": "ms-resource:loc.messages.FailedToUpdateAppSettingsInConfigDetails", + "UnableToGetAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToGetAzureRMWebAppMetadata", + "UnableToUpdateAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToUpdateAzureRMWebAppMetadata", + "Unabletoretrieveazureregistrycredentials": "ms-resource:loc.messages.Unabletoretrieveazureregistrycredentials", + "UnableToReadResponseBody": "ms-resource:loc.messages.UnableToReadResponseBody", + "UnableToUpdateWebAppConfigDetails": "ms-resource:loc.messages.UnableToUpdateWebAppConfigDetails", + "AddingReleaseAnnotation": "ms-resource:loc.messages.AddingReleaseAnnotation", + "SuccessfullyAddedReleaseAnnotation": "ms-resource:loc.messages.SuccessfullyAddedReleaseAnnotation", + "FailedAddingReleaseAnnotation": "ms-resource:loc.messages.FailedAddingReleaseAnnotation", + "RenameLockedFilesEnabled": "ms-resource:loc.messages.RenameLockedFilesEnabled", + "FailedToEnableRenameLockedFiles": "ms-resource:loc.messages.FailedToEnableRenameLockedFiles", + "WebJobsInProgressIssue": "ms-resource:loc.messages.WebJobsInProgressIssue", + "FailedToFetchKuduAppSettings": "ms-resource:loc.messages.FailedToFetchKuduAppSettings", + "FailedToCreatePath": "ms-resource:loc.messages.FailedToCreatePath", + "FailedToDeleteFile": "ms-resource:loc.messages.FailedToDeleteFile", + "FailedToDeleteFolder": "ms-resource:loc.messages.FailedToDeleteFolder", + "FailedToUploadFile": "ms-resource:loc.messages.FailedToUploadFile", + "FailedToGetFileContent": "ms-resource:loc.messages.FailedToGetFileContent", + "FailedToListPath": "ms-resource:loc.messages.FailedToListPath", + "RetryToDeploy": "ms-resource:loc.messages.RetryToDeploy", + "FailedToGetAppServiceDetails": "ms-resource:loc.messages.FailedToGetAppServiceDetails", + "FailedToGetAppServicePublishingProfile": "ms-resource:loc.messages.FailedToGetAppServicePublishingProfile", + "FailedToUpdateAppServiceMetadata": "ms-resource:loc.messages.FailedToUpdateAppServiceMetadata", + "FailedToGetAppServiceMetadata": "ms-resource:loc.messages.FailedToGetAppServiceMetadata", + "FailedToPatchAppServiceConfiguration": "ms-resource:loc.messages.FailedToPatchAppServiceConfiguration", + "FailedToUpdateAppServiceConfiguration": "ms-resource:loc.messages.FailedToUpdateAppServiceConfiguration", + "FailedToGetAppServiceConfiguration": "ms-resource:loc.messages.FailedToGetAppServiceConfiguration", + "FailedToGetAppServicePublishingCredentials": "ms-resource:loc.messages.FailedToGetAppServicePublishingCredentials", + "FailedToGetAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToGetAppServiceApplicationSettings", + "FailedToUpdateAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToUpdateAppServiceApplicationSettings", + "UpdatingAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatingAppServiceConfigurationSettings", + "UpdatedAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatedAppServiceConfigurationSettings", + "UpdatingAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatingAppServiceApplicationSettings", + "AppServiceApplicationSettingsAlreadyPresent": "ms-resource:loc.messages.AppServiceApplicationSettingsAlreadyPresent", + "AppServiceConnectionStringsAlreadyPresent": "ms-resource:loc.messages.AppServiceConnectionStringsAlreadyPresent", + "UpdatedAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatedAppServiceApplicationSettings", + "MultipleResourceGroupFoundForAppService": "ms-resource:loc.messages.MultipleResourceGroupFoundForAppService", + "PackageDeploymentUsingZipDeployFailed": "ms-resource:loc.messages.PackageDeploymentUsingZipDeployFailed", + "PackageDeploymentInitiated": "ms-resource:loc.messages.PackageDeploymentInitiated", + "PackageDeploymentInitiatedWithOneDeploy": "ms-resource:loc.messages.PackageDeploymentInitiatedWithOneDeploy", + "OneDeployWithIncrementalDeploymentOption": "ms-resource:loc.messages.OneDeployWithIncrementalDeploymentOption", + "WarPackageDeploymentInitiated": "ms-resource:loc.messages.WarPackageDeploymentInitiated", + "FailedToGetDeploymentLogs": "ms-resource:loc.messages.FailedToGetDeploymentLogs", + "GoExeNameNotPresent": "ms-resource:loc.messages.GoExeNameNotPresent", + "WarDeploymentRetry": "ms-resource:loc.messages.WarDeploymentRetry", + "Updatemachinetoenablesecuretlsprotocol": "ms-resource:loc.messages.Updatemachinetoenablesecuretlsprotocol", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "XmlParsingFailed": "ms-resource:loc.messages.XmlParsingFailed", + "PropertyDoesntExistPublishProfile": "ms-resource:loc.messages.PropertyDoesntExistPublishProfile", + "InvalidConnectionType": "ms-resource:loc.messages.InvalidConnectionType", + "InvalidImageSourceType": "ms-resource:loc.messages.InvalidImageSourceType", + "InvalidPublishProfile": "ms-resource:loc.messages.InvalidPublishProfile", + "ASE_SSLIssueRecommendation": "ms-resource:loc.messages.ASE_SSLIssueRecommendation", + "ZipDeployLogsURL": "ms-resource:loc.messages.ZipDeployLogsURL", + "DeployLogsURL": "ms-resource:loc.messages.DeployLogsURL", + "AppServiceApplicationURL": "ms-resource:loc.messages.AppServiceApplicationURL", + "ASE_WebDeploySSLIssueRecommendation": "ms-resource:loc.messages.ASE_WebDeploySSLIssueRecommendation", + "FailedToGetResourceID": "ms-resource:loc.messages.FailedToGetResourceID", + "JarPathNotPresent": "ms-resource:loc.messages.JarPathNotPresent", + "FailedToUpdateApplicationInsightsResource": "ms-resource:loc.messages.FailedToUpdateApplicationInsightsResource", + "RunFromZipPreventsFileInUseError": "ms-resource:loc.messages.RunFromZipPreventsFileInUseError", + "MSDeployNotSupportTokenAuth": "ms-resource:loc.messages.MSDeployNotSupportTokenAuth", + "RunFromPackageAppsetting": "ms-resource:loc.messages.RunFromPackageAppsetting" + }, + "_buildConfigMapping": { + "Default": "5.251.0", + "Node20-225": "5.251.1" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5/tsconfig.json b/_generated/AzureRmWebAppDeploymentV5/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/.npmrc b/_generated/AzureRmWebAppDeploymentV5_Node20/.npmrc new file mode 100644 index 000000000000..d5c7fef620a3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/.npmrc @@ -0,0 +1,5 @@ +scripts-prepend-node-path=true + +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/README.md b/_generated/AzureRmWebAppDeploymentV5_Node20/README.md new file mode 100644 index 000000000000..aae6da3440d0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/README.md @@ -0,0 +1,213 @@ +# Azure App Service Deployment: ARM + +## Overview + +The Azure App Service Deployment task is used to update different Azure App Service to deploy [Web Apps](https://azure.microsoft.com/en-in/documentation/articles/app-service-web-overview/), [Functions](https://docs.microsoft.com/en-us/azure/azure-functions/) and [WebJobs](https://azure.microsoft.com/en-us/blog/webjobs-goes-into-full-production/) to Azure. The task works on cross platform Azure Pipelines agents running Windows, Linux or Mac and uses the underlying deployment technologies of [Web Deploy](https://www.iis.net/downloads/microsoft/web-deploy), RunFromPackage, Zip Deploy, Containers and [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API). + +The task works for [ASP.NET](https://www.visualstudio.com/en-us/docs/release/examples/azure/azure-web-apps-from-build-and-release-hubs), [ASP.NET Core](https://www.visualstudio.com/en-us/docs/release/examples/azure/aspnet-core10-azure-web-apps), PHP, Java, Python, Go and [Node.js](https://www.visualstudio.com/en-us/docs/release/examples/nodejs/node-to-azure-webapps) based web applications. + +The task can be used to deploy different Azure App Services like Function App (Windows/Linux/Containers), Web App on Windows, Web App on Linux, Web App for Containers and apps configured under Azure App Service Environments. + +The task is **under development and is available to a limited set of Azure DevOps organizations**. The [video](https://www.youtube.com/watch?v=uQ2qCmaZ_Ag&feature=youtu.be) describes the features that are available in the task currently. + +## Contact Information + +Please report a problem at [Developer Community Forum](https://developercommunity.visualstudio.com/spaces/21/index.html) if you are facing problems in making this task work. You can also share feedback about the task like, what more functionality should be added to the task, what other tasks you would like to have, at the same place. + +## Pre-requisites for the task + +The following pre-requisites need to be setup in the target machine(s) for the task to work properly. + +##### Azure Web App or Azure Function + +The task is used to deploy a Web project to an existing Azure Web App. The Web App should exist prior to running the task. The Web App can be created from the [Azure portal](https://azure.microsoft.com/en-in/documentation/videos/azure-app-service-web-apps-with-yochay-kiriaty/) and [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) there. Alternatively, the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) can be used to run [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx) to provision and configure the Web App. + +The task can also be used to deploy [Azure Functions](https://azure.microsoft.com/en-in/services/functions/) (Windows/Linux/Containers). + +##### Azure Subscription + +To deploy to Azure, an Azure subscription has to be linked to Team Foundation Server or to Azure Pipelines using the Services tab in the Account Administration section. Add the Azure subscription to use in the Build or Release Management definition by opening the Account Administration screen (gear icon on the top-right of the screen) and then click on the Services Tab. + +Create the [ARM](https://azure.microsoft.com/en-in/documentation/articles/resource-group-overview/) service endpoint, use **'Azure Resource Manager'** endpoint type, for more details follow the steps listed in the link [here](https://go.microsoft.com/fwlink/?LinkID=623000&clcid=0x409). + +The task does not work with the Azure Classic service endpoint and it will not list these connections in the parameters in the task. + +## Deployment + +Several deployment methods are available in this task. Web Deploy (msdeploy.exe) is the default option. To change the deployment option, expand Additional Deployment Options and enable Select deployment method to choose from additional package-based deployment options. + +Based on the type of Azure App Service and Azure Pipelines agent, the task chooses a suitable deployment technology. The different deployment technologies used by the task are: +* *Web Deploy* + +* *Kudu REST APIs* + +* *Container Registry* + +* *Zip Deploy* + +* *RunFromPackage* + +By default the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* For msdeploy (MSBuild generated package) package, use Web Deploy +* When post deployment script is provided, use Zip Deploy +* When the App Service type is Web App on Linux App, use Zip Deploy +* If War file is provided, use War Deploy +* If Jar file is provided, use Run From Zip +* For all others, use Run From Zip (via Zip Deploy) + +On non-Windows agent (for any App service type), the task relies on [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) to deploy the Web App. + +### Web Deploy + +Web Deploy (msdeploy.exe) is used to deploy the web application to the Azure Web App. Web Deploy Works on a Windows automation agent when the target is a Web App on Windows or Function App. Install it on the agent using the [Microsoft Web Platform Installer](https://www.microsoft.com/web/gallery/install.aspx?appid=wdeploynosmo). The Web Deploy 3.5 needs to be installed without the bundled SQL support. There is no need to choose any custom settings while installing Web Deploy. After installing the Web Deploy is available at C:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V3. + +Web Deploy is feature rich and offers options like: +* **Rename locked files\*:** Rename file which are still in use by the web server by enabling msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment + +* **Remove additional files at destination\*:** Deletes files on the Azure App Service that have no matching files in the App Service artifact package or folder getting deployed. + +* **Exclude files from the App_Data folder\*:** Prevent files in the App_Data folder (in the artifact package/folder getting deployed) from being deployed to the Azure App Service + +* **Additional Web Deploy arguments\*:** Arguments that will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.For more examples of Web Deploy operation settings, refer [Web Deploy Operation Settings](https://go.microsoft.com/fwlink/?linkid=838471) + + +### [Kudu REST APIs](https://github.com/projectkudu/kudu/wiki/REST-API) +Works on a Windows as well as Linux automation agent when the target is a Web App on Windows or Web App on Linux (built-in source) or Function App. The task uses Kudu to copy over files to the Azure App service. + +### Container Registry +Works on a Windows as well as Linux automation agent when the target is a Web App for Containers. The task updates the Azure Web App for Containers by setting the right Container registry, repository, image name and tag information. You can also use the task to pass a startup command for the container image. + +### Zip Deploy +Creates a .zip deployment package of the chosen Package or folder and deploys the file contents to the wwwroot folder of the App Service name function app in Azure. This option overwrites all existing contents in the wwwroot folder. For more information, see [Zip deployment for Azure Functions](https://docs.microsoft.com/azure/azure-functions/deployment-zip-push). + +### RunFromPackage +Creates the same deployment package as Zip Deploy. However, instead of deploying files to the wwwroot folder, the entire package is mounted by the Functions runtime. With this option, files in the wwwroot folder become read-only. For more information, see [Run your Azure Functions from a package file](https://docs.microsoft.com/azure/azure-functions/run-functions-from-deployment-package). + +### Parameters of the task +The task is used to deploy a Web project to an existing Azure Web App or Function. The mandatory fields are highlighted with a *. + +* **Azure Subscription\*:** Select the AzureRM Subscription. If none exists, then click on the **Manage** link, to navigate to the Services tab in the Administrators panel. In the tab click on **New Service Endpoint** and select **Azure Resource Manager** from the dropdown. + +* **App Service type\*:** Select the Azure App Service type. The different app types supported are Function App, Web App on Windows, Web App on Linux, Web App for Containers and Azure App Service Environments + +* **App Service Name\*:** Select the name of an existing Azure App Service. Enter the name of the Web App if it was provisioned dynamically using the [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3) and [AzureRM PowerShell scripts](https://msdn.microsoft.com/en-us/library/mt619237.aspx). + +* **Deploy to Slot:** Select the option to deploy to an existing slot other than the Production slot. Do not select this option if the Web project is being deployed to the Production slot. The Web App itself is the Production slot. + +* **Resource Group:** Select the Azure Resource Group that contains the Azure App Service specified above. Enter the name of the Azure Resource Group if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Slot:** Select the Slot to deploy the Web project to. Enter the name of the Slot if has been dynamically provisioned using [Azure Resource Group Deployment task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureResourceGroupDeploymentV2) or [Azure PowerShell task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV3). This is a required parameter if the option to Deploy to Slot has been selected. + +* **Virtual Application:** Specify the name of the Virtual Application that has been configured in the Azure portal. The option is not required for deployments to the website root. The Virtual Application should have been [configured](https://azure.microsoft.com/en-us/documentation/articles/web-sites-configure/) prior to deploying the Web project to it using the task. + +* **Package or Folder\*:** Location of the Web App zip package or folder on the automation agent or on a UNC path accessible to the automation agent like, \\\\BudgetIT\\Web\\Deploy\\Fabrikam.zip. Predefined system variables and wild cards like, $(System.DefaultWorkingDirectory)\\\***.zip can be also used here. + +* **Select deployment method:** Select the option to to choose from Web Deploy, Container, Zip Deploy, RunFromPackage, Kudu REST apis + +By default (when 'Select deployment method' is not checked) the task tries to select the appropriate deployment technology given the input package, app service type and agent OS. + +* **Parameters File:** (Optional) The parameter file is used to override the default settings in the web deploy zip package file like, the IIS Web application name or the database connection string. This helps in having a single package that can be deployed across dev, test, staging, and production, with a specific parameter file for each environment. + +* **Remove Additional Files at Destination:** Select the option to delete the files in the Azure App Service that have no matching files in the Web App zip package. This will ensure that during the Web project deployment any additional files in the Azure App Service are deleted, and the only files in the Azure App Service are the ones in the Web App zip package. +This will also remove all files related to any extension (for example Application Insights) installed on this Azure App Service. To prevent this, enable 'Exclude files from App_Data folder' as well. + +* **Exclude Files from the App_Data Folder:** Select the option to prevent files in the App_Data folder from being deployed to the Azure App Service. This is a useful option to select, if a local database or a WebJob has been deployed earlier to the Azure App Service, and they should not be deleted in the subsequent deployments of the Web project. + +* **Take Application Offline:** Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the Web App before the sync operation begins. The file will be removed after the sync operation completes successfully. + +* **Additional Arguments:** Additional Web Deploy arguments that will be appended to the MSDeploy command while deploying the Azure Web App like,-disableLink:AppPoolExtension -disableLink:ContentExtension. A useful parameter for enabling and disabling rules and for skipping syncing of certain folders. + +* **Generate Web.config:** A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. For example, for [Nodejs application, web.config](https://github.com/projectkudu/kudu/wiki/Using-a-custom-web.config-for-Node-apps) will have startup file and iis_node module values. Similarly for Python (Bottle, Django, Flask) the web.config will have details of WSGI handler, Python path etc. The task will generate a new web.config only when the artifact package/folder does not contain an existing web.config. The default values populated by the task can be overriden in the task by using the Web.config parameters field. + +* **Web.config parameters:** Edit values like startup file in the task generated web.config file. The default values populated by the task can be overridden in the task by passing the web.config parameters. This edit feature is **only for the generated web.config**. Feature is useful when [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) is used to install specific Python version by using extensions or when you want to provide a different startup file for Node.js. +In case of Python, the path can be set as an output variable of the [Azure App Service Manage task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/AzureAppServiceManageV0) and then set as the Python path in the web.config generated by this deploy task. You can try out this feature by selecting any Python, Nodejs, PHP release definition template. + +* **File transformation and variable substitution:** Refer to following links: + * [XML transformation](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-transformation) + * [XML variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#xml-variable-substitution) + * [JSON variable substitution](https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution?view=vsts#json-variable-substitution) +* **Deployment script:** +The task provides an option to customize the deployment by providing a script that will run on the Azure App Service once the application artifacts have been copied successfully to the App Service. You can choose to either provide an inline deployment script or point to a script file in your atifact folder. This is very useful when you want to restore your application dependencies on the App service directly. Restoring packages of Node, PHP, Python applications helps in avoiding timeouts when the application dependency results in a large artifact getting copied over from Azure Pipelines Agent to Azure app service. An example of this script is: +``` +@echo off +if NOT exist requirements.txt ( + echo No Requirements.txt found. + EXIT /b 0 +) +if NOT exist "$(PYTHON_EXT)/python.exe" ( + echo Python extension not available >&2 + EXIT /b 1 +) +echo Installing dependencies +call "$(PYTHON_EXT)/python.exe" -m pip install -U setuptools +if %errorlevel% NEQ 0 ( + echo Failed to install setuptools >&2 + EXIT /b 1 +) +call "$(PYTHON_EXT)/python.exe" -m pip install -r requirements.txt +if %errorlevel% NEQ 0 ( + echo Failed to install dependencies>&2 + EXIT /b 1 +) +``` + +* **Runtime Stack:** +Web App on Linux offers two different options to publish your application, one is Custom image deployment (Web App for Containers) and the other is App deployment with a built-in platform image (Web App on Linux). You will see this parameter only when you selected 'Linux Web App' in the App type selection option in the task. + +For Web **Web App for Containers** you need to provide the following details: +* *Registry or Namespace:* +A globally unique top-level domain name for your specific registry or namespace. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Image:* +Image Name of the repository where the container images are stored. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Tag:* +Tags are optional, it is the mechanism that registries use to give Docker images a version. A fully qualified image name will be of the format: '/:'. For example, 'myregistry.azurecr.io/nginx:latest'. + +* *Startup command:* +Start up command for the container. + +For Web **Web App on Linux** you need to provide the following details: +* *Runtime stack:* Select the framework and version your web app will run on. + +* *Startup command:* +Start up command for the app. For example if you are using PM2 process manager for Nodejs then you can specify the PM2 file here. + +* *Application and Configuration Settings* + +**App settings**: [App settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure#app-settings) contains name/value pairs that your web app will load on start up. Edit web app application settings by following the syntax '-key value'. Value containing spaces should be enclosed in double quotes. +>Example : -Port 5000 -RequestTimeout 5000 +>-WEBSITE_TIME_ZONE "Eastern Standard Time" + +**Configuration settings**: +Edit web app [configuration settings](https://docs.microsoft.com/en-us/azure/app-service/web-sites-configure) following the syntax -key value. Value containing spaces should be enclosed in double quotes. +>Example : -phpVersion 5.6 -linuxFxVersion: node|6.11 + +### Output Variables + +* **Web App Hosted URL:** Provide a name, like FabrikamWebAppURL for the variable for the Azure App Service Hosted URL. The variable can be used as $(variableName), like $(FabrikamWebAppURL) to refer to the Hosted URL of the Azure App Service in subsequent tasks like in the [Run Functional Tests task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/RunDistributedTestsV1) or the [Visual Studio Test task](https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/VsTestV2). + + +### Troubleshooting : + +- **Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.** + + Service connection used by the task would have been expired or the service principal use must have been removed from the app registrations. [Troubleshoot the affected Azure Resource Manager service connection.](https://docs.microsoft.com/en-us/azure/devops/pipelines/release/azure-rm-endpoint?view=azure-devops) + +- **SSL error** + To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + +- **Managed Service Identity (MSI)** + configure Managed Service Identity (MSI) for virtual machine https://aka.ms/azure-msi-docs + + +- **Publish using zip deploy option is not supported for msBuild package type** + Follow the steps provided in the link https://github.com/microsoft/azure-pipelines-tasks/wiki/Migrating-from-Web-Deploy-to-Run-From-Package-deployment-mechanism + +- **ERROR_FILE_IN_USE** + * For avoiding deployment failure with error code ERROR_FILE_IN_USE, in case of .NET apps targeting Web App on Windows, ensure that 'Rename locked files' and 'Take App Offline' are enabled. For zero downtime deployment use slot swap. + * You can also use `Run From Package` deployment method to avoid resource locking. + +- **Web Job deployment** +When deploying to an App Service with App Insights configured, if you have enabled “Remove additional files at destination” then you also need to enable “Exclude files from the App_Data folder” in order to keep App insights extension in safe state. This is required because App Insights continuous web job gets installed into the App_Data folder. diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..61fdf60095b0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service-Bereitstellung", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Hiermit wird eine Web-, Mobil- oder API-App mithilfe von Docker, Java, .NET, .NET Core, Node.js, PHP, Python oder Ruby für Azure App Service bereitgestellt.", + "loc.instanceNameFormat": "Azure App Service bereitstellen: $(WebAppName)", + "loc.releaseNotes": "Neuigkeiten in Version 4.*
Unterstützung für ZIP Deploy, die Ausführung über Pakete und WAR Deploy [Details](https://aka.ms/appServiceDeploymentMethods)
Unterstützung für App Service-Umgebungen
Verbesserte Benutzeroberfläche zum Ermitteln der von der Aufgabe unterstützten App Service-Typen
\"Aus Paket ausführen\" ist die bevorzugte Bereitstellungsmethode und markiert Dateien im Ordner \"wwwroot\" als schreibgeschützt
Klicken Sie [hier](https://aka.ms/azurermwebdeployreadme), um weitere Informationen zu erhalten.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Optionen für Dateitransformationen und Variablenersetzungen", + "loc.group.displayName.AdditionalDeploymentOptions": "Zusätzliche Bereitstellungsoptionen", + "loc.group.displayName.PostDeploymentAction": "Aktion nach der Bereitstellung", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Anwendungs- und Konfigurationseinstellungen", + "loc.input.label.ConnectionType": "Verbindungstyp", + "loc.input.help.ConnectionType": "Wählen Sie den Dienstverbindungstyp aus, der zum Bereitstellen der Web-App verwendet werden soll.
Wählen Sie \"Veröffentlichungsprofil\" aus, um das von Visual Studio erstellte Veröffentlichungsprofil zu verwenden. [Weitere Informationen](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure-Abonnement", + "loc.input.help.ConnectedServiceName": "Wählen Sie das Azure Resource Manager-Abonnement für die Bereitstellung aus.", + "loc.input.label.PublishProfilePath": "Pfad für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePath": "Pfad des von Visual Studio erstellten Veröffentlichungsprofils", + "loc.input.label.PublishProfilePassword": "Kennwort für Veröffentlichungsprofil", + "loc.input.help.PublishProfilePassword": "Es wird empfohlen, das Kennwort in einer geheimen Variablen zu speichern und diese Variable hier zu verwenden, z. B. $(Password).", + "loc.input.label.WebAppKind": "App Service-Typ", + "loc.input.help.WebAppKind": "Wählen Sie aus zwischen Web-App unter Windows, Web-App unter Linux, Web-App für Container, Funktions-App, Funktions-App unter Linux, Funktions-App für Container und mobile App.", + "loc.input.label.WebAppName": "App Service-Name", + "loc.input.help.WebAppName": "Geben Sie den Namen eines vorhandenen Azure App Service ein, oder wählen Sie ihn aus. Es werden nur App-Dienste für den ausgewählten App-Typ angezeigt.", + "loc.input.label.DeployToSlotOrASEFlag": "In Slot oder App Service-Umgebung bereitstellen", + "loc.input.help.DeployToSlotOrASEFlag": "Wählen Sie die Option für die Bereitstellung in einem vorhandenen Bereitstellungsslot oder in der Azure App Service-Umgebung.
Für beide Ziele benötigt die Aufgabe den Ressourcengruppennamen.
Falls als Bereitstellungsziel ein Slot verwendet wird, erfolgt die Bereitstellung standardmäßig im Produktionsslot. Auch jeder andere vorhandene Slotname kann angegeben werden.
Falls als Bereitstellungsziel eine Azure App Service-Umgebung verwendet wird, behalten Sie den Slotnamen \"production\" bei, und geben Sie nur den Namen der Ressourcengruppe an.", + "loc.input.label.ResourceGroupName": "Ressourcengruppe", + "loc.input.help.ResourceGroupName": "Der Ressourcengruppenname ist erforderlich, wenn als Bereitstellungsziel ein Bereitstellungsslot oder eine App Service-Umgebung verwendet wird.
Geben Sie die Azure-Ressourcengruppe mit der oben angegebenen Azure App Service-Instanz ein, oder wählen Sie sie aus.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Geben Sie einen anderen vorhandenen Slot als den Produktionsslot ein, oder wählen Sie ihn aus.", + "loc.input.label.DockerNamespace": "Registrierung oder Namespace", + "loc.input.help.DockerNamespace": "Eine global eindeutiger Name einer Domäne der obersten Ebene für Ihre spezifische Registrierung oder den Namespace.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name des Repositorys, in dem Containerimages gespeichert werden.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags sind optional. Sie werden von den Registrierungen genutzt, um eine Version für die Docker-Images zu vergeben.
Hinweis: Vollqualifizierte Imagenamen haben das folgende Format: \"'`/`:`\". Beispiel: \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Virtuelle Anwendung", + "loc.input.help.VirtualApplication": "Geben Sie den Namen der virtuellen Anwendung ein, die im Azure-Portal konfiguriert wurde. Die Option ist für Bereitstellungen im App Service-Stamm nicht erforderlich.", + "loc.input.label.Package": "Paket oder Ordner", + "loc.input.help.Package": "Dateipfad zum Paket oder zu einem Ordner mit den durch MSBuild generierten App Service-Inhalten oder zu einer komprimierten ZIP-oder WAR-Datei.
Variablen ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), Platzhalter werden unterstützt.
Beispiel: \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip\" oder \"$(System.DefaultWorkingDirectory)/\\*\\*/\\*.war\".", + "loc.input.label.RuntimeStack": "Runtimestapel", + "loc.input.help.RuntimeStack": "Wählen Sie Framework und Version aus.", + "loc.input.label.RuntimeStackFunction": "Runtimestapel", + "loc.input.help.RuntimeStackFunction": "Wählen Sie das Framework und die Version aus. In [diesem Dokument](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) finden Sie die unterstützten Runtimeversionen. Verwenden Sie anstelle alter Werte wie \"DOCKER|microsoft/azure-functions-*\" die neuen Werte aus der Dropdownliste.", + "loc.input.label.StartupCommand": "Startbefehl ", + "loc.input.help.StartupCommand": "Geben Sie den Startbefehl ein. Beispiel:
dotnet exec Dateiname.dll
dotnet Dateiname.dll", + "loc.input.label.ScriptType": "Bereitstellungsskripttyp", + "loc.input.help.ScriptType": "Passen Sie die Bereitstellung durch das Angeben eines Skripts an, das im Azure App Service ausgeführt wird, nachdem die Aufgabe die Bereitstellung erfolgreich abgeschlossen hat. Stellen Sie beispielsweise Pakete für Node-, PHP- oder Python-Anwendungen wieder her. [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inlineskript", + "loc.input.label.ScriptPath": "Bereitstellungsskriptpfad", + "loc.input.label.WebConfigParameters": "Parameter der Datei \"web.config\" für Python-, Node.js-, Go- und Java-Apps generieren", + "loc.input.help.WebConfigParameters": "Ein Standarddatei \"web.config\" wird generiert und in Azure App Service bereitgestellt, wenn diese Datei nicht in der Anwendung vorhanden ist. Die Werte in \"web.config\" können bearbeitet werden und variieren je nach Anwendungsframework. Zum Beispiel enthält \"web.config\" für node.js-Anwendungen Werte für eine Startdatei und ein iis_node-Modul. Dieses Bearbeitungsfeature gilt nur für die generierte Datei \"web.config\". [Weitere Informationen](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App-Einstellungen", + "loc.input.help.AppSettings": "Bearbeiten Sie Web-App-Anwendungseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Konfigurationseinstellungen", + "loc.input.help.ConfigurationSettings": "Bearbeiten Sie Web-App-Konfigurationseinstellungen entsprechend der Syntax \"-Schlüssel Wert\". Ein Wert mit Leerzeichen muss in doppelte Anführungszeichen eingeschlossen werden.
Beispiel: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Bereitstellungsmethode auswählen", + "loc.input.help.UseWebDeploy": "Wenn die Option deaktiviert ist, wird die beste Bereitstellungsmethode basierend auf dem App-Typ, dem Paketformat und anderen Parametern automatisch ermittelt.
Klicken Sie auf die Option zum Anzeigen der unterstützten Bereitstellungsmethoden, und wählen Sie eine davon für die Bereitstellung Ihrer App aus.", + "loc.input.label.DeploymentType": "Bereitstellungsmethode", + "loc.input.help.DeploymentType": "Wählen Sie die Bereitstellungsmethode für die App aus.", + "loc.input.label.TakeAppOfflineFlag": "App offline schalten", + "loc.input.help.TakeAppOfflineFlag": "Wählen Sie diese Option aus, um den Azure App Service offline zu schalten, indem vor dem Synchronisierungsvorgang eine Datei \"app_offline.htm\" im App Service-Stammverzeichnis platziert wird. Die Datei wird entfernt, nachdem der Synchronisierungsvorgang erfolgreich abgeschlossen wurde.", + "loc.input.label.SetParametersFile": "SetParameters-Datei", + "loc.input.help.SetParametersFile": "Optional: Speicherort für die zu verwendende Datei \"SetParameters.xml\".", + "loc.input.label.RemoveAdditionalFilesFlag": "Zusätzliche Dateien am Ziel entfernen", + "loc.input.help.RemoveAdditionalFilesFlag": "Wählen Sie diese Option aus, um Dateien im Azure App Service zu löschen, für die keine übereinstimmenden Dateien im Paket oder Ordner des App Service vorhanden sind.

Hierdurch werden auch alle zugehörigen Dateien für Erweiterungen entfernt, die in diesem Azure App Service installiert sind. Um dies zu verhindern, aktivieren Sie das Kontrollkästchen \"Dateien aus App_Data-Ordner ausschließen\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Dateien aus dem Ordner \"App_Data\" ausschließen", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Wählen Sie diese Option aus, um zu verhindern, dass Dateien im Ordner \"App_Data\" in Azure App Service bereitgestellt oder gelöscht werden.", + "loc.input.label.AdditionalArguments": "Zusätzliche Argumente", + "loc.input.help.AdditionalArguments": "Weitere Web Deploy-Argumente mit der Syntax \"-key:value\".
Diese werden angewendet, wenn der Azure App Service bereitgestellt wird. Beispiel: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Weitere Beispiele für Einstellungen für den Web Deploy-Vorgang finden Sie [hier] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Gesperrte Dateien umbenennen", + "loc.input.help.RenameFilesFlag": "Wählen Sie die Option aus, um das msdeploy-Flag MSDEPLOY_RENAME_LOCKED_FILES=1 in den Azure App Service-Anwendungseinstellungen zu aktivieren. Wenn diese Option festgelegt ist, kann \"msdeploy\" gesperrte Dateien umbenennen, die während der App-Bereitstellung gesperrt sind.", + "loc.input.label.XmlTransformation": "XML-Transformation", + "loc.input.help.XmlTransformation": "Die Konfigurationstransformationen werden für \"*.Release.config\" und \"*..config\" in der Datei \"*.config\" ausgeführt.
Konfigurationstransformationen werden vor der Variablenersetzung ausgeführt.
XML-Transformationen werden nur für Windows-Plattformen unterstützt.", + "loc.input.label.XmlVariableSubstitution": "XML-Variablenersetzung", + "loc.input.help.XmlVariableSubstitution": "In der Build- oder Releasepipeline definierte Variablen werden mit den Einträgen \"key\" oder \"name\" in den appSettings-, applicationSettings- und connectionStrings-Abschnitten jeder Konfigurationsdatei und der Datei \"parameters.xml\" abgeglichen. Die Variablenersetzung erfolgt nach den Konfigurationstransformationen.

Hinweis: Wenn in der Releasepipeline und der Umgebung dieselben Variablen definiert wurden, haben die Umgebungsvariablen Vorrang vor den Variablen der Releasepipeline.
", + "loc.input.label.JSONFiles": "JSON-Variablenersetzung", + "loc.input.help.JSONFiles": "Stellen Sie eine durch Zeilenumbrüche getrennte Liste der JSON-Dateien für die Ersetzung der Variablenwerte bereit. Die Dateinamen müssen relativ zum Stammordner angegeben werden.
Um geschachtelte oder hierarchische JSON-Variablen zu ersetzen, geben Sie diese mithilfe von JSONPath-Ausdrücken an.

Um etwa im Beispiel unten den Wert von \"ConnectionString\" zu ersetzen, müssen Sie in der Build- oder Releasepipeline (oder der Umgebung der Releasepipeline) eine Variable als \"Data.DefaultConnection.ConnectionString\" definieren.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Die Variablenersetzung wird nach den Konfigurationstransformationen durchgeführt.

Hinweis: Pipelinevariablen sind von der Ersetzung ausgenommen.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Ungültiges App Service-Paket oder ungültiger App Service-Ordnerpfad angegeben: %s", + "loc.messages.SetParamFilenotfound0": "Datei zum Festlegen der Parameter nicht gefunden: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Die XML-Transformationen wurden erfolgreich angewendet.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Die Dienstverbindungsdetails für Azure App Service wurden abgerufen: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Fehler: Keine solche Bereitstellungsmethode vorhanden.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Die Dienstverbindungsdetails für Azure App Service können nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Die Dienstverbindungsdetails für die Azure-Ressource \"%s\" konnten nicht abgerufen werden. Statuscode: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Der Bereitstellungsverlauf unter \"%s\" wurde erfolgreich aktualisiert.", + "loc.messages.Failedtoupdatedeploymenthistory": "Fehler beim Aktualisieren des Bereitstellungsverlaufs. Fehler: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNUNG: Der Bereitstellungsstatus kann nicht aktualisiert werden: Der SCM-Endpunkt ist für diese Website nicht aktiviert.", + "loc.messages.Unabletoretrievewebconfigdetails": "Die App Service-Konfigurationsdetails können nicht abgerufen werden. Statuscode: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Die App Service-Anwendungseinstellungen können nicht abgerufen werden. [Statuscode: %s, Fehlermeldung: %s]", + "loc.messages.Unabletoupdatewebappsettings": "Die App Service-Anwendungseinstellungen können nicht aktualisiert werden. Statuscode: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Der Bereitstellungsstatus kann nicht aktualisiert werden: Die eindeutige Bereitstellungs-ID kann nicht abgerufen werden.", + "loc.messages.PackageDeploymentSuccess": "Web-Paket für den App Service erfolgreich bereitgestellt.", + "loc.messages.PackageDeploymentFailed": "Fehler beim Bereitstellen des Web-Pakets für den App Service.", + "loc.messages.Runningcommand": "Befehl wird ausgeführt: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Webpaket \"%s\" wird im virtuellen Pfad (physischen Pfad) bereitgestellt: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Das Paket \"%s\" wurde unter Verwendung des Kudu-Diensts erfolgreich unter \"%s\" bereitgestellt.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Fehler beim Bereitstellen des App Service-Pakets mithilfe des Kudu-Diensts: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Der App Service kann nicht bereitgestellt werden. Fehlercode: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Mit MSDeploy generierte Pakete werden nur für Windows-Plattformen unterstützt.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Nicht unterstützte installierte Version %s für MSDeploy gefunden. Version 3 oder höher muss installiert sein.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Der Speicherort von MS Deploy wurde nicht in der Registrierung auf dem Computer gefunden (Fehler: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Es wurde kein Paket mit dem angegebenen Muster gefunden: %s
überprüfen, ob das in der Aufgabe erwähnte Paket als Artefakt im Build oder in einer vorherigen Stage veröffentlicht und im aktuellen Auftrag heruntergeladen wurde.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Mindestens zwei Pakete stimmten mit dem angegebenen Suchmuster überein: %s. Schränken Sie das Suchmuster ein.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Anwendung offline schalten\" erneut bereitzustellen.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Versuchen Sie, den App Service mit ausgewählter Option \"Gesperrte Dateien umbenennen\" erneut bereitzustellen.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Keine JSON-Datei stimmte mit dem angegebenen Muster überein: %s", + "loc.messages.Configfiledoesntexists": "Die Konfigurationsdatei \"%s\" ist nicht vorhanden.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Fehler beim Schreiben in die Konfigurationsdatei \"%s\". Fehler: %s ", + "loc.messages.AppOfflineModeenabled": "Der App-Offlinemodus wurde aktiviert.", + "loc.messages.Failedtoenableappofflinemode": "Fehler beim Aktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.AppOflineModedisabled": "Der App-Offlinemodus wurde deaktiviert.", + "loc.messages.FailedtodisableAppOfflineMode": "Fehler beim Deaktivieren des App-Offlinemodus. Statuscode: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "XML-Transformationen können auf einer Nicht-Windows-Plattform nicht ausgeführt werden.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML-Transformationsfehler beim Transformieren von \"%s\" unter Verwendung von \"%s\".", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Eine Veröffentlichung unter Verwendung von webdeploy-Optionen wird nur unterstützt, wenn der Windows-Agent verwendet wird. ", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Die Veröffentlichung über die ZIP Deploy-Option wird für den msBuild-Pakettyp nicht unterstützt.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Die Veröffentlichung über die ZIP Deploy-Option wird für virtuelle Anwendungen nicht unterstützt.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Bei der Veröffentlichung über die Optionen \"ZIP Deploy\" oder \"RunFromZip\" wird die WAR-Dateibereitstellung nicht unterstützt.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Bei der Veröffentlichung über RunFromZip werden Skripts nach der Bereitstellung möglicherweise nicht unterstützt, wenn diese Änderungen an wwwroot vornehmen, weil der Ordner schreibgeschützt ist.", + "loc.messages.ResourceDoesntExist": "Die Ressource \"%s\" ist nicht vorhanden. Die Ressource muss vor der Bereitstellung vorhanden sein.", + "loc.messages.EncodeNotSupported": "Erkannte Codierung der Datei \"%s\": %s. Eine Variablenersetzung wird für die Dateicodierung \"%s\" nicht unterstützt. Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Die Codierung der Datei \"%s\" wurde nicht erkannt (typeCode: %s). Unterstützte Codierungen sind UTF-8 und UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Der Dateipuffer ist zu klein, um den Codierungstyp zu erkennen: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Fehler beim Aktualisieren der App Service-Konfigurationsdetails. Fehler: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Die App Service-Konfigurationsdetails wurden erfolgreich aktualisiert.", + "loc.messages.RequestedURLforkuduphysicalpath": "Angeforderte URL für physischen Kudu-Pfad: %s", + "loc.messages.Physicalpathalreadyexists": "Der physische Pfad \"%s\" ist bereits vorhanden.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Der physische Kudu-Pfad wurde erfolgreich erstellt: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Fehler beim Erstellen des physischen Kudu-Pfads. Fehler: %s", + "loc.messages.FailedtocheckphysicalPath": "Fehler beim Überprüfen des physischen Kudu-Pfads. Fehlercode: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Die virtuelle Anwendung ist nicht vorhanden: %s", + "loc.messages.JSONParseError": "Die JSON-Datei konnte nicht analysiert werden: %s. Fehler: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Die JSON-Variablenersetzung wurde erfolgreich angewendet.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML-Variablenersetzung erfolgreich angewendet.", + "loc.messages.failedtoUploadFileToKudu": "Datei \"%s\" kann nicht in Kudu (%s) hochgeladen werden. Statuscode: %s", + "loc.messages.failedtoUploadFileToKuduError": "Hochladen der Datei: %s auf Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ExecuteScriptOnKudu": "Das angegebene Skript wird im Kudu-Dienst ausgeführt.", + "loc.messages.FailedToRunScriptOnKuduError": "Das Skript kann nicht im Kudu-Dienst ausgeführt werden. Fehler: %s", + "loc.messages.FailedToRunScriptOnKudu": "Ausführen des Skripts in Kudu nicht möglich: %s. Statuscode: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Skript in Kudu erfolgreich ausgeführt.", + "loc.messages.ScriptExecutionOnKuduFailed": "Das ausgeführte Skript hat \"%s\" als Rückgabecode zurückgegeben. Fehler: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Die Datei \"%s\" kann nicht aus Kudu (%s) gelöscht werden. Statuscode: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Löschen der Datei: %s von Kudu (%s) nicht möglich. Fehler: %s", + "loc.messages.ScriptFileNotFound": "Skriptdatei \"%s\" nicht gefunden.", + "loc.messages.InvalidScriptFile": "Ungültige Skriptdatei \"%s\" angegeben. Gültige Erweiterungen sind \".bat\" und \".cmd\" für Windows und \".sh\" für Linux.", + "loc.messages.RetryForTimeoutIssue": "Fehler beim Ausführen des Skripts mit Zeitüberschreitung. Es wird noch mal versucht.", + "loc.messages.stdoutFromScript": "Standardausgabe von Skript:", + "loc.messages.stderrFromScript": "Standardfehler von Skript:", + "loc.messages.WebConfigAlreadyExists": "web.config-Datei ist bereits vorhanden. Sie wird nicht erstellt.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config-Datei erfolgreich erstellt.", + "loc.messages.FailedToGenerateWebConfig": "Fehler beim Erstellen von \"web.config\". %s", + "loc.messages.FailedToGetKuduFileContent": "Dateiinhalt konnte nicht abgerufen werden: %s. Statuscode: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Dateiinhalt konnte nicht abgerufen werden: %s. Fehler: %s", + "loc.messages.ScriptStatusTimeout": "Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden.", + "loc.messages.PollingForFileTimeOut": "Der Skriptstatus konnte aufgrund einer Zeitüberschreitung nicht abgerufen werden. Sie können das Zeitlimit erhöhen, indem Sie die erforderliche Minutenzahl für die Variable \"appservicedeploy.retrytimeout\" festlegen.", + "loc.messages.InvalidPollOption": "Ungültige Abrufoption angegeben: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Das Attribut \"-appType\" fehlt in den Parametern \"Web.config\". Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" und \"Go\".
Beispiel: \"-appType python_Bottle\" (ohne Anführungszeichen) im Fall von Python Bottle-Framework.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Der Pfad für die Datei \"settings.py\" von DJANGO_SETTINGS_MODULE 'settings.py' wurde nicht gefunden. Überprüfen Sie, ob die Datei \"settings.py\" existiert, oder geben Sie den korrekten Pfad in der Parametereingabe \"Web.config\" im folgenden Format an: \"-DJANGO_SETTINGS_MODULE .settings\".", + "loc.messages.FailedToApplyTransformation": "Die Transformation für das angegebene Paket kann nicht angewendet werden. Führen Sie die folgenden Schritte aus.", + "loc.messages.FailedToApplyTransformationReason1": "1. Prüfen Sie, ob die Transformation für das beim Build generierte MSBuild-Paket bereits angewendet wurde. Ist dies der Fall, entfernen Sie das Tag aus allen Konfigurationen in der CSPROJ-Datei, und führen Sie den Build erneut aus. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Stellen Sie sicher, dass sich die Konfigurationsdatei und die Transformationsdateien im selben Ordner im Paket befinden.", + "loc.messages.AutoParameterizationMessage": "ConnectionString-Attribute in Web.config ist standardmäßig parametrisiert. Beachten Sie, dass die Transformation keine Auswirkungen auf connectionString-Attribute hat, da der Wert bei der Bereitstellung durch Dateien vom Typ \"Parameters.xml\" oder \"SetParameters.xml\" überschrieben wird. Sie können die automatische Parametrisierung deaktivieren, indem Sie beim Erstellung des MSBuild-Pakets die Einstellung \"/p:AutoParameterizationWebConfigConnectionStrings=False\" festlegen.", + "loc.messages.UnsupportedAppType": "App-Typ \"%s\" wird beim Erstellen von \"Web.config\" nicht unterstützt. Gültige Werte für \"-appType\" sind: \"python_Bottle\", \"python_Django\", \"python_Flask\" und \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Abrufen der Autoritäts-URL nicht möglich.", + "loc.messages.UnableToFetchActiveDirectory": "Abrufen der Active Directory-Ressourcen-ID nicht möglich.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Runtimestapel und Startbefehl erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Fehler beim Aktualisieren des Runtimestapels und des Startbefehls. Fehler: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "App-Einstellungen erfolgreich aktualisiert.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Fehler beim Aktualisieren der App-Einstellungen. Fehler: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Fehler beim Abrufen von AzureRM-WebApp-Metadaten. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM-WebApp-Metadaten können nicht aktualisiert werden. Fehlercode: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Die Anmeldeinformationen für Azure Container Registry konnten nicht abgerufen werden. [Statuscode: %s]", + "loc.messages.UnableToReadResponseBody": "Antworttext konnte nicht gelesen werden. Fehler: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp-Konfigurationsdetails konnten nicht aktualisiert werden. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Releaseanmerkung für Application Insights-Ressource \"%s\" wird hinzugefügt.", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Releaseanmerkung erfolgreich zu Application Insight hinzugefügt: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Fehler beim Hinzufügen einer Releaseanmerkung. %s", + "loc.messages.RenameLockedFilesEnabled": "Umbenennung gesperrter Dateien für App Service aktiviert.", + "loc.messages.FailedToEnableRenameLockedFiles": "Fehler beim Aktivieren der Umbenennung gesperrter Dateien. Fehler: %s", + "loc.messages.WebJobsInProgressIssue": "Einige WebJobs-Instanzen werden gerade ausgeführt und verhindern, dass die Bereitstellung Dateien entfernt. Sie können die Option \"Zusätzliche Dateien am Ziel entfernen\" deaktivieren oder fortlaufende Aufträge vor der Bereitstellung beenden.", + "loc.messages.FailedToFetchKuduAppSettings": "Fehler beim Abrufen von Kudu-App-Einstellungen. Fehler: %s", + "loc.messages.FailedToCreatePath": "Fehler beim Erstellen des Pfads \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFile": "Fehler beim Löschen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToDeleteFolder": "Fehler beim Löschen des Ordners \"%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToUploadFile": "Fehler beim Hochladen der Datei \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToGetFileContent": "Fehler beim Abrufen des Dateiinhalts \"%s/%s\" aus Kudu. Fehler: %s", + "loc.messages.FailedToListPath": "Fehler beim Auflisten von Pfad \"%s\" aus Kudu. Fehler: %s", + "loc.messages.RetryToDeploy": "Es wird erneut versucht, das Paket bereitzustellen.", + "loc.messages.FailedToGetAppServiceDetails": "Fehler beim Abrufen der App Service-Details \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Fehler beim Abrufen des Veröffentlichungsprofils für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Fehler beim Aktualisieren der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Fehler beim Abrufen der Metadaten für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Fehler beim Patchen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Fehler beim Aktualisieren der App-Dienstkonfiguration \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Fehler beim Abrufen der Konfiguration für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Fehler beim Abrufen der Anmeldeinformationen für die Veröffentlichung für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Fehler beim Abrufen der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Fehler beim Aktualisieren der Anwendungseinstellungen für App Service \"%s\". Fehler: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Es wird versucht, die App Service-Konfigurationseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Die App Service-Konfigurationseinstellungen wurden aktualisiert.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Es wird versucht, die App Service-Anwendungseinstellungen zu aktualisieren. Daten: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service-Anwendungseinstellungen sind bereits vorhanden.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service-Verbindungszeichenfolgen sind bereits vorhanden.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Die App Service-Anwendungseinstellungen und die Kudu-Anwendungseinstellungen wurden aktualisiert.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Mehrere Ressourcengruppen für App Service \"%s\" gefunden.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Fehler bei der Paketbereitstellung über ZIP Deploy. Weitere Informationen finden Sie in den Protokollen.", + "loc.messages.PackageDeploymentInitiated": "Die Paketbereitstellung über ZIP Deploy wurde eingeleitet.", + "loc.messages.WarPackageDeploymentInitiated": "Die Paketbereitstellung über WAR Deploy wurde eingeleitet.", + "loc.messages.FailedToGetDeploymentLogs": "Fehler beim Abrufen von Bereitstellungsprotokollen. Fehler: %s", + "loc.messages.GoExeNameNotPresent": "Der Name der Go-EXE-Datei ist nicht vorhanden.", + "loc.messages.WarDeploymentRetry": "Die Bereitstellung der WAR-Datei wird wiederholt, weil sie zuvor nicht erfolgreich erweitert wurde.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Stellen Sie sicher, dass der Computer das TLS 1.2-Protokoll oder eine höhere Version verwendet. Weitere Informationen zum Aktivieren von TLS auf Ihrem Computer finden Sie unter https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Ein Zugriffstoken für Azure konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Konfigurieren Sie die verwaltete Dienstidentität (MSI) für den virtuellen Computer (https://aka.ms/azure-msi-docs). Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.XmlParsingFailed": "Die publishProfileXML-Datei konnte nicht analysiert werden. Fehler: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Die [%s]-Eigenschaft ist im Veröffentlichungsprofil nicht vorhanden.", + "loc.messages.InvalidConnectionType": "Ungültiger Dienstverbindungstyp", + "loc.messages.InvalidImageSourceType": "Ungültiger Imagequelltyp", + "loc.messages.InvalidPublishProfile": "Die Veröffentlichungsprofildatei ist ungültig.", + "loc.messages.ASE_SSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie in der Build- oder Releasepipeline eine Variable mit dem Namen VSTS_ARM_REST_IGNORE_SSL_ERRORS auf den Wert TRUE festlegen.", + "loc.messages.ZipDeployLogsURL": "ZIP Deploy-Protokolle können unter %s angezeigt werden.", + "loc.messages.DeployLogsURL": "Bereitstellungsprotokolle können unter %s angezeigt werden.", + "loc.messages.AppServiceApplicationURL": "URL der App Service-Anwendung: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Um ein Zertifikat in App Service zu verwenden, muss das Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle signiert sein. Werden von Ihrer Web-App Zertifikatüberprüfungsfehler zurückgegeben, verwenden Sie wahrscheinlich ein selbstsigniertes Zertifikat. Um den Fehler zu beheben, müssen Sie \"-allowUntrusted\" in zusätzlichen Argumenten der Web Deploy-Option übergeben.", + "loc.messages.FailedToGetResourceID": "Fehler beim Abrufen der Ressourcen-ID für Ressourcentyp \"%s\" und Ressourcenname \"%s\". Fehler: %s", + "loc.messages.JarPathNotPresent": "Der Java-JAR-Pfad ist nicht vorhanden.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Fehler beim Aktualisieren der Application Insights-Ressource \"%s\". Fehler: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Wechseln Sie Web Deploy zum \"Aus Paket ausführen\", um FILE_IN_USE-Fehler zu vermeiden. Beachten Sie, dass \"Aus Paket ausführen\" keine Unterstützung für den msBuild-Pakettyp bietet. Ändern Sie Ihr Paketformat, um diese Bereitstellungsmethode zu verwenden." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..545ed17423d8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,238 @@ +{ + "loc.friendlyName": "Azure App Service deploy", + "loc.helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "loc.instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "loc.releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "File Transforms & Variable Substitution Options", + "loc.group.displayName.AdditionalDeploymentOptions": "Additional Deployment Options", + "loc.group.displayName.AdditionalDeploymentOptionsLinux": "Additional Deployment Options", + "loc.group.displayName.PostDeploymentAction": "Post Deployment Action", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Application and Configuration Settings", + "loc.input.label.ConnectionType": "Connection type", + "loc.input.help.ConnectionType": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure subscription", + "loc.input.help.ConnectedServiceName": "Select the Azure Resource Manager subscription for the deployment.", + "loc.input.label.PublishProfilePath": "Publish profile path", + "loc.input.help.PublishProfilePath": "Path of the Publish profile created from Visual Studio", + "loc.input.label.PublishProfilePassword": "Publish profile password", + "loc.input.help.PublishProfilePassword": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "loc.input.label.WebAppKind": "App Service type", + "loc.input.help.WebAppKind": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "loc.input.label.WebAppName": "App Service name", + "loc.input.help.WebAppName": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "loc.input.label.DeployToSlotOrASEFlag": "Deploy to Slot or App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "loc.input.label.ResourceGroupName": "Resource group", + "loc.input.help.ResourceGroupName": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Enter or Select an existing Slot other than the Production slot.", + "loc.input.label.DockerNamespace": "Registry or Namespace", + "loc.input.help.DockerNamespace": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Virtual application", + "loc.input.help.VirtualApplication": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root.", + "loc.input.label.Package": "Package or folder", + "loc.input.help.Package": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Runtime Stack", + "loc.input.help.RuntimeStack": "Select the framework and version.", + "loc.input.label.RuntimeStackFunction": "Runtime Stack", + "loc.input.help.RuntimeStackFunction": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "loc.input.label.StartupCommand": "Startup command ", + "loc.input.help.StartupCommand": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Deployment script type", + "loc.input.help.ScriptType": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Inline Script", + "loc.input.label.ScriptPath": "Deployment script path", + "loc.input.label.WebConfigParameters": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "loc.input.help.WebConfigParameters": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "App settings", + "loc.input.help.AppSettings": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Configuration settings", + "loc.input.help.ConfigurationSettings": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Select deployment method", + "loc.input.help.UseWebDeploy": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app.", + "loc.input.label.DeploymentType": "Deployment method", + "loc.input.help.DeploymentType": "Choose the deployment method for the app.", + "loc.input.label.TakeAppOfflineFlag": "Take App Offline", + "loc.input.help.TakeAppOfflineFlag": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully.", + "loc.input.label.SetParametersFile": "SetParameters file", + "loc.input.help.SetParametersFile": "Optional: location of the SetParameters.xml file to use.", + "loc.input.label.RemoveAdditionalFilesFlag": "Remove additional files at destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclude files from the App_Data folder", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service.", + "loc.input.label.AdditionalArguments": "Additional arguments", + "loc.input.help.AdditionalArguments": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rename locked files", + "loc.input.help.RenameFilesFlag": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment", + "loc.input.label.XmlTransformation": "XML transformation", + "loc.input.help.XmlTransformation": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform.", + "loc.input.label.XmlVariableSubstitution": "XML variable substitution", + "loc.input.help.XmlVariableSubstitution": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
", + "loc.input.label.JSONFiles": "JSON variable substitution", + "loc.input.help.JSONFiles": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution.", + "loc.input.label.DeploymentTypeLinux": "Deployment method", + "loc.input.help.DeploymentTypeLinux": "Choose the deployment method for the app.", + "loc.input.label.CleanDeploymentFlag": "Enable clean deployment", + "loc.input.help.CleanDeploymentFlag": "Deployment mode for complete sync (clean) deployment", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "loc.messages.SetParamFilenotfound0": "Set parameters file not found: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "loc.messages.Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "loc.messages.PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "loc.messages.PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "loc.messages.Runningcommand": "Running command: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "loc.messages.Configfiledoesntexists": "Configuration file %s doesn't exist.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "loc.messages.AppOfflineModeenabled": "App offline mode enabled.", + "loc.messages.Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "loc.messages.AppOflineModedisabled": "App offline mode disabled.", + "loc.messages.FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "loc.messages.XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "loc.messages.ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "loc.messages.EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "loc.messages.ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "loc.messages.RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "loc.messages.Physicalpathalreadyexists": "Physical path '%s' already exists", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "loc.messages.FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "loc.messages.JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "loc.messages.failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "loc.messages.failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "loc.messages.FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "Script file '%s' not found.", + "loc.messages.InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "loc.messages.RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "loc.messages.stdoutFromScript": "Standard output from script: ", + "loc.messages.stderrFromScript": "Standard error from script: ", + "loc.messages.WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "loc.messages.FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "loc.messages.PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "loc.messages.InvalidPollOption": "Invalid polling option provided: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "loc.messages.AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "loc.messages.FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "loc.messages.AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "loc.messages.UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "loc.messages.UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "loc.messages.UnableToReadResponseBody": "Unable to read response body. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "loc.messages.RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "loc.messages.FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "loc.messages.FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "loc.messages.FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Retrying to deploy the package.", + "loc.messages.FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "loc.messages.PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "loc.messages.PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "loc.messages.OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "loc.messages.WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "loc.messages.FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "loc.messages.GoExeNameNotPresent": "Go exe name is not present", + "loc.messages.WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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.XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "loc.messages.InvalidConnectionType": "Invalid service connection type", + "loc.messages.InvalidImageSourceType": "Invalid Image source Type", + "loc.messages.InvalidPublishProfile": "Publish profile file is invalid.", + "loc.messages.ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "loc.messages.ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "loc.messages.DeployLogsURL": "Deploy logs can be viewed at %s", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "loc.messages.FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "loc.messages.JarPathNotPresent": "Java jar path is not present", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "loc.messages.MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy .", + "loc.messages.RunFromPackageAppsetting": "NOTE: Run From Package makes wwwroot read-only, so you will receive an error when writing files to this directory." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..f10de1f4b8fc --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Implementación de Azure App Service", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Implementar en Azure App Service una aplicación de API, móvil o web con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Implementación de Azure App Service: $(WebAppName)", + "loc.releaseNotes": "Novedades de la versión 4.*
Compatibilidad con la implementación desde archivo zip, la ejecución desde paquete y la implementación desde archivo WAR [detalles aquí](https://aka.ms/appServiceDeploymentMethods)
Compatibilidad con los entornos de App Service Environment
Mejora de la interfaz de usuario para detectar diferentes tipos de instancias de App Service compatibles con la tarea
La ejecución desde el paquete es el método de implementación preferido, que hace que los archivos de la carpeta wwwroot sean de solo lectura
Haga clic [aquí](https://aka.ms/azurermwebdeployreadme) para obtener más información.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformaciones de archivos y opciones de sustitución de variables", + "loc.group.displayName.AdditionalDeploymentOptions": "Opciones de implementación adicionales", + "loc.group.displayName.PostDeploymentAction": "Acción posterior a la implementación", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Configuración y opciones de la aplicación", + "loc.input.label.ConnectionType": "Tipo de conexión", + "loc.input.help.ConnectionType": "Seleccione el tipo de conexión de servicio que se va a usar para implementar la aplicación web.
Seleccione Perfil de publicación para usar el perfil de publicación creado por Visual Studio. [Más información] (https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Suscripción a Azure", + "loc.input.help.ConnectedServiceName": "Seleccione la suscripción de Azure Resource Manager para la implementación.", + "loc.input.label.PublishProfilePath": "Ruta de acceso del perfil de publicación", + "loc.input.help.PublishProfilePath": "Ruta de acceso del perfil de publicación creado desde Visual Studio", + "loc.input.label.PublishProfilePassword": "Contraseña del perfil de publicación", + "loc.input.help.PublishProfilePassword": "Se recomienda almacenar la contraseña en una variable secreta y utilizar esa variable aquí; por ejemplo, $(Password).", + "loc.input.label.WebAppKind": "Tipo de App Service", + "loc.input.help.WebAppKind": "Elija entre Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers y Mobile App.", + "loc.input.label.WebAppName": "Nombre de App Service", + "loc.input.help.WebAppName": "Escriba o seleccione el nombre de una instancia existente de Azure App Service. Solo se enumerarán las instancias de App Service basadas en el tipo de aplicación seleccionado.", + "loc.input.label.DeployToSlotOrASEFlag": "Implementar en la ranura o en App Service Environment", + "loc.input.help.DeployToSlotOrASEFlag": "Seleccione la opción para implementar en una ranura de implementación o entorno de Azure App Service Environment existente.
Para ambos destinos, la tarea necesita el nombre del grupo de recursos.
En caso de que el destino de implementación sea una ranura, la implementación se realiza de forma predeterminada en la ranura de producción. También se puede proporcionar cualquier otro nombre de ranura existente.
En caso de que el destino de implementación sea un entorno de Azure App Service Environment, deje el nombre de la ranura como \"Producción\" y especifique el nombre del grupo de recursos.", + "loc.input.label.ResourceGroupName": "Grupo de recursos", + "loc.input.help.ResourceGroupName": "El nombre del grupo de recursos es necesario cuando el destino de implementación es una ranura de implementación o una instancia de App Service Environment.
Escriba o seleccione el grupo de recursos de Azure que contiene el servicio de Azure App Service especificado anteriormente.", + "loc.input.label.SlotName": "Ranura", + "loc.input.help.SlotName": "Escriba o seleccione un espacio que no sea el de producción.", + "loc.input.label.DockerNamespace": "Registro o espacio de nombres", + "loc.input.help.DockerNamespace": "Nombre de dominio de nivel superior único global para su espacio de nombres o Registro específico.
Nota: El nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerRepository": "Imagen", + "loc.input.help.DockerRepository": "Nombre del repositorio en el que se almacenan las imágenes del contenedor.
Nota: Un nombre de imagen completo tiene el formato: \"/:\". Por ejemplo, \"miRegistro.azurecr.io/nginx:última\".", + "loc.input.label.DockerImageTag": "Etiqueta", + "loc.input.help.DockerImageTag": "Las etiquetas son opcionales. Este es el mecanismo que los registros usan para asignar una versión a las imágenes de Docker.
Nota: El nombre de imagen completo tiene el formato: \"'`/`:`\". Por ejemplo, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Aplicación virtual", + "loc.input.help.VirtualApplication": "Especifique el nombre de la aplicación virtual que se ha configurado en Azure Portal. Esta opción no es necesaria para implementaciones en la raíz de App Service.", + "loc.input.label.Package": "Paquete o carpeta", + "loc.input.help.Package": "Ruta de acceso al paquete o carpeta que contiene el contenido de App Service generado por MSBuild o un archivo zip o war comprimido.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), se admiten caracteres comodín.
Por ejemplo, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStack": "Seleccione el marco y la versión.", + "loc.input.label.RuntimeStackFunction": "Pila en tiempo de ejecución", + "loc.input.help.RuntimeStackFunction": "Seleccione el marco y la versión. Consulte [este documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) para ver las versiones compatibles del entorno de ejecución. Los valores anteriores, como \"DOCKER|microsoft/azure-functions-*\", están en desuso; use los valores nuevos de la lista desplegable.", + "loc.input.label.StartupCommand": "Comando de inicio ", + "loc.input.help.StartupCommand": "Escriba el comando de inicio. Por ejemplo,
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo de script de implementación", + "loc.input.help.ScriptType": "Para personalizar la implementación, proporcione un script que se ejecute en Azure App Service una vez que la tarea haya completado la implementación correctamente. Por ejemplo, restaure paquetes para aplicaciones de Node, PHP y Python. [Más información](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script en línea", + "loc.input.label.ScriptPath": "Ruta de acceso del script de implementación", + "loc.input.label.WebConfigParameters": "Generar parámetros de web.config para aplicaciones de Python, Node.js, Go y Java", + "loc.input.help.WebConfigParameters": "Se generará un archivo web.config estándar y se implementará en Azure App Service si la aplicación no tiene uno. Los valores de web.config se pueden editar y pueden variar en función del marco de trabajo de la aplicación. Por ejemplo, para la aplicación node.js, web.config tendrá los valores de archivo de inicio y del módulo iis_node. La característica de edición es solo para el web.config generado. [Más información](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Configuración de la aplicación", + "loc.input.help.AppSettings": "Edite la configuración de la aplicación web siguiendo la sintaxis -clave valor. Si un valor contiene espacios, debe ponerlo entre comillas dobles.
Ejemplo: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Opciones de configuración", + "loc.input.help.ConfigurationSettings": "Edite opciones de configuración de aplicación web la sintaxis-valor de clave. Valor que contenga espacios debe incluirse entre comillas dobles.
Ejemplo: - phpVersion 5.6 - linuxFxVersion: nodo|6.11", + "loc.input.label.UseWebDeploy": "Seleccionar el método de implementación", + "loc.input.help.UseWebDeploy": "Si está desactivado, se detectará automáticamente el mejor método de implementación en función de su tipo de aplicación, el formato del paquete y otros parámetros.
Seleccione la opción para ver los métodos de implementación compatibles y elija uno para implementar su aplicación.", + "loc.input.label.DeploymentType": "Método de implementación", + "loc.input.help.DeploymentType": "Elija el método de implementación para la aplicación.", + "loc.input.label.TakeAppOfflineFlag": "Desconectar la aplicación", + "loc.input.help.TakeAppOfflineFlag": "Seleccione esta opción para poner sin conexión Azure App Service colocando el archivo app_offline.htm en el directorio raíz de App Service antes de que comience la operación de sincronización. El archivo se quitará cuando la operación de sincronización finalice correctamente.", + "loc.input.label.SetParametersFile": "Archivo SetParameters", + "loc.input.help.SetParametersFile": "Opcional: ubicación del archivo SetParameters.xml que debe usarse.", + "loc.input.label.RemoveAdditionalFilesFlag": "Quitar archivos adicionales en el destino", + "loc.input.help.RemoveAdditionalFilesFlag": "Seleccione la opción para eliminar archivos en la instancia de Azure App Service que no tiene archivos coincidentes en la carpeta o el paquete de App Service.

Nota: Al hacerlo, también se quitarán todos los archivos relacionados con cualquier extensión instalada en esta instancia de Azure App Service. Para evitarlo, seleccione la casilla \"Excluir archivos de la carpeta App_Data\". ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Excluir archivos de la carpeta App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Seleccione esta opción para evitar que los archivos de la carpeta App_Data se implementen en Azure App Service o se eliminen de ese servicio.", + "loc.input.label.AdditionalArguments": "Argumentos adicionales", + "loc.input.help.AdditionalArguments": "Argumentos adicionales de Web Deploy que siguen la sintaxis -clave:valor.
Se aplicarán cuando se implemente la instancia de Azure App Service. Ejemplo: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Para más ejemplos de configuración de la operación de Web Deploy, consulte [aquí] (https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Cambiar nombre de archivos bloqueados", + "loc.input.help.RenameFilesFlag": "Seleccione la opción para habilitar la marca de msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 en la configuración de la aplicación de Azure App Service. Si está establecida, la opción permite que msdeploy cambie el nombre de los archivos bloqueados que se bloquean durante la implementación de la aplicación", + "loc.input.label.XmlTransformation": "Transformación XML", + "loc.input.help.XmlTransformation": "Las transformaciones de configuración se ejecutarán para \"*.Release.config\" y \"*..config\" en el \"archivo *.config\".
Las transformaciones de configuración se ejecutarán antes de la sustitución de variables.
Las transformaciones XML solo se admiten para la plataforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sustitución de variables XML", + "loc.input.help.XmlVariableSubstitution": "Las variables que se definen en las canalizaciones de compilación o de versión se compararán con las entradas \"key\" o \"name\" de las secciones appSettings, applicationSettings y connectionStrings de cualquier archivo de configuración y parameters.xml. La sustitución de variable tiene lugar después de las transformaciones de configuración.

Nota: Si las mismas variables están definidas en la canalización de versión y en el entorno, las variables de entorno sustituirán las variables de la canalización de versión.
", + "loc.input.label.JSONFiles": "Sustitución de variables JSON", + "loc.input.help.JSONFiles": "Proporcione una nueva lista separada por líneas de los archivos JSON para sustituir los valores de variable. Los nombres de archivos que se proporcionen deben ser relativos a la carpeta raíz.
Para sustituir las variables JSON anidadas o jerárquicas, especifíquelas mediante expresiones JSONPath.

Por ejemplo, para reemplazar el valor de \"ConnectionString\" en el ejemplo siguiente, debe definir una variable como \"Data.DefaultConnection.ConnectionString\" en la canalización de compilación o versión (o el entorno de la canalización de versión).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sustitución de variables se ejecuta una vez que se transforma la configuración.

Nota: Las variables de la canalización se excluyen de la sustitución.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Paquete App Service o ruta de acceso de carpeta proporcionados no válidos: %s", + "loc.messages.SetParamFilenotfound0": "No se ha encontrado el archivo de parámetros establecido: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Las transformaciones XML se aplicaron correctamente", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Se obtuvieron detalles de conexión de servicio para Azure App Service: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Error : No existe tal método de implementación", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "No se pueden recuperar los detalles de la conexión de servicio para Azure App Service: %s. Código de estado: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "No se pueden recuperar los detalles de la conexión de servicio para el recurso de Azure \"%s\". Código de estado: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "El historial de implementación se actualizó correctamente en %s", + "loc.messages.Failedtoupdatedeploymenthistory": "No se pudo actualizar el historial de implementación. Error: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ADVERTENCIA : no se puede actualizar el estado de implementación, el punto de conexión de SCM no está habilitado para este sitio web", + "loc.messages.Unabletoretrievewebconfigdetails": "No se pueden recuperar los detalles de configuración de la instancia de App Service. Código de estado: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "No se puede recuperar la configuración de aplicación de App Service. [Código de estado: \"%s\", Mensaje de error: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "No se puede actualizar la configuración de aplicación de la instancia de App Service. Código de estado: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "No se puede actualizar el estado de implementación : no se puede recuperar el id. de implementación único", + "loc.messages.PackageDeploymentSuccess": "El paquete web se implementó correctamente en App Service.", + "loc.messages.PackageDeploymentFailed": "No se pudo implementar el paquete web en App Service.", + "loc.messages.Runningcommand": "Ejecutando el comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Implementando el paquete web : %s en una ruta de acceso virtual (ruta de acceso física): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "El paquete %s se implementó correctamente mediante el servicio Kudu en %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "No se pudo implementar el paquete App Service mediante el servicio Kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "No se puede implementar App Service debido al código de error: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Los paquetes generados por MSDeploy solo se admiten para la plataforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Versión instalada no admitida: se encontró %s para MSDeploy, pero la versión mínima admitida es 3 o posterior.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "No se puede encontrar la ubicación de MS Deploy del Registro en la máquina (Error : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No se encontró ningún paquete con el patrón especificado: %s
Compruebe si el paquete mencionado en la tarea se publica como artefacto en la compilación o en una fase anterior y se descarga en el trabajo actual.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Más de un paquete coincidió con el patrón especificado: %s. Restrinja el patrón de búsqueda.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Poner la aplicación sin conexión seleccionada.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Intente volver a implementar el servicio de la aplicación con la opción Cambiar de nombre archivos bloqueados seleccionada.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Ningún archivo JSON coincidía con un patrón específico: %s.", + "loc.messages.Configfiledoesntexists": "El archivo de configuración %s no existe.", + "loc.messages.Failedtowritetoconfigfilewitherror": "No se pudo escribir en el archivo de configuración %s con el error: %s", + "loc.messages.AppOfflineModeenabled": "Modo de aplicación sin conexión habilitado.", + "loc.messages.Failedtoenableappofflinemode": "No se pudo habilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.AppOflineModedisabled": "Modo de aplicación sin conexión deshabilitado.", + "loc.messages.FailedtodisableAppOfflineMode": "No se pudo deshabilitar el modo de aplicación sin conexión. Código de estado: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "No se pueden realizar las transformaciones XML en una plataforma que no es Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Error de transformación XML al transformar %s mediante %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Las opciones de publicación mediante webdeploy solo se admiten cuando se usa el agente de Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publicación mediante la opción de implementación desde un archivo zip no se admite para el tipo de paquete de MSBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publicación mediante la opción de implementación desde un archivo zip no se admite para una aplicación virtual.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publicación mediante las opciones de RunFromZip o de implementación desde un archivo zip no admiten la implementación de archivos war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publicación mediante RunFromZip podría no admitir el script posterior a la implementación si realiza cambios en wwwroot, puesto que la carpeta es de solo lectura.", + "loc.messages.ResourceDoesntExist": "El recurso \"%s\" no existe. Este debe existir antes de la implementación.", + "loc.messages.EncodeNotSupported": "Se detectó una codificación de archivos del archivo %s como %s. No se admite la sustitución de variables con la codificación de archivos %s. Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "No se puede detectar la codificación del archivo %s (typeCode: %s). Las codificaciones admitidas son UTF-8 y UTF-16 LE.", + "loc.messages.ShortFileBufferError": "El búfer de archivos es demasiado breve para detectar el tipo de codificación : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "No se pudieron actualizar los detalles de configuración de App Service. Error: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Los detalles de configuración de App Service se actualizaron correctamente", + "loc.messages.RequestedURLforkuduphysicalpath": "Dirección URL solicitada para la ruta de acceso física a Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "La ruta de acceso física \"%s\" ya existe", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "La ruta de acceso física a Kudu se creó correctamente: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "No se pudo crear la ruta de acceso física de Kudu. Error: %s", + "loc.messages.FailedtocheckphysicalPath": "No se pudo comprobar la ruta de acceso física de Kudu. Código de error: %s", + "loc.messages.VirtualApplicationDoesNotExist": "La aplicación virtual no existe: %s", + "loc.messages.JSONParseError": "No se puede analizar el archivo JSON: %s. Error: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sustitución de variable JSON se aplicó correctamente.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Sustitución de variables XML aplicada correctamente.", + "loc.messages.failedtoUploadFileToKudu": "No se puede cargar el archivo %s en Kudu (%s). Código de estado: %s", + "loc.messages.failedtoUploadFileToKuduError": "No se puede cargar el archivo %s en Kudu (%s). Error: %s", + "loc.messages.ExecuteScriptOnKudu": "Ejecutando el script dado en el servicio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "No se puede ejecutar el script en el servicio Kudu. Error: %s", + "loc.messages.FailedToRunScriptOnKudu": "No se puede ejecutar el script en Kudu: %s. Código de estado: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "El script se ejecutó correctamente en Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "El script ejecutado devolvió \"%s\" como código de retorno. Error: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "No se puede eliminar el archivo %s de Kudu (%s). Código de estado: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "No se puede eliminar el archivo %s de Kudu (%s). Error: %s", + "loc.messages.ScriptFileNotFound": "No se encuentra el archivo de script \"%s\".", + "loc.messages.InvalidScriptFile": "Se proporcionó un archivo de script \"%s\" no válido. Las extensiones válidas son .bat y .cmd para Windows y .sh para Linux.", + "loc.messages.RetryForTimeoutIssue": "No se pudo ejecutar el script porque se agotó el tiempo de espera. Se reintentará una vez más.", + "loc.messages.stdoutFromScript": "Salida estándar del script: ", + "loc.messages.stderrFromScript": "Error estándar del script: ", + "loc.messages.WebConfigAlreadyExists": "El archivo web.config ya existe. No se va a generar.", + "loc.messages.SuccessfullyGeneratedWebConfig": "El archivo web.config se generó correctamente", + "loc.messages.FailedToGenerateWebConfig": "No se pudo generar el archivo web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "No se puede obtener el contenido del archivo: %s. Código de estado: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "No se puede obtener el contenido del archivo: %s. Error: %s", + "loc.messages.ScriptStatusTimeout": "No se pudo recuperar el estado del script porque se agotó el tiempo de espera.", + "loc.messages.PollingForFileTimeOut": "No se puede recuperar el estado del script porque se agotó el tiempo de espera. Puede aumentar el tiempo de espera estableciendo la variable \"appservicedeploy.retrytimeout\" en el número de minutos que sea necesario.", + "loc.messages.InvalidPollOption": "Se ha proporcionado una opción de sondeo no válida: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "El atributo \"-appType\" falta en los parámetros de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" y \"Go\".
Por ejemplo, \"-appType python_Bottle\" (sin comillas) en el caso de la plataforma Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "No se puede detectar la ruta de acceso del archivo \"settings.py\" de DJANGO_SETTINGS_MODULE. Asegúrese de que el archivo \"settings.py\" existe o indique la ruta de acceso correcta en la entrada del parámetro de Web.config siguiendo este formato: \"-DJANGO_SETTINGS_MODULE .settings\"", + "loc.messages.FailedToApplyTransformation": "No se puede aplicar la transformación para el paquete dado. Compruebe lo siguiente.", + "loc.messages.FailedToApplyTransformationReason1": "1. Si la transformación ya se ha aplicado para el paquete generado por MSBuild durante la compilación. Si es así, quite la etiqueta para cada configuración del archivo csproj y compile de nuevo. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Asegúrese de que el archivo de configuración y los archivos de transformación están presentes en la misma carpeta dentro del paquete.", + "loc.messages.AutoParameterizationMessage": "Los atributos de ConnectionString en Web.config están parametrizados de manera predeterminada. Tenga en cuenta que la transformación no tiene efecto en los atributos connectionString porque el valor se invalida durante la implementación por los archivos \"Parameters.xml\" o \"SetParameters.xml\". Puede deshabilitar la parametrización automática estableciendo /p:AutoParameterizationWebConfigConnectionStrings=False durante la generación del paquete MSBuild.", + "loc.messages.UnsupportedAppType": "El tipo de aplicación \"'%s\" no se admite en la generación de Web.config. Los valores válidos para \"-appType\" son: \"python_Bottle\", \"python_Django\", \"python_Flask\" y \"'node\"", + "loc.messages.UnableToFetchAuthorityURL": "No se puede recuperar la dirección URL de la autoridad.", + "loc.messages.UnableToFetchActiveDirectory": "No se puede recuperar el id. de recurso de Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "La pila en tiempo de ejecución y el comando de inicio se actualizaron correctamente.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "No se pudieron actualizar la pila en tiempo de ejecución y el comando de inicio. Error: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "La configuración de la aplicación se actualizó correctamente.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "No se pudo actualizar la configuración de la aplicación. Error: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "No se pudieron capturar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "No se pueden actualizar los metadatos de WebApp de AzureRM. Código de error: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "No se pueden recuperar las credenciales de Azure Container Registry. [Código de estado: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "No se puede leer el cuerpo de la respuesta. Error: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "No se pueden actualizar los detalles de la configuración de WebApp. Código de estado: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Agregar anotación de versión para el recurso de Application Insights \"%s\".", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "La anotación de versión se agregó correctamente a la instancia de Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "No se pudo agregar la anotación de versión. %s", + "loc.messages.RenameLockedFilesEnabled": "La opción Cambiar nombre de archivos bloqueados está habilitada para la instancia de App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "No se pudo habilitar el cambio de nombre de los archivos bloqueados. Error: %s", + "loc.messages.WebJobsInProgressIssue": "Algunos WebJobs en estado de ejecución impiden que la implementación elimine los archivos. Puede deshabilitar la opción \"Quitar archivos adicionales en el destino\" o detener los trabajos continuos antes de la implementación.", + "loc.messages.FailedToFetchKuduAppSettings": "No se pudo capturar la configuración de la aplicación de Kudu. Error: %s", + "loc.messages.FailedToCreatePath": "No se pudo crear la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFile": "No se pudo eliminar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToDeleteFolder": "No se pudo eliminar la carpeta \"%s\" de Kudu. Error: %s", + "loc.messages.FailedToUploadFile": "No se pudo cargar el archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToGetFileContent": "No se pudo obtener el contenido del archivo \"%s/%s\" de Kudu. Error: %s", + "loc.messages.FailedToListPath": "No se pudo enumerar la ruta de acceso \"%s\" de Kudu. Error: %s", + "loc.messages.RetryToDeploy": "Reintentando la implementación del paquete.", + "loc.messages.FailedToGetAppServiceDetails": "No se pudieron capturar los detalles de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "No se pudo capturar el perfil de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "No se pudieron actualizar los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceMetadata": "No se pudieron obtener los metadatos de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "No se pudo aplicar una revisión a la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "No se pudo actualizar la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "No se pudo obtener la configuración de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "No se pudieron capturar las credenciales de publicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "No se pudo obtener la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "No se pudo actualizar la configuración de aplicación de la instancia de App Service \"%s\". Error: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Intentando actualizar los valores de configuración de la instancia de App Service. Datos: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Se han actualizado los valores de configuración de App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Intentando actualizar la configuración de aplicación de App Service. Datos: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "La configuración de aplicación de App Service ya está presente.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Las cadenas de conexión de App Service ya están presentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Se han actualizado la configuración de aplicación de App Service y la configuración de aplicación de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Se encontraron varios grupos de recursos para la instancia de App Service \"%s\".", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Error al implementar el paquete mediante la implementación de ZIP. Consulte los registros para obtener más detalles.", + "loc.messages.PackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo ZIP.", + "loc.messages.WarPackageDeploymentInitiated": "Se ha iniciado la implementación del paquete mediante la implementación desde un archivo WAR.", + "loc.messages.FailedToGetDeploymentLogs": "No se pudieron obtener los registros de implementación. Error: %s", + "loc.messages.GoExeNameNotPresent": "Falta el nombre del archivo ejecutable de Go", + "loc.messages.WarDeploymentRetry": "Reintentando la implementación del archivo war, ya que no se expandió correctamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Asegúrese de que el equipo usa el protocolo TLS 1.2 o posterior. Consulte https://aka.ms/enableTlsv2 para obtener más información sobre cómo habilitar TLS en la máquina.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "No se pudo capturar el token de acceso para Azure. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Configure Managed Service Identity (MSI) para la máquina virtual \"https://aka.ms/azure-msi-docs\". Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.XmlParsingFailed": "No se puede analizar el archivo publishProfileXML: %s. Error: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propiedad no existe en el perfil de publicación", + "loc.messages.InvalidConnectionType": "Tipo de conexión de servicio no válido", + "loc.messages.InvalidImageSourceType": "Tipo de origen de imagen no válido", + "loc.messages.InvalidPublishProfile": "El archivo del perfil de publicación no es válido.", + "loc.messages.ASE_SSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe establecer una variable denominada VSTS_ARM_REST_IGNORE_SSL_ERRORS como true en la canalización de compilación o de versión", + "loc.messages.ZipDeployLogsURL": "Los registros de implementación desde un archivo zip pueden verse en %s", + "loc.messages.DeployLogsURL": "Los registros de implementación pueden verse en %s", + "loc.messages.AppServiceApplicationURL": "Dirección URL de la aplicación de App Service: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Para usar un certificado en App Service, debe haberlo firmado una entidad de certificación de confianza. Si la aplicación web genera errores de validación del certificado, es posible que esté usando un certificado autofirmado. Para resolverlo, debe pasar -allowUntrusted en argumentos adicionales de la opción de implementación web.", + "loc.messages.FailedToGetResourceID": "No se pudo obtener el identificador del tipo de recurso \"%s\" y el nombre de recurso \"%s\". Error: %s", + "loc.messages.JarPathNotPresent": "La ruta de acceso de jar de Java no está presente.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "No se pudo actualizar el recurso de Application Insights \"%s\". Error: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Cambie de Web Deploy a la ejecución desde el paquete, que ayuda a evitar el error FILE_IN_USE. Tenga en cuenta que la ejecución desde el paquete no admite el tipo de paquete msBuild. Cambie el formato del paquete para usar este método de implementación." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..735e9149ed5b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Déploiement Azure App Service", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Déployer sur Azure App Service une application web, mobile ou API via Docker, Java, .NET, .NET Core, Node.js, PHP, Python ou Ruby", + "loc.instanceNameFormat": "Déploiement d'Azure App Service : $(WebAppName)", + "loc.releaseNotes": "Nouveautés de la version 4.*
Prend en charge Zip Deploy, l'exécution à partir d'un package, War Deploy [Détails ici](https://aka.ms/appServiceDeploymentMethods)
Prend en charge les environnements App Service
Amélioration de l'IU pour la découverte des différents types d'App Service pris en charge par la tâche
L'exécution à partir d'un package est la méthode de déploiement recommandée. Elle permet de rendre les fichiers du dossier wwwroot accessibles en lecture seule
Cliquez [ici](https://aka.ms/azurermwebdeployreadme) pour plus d'informations.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Transformations de fichiers et options de substitution de variable", + "loc.group.displayName.AdditionalDeploymentOptions": "Options de déploiement supplémentaires", + "loc.group.displayName.PostDeploymentAction": "Action de postdéploiement", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Paramètres d'application et de configuration", + "loc.input.label.ConnectionType": "Type de connexion", + "loc.input.help.ConnectionType": "Sélectionnez le type de connexion de service à utiliser pour déployer l'application web.
Sélectionnez Publier le profil pour utiliser le profil de publication créé par Visual Studio. [Plus d'informations](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Abonnement Azure", + "loc.input.help.ConnectedServiceName": "Sélectionnez l'abonnement Azure Resource Manager pour le déploiement.", + "loc.input.label.PublishProfilePath": "Chemin du profil de publication", + "loc.input.help.PublishProfilePath": "Chemin du profil de publication créé à partir de Visual Studio", + "loc.input.label.PublishProfilePassword": "Mot de passe du profil de publication", + "loc.input.help.PublishProfilePassword": "Il est recommandé de stocker le mot de passe dans une variable secrète et d'utiliser cette variable ici, par exemple $(Password).", + "loc.input.label.WebAppKind": "Type d'App Service", + "loc.input.help.WebAppKind": "Choisissez parmi Web App sur Windows, Web App sur Linux, Web App pour conteneurs, Application de fonction, Application de fonction sur Linux, Application de fonction pour conteneurs et Mobile App.", + "loc.input.label.WebAppName": "Nom de l'App Service", + "loc.input.help.WebAppName": "Entrez ou sélectionnez le nom d'un Azure App Service existant. Seuls les App Services basés sur le type d'application sélectionné sont listés.", + "loc.input.label.DeployToSlotOrASEFlag": "Déployer sur l'emplacement ou l'environnement App Service", + "loc.input.help.DeployToSlotOrASEFlag": "Sélectionnez l'option permettant d'effectuer un déploiement sur un emplacement de déploiement existant ou sur Azure App Service Environment.
Pour les deux cibles, la tâche a besoin du nom du groupe de ressources.
Si la cible de déploiement est un emplacement, le déploiement est effectué par défaut sur l'emplacement de production. Vous pouvez également indiquer un autre nom d'emplacement existant.
Si la cible de déploiement est un environnement Azure App Service, gardez le nom d'emplacement 'production', et spécifiez simplement le nom du groupe de ressources.", + "loc.input.label.ResourceGroupName": "Groupe de ressources", + "loc.input.help.ResourceGroupName": "Le nom du groupe de ressources est obligatoire quand la cible de déploiement est un emplacement de déploiement ou un environnement App Service.
Entrez ou sélectionnez le groupe de ressources Azure qui contient le service Azure App Service spécifié ci-dessus.", + "loc.input.label.SlotName": "Emplacement", + "loc.input.help.SlotName": "Entrez ou sélectionnez un emplacement existant autre que l'emplacement de production.", + "loc.input.label.DockerNamespace": "Registre ou espace de noms", + "loc.input.help.DockerNamespace": "Nom de domaine de premier niveau de type identificateur global unique pour votre registre ou espace de noms spécifique.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Image", + "loc.input.help.DockerRepository": "Nom du dépôt où sont stockés les images conteneurs.
Remarque : Le nom d'image complet est au format : '/:<étiquette>'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Étiquette", + "loc.input.help.DockerImageTag": "Les étiquettes sont facultatives. Il s'agit du mécanisme utilisé par les registres pour donner une version aux images Docker.
Remarque : Le nom d'image complet est au format suivant : '`/`:`'. Exemple : 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Application virtuelle", + "loc.input.help.VirtualApplication": "Spécifiez le nom de l'application virtuelle configurée dans le portail Azure. L'option n'est pas nécessaire pour les déploiements sur la racine App Service.", + "loc.input.label.Package": "Package ou dossier", + "loc.input.help.Package": "Chemin de fichier du package ou d'un dossier de contenu App Service généré par MSBuild, ou d'un fichier zip ou war compressé.
Les variables ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Mise en production](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)) et les caractères génériques sont pris en charge.
Exemple : $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip ou $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Pile d'exécution", + "loc.input.help.RuntimeStack": "Sélectionnez le framework et la version.", + "loc.input.label.RuntimeStackFunction": "Pile d'exécution", + "loc.input.help.RuntimeStackFunction": "Sélectionnez le framework et la version. Consultez [cette documentation](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) pour accéder aux versions de runtime prises en charge. Les anciennes valeurs telles que 'DOCKER|microsoft/azure-functions-*' sont dépréciées. Utilisez les nouvelles valeurs de la liste déroulante.", + "loc.input.label.StartupCommand": "Commande de démarrage ", + "loc.input.help.StartupCommand": "Entrez la commande de démarrage. Exemple :
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Type du script de déploiement", + "loc.input.help.ScriptType": "Personnalisez le déploiement en fournissant un script qui s'exécute sur Azure App Service, une fois que la tâche a effectué le déploiement avec succès. Par exemple, restaurez les packages des applications Node, PHP et Python. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script Inline", + "loc.input.label.ScriptPath": "Chemin du script de déploiement", + "loc.input.label.WebConfigParameters": "Générer les paramètres web.config pour les applications Python, Node.js, Go et Java", + "loc.input.help.WebConfigParameters": "Un fichier web.config standard va être généré et déployé sur Azure App Service, si l'application n'en a pas. Vous pouvez modifier les valeurs du fichier web.config. Celles-ci varient en fonction du framework d'application. Par exemple, pour l'application node.js, web.config a un fichier de démarrage et des valeurs de module iis_node. Cette fonctionnalité d'édition est réservée au fichier web.config généré. [En savoir plus](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Paramètres de l'application", + "loc.input.help.AppSettings": "Modifiez les paramètres d'application Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple :-Port 5000 - RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Paramètres de configuration", + "loc.input.help.ConfigurationSettings": "Modifiez les paramètres de configuration Web App qui suivent la valeur -key de la syntaxe. La valeur contenant des espaces doit être comprise entre des guillemets.
Exemple : - phpVersion 5.6 -linuxFXVersion : node|6.11", + "loc.input.label.UseWebDeploy": "Sélectionner la méthode de déploiement", + "loc.input.help.UseWebDeploy": "Si l'option est décochée, nous détectons automatiquement la meilleure méthode de déploiement en fonction du type de votre application, du format de votre package et d'autres paramètres.
Sélectionnez l'option permettant d'afficher les méthodes de déploiement prises en charge, puis choisissez-en une pour déployer votre application.", + "loc.input.label.DeploymentType": "Méthode de déploiement", + "loc.input.help.DeploymentType": "Choisissez la méthode de déploiement de l'application.", + "loc.input.label.TakeAppOfflineFlag": "Mettre l'application hors connexion", + "loc.input.help.TakeAppOfflineFlag": "Sélectionnez cette option pour mettre Azure App Service hors connexion en plaçant un fichier app_offline.htm dans le répertoire racine de l'App Service avant le début de l'opération de synchronisation. Le fichier est supprimé une fois l'opération de synchronisation correctement effectuée.", + "loc.input.label.SetParametersFile": "Fichier SetParameters", + "loc.input.help.SetParametersFile": "Facultatif : emplacement du fichier SetParameters.xml à utiliser.", + "loc.input.label.RemoveAdditionalFilesFlag": "Supprimer les fichiers supplémentaires à la destination", + "loc.input.help.RemoveAdditionalFilesFlag": "Sélectionnez l'option permettant de supprimer les fichiers du service Azure App Service qui n'ont aucun fichier correspondant dans le package ou dossier App Service.

Remarque : Tous les fichiers associés à une extension installée sur ce service Azure App Service sont également supprimés. Pour éviter que cela se produise, cochez la case 'Exclure les fichiers du dossier App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Exclure les fichiers du dossier App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Sélectionnez l'option permettant d'empêcher les fichiers du dossier App_Data d'être déployés/supprimés sur Azure App Service.", + "loc.input.label.AdditionalArguments": "Arguments supplémentaires", + "loc.input.help.AdditionalArguments": "Arguments Web Deploy supplémentaires suivant la syntaxe -key:value.
Ceux-ci sont appliqués au moment du déploiement d'Azure App Service, par exemple : -disableLink:AppPoolExtension -disableLink:ContentExtension.
Pour plus d'exemples de paramètres d'opération Web Deploy, consultez [cette page](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Renommer les fichiers verrouillés", + "loc.input.help.RenameFilesFlag": "Sélectionnez l'option permettant d'activer l'indicateur msdeploy MSDEPLOY_RENAME_LOCKED_FILES=1 dans les paramètres d'application Azure App Service. Si cette option est définie, elle permet à msdeploy de renommer les fichiers verrouillés durant le déploiement de l'application", + "loc.input.label.XmlTransformation": "Transformation XML", + "loc.input.help.XmlTransformation": "Les transformations de configuration sont exécutées pour '*Release.config' et '*..config' sur le fichier '*.config'.
Elles sont exécutées avant la substitution de variable.
Les transformations XML sont prises en charge uniquement pour la plateforme Windows.", + "loc.input.label.XmlVariableSubstitution": "Substitution de variable XML", + "loc.input.help.XmlVariableSubstitution": "Les variables définies dans le pipeline de build ou le pipeline de mise en production sont mappées aux entrées 'key' ou 'name' dans les sections appSettings, connectionStrings et applicationSettings d'un fichier config et d'un fichier parameters.xml. La substitution de variable est exécutée après les transformations de configuration.

Remarque : Si les mêmes variables sont définies dans le pipeline de mise en production et dans l'environnement, les variables d'environnement remplacent les variables de pipeline de mise en production.
", + "loc.input.label.JSONFiles": "Substitution de variable JSON", + "loc.input.help.JSONFiles": "Fournissez une liste de fichiers JSON séparés par une nouvelle ligne pour remplacer les valeurs de variables. Les noms de fichiers doivent être indiqués par rapport au dossier racine.
Pour remplacer les variables JSON imbriquées ou hiérarchiques, spécifiez-les à l'aide d'expressions JSONPath.

Par exemple, pour remplacer la valeur de 'ConnectionString' dans l'exemple ci-dessous, vous devez définir une variable en tant que 'Data.DefaultConnection.ConnectionString' dans la définition de build ou de mise en production (ou l'environnement du pipeline de mise en production).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La substitution de variable est exécutée après les transformations de configuration.

Remarque : Les variables de pipeline sont exclues de la substitution.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Chemin de dossier ou package App Service fourni non valide : %s", + "loc.messages.SetParamFilenotfound0": "Fichier de définition de paramètres introuvable : %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Transformations XML correctement appliquées", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Obtention effectuée des détails de la connexion de service d'Azure App Service : '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Erreur : Aucune méthode de déploiement de ce type n'existe", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Impossible de récupérer les détails de la connexion de service d'Azure App Service : %s. Code d'état : %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Impossible de récupérer les détails de connexion de service de la ressource Azure : '%s'. Code d'état : %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Historique de déploiement mis à jour sur %s", + "loc.messages.Failedtoupdatedeploymenthistory": "Échec de la mise à jour de l'historique de déploiement. Erreur : %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVERTISSEMENT : Impossible de mettre à jour l'état de déploiement : le point de terminaison SCM n'est pas activé pour ce site web", + "loc.messages.Unabletoretrievewebconfigdetails": "Impossible de récupérer les détails de la configuration d'App Service. Code d'état : '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Impossible de récupérer les paramètres d'application App Service. [Code d'état : '%s', message d'erreur : '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Impossible de mettre à jour les paramètres d'application d'App Service. Code d'état : '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Impossible de mettre à jour l'état du déploiement : l'ID de déploiement unique ne peut pas être récupéré", + "loc.messages.PackageDeploymentSuccess": "Déploiement réussi du package web sur App Service.", + "loc.messages.PackageDeploymentFailed": "Échec de déploiement du package web sur App Service.", + "loc.messages.Runningcommand": "Exécution de la commande : %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Déploiement du package web : %s sur le chemin virtuel (chemin physique) : %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Package %s déployé à l'aide du service kudu sur %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Impossible de déployer le package App Service à l'aide du service kudu : %s", + "loc.messages.Unabletodeploywebappresponsecode": "Impossible de déployer App Service en raison du code d'erreur %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Les packages générés par MSDeploy sont uniquement pris en charge par la plateforme Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Version installée non prise en charge : %s trouvé pour MSDeploy. Il doit s'agir au minimum de la version 3 ou d'une version ultérieure", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Emplacement introuvable de MSDeploy dans le Registre de l'ordinateur (Erreur : %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Package introuvable avec le modèle spécifié : %s
Vérifiez si le package mentionné dans la tâche est publié en tant qu'artefact dans la build ou à une étape précédente, et s'il est téléchargé dans le travail actuel.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Plusieurs packages correspondent au modèle spécifié : %s. Affinez le modèle de recherche.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Essayez de redéployer App Service avec l'option Mettre l'application hors connexion sélectionnée.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Essayez de redéployer App Service avec l'option Renommer les fichiers verrouillés sélectionnée.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Aucun fichier JSON ne correspond au modèle spécifique : %s.", + "loc.messages.Configfiledoesntexists": "Le fichier de configuration %s n'existe pas.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Échec d'écriture dans le fichier config %s avec l'erreur : %s", + "loc.messages.AppOfflineModeenabled": "Mode hors connexion de l'application activé.", + "loc.messages.Failedtoenableappofflinemode": "Échec de l'activation du mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.AppOflineModedisabled": "Mode hors connexion de l'application désactivé.", + "loc.messages.FailedtodisableAppOfflineMode": "Impossible de désactiver le mode hors connexion de l'application. Code d'état : %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Impossible d'effectuer les transformations XML sur une plateforme non-Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Erreur de transformation XML lors de la transformation de %s à l'aide de %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Les options de publication à l'aide de webdeploy ne sont prises en charge qu'en cas d'utilisation de l'agent Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour le type de package msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La publication à l'aide de l'option zip deploy n'est pas prise en charge pour une application virtuelle.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "La publication à l'aide des options zip deploy ou RunFromZip ne prend pas en charge le déploiement de fichiers war.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "La publication à l'aide de RunFromZip risque de ne pas prendre en charge le script de postdéploiement, s'il apporte des changements à wwwroot, car le dossier est ReadOnly.", + "loc.messages.ResourceDoesntExist": "La ressource '%s' n'existe pas. La ressource doit exister avant le déploiement.", + "loc.messages.EncodeNotSupported": "Encodage du fichier %s en %s détecté. La substitution de variable n'est pas prise en charge avec l'encodage de fichier %s. Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Impossible de détecter l'encodage du fichier %s (typeCode : %s). Les encodages pris en charge sont UTF-8 et UTF-16 LE.", + "loc.messages.ShortFileBufferError": "La mémoire tampon de fichier est insuffisante pour détecter le type d'encodage : %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Impossible de mettre à jour les informations sur la configuration App Service. Erreur : %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Informations sur la configuration App Service correctement mises à jour", + "loc.messages.RequestedURLforkuduphysicalpath": "URL demandée pour le chemin d'accès physique Kudu : %s", + "loc.messages.Physicalpathalreadyexists": "Le chemin d'accès physique '%s' existe déjà", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Chemin d'accès physique Kudu correctement créé : %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Échec de la création du chemin physique de kudu. Erreur : %s", + "loc.messages.FailedtocheckphysicalPath": "Échec de la vérification du chemin physique de kudu. Code d'erreur : %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'application virtuelle %s n'existe pas", + "loc.messages.JSONParseError": "Impossible d'analyser le fichier JSON : %s. Erreur : %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Substitution de variable JSON correctement appliquée.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La substitution de la variable XML a été appliquée.", + "loc.messages.failedtoUploadFileToKudu": "Impossible de charger le fichier %s sur Kudu (%s). Code d'état : %s", + "loc.messages.failedtoUploadFileToKuduError": "Impossible de charger le fichier %s sur Kudu (%s). Erreur : %s", + "loc.messages.ExecuteScriptOnKudu": "Exécution du script donné sur le service Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Impossible d'exécuter le script sur le service Kudu. Erreur : %s", + "loc.messages.FailedToRunScriptOnKudu": "Impossible d'exécuter le script sur Kudu : %s. Code d'état : %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Exécution réussie du script sur Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Le script exécuté a généré le code de retour '%s'. Erreur : %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Impossible de supprimer le fichier %s de Kudu (%s). Code d'état : %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Impossible de supprimer le fichier %s de Kudu (%s). Erreur : %s", + "loc.messages.ScriptFileNotFound": "Le fichier de script '%s' est introuvable.", + "loc.messages.InvalidScriptFile": "Le fichier de script fourni '%s' est non valide. Les extensions valides sont .bat et .cmd pour Windows, et.sh pour Linux", + "loc.messages.RetryForTimeoutIssue": "Échec de l'exécution du script en raison d'un problème de délai d'expiration. Nouvelle tentative.", + "loc.messages.stdoutFromScript": "Sortie standard du script : ", + "loc.messages.stderrFromScript": "Erreur standard du script : ", + "loc.messages.WebConfigAlreadyExists": "Le fichier web.config existe déjà. Aucune génération en cours.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Génération réussie du fichier web.config", + "loc.messages.FailedToGenerateWebConfig": "Échec de génération de web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Impossible d'obtenir le contenu du fichier : %s. Code d'état : %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Impossible d'obtenir le contenu du fichier : %s. Erreur : %s", + "loc.messages.ScriptStatusTimeout": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration.", + "loc.messages.PollingForFileTimeOut": "Impossible de récupérer (fetch) l'état du script en raison du délai d'expiration. Vous pouvez augmenter la limite du délai d'expiration en affectant le nombre de minutes nécessaires à la variable 'appservicedeploy.retrytimeout'.", + "loc.messages.InvalidPollOption": "Option d'interrogation non valide fournie : %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Il manque l'attribut '-appType' dans les paramètres de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask', 'node' et 'Go'.
Exemple : '-appType python_Bottle' (sans guillemets) dans le cas d'un framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Impossible de détecter le chemin du fichier 'settings.py' pour DJANGO_SETTINGS_MODULE. Vérifiez que le fichier 'settings.py' existe, ou indiquez le chemin approprié dans l'entrée de paramètre de Web.config au format suivant : '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Impossible d'appliquer la transformation pour le package donné. Vérifiez ce qui suit.", + "loc.messages.FailedToApplyTransformationReason1": "1. La transformation est-elle déjà appliquée pour le package MSBuild généré durant la build ? Si la réponse est oui, supprimez la balise pour chaque configuration dans le fichier csproj, puis effectuez une regénération. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Vérifiez que le fichier config et les fichiers de transformation sont présents dans le même dossier à l'intérieur du package.", + "loc.messages.AutoParameterizationMessage": "Les attributs de ConnectionString dans Web.config sont paramétrables par défaut. Notez que la transformation n'a aucun effet sur les attributs de connectionString, car la valeur est remplacée durant le déploiement par les fichiers 'Parameters.xml' ou 'SetParameters.xml'. Vous pouvez désactiver le paramétrage automatique en définissant /p:AutoParameterizationWebConfigConnectionStrings=False durant la génération du package MSBuild.", + "loc.messages.UnsupportedAppType": "Le type d'application '%s' n'est pas pris en charge dans la génération de Web.config. Les valeurs valides pour '-appType' sont : 'python_Bottle', 'python_Django', 'python_Flask' et 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Impossible de récupérer (fetch) l'URL d'autorité.", + "loc.messages.UnableToFetchActiveDirectory": "Impossible de récupérer (fetch) l'ID de ressource Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Mise à jour réussie de la pile d'exécution et de la commande de démarrage.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Échec de la mise à jour de la pile d'exécution et de la commande de démarrage. Erreur : %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Mise à jour réussie des paramètres de l'application.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Échec de la mise à jour des paramètres de l'application. Erreur : %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Échec de la récupération (fetch) des métadonnées de la WebApp AzureRM. ErrorCode : %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Impossible de mettre à jour les métadonnées de la WebApp AzureRM. Code d'erreur : %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Impossible de récupérer les informations d'identification d'Azure Container Registry.[Code d'état : '%s']", + "loc.messages.UnableToReadResponseBody": "Impossible de lire le corps de la réponse. Erreur : %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Impossible de mettre à jour les détails de configuration de la WebApp. StatusCode : '%s'", + "loc.messages.AddingReleaseAnnotation": "Ajout d'une annotation de mise en production pour la ressource Application Insights '%s'", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Ajout réussi de l'annotation de mise en production à Application Insight : %s", + "loc.messages.FailedAddingReleaseAnnotation": "Échec de l'ajout de l'annotation de mise en production. %s", + "loc.messages.RenameLockedFilesEnabled": "Le renommage des fichiers verrouillés est activé pour App Service.", + "loc.messages.FailedToEnableRenameLockedFiles": "Échec de l'activation du renommage des fichiers verrouillés. Erreur : %s", + "loc.messages.WebJobsInProgressIssue": "Un petit nombre de WebJobs à l'état en cours d'exécution empêchent le processus de déploiement de supprimer les fichiers. Désactivez l'option Supprimer les fichiers supplémentaires à l'emplacement de destination, ou arrêtez les travaux continus avant le déploiement.", + "loc.messages.FailedToFetchKuduAppSettings": "Échec de la récupération (fetch) des paramètres d'application Kudu. Erreur : %s", + "loc.messages.FailedToCreatePath": "Échec de la création du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFile": "Échec de la suppression du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToDeleteFolder": "Échec de la suppression du dossier '%s' dans Kudu. Erreur : %s", + "loc.messages.FailedToUploadFile": "Échec du chargement du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToGetFileContent": "Échec de l'obtention du contenu du fichier '%s/%s' à partir de Kudu. Erreur : %s", + "loc.messages.FailedToListPath": "Échec du listage du chemin '%s' à partir de Kudu. Erreur : %s", + "loc.messages.RetryToDeploy": "Nouvelle tentative de déploiement du package.", + "loc.messages.FailedToGetAppServiceDetails": "Échec de la récupération (fetch) des détails de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Échec de la récupération (fetch) du profil de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Échec de la mise à jour des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceMetadata": "Échec de l'obtention des métadonnées de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Échec de l'application du correctif à la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Échec de la mise à jour de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Échec de l'obtention de la configuration de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Échec de la récupération (fetch) des informations d'identification de publication de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Échec de l'obtention des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Échec de la mise à jour des paramètres d'application de l'App Service '%s'. Erreur : %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentative de mise à jour des paramètres de configuration d'App Service. Données : %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Mise à jour effectuée des paramètres de configuration d'App Service.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentative de mise à jour des paramètres d'application d'App Service. Données : %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Les paramètres d'application d'App Service sont déjà présents.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Les chaînes de connexion d'App Service sont déjà présentes.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Mise à jour effectuée des paramètres d'application d'App Service et des paramètres d'application de Kudu.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Plusieurs groupes de ressources trouvés pour l'App Service '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Échec du déploiement de package à l'aide de ZIP Deploy. Pour plus d'informations, consultez les journaux.", + "loc.messages.PackageDeploymentInitiated": "Déploiement de package avec ZIP Deploy lancé.", + "loc.messages.WarPackageDeploymentInitiated": "Lancement effectué du déploiement de package à l'aide de WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Échec de l'obtention des journaux de déploiement. Erreur : %s", + "loc.messages.GoExeNameNotPresent": "Nom de l’exe Go absent", + "loc.messages.WarDeploymentRetry": "Nouvelle tentative de déploiement du fichier war, car il ne s'est pas décompressé correctement.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assurez-vous que l'ordinateur utilise le protocole TLS 1.2 ou ultérieur. Consultez https://aka.ms/enableTlsv2 pour plus d'informations sur l'activation de TLS sur votre ordinateur.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Configurez MSI (Managed Service Identity) pour la machine virtuelle 'https://aka.ms/azure-msi-docs'. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Code d'état : %s, message d'état : %s", + "loc.messages.XmlParsingFailed": "Impossible d'analyser le fichier publishProfileXML. Erreur : %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La propriété n'existe pas dans le profil de publication", + "loc.messages.InvalidConnectionType": "Type de connexion de service non valide", + "loc.messages.InvalidImageSourceType": "Type de source d'image non valide", + "loc.messages.InvalidPublishProfile": "Le fichier de profil de publication est non valide.", + "loc.messages.ASE_SSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez affecter la valeur true à une variable nommée VSTS_ARM_REST_IGNORE_SSL_ERRORS dans le pipeline de build ou le pipeline de mise en production", + "loc.messages.ZipDeployLogsURL": "Les journaux Zip Deploy peuvent être consultés sur %s", + "loc.messages.DeployLogsURL": "Les journaux de déploiement peuvent être consultés sur %s", + "loc.messages.AppServiceApplicationURL": "URL d'application App Service : %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Pour utiliser un certificat dans App Service, celui-ci doit être signé par une autorité de certification de confiance. Si votre application web génère des erreurs de validation de certificat, cela signifie probablement que vous utilisez un certificat auto-signé. Pour résoudre ces erreurs, vous devez passer -allowUntrusted dans des arguments supplémentaires de l'option Web Deploy.", + "loc.messages.FailedToGetResourceID": "Échec de l'obtention de l'ID de ressource pour le type de ressource '%s' et le nom de ressource '%s'. Erreur : %s", + "loc.messages.JarPathNotPresent": "Le chemin du fichier jar Java n'est pas présent", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Échec de la mise à jour de la ressource Application Insights '%s'. Erreur : %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passez de Web Deploy à l'exécution à partir d'un package, ce qui permet d'éviter l'erreur FILE_IN_USE. Notez que l'exécution à partir d'un package ne prend pas en charge le type de package msBuild. Changez le format de votre package pour utiliser cette méthode de déploiement." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..f4bfc0ca0356 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Distribuzione di Servizio app di Azure", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Esegue la distribuzione in Servizio app di Azure di un'app Web, per dispositivi mobili o API con Docker, Java, .NET, .NET Core, Node.js, PHP, Python o Ruby", + "loc.instanceNameFormat": "Distribuzione servizio app di Azure: $(WebAppName)", + "loc.releaseNotes": "Novità della versione 4.*
Supporto di Zip Deploy, Run From Package, War Deploy [Dettagli](https://aka.ms/appServiceDeploymentMethods)
Supporto di Ambienti del servizio app
Interfaccia utente migliorata per l'individuazione dei diversi tipi di servizio app supportati dall'attività
Il metodo di distribuzione preferito è Run From Package, con cui i file nella cartella wwwroot diventano di sola lettura
Per altre informazioni, fare clic [qui](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Opzioni di trasformazioni di file e sostituzioni di variabili", + "loc.group.displayName.AdditionalDeploymentOptions": "Opzioni di distribuzione aggiuntive", + "loc.group.displayName.PostDeploymentAction": "Azione post-distribuzione", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Impostazioni applicazione e configurazione", + "loc.input.label.ConnectionType": "Tipo di connessione", + "loc.input.help.ConnectionType": "Selezionare il tipo di connessione al servizio da usare per distribuire l'app Web.
Selezionare Profilo di pubblicazione per usare il profilo di pubblicazione creato da Visual Studio. [Altre informazioni](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceName": "Selezionare la sottoscrizione di Azure Resource Manager per la distribuzione.", + "loc.input.label.PublishProfilePath": "Percorso del profilo di pubblicazione", + "loc.input.help.PublishProfilePath": "Percorso del profilo di pubblicazione creato da Visual Studio", + "loc.input.label.PublishProfilePassword": "Password del profilo di pubblicazione", + "loc.input.help.PublishProfilePassword": "È consigliabile archiviare la password in una variabile di segreto e usare qui tale variabile, ad esempio $(Password).", + "loc.input.label.WebAppKind": "Tipo del servizio app", + "loc.input.help.WebAppKind": "Consente di scegliere tra App Web in Windows, App Web in Linux, App Web per contenitori, App per le funzioni, App per le funzioni in Linux, App per le funzioni per contenitori e App per dispositivi mobili.", + "loc.input.label.WebAppName": "Nome del servizio app", + "loc.input.help.WebAppName": "Consente di immettere o selezionare il nome di un servizio app di Azure. Verranno elencati solo i servizi app basati sul tipo di app selezionato.", + "loc.input.label.DeployToSlotOrASEFlag": "Distribuisci nello slot o nell'ambiente del servizio app", + "loc.input.help.DeployToSlotOrASEFlag": "Consente di selezionare l'opzione per la distribuzione in uno slot di distribuzione esistente o in un ambiente del servizio app di Azure.
Per entrambe le destinazioni l'attività richiede il nome del gruppo di risorse.
Se la destinazione di distribuzione è uno slot, per impostazione predefinita la distribuzione viene eseguita nello slot di produzione. È anche possibile specificare qualsiasi altro nome di slot esistente.
Se la destinazione di distribuzione è un ambiente del servizio app di Azure, lasciare il nome dello slot impostato su 'produzione' e specificare solo il nome del gruppo di risorse.", + "loc.input.label.ResourceGroupName": "Gruppo di risorse", + "loc.input.help.ResourceGroupName": "Il nome del gruppo di risorse è obbligatorio quando la destinazione di distribuzione è uno slot di distribuzione o un ambiente del servizio app.
Immettere o selezionare il gruppo di risorse di Azure che contiene il servizio app di Azure specificato sopra.", + "loc.input.label.SlotName": "Slot", + "loc.input.help.SlotName": "Immettere o selezionare uno slot esistente diverso da quello di produzione.", + "loc.input.label.DockerNamespace": "Registro o spazio dei nomi", + "loc.input.help.DockerNamespace": "Nome di dominio di primo livello univoco a livello globale per il registro o lo spazio dei nomi specifico.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerRepository": "Immagine", + "loc.input.help.DockerRepository": "Nome del repository in cui vengono archiviate le immagini del contenitore.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'registropersonale.azurecr.io/nginx:latest'.", + "loc.input.label.DockerImageTag": "Tag", + "loc.input.help.DockerImageTag": "I tag sono facoltativi e costituiscono il meccanismo usato dai registri per assegnare una versione alle immagini Docker.
Nota: il formato del nome completo dell'immagine è: '`/`:`'. Esempio: 'myregistry.azurecr.io/nginx:latest'.", + "loc.input.label.VirtualApplication": "Applicazione virtuale", + "loc.input.help.VirtualApplication": "Consente di specificare il nome dell'applicazione virtuale configurata nel portale di Azure. L'opzione non è necessaria per le distribuzioni nella radice del servizio app.", + "loc.input.label.Package": "Pacchetto o cartella", + "loc.input.help.Package": "Percorso file del pacchetto o di una cartella che include il contenuto del servizio app generato da MSBuild oppure un file WAR o ZIP compresso.
Variabili ( [Compilazione](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Versione](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)). I caratteri jolly sono supportati.
Ad esempio, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip o $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Stack di runtime", + "loc.input.help.RuntimeStack": "Consente di selezionare il framework e la versione.", + "loc.input.label.RuntimeStackFunction": "Stack di runtime", + "loc.input.help.RuntimeStackFunction": "Consente di selezionare il framework e la versione. Fare riferimento a [questo documento](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) per le versioni del runtime supportate. I valori precedenti, come `DOCKER|microsoft/azure-functions-*`, sono deprecati. Usare i nuovi valori dall'elenco a discesa.", + "loc.input.label.StartupCommand": "Comando di avvio ", + "loc.input.help.StartupCommand": "Immettere il comando di avvio, ad esempio
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "Tipo dello script di distribuzione", + "loc.input.help.ScriptType": "È possibile personalizzare la distribuzione fornendo uno script che verrà eseguito nel servizio app di Azure una volta completata la distribuzione dell'attività, ad esempio per ripristinare i pacchetti per le applicazioni Node, PHP e Python. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Script inline", + "loc.input.label.ScriptPath": "Percorso dello script di distribuzione", + "loc.input.label.WebConfigParameters": "Genera i parametri di web.config per app Python, Node.js, Go e Java", + "loc.input.help.WebConfigParameters": "Verrà generato un file Web.config standard che verrà distribuito nel servizio app di Azure, se non è disponibile per l'applicazione. I valori presenti nel file Web.config sono modificabili e possono variare a seconda del framework dell'applicazione. Ad esempio, per l'applicazione node.js il file Web.config includerà i valori per il file di avvio e il modulo iis_node. Questa funzionalità di modifica è utilizzabile solo per il file Web.config generato. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Impostazioni app", + "loc.input.help.AppSettings": "Consente di modificare le impostazioni applicazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Ora solare fuso orientale\"", + "loc.input.label.ConfigurationSettings": "Impostazioni di configurazione", + "loc.input.help.ConfigurationSettings": "Consente di modificare le impostazioni di configurazione dell'app Web successive al valore -key della sintassi. Il valore che contiene spazi deve essere racchiuso tra virgolette.
Esempio: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Seleziona il metodo di distribuzione", + "loc.input.help.UseWebDeploy": "Se questa opzione è deselezionata, il metodo di distribuzione migliore verrà rilevato automaticamente in base al tipo di app, al formato del pacchetto e ad altri parametri.
Selezionare l'opzione per visualizzare i metodi di distribuzione supportati e sceglierne uno per la distribuzione dell'app.", + "loc.input.label.DeploymentType": "Metodo di distribuzione", + "loc.input.help.DeploymentType": "Consente di scegliere il metodo di distribuzione per l'app.", + "loc.input.label.TakeAppOfflineFlag": "Porta app offline", + "loc.input.help.TakeAppOfflineFlag": "Consente di selezionare l'opzione per portare offline il servizio app di Azure inserendo un file app_offline.htm nella directory radice del servizio app prima dell'inizio dell'operazione di sincronizzazione. Il file verrà rimosso al termine dell'operazione di sincronizzazione.", + "loc.input.label.SetParametersFile": "File SetParameters", + "loc.input.help.SetParametersFile": "Facoltativo: percorso del file SetParameters.xml da usare.", + "loc.input.label.RemoveAdditionalFilesFlag": "Rimuovi file aggiuntivi nella destinazione", + "loc.input.help.RemoveAdditionalFilesFlag": "Consente di selezionare l'opzione per eliminare nel servizio app di Azure i file per cui non esistono file corrispondenti nella cartella o nel pacchetto del servizio app.

Nota: verranno rimossi anche tutti i file correlati a eventuali estensioni installate in questo servizio app di Azure. Per evitarlo, selezionare la casella di controllo 'Escludi file dalla cartella App_Data'. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Escludi file dalla cartella App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Consente di selezionare l'opzione per impedire che i file nella cartella App_Data vengano distribuiti nel servizio app di Azure o eliminati da tale servizio.", + "loc.input.label.AdditionalArguments": "Argomenti aggiuntivi", + "loc.input.help.AdditionalArguments": "Argomenti aggiuntivi di Web Deploy conformi alla sintassi -chiave:valore.
Tali argomenti verranno applicati durante la distribuzione del servizio app di Azure. Esempio: -disableLink:AppPoolExtension -disableLink:ContentExtension.
Per altri esempi di impostazioni per le operazioni di Web Deploy, fare clic [qui](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Rinomina i file bloccati", + "loc.input.help.RenameFilesFlag": "Consente di selezionare l'opzione per abilitare il flag MSDEPLOY_RENAME_LOCKED_FILES=1 di MSDeploy nelle impostazioni dell'applicazione del servizio app di Azure. Se impostata, l'opzione consente a MSDeploy di rinominare file bloccati che vengono bloccati durante la distribuzione dell'app", + "loc.input.label.XmlTransformation": "Trasformazione XML", + "loc.input.help.XmlTransformation": "Le trasformazioni dei file config verranno eseguite per `*.Release.config` e `*..config` nel file `*.config`.
Le trasformazioni dei file config verranno eseguite prima della sostituzione delle variabili.
Le trasformazioni XML sono supportate solo per la piattaforma Windows.", + "loc.input.label.XmlVariableSubstitution": "Sostituzione di variabili XML", + "loc.input.help.XmlVariableSubstitution": "Le variabili definite nelle pipeline di compilazione o di versione verranno confrontate con le voci 'key' o 'name' nelle sezioni appSettings, applicationSettings e connectionStrings di tutti i file config e parameters.xml. La sostituzione delle variabili viene eseguita dopo le trasformazioni dei file config.

Nota: se si definiscono le stesse variabili nella pipeline di versione e nell'ambiente, quelle di ambiente prevarranno su quelle della pipeline di versione.
", + "loc.input.label.JSONFiles": "Sostituzione di variabili JSON", + "loc.input.help.JSONFiles": "Consente di specificare l'elenco di file JSON delimitati da caratteri di nuova riga per sostituire i valori delle variabili. I nomi di file specificati devono essere relativi alla cartella radice.
Per sostituire le variabili JSON annidate o gerarchiche, specificarle usando espressioni JSONPath.

Ad esempio, per sostituire il valore di ‘ConnectionString’ nell'esempio seguente, è necessario definire una variabile come ‘Data.DefaultConnection.ConnectionString’ nella pipeline di compilazione o versione (o nell'ambiente della pipeline di versione).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
La sostituzione delle variabili viene eseguita dopo le trasformazioni della configurazione.

Nota: le variabili delle pipeline vengono escluse nella sostituzione.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Il percorso specificato per il pacchetto o la cartella del servizio app non è valido: %s", + "loc.messages.SetParamFilenotfound0": "Il file dei parametri del set non è stato trovato: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "Le trasformazioni XML sono state applicate", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "I dettagli della connessione al servizio per il servizio app di Azure sono stati recuperati: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Errore: non esiste alcun metodo di distribuzione di questo tipo", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Non è possibile recuperare i dettagli della connessione al servizio per il servizio app di Azure: %s. Codice di stato: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Non è possibile recuperare i dettagli della connessione al servizio per la risorsa di Azure '%s'. Codice di stato: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "L'aggiornamento della cronologia di distribuzione all'indirizzo %s è stato completato", + "loc.messages.Failedtoupdatedeploymenthistory": "Non è stato possibile aggiornare la cronologia di distribuzione. Errore: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "AVVISO: non è possibile aggiornare lo stato di distribuzione. L'endpoint di Gestione controllo del codice sorgente non è abilitato per questo sito Web", + "loc.messages.Unabletoretrievewebconfigdetails": "Non è possibile recuperare i dettagli di configurazione del servizio app. Codice di stato: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "Non è possibile recuperare le impostazioni dell'applicazione del servizio app. [Codice di stato: '%s'. Messaggio di errore: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "Non è possibile aggiornare le impostazioni dell'applicazione del servizio app. Codice di stato: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Non è possibile aggiornare lo stato di distribuzione. L'ID distribuzione univoco non è stato recuperato", + "loc.messages.PackageDeploymentSuccess": "Il pacchetto Web è stato distribuito nel servizio app.", + "loc.messages.PackageDeploymentFailed": "Non è stato possibile distribuire il pacchetto Web nel servizio app.", + "loc.messages.Runningcommand": "Esecuzione del comando: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Distribuzione del pacchetto Web %s nel percorso virtuale (percorso fisico) %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "La distribuzione del pacchetto %s con il servizio Kudu all'indirizzo %s è riuscita", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Non è stato possibile distribuire il pacchetto del servizio app con il servizio Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Non è possibile distribuire il servizio app a causa del codice errore: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "I pacchetti generati da MSDeploy sono supportati solo per la piattaforma Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "La versione installata non è supportata. La versione trovata per MSDeploy è %s, ma deve essere almeno 3 o successiva", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Il percorso di MSDeploy non è stato trovato dal Registro di sistema nel computer (errore: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Non è stato trovato alcun pacchetto con il criterio specificato: %s
Verificare se il pacchetto menzionato nell'attività viene pubblicato come artefatto nella compilazione o in una fase precedente e quindi scaricato nel processo corrente.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Più pacchetti corrispondono al criterio specificato %s. Restringere i criteri di ricerca.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Porta l'applicazione offline.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Provare a distribuire di nuovo il servizio app dopo aver selezionato l'opzione Rinomina i file bloccati.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Non sono stati trovati file JSON corrispondenti al criterio specificato: %s.", + "loc.messages.Configfiledoesntexists": "Il file di configurazione %s non esiste.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Non è stato possibile scrivere nel file config %s. Errore: %s", + "loc.messages.AppOfflineModeenabled": "La modalità offline dell'app è abilitata.", + "loc.messages.Failedtoenableappofflinemode": "Non è stato possibile abilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.AppOflineModedisabled": "La modalità offline dell'app è disabilitata.", + "loc.messages.FailedtodisableAppOfflineMode": "Non è stato possibile disabilitare la modalità offline dell'app. Codice di stato: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Non è possibile eseguire trasformazioni XML su una piattaforma non Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Si è verificato un errore di trasformazione XML durante la trasformazione di %s con %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Le opzioni di pubblicazione con Distribuzione Web sono supportate solo quando si usa l'agente Windows", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "La pubblicazione con l'opzione zipdeploy non è supportata per il tipo di pacchetto msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "La pubblicazione con l'opzione zipdeploy non è supportata per l'applicazione virtuale.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "Se si pubblica usando le opzioni zipdeploy o RunFromZip, la distribuzione di file war non è supportata.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "Se si pubblica usando RunFromZip, è possibile che lo script post-distribuzione non sia supportato se apporta modifiche a wwwroot perché la cartella è di sola lettura.", + "loc.messages.ResourceDoesntExist": "La risorsa '%s' non esiste. La risorsa deve esistere prima della distribuzione.", + "loc.messages.EncodeNotSupported": "La codifica rilevata del file %s è %s. La sostituzione delle variabili non è supportata con la codifica file %s. Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Non è possibile rilevare la codifica del file %s (typeCode: %s). Le codifiche supportate sono UTF-8 e UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Il buffer di file è troppo piccolo per il rilevamento del tipo di codifica: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Non è stato possibile aggiornare i dettagli della configurazione del servizio app. Errore: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "I dettagli della configurazione del servizio app sono stati aggiornati", + "loc.messages.RequestedURLforkuduphysicalpath": "È stato richiesto l'URL per il percorso fisico di Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Il percorso fisico '%s' esiste già", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Il percorso fisico di Kudu è stato creato: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Non è stato possibile creare il percorso fisico di Kudu. Errore: %s", + "loc.messages.FailedtocheckphysicalPath": "Non è stato possibile verificare il percorso fisico di Kudu. Codice errore: %s", + "loc.messages.VirtualApplicationDoesNotExist": "L'applicazione virtuale non esiste: %s", + "loc.messages.JSONParseError": "Non è possibile analizzare il file JSON: %s. Errore: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili JSON è stata applicata.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "La sostituzione di variabili XML è stata applicata.", + "loc.messages.failedtoUploadFileToKudu": "Non è possibile caricare il file %s in Kudu (%s). Codice di stato: %s", + "loc.messages.failedtoUploadFileToKuduError": "Non è stato possibile caricare il file %s in Kudu (%s). Errore: %s", + "loc.messages.ExecuteScriptOnKudu": "Esecuzione dello script specificato nel servizio Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Non è possibile eseguire lo script nel servizio Kudu. Errore: %s", + "loc.messages.FailedToRunScriptOnKudu": "Non è possibile eseguire lo script in Kudu: %s. Codice di stato: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Lo script è stato eseguito in Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Il codice restituito dallo script eseguito è '%s'. Errore: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Non è possibile eliminare il file %s da Kudu (%s). Codice di stato: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Non è possibile eliminare il file %s da Kudu (%s). Errore: %s", + "loc.messages.ScriptFileNotFound": "Il file di script '%s' non è stato trovato.", + "loc.messages.InvalidScriptFile": "Il file di script specificato '%s' non è valido. Le estensioni valide sono bat e cmd per Windows e sh per Linux", + "loc.messages.RetryForTimeoutIssue": "L'esecuzione dello script non è riuscita a causa del timeout. Verrà effettuato un nuovo tentativo.", + "loc.messages.stdoutFromScript": "Output standard dello script: ", + "loc.messages.stderrFromScript": "Errore standard dello script: ", + "loc.messages.WebConfigAlreadyExists": "Il file Web.config esiste già e non verrà generato.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Il file Web.config è stato generato", + "loc.messages.FailedToGenerateWebConfig": "Non è stato possibile generare il file Web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Non è possibile recuperare il contenuto del file: %s. Codice di stato: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Non è possibile recuperare il contenuto del file: %s. Errore: %s", + "loc.messages.ScriptStatusTimeout": "Non è possibile recuperare lo stato dello script a causa del timeout.", + "loc.messages.PollingForFileTimeOut": "Non è possibile recuperare lo stato dello script a causa del timeout. È possibile aumentare il limite di timeout impostando la variabile 'appservicedeploy.retrytimeout' sul numero di minuti necessari.", + "loc.messages.InvalidPollOption": "L'opzione di polling specificata %s non è valida.", + "loc.messages.MissingAppTypeWebConfigParameters": "Nei parametri di Web.config manca l'attributo '-appType'. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask', 'node' e 'Go'.
Esempio: '-appType python_Bottle' (senza virgolette) nel caso del framework Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Il percorso del file 'settings.py' di DJANGO_SETTINGS_MODULE non è stato rilevato. Assicurarsi che il file 'settings.py' sia esistente oppure specificare il percorso corretto nel campo di input del parametro di Web.config nel formato seguente: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "Non è possibile applicare la trasformazione per il pacchetto specificato. Eseguire le verifiche seguenti.", + "loc.messages.FailedToApplyTransformationReason1": "1. Verificare se la trasformazione è già stata applicata per il pacchetto generato da MSBuild durante la compilazione. In caso affermativo, rimuovere il tag per ogni file config nel file csproj e ricompilare. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Assicurarsi che il file config e i file di trasformazione siano presenti nella stessa cartella all'interno del pacchetto.", + "loc.messages.AutoParameterizationMessage": "Per impostazione predefinita, agli attributi di ConnectionString in Web.config sono associati parametri. Si noti che la trasformazione non ha effetto sugli attributi di ConnectionString perché durante la distribuzione il valore viene sostituito dai file 'Parameters.xml' o 'SetParameters.xml'. Per disabilitare l'aggiunta automatica di parametri, impostare /p:AutoParameterizationWebConfigConnectionStrings=False durante la generazione del pacchetto MSBuild.", + "loc.messages.UnsupportedAppType": "Il tipo di app '%s' non è supportato nella generazione di Web.config. I valori validi per '-appType' sono: 'python_Bottle', 'python_Django', 'python_Flask' e 'node'", + "loc.messages.UnableToFetchAuthorityURL": "Non è possibile recuperare l'URL dell'autorità.", + "loc.messages.UnableToFetchActiveDirectory": "Non è possibile recuperare l'ID risorsa di Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Lo stack di runtime e il comando di avvio sono stati aggiornati.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Non è stato possibile aggiornare lo stack di runtime e il comando di avvio. Errore: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Le impostazioni dell'app sono state aggiornate.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Non è stato possibile aggiornare le impostazioni dell'app. Errore: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Non è stato possibile recuperare i metadati dell'app Web AzureRM. Codice errore: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Non è possibile aggiornare i metadati dell'app Web di AzureRM. Codice errore: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Non è possibile recuperare le credenziali di Registro Azure Container. [Codice di stato: '%s']", + "loc.messages.UnableToReadResponseBody": "Non è possibile leggere il corpo della risposta. Errore: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Non è possibile aggiornare i dettagli di configurazione dell'app Web. Codice di stato: '%s'", + "loc.messages.AddingReleaseAnnotation": "Aggiunta dell'annotazione versione per la risorsa '%s' di Application Insights", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "L'annotazione versione è stata aggiunta alla risorsa di Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Non è stato possibile aggiungere l'annotazione versione. %s", + "loc.messages.RenameLockedFilesEnabled": "La ridenominazione dei file bloccati è abilitata per il servizio app.", + "loc.messages.FailedToEnableRenameLockedFiles": "Non è stato possibile abilitare la ridenominazione de file bloccati. Errore: %s", + "loc.messages.WebJobsInProgressIssue": "Qualche processo Web nello stato in esecuzione impedisce alla distribuzione di rimuovere i file. È possibile disabilitare l'opzione 'Rimuovi file aggiuntivi nella destinazione' oppure arrestare i processi continui prima della distribuzione.", + "loc.messages.FailedToFetchKuduAppSettings": "Non è stato possibile recuperare le impostazioni dell'app Kudu. Errore: %s", + "loc.messages.FailedToCreatePath": "Non è stato possibile creare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFile": "Non è stato possibile eliminare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToDeleteFolder": "Non è stato possibile eliminare la cartella '%s' da Kudu. Errore: %s", + "loc.messages.FailedToUploadFile": "Non è stato possibile caricare il file '%s/%s' da Kudu. Errore: %s", + "loc.messages.FailedToGetFileContent": "Non è stato possibile ottenere il contenuto '%s/%s' del file da Kudu. Errore: %s", + "loc.messages.FailedToListPath": "Non è stato possibile elencare il percorso '%s' da Kudu. Errore: %s", + "loc.messages.RetryToDeploy": "Verrà effettuato un nuovo tentativo di distribuzione del pacchetto.", + "loc.messages.FailedToGetAppServiceDetails": "Non è stato possibile recuperare i dettagli del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Non è stato possibile recuperare il profilo di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Non è stato possibile aggiornare i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Non è stato possibile ottenere i metadati del servizio app '%s'. Errore: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Non è stato possibile correggere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Non è stato possibile aggiornare la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Non è stato possibile ottenere la configurazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Non è stato possibile recuperare le credenziali di pubblicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Non è stato possibile ottenere le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Non è stato possibile aggiornare le impostazioni applicazione del servizio app '%s'. Errore: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Tentativo di aggiornamento delle impostazioni di configurazione del servizio app. Dati: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Le impostazioni di configurazione del servizio app sono state aggiornate.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Tentativo di aggiornamento delle impostazioni applicazione del servizio app. Dati: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Le impostazioni applicazione del servizio app sono già presenti.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Le stringhe di connessione del servizio app sono già presenti.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Le impostazioni applicazione del servizio app e le impostazioni applicazione di Kudu sono state aggiornate.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Sono stati trovati più gruppi di risorse per il servizio app '%s'.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "La distribuzione del pacchetto con zipdeploy non è riuscita. Per maggiori dettagli, vedere i log.", + "loc.messages.PackageDeploymentInitiated": "La distribuzione del pacchetto con zipdeploy è stata avviata.", + "loc.messages.WarPackageDeploymentInitiated": "La distribuzione del pacchetto con WAR Deploy è stata avviata.", + "loc.messages.FailedToGetDeploymentLogs": "Non è stato possibile ottenere i log di distribuzione. Errore: %s", + "loc.messages.GoExeNameNotPresent": "Il nome dell'eseguibile Go non è presente", + "loc.messages.WarDeploymentRetry": "Verrà effettuato un nuovo tentativo di distribuzione del file WAR perché in precedenza non si è espanso correttamente.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Assicurarsi che il computer usi il protocollo TLS 1.2 o superiore. Per altre informazioni su come abilitare TLS nel computer, vedere https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Non è stato possibile recuperare il token di accesso per Azure. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Configurare l'identità del servizio gestita per la macchina virtuale 'https://aka.ms/azure-msi-docs'. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.XmlParsingFailed": "Non è possibile analizzare il file XML del profilo di pubblicazione. Errore: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] La proprietà non esiste nel profilo di pubblicazione", + "loc.messages.InvalidConnectionType": "Il tipo di connessione al servizio non è valido", + "loc.messages.InvalidImageSourceType": "Il tipo di origine immagini non è valido", + "loc.messages.InvalidPublishProfile": "Il file del profilo di pubblicazione non è valido.", + "loc.messages.ASE_SSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario impostare su true una variabile denominata VSTS_ARM_ARM_REST_IGNORE_SSL_ERRORS nella pipeline di compilazione o versione", + "loc.messages.ZipDeployLogsURL": "I log di zipdeploy possono essere visualizzati in %s", + "loc.messages.DeployLogsURL": "I log di distribuzione possono essere visualizzati in %s", + "loc.messages.AppServiceApplicationURL": "URL dell'applicazione del servizio app: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Per usare un certificato nel servizio app, il certificato deve essere firmato da un'autorità di certificazione attendibile. Se l'app Web restituisce errori di convalida del certificato, è possibile che si stia usando un certificato autofirmato. Per risolvere gli errori, è necessario passare -allowUntrusted negli argomenti aggiuntivi dell'opzione di distribuzione Web.", + "loc.messages.FailedToGetResourceID": "Non è stato possibile ottenere l'ID risorsa per il tipo di risorsa '%s' e il nome di risorsa '%s'. Errore: %s", + "loc.messages.JarPathNotPresent": "Il percorso del file jar Java non è presente", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Non è stato possibile aggiornare la risorsa '%s' di Application Insights. Errore: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Passare da Distribuzione Web a Run From Package, che consente di evitare errori FILE_IN_USE. Tenere presente che Run From Package non supporta il tipo di pacchetto msBuild. Per usare questo metodo di distribuzione, modificare il formato del pacchetto." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c363ab7cf9cb --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service デプロイ", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker、Java、.NET、.NET Core、Node.js、PHP、Python、Ruby を使用して、Web、モバイル、API アプリを Azure App Service にデプロイします", + "loc.instanceNameFormat": "Azure App Service の配置: $(WebAppName)", + "loc.releaseNotes": "バージョン 4.* での変更点
Zip Deploy、Run From Package、War Deploy のサポート [詳細はこちら](https://aka.ms/appServiceDeploymentMethods)
App Service Environment のサポート
タスクによってサポートされる複数のアプリ サービス タイプを見つけるための、UI の向上
推奨されるデプロイ方法は、wwwroot フォルダー内のファイルが読み取り専用になる Run From Package です。
詳細については、[こちら](https://aka.ms/azurermwebdeployreadme)をクリックしてください。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "ファイルの変換と変数の置換のオプション", + "loc.group.displayName.AdditionalDeploymentOptions": "追加の配置オプション", + "loc.group.displayName.PostDeploymentAction": "配置後アクション", + "loc.group.displayName.ApplicationAndConfigurationSettings": "アプリケーションと構成の設定", + "loc.input.label.ConnectionType": "接続の種類", + "loc.input.help.ConnectionType": "Web アプリの配置に使用するサービス接続の種類を選択してください。
Visual Studio で作成された公開プロファイルを使用するには、[公開プロファイル] を選択します。[詳細情報](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceName": "デプロイ用の Azure Resource Manager サブスクリプションを選択します。", + "loc.input.label.PublishProfilePath": "プロファイルのパスの公開", + "loc.input.help.PublishProfilePath": "Visual Studio から作成された公開プロファイルのパス", + "loc.input.label.PublishProfilePassword": "プロファイルのパスワードの公開", + "loc.input.help.PublishProfilePassword": "パスワードは秘密の変数に保管し、ここではその変数を使用することをお勧めします。例: $(Password)。", + "loc.input.label.WebAppKind": "App Service の種類", + "loc.input.help.WebAppKind": "Web App on Windows、Web App on Linux、Web App for Containers、関数アプリ、Linux 上の 関数アプリ、コンテナー向け 関数アプリ、モバイル アプリから選択します。", + "loc.input.label.WebAppName": "App Service の名前", + "loc.input.help.WebAppName": "既存の Azure App Service の名前を入力するか、選択します。選択するアプリの種類に基づく App Service のみが一覧表示されます。", + "loc.input.label.DeployToSlotOrASEFlag": "スロットまたは App Service Environment に配置する", + "loc.input.help.DeployToSlotOrASEFlag": "既存の配置スロットまたは Azure App Service Environment に配置するためのオプションを選択します。
どちらのターゲットでも、タスクにはリソース グループ名が必要です。
配置ターゲットがスロットの場合、配置は既定で運用スロットに実施されます。他の既存のスロット名を指定することもできます。
配置ターゲットが Azure App Service Environment の場合、スロット名を 'production' のままにして、リソース グループ名だけを指定します。", + "loc.input.label.ResourceGroupName": "リソース グループ", + "loc.input.help.ResourceGroupName": "配置ターゲットが配置スロットまたは App Service Environment の場合、リソース グループ名が必要です。
上記で指定された Azure App Service を含む Azure リソース グループを入力するか選択します。", + "loc.input.label.SlotName": "スロット", + "loc.input.help.SlotName": "運用スロット以外の既存のスロットを入力または選択してください。", + "loc.input.label.DockerNamespace": "レジストリまたは名前空間", + "loc.input.help.DockerNamespace": "特定のレジストリまたは名前空間をグローバルに識別する一意の最上位ドメイン名です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "イメージ", + "loc.input.help.DockerRepository": "コンテナー イメージが格納されるリポジトリの名前です。
メモ: 完全修飾イメージ名の形式は '`<レジストリまたは名前空間`>/`<リポジトリ`>:`<タグ`>' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "タグ", + "loc.input.help.DockerImageTag": "タグは省略可能です。これは、レジストリで Docker イメージにバージョンを付けるために使う機構です。
メモ: 完全修飾イメージ名の形式は '`/`:`' です。例: 'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "仮想アプリケーション", + "loc.input.help.VirtualApplication": "Azure Portal に構成された仮想アプリケーションの名前を指定します。App Service ルートに配置する場合には、このオプションは不要です。", + "loc.input.label.Package": "パッケージまたはフォルダー", + "loc.input.help.Package": "MSBuild で生成されたアプリ サービスのコンテンツが入ったパッケージまたはフォルダー、あるいは圧縮された zip または war ファイルへのファイル パス。
変数 ([ビルド](https://docs.microsoft.com/vsts/pipelines/build/variables) |[リリース](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables))、ワイルドカードを使用できます。
たとえば、$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip または $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "ランタイム スタック", + "loc.input.help.RuntimeStack": "フレームワークとバージョンを選択します。", + "loc.input.label.RuntimeStackFunction": "ランタイム スタック", + "loc.input.help.RuntimeStackFunction": "フレームワークとバージョンを選択します。サポートされているランタイム バージョンについては、[こちらのドキュメント](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)をご覧ください。`DOCKER|microsoft/azure-functions-*` などの前の値は非推奨であるため、ドロップダウンから新しい値をお使いください。", + "loc.input.label.StartupCommand": "スタートアップ コマンド ", + "loc.input.help.StartupCommand": "スタートアップ コマンドを入力してください。例:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "配置スクリプトの種類", + "loc.input.help.ScriptType": "タスクで配置が正常に完了したときに Azure App Service 上で実行されるスクリプトを提供して、配置をカスタマイズします。たとえば、Node、PHP、Python アプリケーション用のパッケージを復元します。[詳細](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "インライン スクリプト", + "loc.input.label.ScriptPath": "配置スクリプトのパス", + "loc.input.label.WebConfigParameters": "Python、Node.js、Go、Java アプリ向けの web.config パラメーターを生成する", + "loc.input.help.WebConfigParameters": "アプリケーションに web.config がない場合は、標準の web.config が生成され、Azure App Service に配置されます。web.config 内の値は編集可能で、アプリケーション フレームワークに基づいて変えることができます。たとえば、node.js アプリケーションの場合、スタートアップ ファイルと iis_node モジュールの値を web.config 内に設定します。この編集機能は、生成される web.config のためにのみ使用できます。[詳細情報](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "アプリ設定", + "loc.input.help.AppSettings": "構文 -key value の後に続く Web App アプリケーションの設定を編集します。スペースが含まれる値は二重引用符で囲む必要があります。
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "構成設定", + "loc.input.help.ConfigurationSettings": "構文 -key value の後に続く Web App 構成の設定を編集します。スペースが含まれる値は、二重引用符で囲む必要があります。
例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "配置方法を選択する", + "loc.input.help.UseWebDeploy": "チェック ボックスをオフにすると、アプリの種類、パッケージ形式、その他のパラメーターに基づいて最適な配置方法が自動的に検出されます。
サポートされる配置方法を確認して、アプリの配置に使用する方法を選択するには、オプションを選択してください。", + "loc.input.label.DeploymentType": "配置方法", + "loc.input.help.DeploymentType": "アプリの配置方法を選択します。", + "loc.input.label.TakeAppOfflineFlag": "アプリをオフラインにする", + "loc.input.help.TakeAppOfflineFlag": "Azure App Service をオフラインにする場合、このオプションを選択します。オフラインにするには、同期操作を開始する前に App Service のルート ディレクトリに app_offline.htm ファイルを配置します。このファイルは、同期操作が正常に完了すると削除されます。", + "loc.input.label.SetParametersFile": "SetParameters ファイル", + "loc.input.help.SetParametersFile": "省略可能: 使用する SetParameters.xml ファイルの場所。", + "loc.input.label.RemoveAdditionalFilesFlag": "ターゲットで追加ファイルを削除する", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service パッケージまたはフォルダー内に一致するファイルがない Azure App Service 上のファイルを削除する場合、このオプションを選択します。

注: これにより、この Azure App Service にインストールされたあらゆる拡張機能に関連するファイルも全部削除されます。これを避けるには、[App_Data フォルダーのファイルを除外する] チェックボックスを選択します。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data フォルダーのファイルを除外する", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data フォルダー内のファイルが Azure App Service に配置されないようにする場合、または Azure App Service から削除されないようにする場合、このオプションを選択します。", + "loc.input.label.AdditionalArguments": "追加引数", + "loc.input.help.AdditionalArguments": "構文 -key:value に続くその他の Web 配置の引数。
これらの引数は、Azure App Service を配置するときに適用されます。例: -disableLink:AppPoolExtension -disableLink:ContentExtension。
Web 配置操作の設定に関するその他の例については、[ここ](https://go.microsoft.com/fwlink/?linkid=838471) を参照してください。", + "loc.input.label.RenameFilesFlag": "ロックされたファイルの名前を変更する", + "loc.input.help.RenameFilesFlag": "Azure App Service のアプリケーション設定で msdeploy フラグ FLAGMSDEPLOY_RENAME_LOCKED_FILES=1 を有効にするには、このオプションを選択します。このオプションを設定すると、アプリの配置中にロックされたファイルの名前を MSDeploy で変更できるようになります", + "loc.input.label.XmlTransformation": "XML 変換", + "loc.input.help.XmlTransformation": "`*.config ファイル` 上の `*.Release.config` と `*..config` に対する構成変換が実行されます。
構成変換は変数置換の前に実行されます。
XML 変換は、Windows プラットフォームの場合のみサポートされます。", + "loc.input.label.XmlVariableSubstitution": "XML 変数置換", + "loc.input.help.XmlVariableSubstitution": "ビルド パイプラインまたはリリース パイプラインで定義された変数は、任意の構成ファイルと parameters.xml の appSettings、applicationSettings、connectionStrings セクションの 'key' または 'name' エントリと照合されます。変数置換は config 変換の後に実行されます。

注: リリース パイプラインと環境内で同じ変数が定義されている場合、環境変数はリリース パイプライン変数よりも優先されます。
", + "loc.input.label.JSONFiles": "JSON 変数置換", + "loc.input.help.JSONFiles": "JSON ファイルの行区切り一覧を新しく提供して、変数値を置換します。ルート フォルダーの相対ファイル名を提供します。
入れ子または階層の JSON 変数を置換するには、JSONPath 式を使用して指定します。

たとえば、下のサンプル内の ‘ConnectionString’ 値を置き換えるには、ビルドまたはリリース パイプライン (またはリリース パイプラインの環境) 内で変数を ‘Data.DefaultConnection.ConnectionString’ として定義する必要があります。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
変数置換は構成変換の後に実行されます。

メモ: 置換では、パイプライン変数は除外されます。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "無効な App Service パッケージまたはフォルダー パスが指定されました: %s", + "loc.messages.SetParamFilenotfound0": "Set パラメーター ファイルが見つかりません: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 変換が正常に適用されました", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service のサービス接続の詳細を取得しました: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "エラー: そのような配置方法はありません", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service のサービス接続の詳細を取得できません: %s。状態コード: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure Resource のサービス接続の詳細を取得できません: '%s'。状態コード: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "配置履歴が %s で正常に更新されました", + "loc.messages.Failedtoupdatedeploymenthistory": "配置履歴を更新できませんでした。エラー: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 配置状態を更新できません: この Web サイトでは SCM エンドポイントが有効になっていません", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service の構成の詳細を取得できません。状態コード: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service のアプリケーションの設定を取得できません。[状態コード: '%s'、エラー メッセージ: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "App Service のアプリケーションの設定を更新できません。状態コード: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "配置の状態を更新できません: 一意の配置 ID を取得できません", + "loc.messages.PackageDeploymentSuccess": "Web パッケージを App Service に正常に配置できました。", + "loc.messages.PackageDeploymentFailed": "Web パッケージを App Service に配置できませんでした。", + "loc.messages.Runningcommand": "コマンドを実行しています: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Web パッケージ: %s を仮想パス (物理パス) へ配置しています: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "kudu サービスにより、パッケージ %s が %s に配置されました", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu サービスを使用して App Service パッケージをデプロイできませんでした: %s", + "loc.messages.Unabletodeploywebappresponsecode": "エラー コードにより、App Service を配置できません: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy が生成したパッケージは Windows プラットフォームでのみサポートされます。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy のサポートされていないバージョン: %s がインストールされています。バージョンは 3 以降である必要があります", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "コンピューター上のレジストリから、MS Deploy の場所を特定できません (エラー: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "指定されたパターン %s のパッケージが見つかりませんでした
タスクに指定されているパッケージがビルドまたは前のステージで成果物として公開されており、現在のジョブにダウンロードされているかどうかをご確認ください。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定したパターンと一致するパッケージが複数あります: %s。検索パターンを絞り込んでください。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[アプリケーションをオフラインにする] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[ロックされたファイルの名前を変更する] オプションを選択して、もう一度 App Service を配置してください。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "指定のパターンと一致する JSON ファイルはありません: %s。", + "loc.messages.Configfiledoesntexists": "構成ファイル %s がありません。", + "loc.messages.Failedtowritetoconfigfilewitherror": "構成ファイル %s への書き込みに失敗しました。エラー: %s", + "loc.messages.AppOfflineModeenabled": "アプリのオフライン モードが有効です。", + "loc.messages.Failedtoenableappofflinemode": "アプリのオフライン モードを有効にできませんでした。状態コード: %s (%s)", + "loc.messages.AppOflineModedisabled": "アプリのオフライン モードが無効です。", + "loc.messages.FailedtodisableAppOfflineMode": "アプリのオフライン モードを無効にできませんでした。状態コード: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "非 Windows プラットフォームでは XML 変換を実行できません。", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s の %s による変換中に XML 変換エラーが発生しました。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Web 配置オプションによる公開は、Windows エージェントを使用している場合のみサポートされます", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 配置オプションによる公開は、msBuild パッケージの種類ではサポートされていません。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 配置オプションによる公開は、仮想アプリケーションではサポートされていません。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 配置または RunFromZip オプションによる公開は、war ファイルの配置をサポートしていません。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "フォルダーが ReadOnly のため、RunFromZip による公開は、wwwroot に変更を加える場合は配置後スクリプトをサポートしない可能性があります。", + "loc.messages.ResourceDoesntExist": "リソース '%s' がありません。リソースは配置前に存在している必要があります。", + "loc.messages.EncodeNotSupported": "ファイル %s のファイル エンコードが %s として検出されました。ファイル エンコード %s では変数置換はサポートされていません。サポートされているエンコードは UTF-8 と UTF-16 LE です。", + "loc.messages.UnknownFileEncodeError": "ファイル %s (typeCode: %s) のエンコードを検出できません。サポートされているエンコードは UTF-8 および UTF-16 LE です。", + "loc.messages.ShortFileBufferError": "ファイル バッファーが短すぎてエンコードの種類を検出できません: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 構成の詳細を更新できませんでした。エラー: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 構成の詳細が正常に更新されました", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 物理パスに関して URL が要求されました: %s", + "loc.messages.Physicalpathalreadyexists": "物理パス '%s' は既に存在しています", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理パスが正常に作成されました: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 物理パスを作成することができませんでした。エラー: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 物理パスを確認できませんでした。エラー コード: %s", + "loc.messages.VirtualApplicationDoesNotExist": "仮想アプリケーションがありません: %s", + "loc.messages.JSONParseError": "JSON ファイルを解析できません: %s。エラー: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 変数置換が正常に適用されました。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 変数の置換が正常に適用されました。", + "loc.messages.failedtoUploadFileToKudu": "ファイル %s を Kudu (%s) にアップロードできません。状態コード: %s", + "loc.messages.failedtoUploadFileToKuduError": "ファイル %s を Kudu (%s) にアップロードできません。エラー: %s", + "loc.messages.ExecuteScriptOnKudu": "指定されたスクリプトを Kudu サービス上で実行しています。", + "loc.messages.FailedToRunScriptOnKuduError": "スクリプトを Kudu サービス上で実行できません。エラー: %s", + "loc.messages.FailedToRunScriptOnKudu": "スクリプトを Kudu (%s) 上で実行できません。状態コード: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "スクリプトを Kudu 上で正常に実行できました。", + "loc.messages.ScriptExecutionOnKuduFailed": "実行したスクリプトからリターン コードとして '%s' が返されました。エラー: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "ファイル %s を Kudu (%s) から削除できません。状態コード: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "ファイル %s を Kudu (%s) から削除できません。エラー: %s", + "loc.messages.ScriptFileNotFound": "スクリプト ファイル '%s' が見つかりません。", + "loc.messages.InvalidScriptFile": "無効なスクリプト ファイル '%s' が指定されました。有効な拡張子は、Windows の場合は .bat と .cmd、Linux の場合は .sh です", + "loc.messages.RetryForTimeoutIssue": "タイムアウトの問題でスクリプトを実行できませんでした。もう一度お試しください。", + "loc.messages.stdoutFromScript": "スクリプトからの標準出力: ", + "loc.messages.stderrFromScript": "スクリプトからの標準エラー出力: ", + "loc.messages.WebConfigAlreadyExists": "web.config ファイルは既に存在します。生成しません。", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config ファイルを正常に生成できました", + "loc.messages.FailedToGenerateWebConfig": "web.config を生成できませんでした。%s", + "loc.messages.FailedToGetKuduFileContent": "ファイルの内容を取得できません: %s。状態コード: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "ファイルの内容を取得できません: %s。エラー: %s", + "loc.messages.ScriptStatusTimeout": "タイムアウトのため、スクリプトの状態をフェッチできません。", + "loc.messages.PollingForFileTimeOut": "タイムアウトのため、スクリプトの状態をフェッチできません。タイムアウト制限を延長するには、'appservicedeploy.retrytimeout' 変数を必要な時間 (分) に設定します。", + "loc.messages.InvalidPollOption": "指定されたポーリング オプションが無効です: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "属性 '-appType' が Web.config パラメーターにありません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node'、'Go' です。
たとえば、Python Bottle フレームワークの場合は、'-appType python_Bottle' (sans-quotes) を指定します。", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE の 'settings.py' ファイル パスを検出できません。'settings.py' ファイルが存在することを確認するか、次の形式で Web.config パラメーター入力に正しいパスを指定してください: '-DJANGO_SETTINGS_MODULE .settings'", + "loc.messages.FailedToApplyTransformation": "指定されたパッケージに変換を適用することはできません。次の点をご確認ください。", + "loc.messages.FailedToApplyTransformationReason1": "1. ビルド中、MSBuild によって生成されたパッケージに対して変換が既に適用されたかどうか。適用された場合は、csproj ファイル内の各構成の タグを削除してから、リビルドします。", + "loc.messages.FailedToApplyTransformationReason2": "2. 構成ファイルと変換ファイルがパッケージ内の同じフォルダーに存在すること。", + "loc.messages.AutoParameterizationMessage": "Web.config の ConnectionString 属性は既定でパラメーター化されています。'Parameters.xml' ファイルまたは 'SetParameters.xml' ファイルによって値が配置中に上書きされるため、変換が connectionString 属性に影響を与えることはありません。自動パラメーター化は、MSBuild パッケージの生成中に /p:AutoParameterizationWebConfigConnectionStrings=False のように設定することによって無効にできます。", + "loc.messages.UnsupportedAppType": "アプリの種類 '%s' が Web.config 生成でサポートされていません。'-appType' に対して有効な値は、'python_Bottle'、'python_Django'、'python_Flask'、'node' です。", + "loc.messages.UnableToFetchAuthorityURL": "機関の URL をフェッチできません。", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory リソース ID をフェッチできません。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドが正常に更新されました。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "ランタイム スタックとスタートアップ コマンドの更新に失敗しました。エラー: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "アプリの設定が正常に更新されました。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "アプリ設定の更新に失敗しました。エラー: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp メタデータをフェッチできませんでした。ErrorCode: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp メタデータを更新できません。エラー コード: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure コンテナー レジストリの資格情報を取得できません。[状態コード: '%s']", + "loc.messages.UnableToReadResponseBody": "応答本文を読み取ることができません。エラー: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 構成の詳細を更新できません。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights リソース ’%s’ のリリース コメントを追加しています", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight にリリース コメントが正常に追加されました: %s", + "loc.messages.FailedAddingReleaseAnnotation": "リリース コメントを追加できませんでした。%s", + "loc.messages.RenameLockedFilesEnabled": "App Service で [ロックされたファイルの名前を変更する] が有効です。", + "loc.messages.FailedToEnableRenameLockedFiles": "[ロックされたファイルの名前を変更する] を有効にできませんでした。エラー: %s", + "loc.messages.WebJobsInProgressIssue": "実行状態の Web ジョブが少数あるため、配置でファイルを削除できません。[Remove additional files at destination] (同期先で追加のファイルを削除する) オプションを無効にするか、配置の前に継続ジョブを停止することができます。", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu アプリ設定をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToCreatePath": "Kudu からパス '%s' を作成することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFile": "Kudu からファイル '%s/%s' を削除することができませんでした。エラー: %s", + "loc.messages.FailedToDeleteFolder": "Kudu からフォルダー '%s' を削除できませんでした。エラー: %s", + "loc.messages.FailedToUploadFile": "Kudu からファイル '%s/%s' をアップロードできませんでした。エラー: %s", + "loc.messages.FailedToGetFileContent": "Kudu からファイル コンテンツ '%s/%s' を取得できませんでした。エラー: %s", + "loc.messages.FailedToListPath": "Kudu からパス '%s' の一覧を取得できませんでした。エラー: %s", + "loc.messages.RetryToDeploy": "パッケージの配置を再試行しています。", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' の詳細をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' の公開プロファイルをフェッチできませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' のメタデータの更新に失敗しました。エラー: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' のメタデータの取得に失敗しました。エラー: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' の構成を修正できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 構成を更新できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 構成を取得できませんでした。エラー: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' の公開資格情報をフェッチできませんでした。エラー: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を取得できませんでした。エラー: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' アプリケーション設定を更新できませんでした。エラー: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 構成の設定を更新しようとしています。データ: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 構成の設定が更新されました。", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service アプリケーションの設定を更新しようとしています。データ: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service アプリケーション設定は既に存在します。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 接続文字列は既に存在します。", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service アプリケーション設定と Kudu アプリケーション設定が更新されました。", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s' に複数のリソース グループが見つかりました。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 配置を使用したパッケージ配置に失敗しました。詳細についてはログを参照してください。", + "loc.messages.PackageDeploymentInitiated": "ZIP 配置を使用したパッケージ配置を開始しました。", + "loc.messages.WarPackageDeploymentInitiated": "WAR 配置を使用したパッケージ配置が開始しました。", + "loc.messages.FailedToGetDeploymentLogs": "配置ログを取得できませんでした。エラー: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名が存在しません", + "loc.messages.WarDeploymentRetry": "war ファイルは前回正常に展開されなかったため、展開を再試行しています。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "マシンで TLS 1.2 プロトコル以上を使用していることを確認します。お使いのマシンで TLS を有効にする方法について詳しくは、https://aka.ms/enableTlsv2 をご確認ください。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure 用のアクセス トークンをフェッチできませんでした。状態コード: %s、状態メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。仮想マシンのマネージド サービス ID (MSI) を構成してください 'https://aka.ms/azure-msi-docs'。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML ファイルを解析できません。エラー: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] プロパティが公開プロファイル内に存在しません", + "loc.messages.InvalidConnectionType": "無効なサービス接続の種類", + "loc.messages.InvalidImageSourceType": "無効な画像ソースの種類", + "loc.messages.InvalidPublishProfile": "公開プロファイルのファイルが無効です。", + "loc.messages.ASE_SSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があり、それを解決するには、VSTS_ARM_REST_IGNORE_SSL_ERRORS という名前の変数の値をビルド定義またはリリース パイプラインで true に設定する必要があります。", + "loc.messages.ZipDeployLogsURL": "Zip 配置のログは、%s で確認できます", + "loc.messages.DeployLogsURL": "配置ログは %s で確認できます", + "loc.messages.AppServiceApplicationURL": "App Service Application URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service で証明書を使用するには、証明書が信頼された証明機関によって署名されている必要があります。Web アプリで証明書の検証エラーが出る場合は、自己署名証明書を使用している可能性があります。これを解決するには、Web 配置オプションの追加引数に -allowUntrusted を渡す必要があります。", + "loc.messages.FailedToGetResourceID": "リソースの種類 '%s'、リソース名 '%s' のリソース ID を取得できませんでした。エラー: %s", + "loc.messages.JarPathNotPresent": "Java jar パスが存在しません", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' リソースを更新できませんでした。エラー: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Web 配置から Run From Package に移動します。これは、FILE_IN_USE エラーを回避するのに役立ちます。Run From Package では、msBuild パッケージの種類はサポートされていません。この配置方法を使用するには、パッケージ形式を変更してください。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..b73547991743 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 배포", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Docker, Java, .NET, .NET Core, Node.js, PHP, Python 또는 Ruby를 사용하는 웹, 모바일 또는 API 앱을 Azure App Service에 배포합니다.", + "loc.instanceNameFormat": "Azure App Service 배포: $(WebAppName)", + "loc.releaseNotes": "버전 4.*의 새로운 기능
zip 배포, 패키지에서 실행, war 배포 지원 [자세한 정보](https://aka.ms/appServiceDeploymentMethods)
App Service Environment 지원
작업에서 지원하는 다양한 App Service 유형을 검색하기 위한 향상된 UI
'패키지에서 실행'이 기본 배포 방법으로, wwwroot 폴더의 파일을 읽기 전용으로 설정
자세한 내용을 보려면 [여기](https://aka.ms/azurermwebdeployreadme)를 클릭하세요.", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "파일 변환 및 변수 대체 옵션", + "loc.group.displayName.AdditionalDeploymentOptions": "추가 배포 옵션", + "loc.group.displayName.PostDeploymentAction": "배포 후 작업", + "loc.group.displayName.ApplicationAndConfigurationSettings": "응용 프로그램 및 구성 설정", + "loc.input.label.ConnectionType": "연결 형식", + "loc.input.help.ConnectionType": "웹앱을 배포하는 데 사용할 서비스 연결 형식을 선택합니다.
Visual Studio에서 만든 게시 프로필을 사용하려면 게시 프로필을 선택합니다. [자세한 정보](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 구독", + "loc.input.help.ConnectedServiceName": "배포에 대한 Azure Resource Manager 구독을 선택합니다.", + "loc.input.label.PublishProfilePath": "게시 프로필 경로", + "loc.input.help.PublishProfilePath": "Visual Studio에서 만든 게시 프로필의 경로", + "loc.input.label.PublishProfilePassword": "게시 프로필 암호", + "loc.input.help.PublishProfilePassword": "비밀 변수에 암호를 저장하고 여기서 해당 변수를 사용하는 것이 좋습니다(예: $(Password)).", + "loc.input.label.WebAppKind": "App Service 유형", + "loc.input.help.WebAppKind": "Windows의 웹앱, Web App on Linux, Web App for Containers, 함수 앱, Linux의 함수 앱, 컨테이너용 함수 앱 및 모바일 앱 중에서 선택합니다.", + "loc.input.label.WebAppName": "App Service 이름", + "loc.input.help.WebAppName": "기존 Azure App Service의 이름을 입력하거나 선택합니다. 선택한 앱 유형을 기반으로 하는 앱 서비스만 나열됩니다.", + "loc.input.label.DeployToSlotOrASEFlag": "슬롯 또는 App Service Environment에 배포", + "loc.input.help.DeployToSlotOrASEFlag": "기존 배포 슬롯 또는 Azure App Service Environment에 배포하는 옵션을 선택합니다.
두 대상 모두, 작업에 리소스 그룹 이름이 필요합니다.
배포 대상이 슬롯인 경우 기본적으로 프로덕션 슬롯에 배포가 수행됩니다. 다른 기존 슬롯 이름을 제공할 수도 있습니다.
배포 대상이 Azure App Service Environment인 경우 슬롯 이름을 '프로덕션'으로 두고 리소스 그룹 이름만 지정하세요.", + "loc.input.label.ResourceGroupName": "리소스 그룹", + "loc.input.help.ResourceGroupName": "배포 대상이 배포 슬롯 또는 App Service Environment인 경우 리소스 그룹 이름이 필요합니다.
위에서 지정한 Azure App Service를 포함하는 Azure 리소스 그룹을 입력하거나 선택합니다.", + "loc.input.label.SlotName": "슬롯", + "loc.input.help.SlotName": "프로덕션 슬롯이 아닌 기존 슬롯을 입력하거나 선택합니다.", + "loc.input.label.DockerNamespace": "레지스트리 또는 네임스페이스", + "loc.input.help.DockerNamespace": "특정 레지스트리 또는 네임스페이스의 전역적으로 고유한 최상위 도메인 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerRepository": "이미지", + "loc.input.help.DockerRepository": "컨테이너 이미지가 저장된 리포지토리의 이름입니다.
참고: 정규화된 이미지 이름은 '`<레지스트리 또는 네임스페이스`>/`<리포지토리`>:`<태그`>' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.DockerImageTag": "태그", + "loc.input.help.DockerImageTag": "태그는 선택 사항입니다. 태그는 레지스트리에서 Docker 이미지에 버전을 지정하는 데 사용하는 메커니즘입니다.
참고: 정규화된 이미지 이름은 '`/`:`' 형식입니다. 예: 'myregistry.azurecr.io/nginx:latest'", + "loc.input.label.VirtualApplication": "가상 응용 프로그램", + "loc.input.help.VirtualApplication": "Azure Portal에서 구성된 가상 응용 프로그램의 이름을 지정합니다. App Service 루트에 배포할 경우 이 옵션은 필요하지 않습니다.", + "loc.input.label.Package": "패키지 또는 폴더", + "loc.input.help.Package": "패키지, MSBuild에서 생성된 App Service 콘텐츠를 포함하는 폴더 또는 압축된 zip 또는 war 파일의 파일 경로입니다.
변수([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), 와일드카드가 지원됩니다.
예: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 또는 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "런타임 스택", + "loc.input.help.RuntimeStack": "프레임워크 및 버전을 선택합니다.", + "loc.input.label.RuntimeStackFunction": "런타임 스택", + "loc.input.help.RuntimeStackFunction": "프레임워크 및 버전을 선택합니다. 지원되는 런타임 버전은 [관련 문서](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)를 참조하세요. 'DOCKER|microsoft/azure-functions-*' 같은 이전 값은 사용되지 않습니다. 드롭다운에서 새 값을 사용하세요.", + "loc.input.label.StartupCommand": "시작 명령 ", + "loc.input.help.StartupCommand": "시작 명령을 입력합니다. 예:
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "배포 스크립트 형식", + "loc.input.help.ScriptType": "작업이 배포를 완료한 후 Azure App Service에서 실행할 스크립트를 제공하여 배포를 사용자 지정합니다. 예를 들어 Node, PHP, Python 응용 프로그램용 패키지를 복원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "인라인 스크립트", + "loc.input.label.ScriptPath": "배포 스크립트 경로", + "loc.input.label.WebConfigParameters": "Python, Node.js, Go 및 Java 앱에 대한 web.config 매개 변수 생성", + "loc.input.help.WebConfigParameters": "애플리케이션에 없는 경우 표준 Web.config가 생성되어 Azure App Service에 배포됩니다. web.config의 값은 편집 가능하며, 애플리케이션 프레임워크에 따라 달라집니다. 예를 들어 node.js 애플리케이션의 경우 web.config에 시작 파일 및 iis_node 모듈 값이 포함됩니다. 이 편집 기능은 생성된 web.config에만 사용됩니다. [자세한 정보](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "앱 설정", + "loc.input.help.AppSettings": "구문 -key 값 다음에 오는 웹앱 응용 프로그램 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "구성 설정", + "loc.input.help.ConfigurationSettings": "구문 -key 값 다음에 오는 웹앱 구성 설정을 편집합니다. 공백이 포함되는 값은 큰따옴표로 묶어야 합니다.
예 : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "배포 방법 선택", + "loc.input.help.UseWebDeploy": "선택 취소하면, 앱 유형, 패키지 형식 및 기타 매개 변수를 기준으로 가장 적합한 배포 방법이 자동 검색됩니다.
지원되는 배포 방법을 표시하는 옵션을 선택하고, 앱 배포 방법을 선택합니다.", + "loc.input.label.DeploymentType": "배포 방법", + "loc.input.help.DeploymentType": "앱의 배포 방법을 선택합니다.", + "loc.input.label.TakeAppOfflineFlag": "앱을 오프라인으로 전환", + "loc.input.help.TakeAppOfflineFlag": "동기화 작업이 시작되기 전에 App Service의 루트 디렉터리에 app_offline.htm 파일을 배치하여 Azure App Service를 오프라인 상태로 전환하려면 이 옵션을 선택합니다. 이 파일은 동기화 작업이 완료된 후 제거됩니다.", + "loc.input.label.SetParametersFile": "SetParameters 파일", + "loc.input.help.SetParametersFile": "옵션: 사용할 SetParameters.xml 파일의 위치입니다.", + "loc.input.label.RemoveAdditionalFilesFlag": "대상에서 추가 파일 제거", + "loc.input.help.RemoveAdditionalFilesFlag": "App Service 패키지 또는 폴더에 일치하는 파일이 없는 Azure App Service의 파일을 삭제하는 옵션을 선택합니다.

참고: 이 경우 Azure App Service에 설치된 확장과 관련된 모든 파일도 제거됩니다. 이를 방지하려면 'App_Data 폴더에서 파일 제외' 확인란을 선택합니다. ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일 제외", + "loc.input.help.ExcludeFilesFromAppDataFlag": "App_Data 폴더의 파일이 Azure App Service에 배포되거나 Azure App Service에서 삭제되지 않게 하려면 이 옵션을 선택합니다.", + "loc.input.label.AdditionalArguments": "추가 인수", + "loc.input.help.AdditionalArguments": "구문 -key:value 다음에 오는 추가 웹 배포 인수입니다.
이 인수는 Azure App Service를 배포할 때 적용됩니다. 예: -disableLink:AppPoolExtension -disableLink:ContentExtension.
웹 배포 작업 설정의 추가 예제는 [여기](https://go.microsoft.com/fwlink/?linkid=838471)를 참조하세요.", + "loc.input.label.RenameFilesFlag": "잠겨 있는 파일 이름 바꾸기", + "loc.input.help.RenameFilesFlag": "Azure App Service 응용 프로그램 설정에서 msdeploy 플래그 MSDEPLOY_RENAME_LOCKED_FILES=1을 사용하도록 설정하려면 이 옵션을 선택합니다. 이 옵션을 설정하면 msdeploy에서 앱 배포 중 잠겨 있는 파일의 이름을 바꿀 수 있습니다.", + "loc.input.label.XmlTransformation": "XML 변환", + "loc.input.help.XmlTransformation": "`*.config 파일`에서 `*.Release.config` 및 `*..config`에 대한 구성 변환이 실행됩니다.
구성 변환은 변수 대체 전에 실행됩니다.
XML 변환은 Windows 플랫폼에서만 지원됩니다.", + "loc.input.label.XmlVariableSubstitution": "XML 변수 대체", + "loc.input.help.XmlVariableSubstitution": "빌드 또는 릴리스 파이프라인에서 정의된 변수가 구성 파일 및 parameters.xml의 appSettings, applicationSettings 및 connectionStrings 섹션에 있는 'key' 또는 'name' 항목과 일치됩니다. 구성 변환 후에 변수 대체가 실행됩니다.

참고: 릴리스 파이프라인 및 환경에서 동일한 변수가 정의된 경우 환경 변수가 릴리스 파이프라인 변수를 대체합니다.
", + "loc.input.label.JSONFiles": "JSON 변수 대체", + "loc.input.help.JSONFiles": "변수 값을 대체할 JSON 파일을 줄 바꿈으로 구분된 목록으로 제공합니다. 파일 이름은 루트 폴더에 상대적으로 지정해야 합니다.
중첩되거나 계층적인 JSON 변수를 대체하려면 JSONPath 식을 사용하여 지정합니다.

예를 들어 아래 샘플에서 'ConnectionString' 값을 대체하려면 빌드 또는 릴리스 파이프라인(또는 릴리스 파이프라인의 환경)에서 변수를 'Data.DefaultConnection.ConnectionString'으로 정의해야 합니다.
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
변수 대체는 구성 변환 후 실행됩니다.

참고: 파이프라인 변수는 대체에서 제외됩니다.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "잘못된 App Service 패키지 또는 폴더 경로를 제공했습니다. %s", + "loc.messages.SetParamFilenotfound0": "매개 변수 설정 파일을 찾을 수 없습니다. %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 변환을 적용했습니다.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Azure App Service '%s'에 대한 서비스 연결 정보를 가져왔습니다.", + "loc.messages.ErrorNoSuchDeployingMethodExists": "오류: 해당 배포 방법이 없습니다.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Azure App Service %s에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s(%s)", + "loc.messages.UnabletoretrieveResourceID": "Azure 리소스 '%s'에 대한 서비스 연결 정보를 검색할 수 없습니다. 상태 코드: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "%s에서 배포 기록을 업데이트했습니다.", + "loc.messages.Failedtoupdatedeploymenthistory": "배포 기록을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "경고: 배포 상태를 업데이트할 수 없습니다. 이 웹 사이트에는 SCM 엔드포인트를 사용할 수 없습니다.", + "loc.messages.Unabletoretrievewebconfigdetails": "App Service 구성 정보를 검색할 수 없습니다. 상태 코드: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "App Service 응용 프로그램 설정을 검색할 수 없습니다[상태 코드: '%s', 오류 메시지: '%s'].", + "loc.messages.Unabletoupdatewebappsettings": "App Service 응용 프로그램 설정을 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "배포 상태를 업데이트할 수 없습니다. 고유한 배포 ID를 검색할 수 없습니다.", + "loc.messages.PackageDeploymentSuccess": "웹 패키지를 App Service에 배포했습니다.", + "loc.messages.PackageDeploymentFailed": "웹 패키지를 App Service에 배포하지 못했습니다.", + "loc.messages.Runningcommand": "%s 명령을 실행하고 있습니다.", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "웹 패키지 %s을(를) 가상 경로(실제 경로) %s(%s)에 배포하는 중입니다.", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Kudu 서비스를 사용하여 %s 패키지를 %s에 배포했습니다.", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Kudu 서비스를 사용하여 App Service 패키지를 배포하지 못했습니다. %s", + "loc.messages.Unabletodeploywebappresponsecode": "오류 코드로 인해 App Service를 배포할 수 없습니다. %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 생성 패키지는 Windows 플랫폼에만 지원됩니다.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "MSDeploy에 대해 지원되지 않는 설치된 버전 %s을(를) 찾았습니다. 버전은 3 이상이어야 합니다.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "컴퓨터의 레지스트리에서 MS 배포의 위치를 찾을 수 없습니다(오류: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "지정된 패턴의 패키지를 찾을 수 없습니다. %s
작업에 언급된 패키지가 빌드 또는 이전 스테이지에서 아티팩트로 게시되고 현재 작업에 다운로드되는지 확인합니다.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "지정한 패턴 %s과(와) 일치하는 패키지가 두 개 이상 있습니다. 검색 패턴을 제한하세요.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "[응용 프로그램을 오프라인으로 만들기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "[잠겨 있는 파일 이름 바꾸기] 옵션을 선택하고 App Service를 다시 배포해 보세요.", + "loc.messages.NOJSONfilematchedwithspecificpattern": "특정 패턴과 일치하는 JSON 파일이 없음: %s", + "loc.messages.Configfiledoesntexists": "구성 파일 %s이(가) 없습니다.", + "loc.messages.Failedtowritetoconfigfilewitherror": "구성 파일 %s에 쓰지 못했습니다(오류: %s).", + "loc.messages.AppOfflineModeenabled": "앱 오프라인 모드를 사용하도록 설정했습니다.", + "loc.messages.Failedtoenableappofflinemode": "앱 오프라인 모드를 사용하도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.AppOflineModedisabled": "앱 오프라인 모드를 사용하지 않도록 설정했습니다.", + "loc.messages.FailedtodisableAppOfflineMode": "앱 오프라인 모드를 사용하지 않도록 설정하지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Windows가 아닌 플랫폼에서는 XML 변환을 수행할 수 없습니다.", + "loc.messages.XdtTransformationErrorWhileTransforming": "%s을(를) 변환(%s 사용)하는 동안 XML 변환 오류가 발생했습니다.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "웹 배포 옵션을 사용한 게시는 Windows 에이전트를 사용할 경우에만 지원됩니다.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "zip 배포 옵션을 사용한 게시는 msBuild 패키지 형식에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "zip 배포 옵션을 사용한 게시는 가상 애플리케이션에 대해 지원되지 않습니다.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "zip 배포 또는 RunFromZip 옵션을 사용한 게시에서는 war 파일 배포를 지원하지 않습니다.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "폴더가 읽기 전용이므로 wwwroot를 변경하는 경우 RunFromZip을 사용한 게시에서 배포 후 스크립트를 지원하지 않을 수 있습니다.", + "loc.messages.ResourceDoesntExist": "'%s' 리소스가 없습니다. 배포 전에 리소스가 있어야 합니다.", + "loc.messages.EncodeNotSupported": "%s 파일에 대한 파일 인코딩이 %s(으)로 검색되었습니다. 파일 인코딩 %s을(를) 사용할 경우 변수 대체가 지원되지 않습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.UnknownFileEncodeError": "%s 파일(typeCode: %s)에 대한 인코딩을 검색할 수 없습니다. 지원되는 인코딩은 UTF-8 및 UTF-16 LE입니다.", + "loc.messages.ShortFileBufferError": "파일 버퍼가 너무 짧아서 인코딩 형식을 검색할 수 없습니다. %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "App Service 구성 정보를 업데이트했습니다.", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 실제 경로의 요청된 URL: %s", + "loc.messages.Physicalpathalreadyexists": "실제 경로 '%s'이(가) 이미 있습니다.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 실제 경로를 만들었습니다. %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Kudu 실제 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedtocheckphysicalPath": "Kudu 실제 경로를 확인하지 못했습니다. 오류 코드: %s", + "loc.messages.VirtualApplicationDoesNotExist": "가상 응용 프로그램이 없습니다. %s", + "loc.messages.JSONParseError": "JSON 파일 %s을(를) 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 변수 대체를 적용했습니다.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "XML 변수 대체를 적용했습니다.", + "loc.messages.failedtoUploadFileToKudu": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 상태 코드: %s", + "loc.messages.failedtoUploadFileToKuduError": "%s 파일을 Kudu(%s)에 업로드할 수 없습니다. 오류: %s", + "loc.messages.ExecuteScriptOnKudu": "Kudu 서비스에서 지정된 스크립트를 실행하는 중입니다.", + "loc.messages.FailedToRunScriptOnKuduError": "Kudu 서비스에서 스크립트를 실행할 수 없습니다. 오류: %s", + "loc.messages.FailedToRunScriptOnKudu": "Kudu에서 스크립트를 실행할 수 없음: %s. 상태 코드: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Kudu에서 스크립트를 실행했습니다.", + "loc.messages.ScriptExecutionOnKuduFailed": "실행된 스크립트에서 반환 코드로 '%s'을(를) 반환했습니다. 오류: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 상태 코드: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "%s 파일을 Kudu(%s)에서 삭제할 수 없습니다. 오류: %s", + "loc.messages.ScriptFileNotFound": "스크립트 파일 '%s'을(를) 찾을 수 없습니다.", + "loc.messages.InvalidScriptFile": "잘못된 스크립트 파일 '%s'이(가) 제공되었습니다. 유효한 확장명은 Windows의 경우 .bat 및 .cmd이고, Linux의 경우 .sh입니다.", + "loc.messages.RetryForTimeoutIssue": "시간 초과 문제로 스크립트 실행에 실패했습니다. 다시 시도하는 중입니다.", + "loc.messages.stdoutFromScript": "스크립트의 표준 출력: ", + "loc.messages.stderrFromScript": "스크립트의 표준 오류: ", + "loc.messages.WebConfigAlreadyExists": "web.config 파일이 이미 있습니다. 생성하지 않습니다.", + "loc.messages.SuccessfullyGeneratedWebConfig": "web.config 파일을 생성했습니다.", + "loc.messages.FailedToGenerateWebConfig": "web.config를 생성하지 못했습니다. %s", + "loc.messages.FailedToGetKuduFileContent": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 상태 코드: %s(%s)", + "loc.messages.FailedToGetKuduFileContentError": "파일 콘텐츠 %s을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.ScriptStatusTimeout": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다.", + "loc.messages.PollingForFileTimeOut": "시간 초과로 인해 스크립트 상태를 페치할 수 없습니다. 'appservicedeploy.retrytimeout' 변수를 필요한 시간(분)으로 설정하여 시간 제한을 늘릴 수 있습니다.", + "loc.messages.InvalidPollOption": "잘못된 폴링 옵션이 제공됨: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 매개 변수에 '-appType' 특성이 없습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 'node' 및 'Go'입니다.
예를 들어 Python Bottle 프레임워크의 경우 '-appType python_Bottle' (sans-quotes)입니다.", + "loc.messages.AutoDetectDjangoSettingsFailed": "DJANGO_SETTINGS_MODULE 'settings.py' 파일 경로를 검색할 수 없습니다. 'settings.py' 파일이 존재하는지 확인하거나 Web.config 매개 변수 입력에 '-DJANGO_SETTINGS_MODULE .settings' 형식으로 올바른 경로를 제공하세요.", + "loc.messages.FailedToApplyTransformation": "지정된 패키지에 변환을 적용할 수 없습니다. 다음을 확인하세요.", + "loc.messages.FailedToApplyTransformationReason1": "1. 빌드 중 생성된 MSBuild 패키지에 대해 변환이 이미 적용되었는지 여부를 확인합니다. 그런 경우 csproj 파일에서 각 구성에 대해 태그를 제거하고 다시 빌드합니다. ", + "loc.messages.FailedToApplyTransformationReason2": "2. 구성 파일 및 변환 파일이 패키지 내의 동일한 폴더에 있는지 확인합니다.", + "loc.messages.AutoParameterizationMessage": "Web.config의 ConnectionString 특성은 기본적으로 매개 변수가 있습니다. 'Parameters.xml' 또는 'SetParameters.xml' 파일로 배포 중 값이 재정의되므로 변환은 connectionString 특성에 아무런 영향을 미치지 않습니다. MSBuild 패키지 생성 중 p:AutoParameterizationWebConfigConnectionStrings=False를 설정하여 자동 매개 변수화를 사용하지 않도록 설정할 수 있습니다.", + "loc.messages.UnsupportedAppType": "Web.config 생성에서 '%s' 앱 형식이 지원되지 않습니다. '-appType'에 대해 유효한 값은 'python_Bottle', 'python_Django', 'python_Flask' 및 'node'입니다.", + "loc.messages.UnableToFetchAuthorityURL": "기관 URL을 페치할 수 없습니다.", + "loc.messages.UnableToFetchActiveDirectory": "Active Directory 리소스 ID를 페치할 수 없습니다.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트했습니다.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "런타임 스택 및 시작 명령을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "앱 설정을 업데이트했습니다.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "앱 설정을 업데이트하지 못했습니다. 오류: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 페치하지 못했습니다. 오류 코드: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "AzureRM WebApp 메타데이터를 업데이트할 수 없습니다. 오류 코드: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Azure Container Registry 자격 증명을 검색할 수 없습니다.[상태 코드: '%s']", + "loc.messages.UnableToReadResponseBody": "응답 본문을 읽을 수 없습니다. 오류: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "WebApp 구성 정보를 업데이트할 수 없습니다. 상태 코드: '%s'", + "loc.messages.AddingReleaseAnnotation": "Application Insights 리소스 '%s'에 대한 릴리스 주석을 추가하는 중", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Application Insight에 릴리스 주석 추가함: %s", + "loc.messages.FailedAddingReleaseAnnotation": "릴리스 주석을 추가하지 못했습니다. %s", + "loc.messages.RenameLockedFilesEnabled": "App Service에 대해 잠긴 파일 이름 바꾸기를 사용할 수 있습니다.", + "loc.messages.FailedToEnableRenameLockedFiles": "잠긴 파일 이름 바꾸기를 사용하도록 설정하지 못했습니다. 오류: %s", + "loc.messages.WebJobsInProgressIssue": "실행 상태의 WebJobs가 거의 없으므로 배포에서 파일을 제거할 수 없습니다. 배포 전에 연속 작업을 중지하거나 '대상에서 추가 파일 제거' 옵션을 사용하지 않을 수 있습니다.", + "loc.messages.FailedToFetchKuduAppSettings": "Kudu 앱 설정을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToCreatePath": "Kudu에서 '%s' 경로를 만들지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFile": "Kudu에서 '%s/%s' 파일을 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToDeleteFolder": "Kudu에서 '%s' 폴더를 삭제하지 못했습니다. 오류: %s", + "loc.messages.FailedToUploadFile": "Kudu에서 '%s/%s' 파일을 업로드하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetFileContent": "Kudu에서 파일 콘텐츠 '%s/%s'을(를) 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToListPath": "Kudu에서 '%s' 경로를 나열하지 못했습니다. 오류: %s", + "loc.messages.RetryToDeploy": "패키지 배포를 다시 시도하는 중입니다.", + "loc.messages.FailedToGetAppServiceDetails": "App Service '%s' 정보를 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "App Service '%s' 게시 프로필을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "App Service '%s' 메타데이터를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceMetadata": "App Service '%s' 메타데이터를 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "App Service '%s' 구성을 패치하지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "App Service '%s' 구성을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "App Service '%s' 구성을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "App Service '%s' 게시 자격 증명을 페치하지 못했습니다. 오류: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 가져오지 못했습니다. 오류: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "App Service '%s' 애플리케이션 설정을 업데이트하지 못했습니다. 오류: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "App Service 구성 설정을 업데이트했습니다.", + "loc.messages.UpdatingAppServiceApplicationSettings": "App Service 애플리케이션 설정을 업데이트하는 중입니다. 데이터: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 애플리케이션 설정이 이미 있습니다.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 연결 문자열이 이미 있습니다.", + "loc.messages.UpdatedAppServiceApplicationSettings": "App Service 응용 프로그램 설정 및 Kudu 응용 프로그램 설정을 업데이트했습니다.", + "loc.messages.MultipleResourceGroupFoundForAppService": "App Service '%s'에 대한 리소스 그룹이 여러 개 있습니다.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "ZIP 배포를 사용한 패키지 배포에 실패했습니다. 자세한 내용은 로그를 참조하세요.", + "loc.messages.PackageDeploymentInitiated": "ZIP 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.WarPackageDeploymentInitiated": "WAR 배포를 사용한 패키지 배포가 시작되었습니다.", + "loc.messages.FailedToGetDeploymentLogs": "배포 로그를 가져오지 못했습니다. 오류: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 이름이 없습니다.", + "loc.messages.WarDeploymentRetry": "이전에 war 파일이 확장되지 않았으므로 war 파일 배포를 다시 시도합니다.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "머신에서 TLS 1.2 프로토콜 이상을 사용 중인지 확인하세요. 머신에서 TLS를 사용하도록 설정하는 방법에 대해 자세히 알아보려면 https://aka.ms/enableTlsv2를 참조하세요.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 가상 머신에 대한 MSI(관리 서비스 ID)를 구성하세요('https://aka.ms/azure-msi-docs'). 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.XmlParsingFailed": "publishProfileXML 파일을 구문 분석할 수 없습니다. 오류: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 속성이 게시 프로필에 없습니다.", + "loc.messages.InvalidConnectionType": "잘못된 서비스 연결 형식", + "loc.messages.InvalidImageSourceType": "잘못된 이미지 소스 유형", + "loc.messages.InvalidPublishProfile": "게시 프로필 파일이 잘못되었습니다.", + "loc.messages.ASE_SSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우, 자체 서명된 인증서를 사용하는 중일 수 있으며 오류를 해결하려면 이름이 VSTS_ARM_REST_IGNORE_SSL_ERRORS인 변수를 빌드 또는 릴리스 파이프라인에서 true 값으로 설정해야 합니다.", + "loc.messages.ZipDeployLogsURL": "zip 배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.DeployLogsURL": "배포 로그는 %s에서 볼 수 있습니다.", + "loc.messages.AppServiceApplicationURL": "App Service 애플리케이션 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "App Service에서 인증서를 사용하려면 신뢰할 수 있는 인증 기관에서 인증서에 서명해야 합니다. 웹앱에서 인증서 유효성 검사 오류가 발생하는 경우 자체 서명된 인증서를 사용하는 것 같으며, 오류를 해결하려면 웹 배포 옵션의 추가 인수에 -allowUntrusted를 전달해야 합니다.", + "loc.messages.FailedToGetResourceID": "리소스 종류 '%s' 및 리소스 이름 '%s'의 리소스 ID를 가져오지 못했습니다. 오류: %s", + "loc.messages.JarPathNotPresent": "Java jar 경로가 없습니다.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Application Insights '%s' 리소스를 업데이트하지 못했습니다. 오류: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "'웹 배포'에서 FILE_IN_USE 오류 방지에 도움이 되는 '패키지에서 실행'으로 전환하세요. '패키지에서 실행'은 msBuild 패키지 형식을 지원하지 않습니다. 이 배포 방법을 사용하려면 패키지 형식을 변경하세요." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..d5539e3edd48 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Развертывание Службы приложений Azure", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "Развертывание веб-приложения, мобильного приложения или приложения API в Службе приложений Azure с помощью Docker, Java, .NET, .NET Core, Node.js, PHP, Python или Ruby", + "loc.instanceNameFormat": "Развертывание службы приложений Azure: $(WebAppName)", + "loc.releaseNotes": "Новые возможности в версии 4.*
Поддерживается развертывание из ZIP-файла, запуск из пакета, развертывание WAR-файла [Подробности здесь](https://aka.ms/appServiceDeploymentMethods)
Поддерживаются среды службы приложений
Улучшен пользовательский интерфейс для обнаружения различных типов службы приложений, поддерживаемых задачей
Предпочтительным методом развертывания является запуск из пакета, при котором файлы в папке wwwroot становятся доступными только для чтения
Чтобы получить дополнительные сведения, щелкните [здесь](https://aka.ms/azurermwebdeployreadme).", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "Параметры преобразования файлов и подстановки переменных", + "loc.group.displayName.AdditionalDeploymentOptions": "Дополнительные параметры развертывания", + "loc.group.displayName.PostDeploymentAction": "Действие после развертывания", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Параметры приложения и конфигурации", + "loc.input.label.ConnectionType": "Тип подключения", + "loc.input.help.ConnectionType": "Выберите тип подключения службы, который будет использоваться для развертывания веб-приложения.
Выберите \"Профиль публикации\" для использования профиля публикации, созданного в Visual Studio. [Дополнительные сведения](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Подписка Azure", + "loc.input.help.ConnectedServiceName": "Выберите подписку на Azure Resource Manager для развертывания.", + "loc.input.label.PublishProfilePath": "Путь к профилю публикации", + "loc.input.help.PublishProfilePath": "Путь к профилю публикации, созданному в Visual Studio", + "loc.input.label.PublishProfilePassword": "Пароль профиля публикации", + "loc.input.help.PublishProfilePassword": "Рекомендуется хранить пароль в секретной переменной и использовать ее здесь, например $(Password).", + "loc.input.label.WebAppKind": "Тип службы приложений", + "loc.input.help.WebAppKind": "Выберите веб-приложение в Windows, веб-приложение в Linux, веб-приложение для контейнеров, приложение-функцию, приложение-функцию в Linux, приложение-функцию для контейнеров или мобильное приложение.", + "loc.input.label.WebAppName": "Имя службы приложений", + "loc.input.help.WebAppName": "Введите или выберите имя существующей службы приложений Azure. Будут перечислены только службы приложений для выбранного типа приложения.", + "loc.input.label.DeployToSlotOrASEFlag": "Развернуть в слоте или среде службы приложений", + "loc.input.help.DeployToSlotOrASEFlag": "Выберите вариант развертывания в существующем слоте развертывания или в среде службы приложений Azure.
В обоих случаях задаче требуется имя группы ресурсов.
Если целью развертывания является слот, по умолчанию оно выполняется в рабочем слоте. Можно также указать имя любого другого существующего слота.
Если целью развертывания является среда службы приложений Azure, оставьте имя слота \"рабочий\" и укажите имя группы ресурсов.", + "loc.input.label.ResourceGroupName": "Группа ресурсов", + "loc.input.help.ResourceGroupName": "Имя группы ресурсов является обязательным, если цель развертывания — слот развертывания или среда службы приложений.
Введите или выберите группу ресурсов Azure, которая содержит указанную выше службу приложений Azure.", + "loc.input.label.SlotName": "Слот", + "loc.input.help.SlotName": "Введите или выберите существующий слот вместо рабочего слота.", + "loc.input.label.DockerNamespace": "Реестр или пространство имен", + "loc.input.help.DockerNamespace": "Глобально уникальное доменное имя верхнего уровня для реестра или пространства имен.
Примечание. Полное доменное имя имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerRepository": "Образ", + "loc.input.help.DockerRepository": "Имя репозитория, в котором хранятся образы контейнера.
Примечание. Полное доменное имя образа имеет следующий формат: \"`<реестр или пространство имен`>/`<репозиторий`>:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.DockerImageTag": "Тег", + "loc.input.help.DockerImageTag": "Теги необязательны, они используются в реестрах для указания версий образов Docker.
Примечание. Полное доменное имя образа имеет следующий формат: \"`/`:`\". Например, \"myregistry.azurecr.io/nginx:latest\".", + "loc.input.label.VirtualApplication": "Виртуальное приложение", + "loc.input.help.VirtualApplication": "Укажите имя виртуального приложения, настроенного на портале Azure. Параметр не является обязательным для развертываний в корне службы приложений.", + "loc.input.label.Package": "Пакет или папка", + "loc.input.help.Package": "Путь к файлу пакета или папке с содержимым службы приложений, созданным MSBuild, или к сжатому ZIP- или WAR-файлу.
Поддерживаются переменные ([сборки](https://docs.microsoft.com/vsts/pipelines/build/variables) | [выпуска](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), а также подстановочные знаки.
Примеры: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip или $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war.", + "loc.input.label.RuntimeStack": "Стек среды выполнения", + "loc.input.help.RuntimeStack": "Выберите платформу и версию.", + "loc.input.label.RuntimeStackFunction": "Стек среды выполнения", + "loc.input.help.RuntimeStackFunction": "Выберите платформу и версию. Поддерживаемые версии среды выполнения приведены в [следующем документе](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages). Старые значения, такие как \"DOCKER|microsoft/azure-functions-*\", являются нерекомендуемыми, используйте новые значения из раскрывающегося списка.", + "loc.input.label.StartupCommand": "Команда запуска ", + "loc.input.help.StartupCommand": "Введите команду запуска, например
dotnet exec имя_файла.dll
dotnet имя_файла.dll", + "loc.input.label.ScriptType": "Тип сценария развертывания", + "loc.input.help.ScriptType": "Настройте развертывание, указав скрипт, который будет выполнен в службе приложений Azure по окончании развертывания. Например: восстановите пакеты для приложений Node, PHP и Python. [Дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=843471).", + "loc.input.label.InlineScript": "Встроенный скрипт", + "loc.input.label.ScriptPath": "Путь к сценарию развертывания", + "loc.input.label.WebConfigParameters": "Создание параметров файла web.config для приложений Python, Node.js, Go и Java", + "loc.input.help.WebConfigParameters": "Если в приложении отсутствует стандартный файл web.config, он будет сгенерирован и развернут в Службе приложений Azure. Значения в файле web.config можно изменить. Они могут меняться в зависимости от исполняющей среды. Например, в файле web.config приложения node.js имеются загрузочный файл и модульные значения iis_node. Возможность редактирования доступна только для сгенерированного файла web.config. [Подробнее](https://go.microsoft.com/fwlink/?linkid=843469).", + "loc.input.label.AppSettings": "Параметры приложения", + "loc.input.help.AppSettings": "Измените параметры веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "Параметры конфигурации", + "loc.input.help.ConfigurationSettings": "Измените параметры настройки веб-приложения после значения -key в синтаксисе. Значение с пробелами должно быть заключено в двойные кавычки.
Пример: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "Выбор метода развертывания", + "loc.input.help.UseWebDeploy": "Если этот флажок не установлен, оптимальный метод развертывания определяется автоматически в соответствии с типом приложения, форматом пакета и другими параметрами.
Выберите этот параметр, чтобы просмотреть поддерживаемые методы развертывания и выбрать один из них для своего приложения.", + "loc.input.label.DeploymentType": "Метод развертывания", + "loc.input.help.DeploymentType": "Выберите метод развертывания для приложения.", + "loc.input.label.TakeAppOfflineFlag": "Перевести приложение в автономный режим", + "loc.input.help.TakeAppOfflineFlag": "Выберите этот параметр, чтобы перевести службу приложений Azure в автономный режим путем размещения файла app_offline.htm в корневом каталоге службы приложений перед началом операции синхронизации. Файл будет удален после успешного завершения синхронизации.", + "loc.input.label.SetParametersFile": "Файл SetParameters", + "loc.input.help.SetParametersFile": "Дополнительно: расположение используемого файла SetParameters.xml.", + "loc.input.label.RemoveAdditionalFilesFlag": "Удалять дополнительные файлы в месте назначения", + "loc.input.help.RemoveAdditionalFilesFlag": "Выберите этот параметр, чтобы удалить файлы в службе приложений Azure, для которых отсутствуют соответствующие файлы или папки в службе приложений.

Примечание. При этом также будут удалены все файлы, связанные со всеми расширениями, установленными в этой службе приложений Azure App. Чтобы этого избежать, установите флажок \"Исключить файлы из папки App_Data\".", + "loc.input.label.ExcludeFilesFromAppDataFlag": "Исключить файлы из папки App_Data", + "loc.input.help.ExcludeFilesFromAppDataFlag": "Выберите этот параметр, чтобы заблокировать развертывание файлов из папки App_Data в службе приложений Azure или их удаление из этой службы.", + "loc.input.label.AdditionalArguments": "Дополнительные аргументы", + "loc.input.help.AdditionalArguments": "Дополнительные аргументы веб-развертывания, использующие синтаксис -ключ:значение.
Они будут применяться при развертывании службы приложений Azure, например -disableLink:AppPoolExtension -disableLink:ContentExtension.
Другие примеры рабочих параметров веб-развертывания см. [здесь](https://go.microsoft.com/fwlink/?linkid=838471).", + "loc.input.label.RenameFilesFlag": "Переименовывать заблокированные файлы", + "loc.input.help.RenameFilesFlag": "Выберите этот параметр, чтобы включить в msdeploy флаг MSDEPLOY_RENAME_LOCKED_FILES=1 в параметрах приложения службы приложений Azure. Если этот параметр установлен, msdeploy может переименовывать файлы, заблокированные во время развертывания приложения", + "loc.input.label.XmlTransformation": "XML-преобразование", + "loc.input.help.XmlTransformation": "Преобразования конфигурации будут выполнены для \"*.Release.config\" и \"*..config\" в файле \"*.config\".
Преобразования конфигурации запускаются перед подстановкой переменных.
XML-преобразования поддерживаются только на платформе Windows.", + "loc.input.label.XmlVariableSubstitution": "Подстановка XML-переменных", + "loc.input.help.XmlVariableSubstitution": "Переменные, заданные в конвейерах сборки или выпуска, будут сопоставлены с записями key или name в разделах appSettings, applicationSettings и connectionStrings всех файлов конфигурации и parameters.xml. Подстановка переменных выполняется после преобразований конфигурации.

Примечание. Если одни и те же переменные заданы в конвейере выпуска и в среде, то переменные среды имеют приоритет над переменными из конвейера выпуска.
", + "loc.input.label.JSONFiles": "Подстановка переменных JSON", + "loc.input.help.JSONFiles": "Укажите разделенный переносами строки список JSON-файлов для подстановки значений переменных. Имена файлов следует указывать относительно корневой папки.
Чтобы подставить вложенные или иерархические переменные JSON, укажите их с помощью выражений JSONPath.

Например, чтобы заменить значение ConnectionString в примере ниже, следует определить переменную как Data.DefaultConnection.ConnectionString в конвейере сборки или выпуска (или среде конвейера выпуска).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Подстановка переменных запускается после преобразований конфигураций.

Примечание. Переменные конвейера исключены из подстановки.", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "Указан недопустимый путь к пакету службы приложений или папке: %s", + "loc.messages.SetParamFilenotfound0": "Заданный файл параметров не найден: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML-преобразования успешно применены.", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "Получены сведения о подключении к службе приложений Azure: \"%s\"", + "loc.messages.ErrorNoSuchDeployingMethodExists": "Ошибка: такого метода развертывания не существует.", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "Не удалось получить данные о подключении к Службе приложений Azure: %s. Код состояния: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "Не удалось получить сведения о подключении к службе для ресурса Azure: \"%s\". Код состояния: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "Журнал развертывания (%s) успешно обновлен.", + "loc.messages.Failedtoupdatedeploymenthistory": "Не удалось обновить журнал развертывания. Ошибка: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ПРЕДУПРЕЖДЕНИЕ: невозможно обновить состояние развертывания, конечная точка SCM не включена для этого веб-сайта.", + "loc.messages.Unabletoretrievewebconfigdetails": "Не удалось получить сведения о конфигурации службы приложений. Код состояния: \"%s\"", + "loc.messages.Unabletoretrievewebappsettings": "Не удалось извлечь параметры приложения службы приложений. [Код состояния: \"%s\", сообщение об ошибке: \"%s\"]", + "loc.messages.Unabletoupdatewebappsettings": "Не удалось обновить параметры приложения службы приложений. Код состояния: \"%s\"", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Не удается обновить состояние развертывания: не удается получить уникальный идентификатор развертывания.", + "loc.messages.PackageDeploymentSuccess": "Веб-пакет успешно развернут в службе приложений.", + "loc.messages.PackageDeploymentFailed": "Не удалось развернуть веб-пакет в службе приложений.", + "loc.messages.Runningcommand": "Запуск команды: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "Развертывание веб-пакета %s по виртуальному пути (физическому пути): %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "Пакет %s успешно развернут при помощи службы Kudu в %s", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "Не удалось развернуть пакет службы приложений при помощи службы Kudu: %s", + "loc.messages.Unabletodeploywebappresponsecode": "Не удалось развернуть службу приложений из-за ошибки: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "Пакеты, созданные при помощи MSDeploy, поддерживаются только для платформы Windows.", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Установленная версия MSDeploy (%s) не поддерживается. Должна быть установлена версия 3 или более поздняя.", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "Не удалось определить расположение MS Deploy при помощи реестра на компьютере (ошибка: %s).", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Не удалось найти пакет с указанным шаблоном: %s
Проверьте, публикуется ли пакет, упомянутый в задаче, как артефакт в сборке или на предыдущем этапе и скачан ли он в текущем задании.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Указанному шаблону соответствует несколько пакетов: %s. Ограничьте шаблон поиска.", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Отключить приложение от сети\".", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "Попробуйте снова развернуть службу приложений, используя параметр \"Переименовывать заблокированные файлы\".", + "loc.messages.NOJSONfilematchedwithspecificpattern": "Не найден файл JSON, соответствующий заданному шаблону: %s.", + "loc.messages.Configfiledoesntexists": "Файл конфигурации %s не существует.", + "loc.messages.Failedtowritetoconfigfilewitherror": "Сбой записи в файл конфигурации %s. Ошибка: %s.", + "loc.messages.AppOfflineModeenabled": "Автономный режим для приложения включен.", + "loc.messages.Failedtoenableappofflinemode": "Не удалось включить автономный режим для приложения. Код состояния: %s (%s).", + "loc.messages.AppOflineModedisabled": "Автономный режим для приложения отключен.", + "loc.messages.FailedtodisableAppOfflineMode": "Не удалось отключить автономный режим для приложения. Код состояния: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "Невозможно выполнить XML-преобразования на платформе, отличной от Windows.", + "loc.messages.XdtTransformationErrorWhileTransforming": "Ошибка XML-преобразования при преобразовании %s с помощью %s.", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Публикация при помощи веб-развертывания поддерживается только при использовании агента для Windows.", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "Публикация путем развертывания из ZIP-файла не поддерживается для типа пакета msBuild.", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "Публикация путем развертывания из ZIP-файла не поддерживается для виртуального приложения.", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "При публикации с помощью развертывания из ZIP-файла или RunFromZip не поддерживается развертывание WAR-файла.", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "При публикации с помощью RunFromZip скрипт, выполняемый после развертывания, может не поддерживаться, если он вносит изменения в wwwroot, так как эта папка доступна только для чтения.", + "loc.messages.ResourceDoesntExist": "Ресурс \"%s\" не существует. Он должен существовать перед началом развертывания.", + "loc.messages.EncodeNotSupported": "Обнаруженная кодировка файла %s — %s. Подстановка переменных не поддерживается для кодировки %s. Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.UnknownFileEncodeError": "Не удается определить кодировку файла %s (typeCode: %s). Поддерживаемые кодировки: UTF-8 и UTF-16 LE.", + "loc.messages.ShortFileBufferError": "Слишком короткий файловый буфер для обнаружения типа кодировки: %s.", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "Не удалось изменить конфигурацию службы приложений. Ошибка: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Конфигурация службы приложений успешно изменена.", + "loc.messages.RequestedURLforkuduphysicalpath": "Запрошенный URL-адрес для физического пути Kudu: %s", + "loc.messages.Physicalpathalreadyexists": "Физический путь \"%s\" уже существует.", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Физический путь Kudu успешно создан: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "Не удалось создать физический путь Kudu. Ошибка: %s", + "loc.messages.FailedtocheckphysicalPath": "Не удалось проверить физический путь Kudu. Код ошибки: %s", + "loc.messages.VirtualApplicationDoesNotExist": "Виртуальное приложение не существует: %s", + "loc.messages.JSONParseError": "Не удалось проанализировать JSON-файл: %s. Ошибка: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "Подстановка переменных JSON успешно применена.", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "Подстановка переменных XML применена.", + "loc.messages.failedtoUploadFileToKudu": "Не удалось отправить файл %s в Kudu (%s). Код состояния: %s", + "loc.messages.failedtoUploadFileToKuduError": "Не удалось передать файл %s в Kudu (%s). Ошибка: %s", + "loc.messages.ExecuteScriptOnKudu": "Выполнение указанного скрипта в службе Kudu.", + "loc.messages.FailedToRunScriptOnKuduError": "Не удалось выполнить скрипт в службе Kudu. Ошибка: %s", + "loc.messages.FailedToRunScriptOnKudu": "Не удалось выполнить скрипт в службе Kudu: %s. Код состояния: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "Сценарий успешно выполнен в Kudu.", + "loc.messages.ScriptExecutionOnKuduFailed": "Выполненный сценарий вернул код \"%s\". Ошибка: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "Не удалось удалить файл %s из Kudu (%s). Код состояния: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "Не удалось удалить файл %s из Kudu (%s). Ошибка: %s", + "loc.messages.ScriptFileNotFound": "Файл сценария \"%s\" не найден.", + "loc.messages.InvalidScriptFile": "Указан недопустимый файл скрипта \"%s\". Допустимые расширения: .bat и .cmd в Windows, .sh в Linux", + "loc.messages.RetryForTimeoutIssue": "Сбои выполнения сценария из-за превышения времени ожидания. Выполняется повторная попытка.", + "loc.messages.stdoutFromScript": "Стандартные выходные данные сценария: ", + "loc.messages.stderrFromScript": "Стандартная ошибка сценария: ", + "loc.messages.WebConfigAlreadyExists": "Файл web.config уже существует. Он не будет сгенерирован.", + "loc.messages.SuccessfullyGeneratedWebConfig": "Файл web.config успешно сгенерирован.", + "loc.messages.FailedToGenerateWebConfig": "Не удалось сгенерировать файл web.config. %s", + "loc.messages.FailedToGetKuduFileContent": "Не удалось получить содержимое файла: %s. Код состояния: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "Не удалось получить содержимое файла: %s. Ошибка: %s", + "loc.messages.ScriptStatusTimeout": "Не удалось получить состояние сценария, так как превышено время ожидания.", + "loc.messages.PollingForFileTimeOut": "Не удалось получить состояние сценария, так как превышено время ожидания. Чтобы увеличить время ожидания, задайте для переменной \"appservicedeploy.retrytimeout\" требуемое количество минут.", + "loc.messages.InvalidPollOption": "Указан недопустимый параметр опроса: %s.", + "loc.messages.MissingAppTypeWebConfigParameters": "Атрибут \"-appType\" отсутствует в параметрах Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\", \"node\" и \"Go\".
Например, \"-appType python_Bottle\" (без кавычек), если используется платформа Python Bottle.", + "loc.messages.AutoDetectDjangoSettingsFailed": "Не удалось обнаружить путь к файлу \"settings.py\" DJANGO_SETTINGS_MODULE. Убедитесь, что файл \"settings.py\" существует, или укажите правильный путь во входных данных параметра Web.config в следующем формате: \"-DJANGO_SETTINGS_MODULE <имя_папки>.settings\".", + "loc.messages.FailedToApplyTransformation": "Не удается применить преобразование для указанного пакета. Проверьте следующее.", + "loc.messages.FailedToApplyTransformationReason1": "1. Применено ли преобразование к созданному пакету MSBuild во время сборки. Если это так, удалите тег для каждой конфигурации в CSPROJ-файле и повторите сборку. ", + "loc.messages.FailedToApplyTransformationReason2": "2. Убедитесь, что файлы конфигурации и преобразования находятся в одной и той же папке в пакете.", + "loc.messages.AutoParameterizationMessage": "Атрибуты ConnectionString в Web.config параметризованы по умолчанию. Обратите внимание, что преобразование не влияет на атрибуты connectionString, так как значение переопределяется во время развертывания файлом \"Parameters.xml\" или \"SetParameters.xml\". Вы можете отключить автоматическую параметризацию, задав /p:AutoParameterizationWebConfigConnectionStrings=False во время создания пакета MSBuild.", + "loc.messages.UnsupportedAppType": "Тип приложения \"%s\" не поддерживается при создании Web.config. Допустимые значения для \"-appType\": \"python_Bottle\", \"python_Django\", \"python_Flask\" и \"node\".", + "loc.messages.UnableToFetchAuthorityURL": "Не удается получить URL-адрес центра.", + "loc.messages.UnableToFetchActiveDirectory": "Не удается получить идентификатор ресурса Active Directory.", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Стек времени выполнения и команда запуска успешно обновлены.", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "Не удалось обновить стек времени выполнения и команду запуска. Ошибка: %s.", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "Параметры приложения успешно обновлены.", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "Не удалось обновить параметры приложения. Ошибка: %s.", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "Не удалось получить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "Не удалось обновить метаданные AzureRM WebApp. Код ошибки: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "Не удалось получить учетные данные реестра контейнеров Azure. [Код состояния: \"%s\"]", + "loc.messages.UnableToReadResponseBody": "Не удалось прочитать текст ответа. Ошибка: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "Не удалось обновить сведения о конфигурации WebApp. StatusCode: \"%s\"", + "loc.messages.AddingReleaseAnnotation": "Добавление примечаний к выпуску для ресурса Application Insights \"%s\"", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "Примечания к выпуску успешно добавлены в Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "Не удалось добавить примечания к выпуску. %s", + "loc.messages.RenameLockedFilesEnabled": "Переименование заблокированных файлов для службы приложений включено.", + "loc.messages.FailedToEnableRenameLockedFiles": "Не удалось включить переименование заблокированных файлов. Ошибка: %s", + "loc.messages.WebJobsInProgressIssue": "Невозможно удалить файлы в развертывании, так как запущено несколько веб-заданий. Отключите параметр \"Удалить дополнительные файлы в месте назначения\" или остановите непрерывные задания перед развертыванием.", + "loc.messages.FailedToFetchKuduAppSettings": "Не удалось получить параметры приложения Kudu. Ошибка: %s", + "loc.messages.FailedToCreatePath": "Не удалось создать путь \"%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFile": "Не удалось удалить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToDeleteFolder": "Не удалось удалить папку \"%s\" из Kudu. Ошибка: %s.", + "loc.messages.FailedToUploadFile": "Не удалось отправить файл \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToGetFileContent": "Не удалось получить содержимое файла \"%s/%s\" из Kudu. Ошибка: %s", + "loc.messages.FailedToListPath": "Не удалось получить список элементов для пути \"%s\" из Kudu. Ошибка: %s", + "loc.messages.RetryToDeploy": "Повторная попытка развертывания пакета.", + "loc.messages.FailedToGetAppServiceDetails": "Не удалось получить сведения о службе приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "Не удалось получить профиль публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "Не удалось обновить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceMetadata": "Не удалось получить метаданные службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "Не удалось изменить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "Не удалось обновить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "Не удалось получить конфигурацию службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "Не удалось получить учетные данные публикации для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "Не удалось получить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Не удалось обновить параметры приложения для службы приложений \"%s\". Ошибка: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "Выполняется попытка изменить параметры конфигурации Службы приложений. Данные: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "Параметры конфигурации службы приложений обновлены.", + "loc.messages.UpdatingAppServiceApplicationSettings": "Выполняется попытка изменить параметры приложения Службы приложений. Данные: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "Параметры приложения Службы приложений уже существуют.", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "Строки подключений Службы приложений уже существуют.", + "loc.messages.UpdatedAppServiceApplicationSettings": "Параметры приложений службы приложений и параметры приложений Kudu обновлены.", + "loc.messages.MultipleResourceGroupFoundForAppService": "Для службы приложений \"%s\" найдено несколько групп ресурсов.", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "Не удалось выполнить развертывание пакета с помощью развертывания ZIP-файла. Дополнительные сведения см. в журналах.", + "loc.messages.PackageDeploymentInitiated": "Запущено развертывание пакета с помощью ZIP Deploy.", + "loc.messages.WarPackageDeploymentInitiated": "Запущено развертывание пакета с помощью WAR Deploy.", + "loc.messages.FailedToGetDeploymentLogs": "Не удалось получить журналы развертывания. Ошибка: %s", + "loc.messages.GoExeNameNotPresent": "Отсутствует имя EXE-файла Go", + "loc.messages.WarDeploymentRetry": "Повторяется попытка развертывания WAR-файла, так как он не был развернут раньше.", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "Компьютер должен использовать протокол TLS 1.2 или более поздней версии. Дополнительные сведения о том, как включить TLS на вашем компьютере: https://aka.ms/enableTlsv2.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Не удалось получить маркер доступа для Azure. Код состояния: %s, сообщение о состоянии: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Настройте управляемое удостоверение службы (MSI) для виртуальной машины \"https://aka.ms/azure-msi-docs\". Код состояния: %s; сообщения о состоянии: %s.", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Код состояния: %s, сообщение о состоянии: %s.", + "loc.messages.XmlParsingFailed": "Не удалось проанализировать файл publishProfileXML. Ошибка: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "Свойство [%s] отсутствует в профиле публикации", + "loc.messages.InvalidConnectionType": "Недопустимый тип подключения к службе", + "loc.messages.InvalidImageSourceType": "Недопустимый тип источника образа", + "loc.messages.InvalidPublishProfile": "Недопустимый файл профиля публикации.", + "loc.messages.ASE_SSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо установить значение true для переменной VSTS_ARM_REST_IGNORE_SSL_ERRORS в конвейере сборки или выпуска", + "loc.messages.ZipDeployLogsURL": "Журналы развертывания из ZIP-файла можно просмотреть в %s", + "loc.messages.DeployLogsURL": "Журналы развертывания можно просмотреть в %s", + "loc.messages.AppServiceApplicationURL": "URL-адрес приложения службы приложений: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "Чтобы использовать сертификат в службе приложений, сертификат должен быть подписан доверенным центром сертификации. Если в веб-приложении появляются ошибки проверки сертификата, возможно, вы используете самозаверяющий сертификат и для устранения этих ошибок необходимо передать -allowUntrusted в дополнительных аргументах параметра веб-развертывания.", + "loc.messages.FailedToGetResourceID": "Не удалось получить идентификатор ресурса для ресурса с типом \"%s\" и именем \"%s\". Ошибка: %s", + "loc.messages.JarPathNotPresent": "Отсутствует путь к jar-файлу Java.", + "loc.messages.FailedToUpdateApplicationInsightsResource": "Не удалось обновить ресурс Application Insights \"%s\". Ошибка: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "Переход от веб-развертывания к запуску из пакета, что помогает избежать ошибки FILE_IN_USE. Обратите внимание, что запуск из пакета не поддерживает тип пакета msBuild. Измените формат пакета, чтобы использовать этот метод развертывания." +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..99bb677d364e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure 应用服务部署", + "loc.helpMarkDown": "[详细了解此任务](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 向 Azure 应用服务部署 Web、移动或 API 应用", + "loc.instanceNameFormat": "Azure 应用服务部署: $(WebAppName)", + "loc.releaseNotes": "版本 4.* 中的新增功能
支持 Zip 部署、从包运行、War 部署[在此处获取详细信息](https://aka.ms/appServiceDeploymentMethods)
支持应用服务环境
改进了用于发现任务支持的不同应用服务类型的 UI
从包运行是首选的部署方法,它使 wwwroot 文件夹中的文件成为只读文件
单击[此处](https://aka.ms/azurermwebdeployreadme)以获取更多信息。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "文件转换和变量替换选项", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署选项", + "loc.group.displayName.PostDeploymentAction": "部署后操作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "应用程序和配置设置", + "loc.input.label.ConnectionType": "连接类型", + "loc.input.help.ConnectionType": "选择要用于部署 Web 应用的服务连接类型。
选择发布配置文件以使用 Visual Studio 创建的发布配置文件。[更多信息](https://aka.ms/vsPublishProfile)。", + "loc.input.label.ConnectedServiceName": "Azure 订阅", + "loc.input.help.ConnectedServiceName": "为部署选择 Azure 资源管理器订阅。", + "loc.input.label.PublishProfilePath": "发布配置文件路径", + "loc.input.help.PublishProfilePath": "从 Visual Studio 中创建的发布配置文件的路径", + "loc.input.label.PublishProfilePassword": "发布配置文件密码", + "loc.input.help.PublishProfilePassword": "建议将密码存储在机密变量中,并在此处使用该变量,例如 $(Password)。", + "loc.input.label.WebAppKind": "应用服务类型", + "loc.input.help.WebAppKind": "从后列选项中选择: Windows 上的 Web 应用、Linux 上的 Web 应用、用于容器的 Web 应用、Linux 上的函数应用、用于容器和移动应用的函数应用。", + "loc.input.label.WebAppName": "应用服务名称", + "loc.input.help.WebAppName": "输入或选择现有 Azure 应用服务的名称。只会列出基于所选应用类型的应用服务。", + "loc.input.label.DeployToSlotOrASEFlag": "部署到槽或应用服务环境", + "loc.input.help.DeployToSlotOrASEFlag": "选择要部署到现有部署槽或 Azure 应用服务环境的选项。
对于这两个目标,任务需要资源组名称。
如果部署目标是槽,默认部署到生产槽。此外还可以提供任何其他现有的槽名称。
如果部署目标是 Azure 应用服务环境,则将槽名称保留为“生产”并指定资源组名称即可。", + "loc.input.label.ResourceGroupName": "资源组", + "loc.input.help.ResourceGroupName": "当部署目标是部署槽或应用服务环境时,需要资源组名称。
输入或选择包含上面指定的 Azure 应用服务的 Azure 资源组。", + "loc.input.label.SlotName": "槽", + "loc.input.help.SlotName": "输入或选择生产槽以外的现有槽。", + "loc.input.label.DockerNamespace": "注册表或命名空间", + "loc.input.help.DockerNamespace": "特定注册表或命名空间的全局唯一顶级域名。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "用于存储容器映像的存储库的名称。
注意: 完全限定的映像名称格式应为:“`<注册表或命名空间`>/`<存储库`>:`<标记`>”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.DockerImageTag": "标记", + "loc.input.help.DockerImageTag": "标记为可选项,它是注册表用以对 Docker 映像提供版本的机制。
注意: 完全限定的映射名称格式应为:“`/`:`”。例如,\"myregistry.azurecr.io/nginx:latest\"。", + "loc.input.label.VirtualApplication": "虚拟应用程序", + "loc.input.help.VirtualApplication": "指定 Azure 门户中已配置的虚拟应用程序的名称。对于以应用服务根目录为目标的部署,此选项并非必需。", + "loc.input.label.Package": "包或文件夹", + "loc.input.help.Package": "包的文件路径或一个包含由 MSBuild 生成的应用服务内容或压缩的 zip 或 war 文件的文件夹。
变量([生成](https://docs.microsoft.com/vsts/pipelines/build/variables) | [发布](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支持通配符。
例如,$(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip 或 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "运行时堆栈", + "loc.input.help.RuntimeStack": "选择框架和版本。", + "loc.input.label.RuntimeStackFunction": "运行时堆栈", + "loc.input.help.RuntimeStackFunction": "选择框架和版本。请查看[此文档](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages),了解受支持的运行时版本。\"DOCKER|microsoft/azure-functions-*\" 等旧值已被弃用,请使用下拉列表中的新值。", + "loc.input.label.StartupCommand": "启动命令", + "loc.input.help.StartupCommand": "输入启动命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署脚本类型", + "loc.input.help.ScriptType": "任务成功完成部署后,通过提供可在 Azure 应用服务上运行的脚本自定义部署。例如 Node、PHP 和 Python 应用程序的还原包。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "内联脚本", + "loc.input.label.ScriptPath": "部署脚本路径", + "loc.input.label.WebConfigParameters": "生成适用于 Python、Node.js、Go 和 Java 应用的 web.config 参数", + "loc.input.help.WebConfigParameters": "如果应用程序中没有标准的 Web.config,系统将生成一个并将其部署到 Azure 应用服务。Web.config 中的值可进行编辑,并且可能因应用程序框架而异。例如,对于 node.js 应用程序,web.config 将包含启动文件和 iis_node module 模块值。此编辑功能仅适用于生成的 web.config。[了解详细信息](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "应用设置", + "loc.input.help.AppSettings": "按照语法 -key 值编辑 Web 应用应用程序设置。包含空格的值应括在双引号中。
示例: -Port 5000 -RequestTimeout
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "配置设置", + "loc.input.help.ConfigurationSettings": "按照语法 -key 值编辑 Web 应用配置设置。包含空格的值应括在双引号中。
示例: -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "选择部署方法", + "loc.input.help.UseWebDeploy": "如果未选中,将根据应用类型、包格式和其他参数自动检测最佳部署方法。
选择此选项以查看支持的部署方法,并选择一个用于部署应用。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "选择应用的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "使应用脱机", + "loc.input.help.TakeAppOfflineFlag": "选择该选项,通过在同步操作开始前将 app_offline.htm 文件放入应用服务的根目录而使 Azure 应用服务脱机。同步操作成功完成后,将删除该文件。", + "loc.input.label.SetParametersFile": "SetParameters 文件", + "loc.input.help.SetParametersFile": "可选: 要使用的 SetParameters.xml 文件的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "删除目标中的其他文件", + "loc.input.help.RemoveAdditionalFilesFlag": "选择该选项可删除 Azure 应用服务上在应用服务包或文件夹中没有匹配文件的文件。

注意: 这该将删除与安装在此 Azure 应用服务上的任何扩展相关的所有文件。为防止出现这种情况,请选中“从 App_Data 文件夹中排除文件”复选框。", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 文件夹中的文件", + "loc.input.help.ExcludeFilesFromAppDataFlag": "选择该选项以阻止将 App_Data 文件夹中的文件部署到 Azure 应用服务/从 Azure 应用服务删除。", + "loc.input.label.AdditionalArguments": "其他参数", + "loc.input.help.AdditionalArguments": "语法 -key:value 后的其他 Web 部署参数。
部署 Azure 应用服务时将应用这些参数。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
有关 Web 部署操作设置的更多示例,请参阅[此处](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重命名锁定的文件", + "loc.input.help.RenameFilesFlag": "选择此选项可在 Azure 应用服务应用程序设置中启用 msdeploy 标志 MSDEPLOY_RENAME_LOCKED_FILES=1。如果设定,此选项可使 msdeploy 重命名在应用部署期间锁定的锁定文件", + "loc.input.label.XmlTransformation": "XML 转换", + "loc.input.help.XmlTransformation": "将在 \"*.config file\" 上为 \"*.Release.config\" 和 \"*..config\" 运行配置转换。
配置转换将在变量替换前运行。
仅 Windows 平台支持 XML 转换。", + "loc.input.label.XmlVariableSubstitution": "XML 变量替换", + "loc.input.help.XmlVariableSubstitution": "生成或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的 \"key\" 或 \"name\" 条目进行匹配。变量替换在配置变换后运行。

注意: 如果在发布管道和环境中定义了相同的变量,则环境变量将取代发布管道变量。
", + "loc.input.label.JSONFiles": "JSON 变量替换", + "loc.input.help.JSONFiles": "提供 JSON 文件的新行分隔列表,用于替换变量值。将相对于根文件夹来提供文件名。
要替代嵌套或层次结构式 JSON 变量,请使用 JSONPath 表达式指定它们。

例如,若要替换下面示例中的 \"ConnectionString\" 的值,需要在生成或发布管道(或发布管道的环境)中将变量定义为 \"Data.DefaultConnection.ConnectionString\"。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
变量替换在配置转换后运行。

注意: 管道变量排除在替换之外。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供了无效的应用服务包或文件夹路径: %s", + "loc.messages.SetParamFilenotfound0": "设置的参数文件未找到: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "XML 转换已成功应用", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "已获取 Azure 应用服务“%s”的服务连接详细信息", + "loc.messages.ErrorNoSuchDeployingMethodExists": "错误: 不存在此种部署方法", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "无法检索 Azure 应用服务 %s 的服务连接详细信息。状态代码: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "无法检索 Azure 资源“%s”的服务连接详细信息。状态代码: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功在 %s 更新了部署历史记录", + "loc.messages.Failedtoupdatedeploymenthistory": "未能更新部署历史记录。错误: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 无法更新部署状态: SCM 终结点没有为此网站启用", + "loc.messages.Unabletoretrievewebconfigdetails": "无法检索应用配置详细信息。状态代码:“%s”", + "loc.messages.Unabletoretrievewebappsettings": "无法检索应用服务应用程序设置。[状态代码: %s, 错误消息: %s]", + "loc.messages.Unabletoupdatewebappsettings": "无法更新应用服务应用程序设置。状态代码:“%s”", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "无法更新部署状态: 无法检索唯一部署 ID", + "loc.messages.PackageDeploymentSuccess": "已成功将 Web 包部署到应用服务。", + "loc.messages.PackageDeploymentFailed": "未能将 Web 包部署到应用服务。", + "loc.messages.Runningcommand": "正在运行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正在部署 Web 包 %s,部署位置: 虚拟路径 %s (物理路径 %s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功部署了包 %s (通过在 %s 使用 kudu 服务)", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "未能使用 kudu 服务 %s 部署应用服务包", + "loc.messages.Unabletodeploywebappresponsecode": "错误代码 %s 导致无法部署应用服务", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy 生成的包仅受 Windows 平台支持。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "为 MSDeploy 找到了不受支持的已安装版本 %s。版本应至少为 3 或以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "无法从计算机的注册表上找到 MS 部署的位置(错误: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "未找到具有指定模式的包: %s
请检查任务中提及的包是否在版本或上一阶段中作为项目发布,以及是否已在当前作业中下载。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定的模式 %s 有多个匹配的包。请限制搜索模式。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "再次尝试使用所选“使应用程序脱机”选项部署应用服务。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "再次尝试使用所选“重命名锁定文件”选项部署应用服务。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "没有与特定模式 %s 匹配的 JSON 文件。", + "loc.messages.Configfiledoesntexists": "配置文件 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "未能写入配置文件 %s,错误为 %s", + "loc.messages.AppOfflineModeenabled": "已启用应用脱机模式。", + "loc.messages.Failedtoenableappofflinemode": "未能启用应用脱机模式。状态代码: %s (%s)", + "loc.messages.AppOflineModedisabled": "已禁用应用脱机模式。", + "loc.messages.FailedtodisableAppOfflineMode": "未能禁用应用脱机模式。状态代码: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "无法在非 Windows 平台上执行 XML 转换。", + "loc.messages.XdtTransformationErrorWhileTransforming": "转换 %s (通过使用 %s)时出现 XML 转换错误。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "仅当使用 Windows 代理时才支持使用 webdeploy 选项进行发布", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 包类型不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虚拟应用程序不支持使用 zip 部署选项进行发布。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip 部署或 RunFromZip 选项执行的发布不支持 war 文件部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果对 wwwroot 进行更改,则使用 RunFromZip 发布可能不支持后期部署脚本,因为该文件夹为只读。", + "loc.messages.ResourceDoesntExist": "资源“%s”不存在。资源应在部署前就已存在。", + "loc.messages.EncodeNotSupported": "检测到文件 %s 的文件编码为 %s。不支持使用文件编码 %s 进行变量替换。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "无法检测文件 %s (类型代码: %s)的编码。受支持的编码为 UTF-8 和 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "文件缓冲区太短,无法检测编码类型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "未能更新应用服务配置详细信息。错误: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新应用服务配置详细信息。", + "loc.messages.RequestedURLforkuduphysicalpath": "kudu 物理路径的请求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "物理路径 \"%s\" 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "Kudu 物理路径已成功创建: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "未能创建 kudu 物理路径。错误: %s", + "loc.messages.FailedtocheckphysicalPath": "未能检查 kudu 物理路径。错误代码: %s", + "loc.messages.VirtualApplicationDoesNotExist": "不存在虚拟应用程序: %s", + "loc.messages.JSONParseError": "无法分析 JSON 文件: %s。错误: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "JSON 变量替换已成功应用。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功应用 XML 变量替换。", + "loc.messages.failedtoUploadFileToKudu": "无法将文件 %s 上传到 Kudu (%s)。状态代码: %s", + "loc.messages.failedtoUploadFileToKuduError": "无法将文件 %s 上传到 Kudu (%s)。错误: %s", + "loc.messages.ExecuteScriptOnKudu": "正在 Kudu 服务上执行给定脚本。", + "loc.messages.FailedToRunScriptOnKuduError": "无法在 Kudu 服务上运行该脚本。错误: %s", + "loc.messages.FailedToRunScriptOnKudu": "无法在 Kudu 上运行该脚本: %s。状态代码: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上执行脚本。", + "loc.messages.ScriptExecutionOnKuduFailed": "已执行的脚本返回了“%s”作为返回代码。错误: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "无法从 Kudu (%s) 删除文件: %s。状态代码: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "无法删除文件 %s (位于 Kudu (%s)上)。错误: %s", + "loc.messages.ScriptFileNotFound": "找不到脚本文件“%s”。", + "loc.messages.InvalidScriptFile": "提供的脚本文件“%s”无效。有效的扩展名为 .bat 和 .cmd (对于 Windows)和 .sh (对于 Linux)", + "loc.messages.RetryForTimeoutIssue": "由于出现超时问题,脚本执行失败。请重试。", + "loc.messages.stdoutFromScript": "脚本中的标准输出:", + "loc.messages.stderrFromScript": "脚本中的标准错误:", + "loc.messages.WebConfigAlreadyExists": "web.config 文件已存在。不再生成。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功生成 web.config 文件", + "loc.messages.FailedToGenerateWebConfig": "未能生成 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "无法获取文件内容: %s。状态代码: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "无法获取文件内容: %s。错误: %s", + "loc.messages.ScriptStatusTimeout": "因为超时,无法提取脚本状态。", + "loc.messages.PollingForFileTimeOut": "因为超时,无法提取脚本状态。通过将 \"appservicedeploy.retrytimeout\" 变量设置为所需分钟数可以增加超时限制。", + "loc.messages.InvalidPollOption": "提供的轮询选项无效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 参数中缺少属性 \"-appType\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\"、\"node\" 和 \"Go\"。
例如,如果是 Python Bottle 框架,则应为 \"-appType python_Bottle\" (不带引号)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "无法检测 DJANGO_SETTINGS_MODULE \"settings.py\" 文件路径。请确保 \"settings.py\" 文件存在或采用格式 \"-DJANGO_SETTINGS_MODULE .settings\" 在 Web.config 参数输出中提供正确的路径", + "loc.messages.FailedToApplyTransformation": "无法对给定的包应用转换。请验证以下各项。", + "loc.messages.FailedToApplyTransformationReason1": "1. 在生成期间是否已对 MSBuild 生成的包应用转换。如果已应用,请删除 csproj 文件中每个配置的 标记,然后重新生成。", + "loc.messages.FailedToApplyTransformationReason2": "2. 确保配置文件和转换文件位于包内的同一个文件夹中。", + "loc.messages.AutoParameterizationMessage": "默认情况下,Web.config 中的 connectionString 属性已参数化。请注意,转换对 connectionString 属性无影响,因为在通过 \"Parameters.xml\" 或 \"SetParameters.xml\" 文件进行部署期间,该值将被重写。可通过在 MSBuild 包生成期间设置 /p:AutoParameterizationWebConfigConnectionStrings=False 来禁用自动参数化。", + "loc.messages.UnsupportedAppType": "Web.config 生成中不支持应用类型 \"%s\"。\"-appType\" 的有效值为: \"python_Bottle\"、\"python_Django\"、\"python_Flask\" 和 \"node\"", + "loc.messages.UnableToFetchAuthorityURL": "无法提取授权 URL。", + "loc.messages.UnableToFetchActiveDirectory": "无法提取 Active Directory 资源 ID。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新运行时堆栈和启动命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "未能更新运行时堆栈和启动命令。错误: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新应用设置。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "未能更新应用设置。错误: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "未能提取 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "无法更新 AzureRM WebApp 元数据。错误代码: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "无法检索 Azure 容器注册表凭据。[状态代码: “%s”]", + "loc.messages.UnableToReadResponseBody": "无法读取响应正文。错误: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "无法更新 WebApp 配置详细信息。状态代码:“%s”", + "loc.messages.AddingReleaseAnnotation": "正在添加 Application Insights 资源“%s”的发布注释", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功向 Application Insights 添加发布注释: %s", + "loc.messages.FailedAddingReleaseAnnotation": "未能添加发布注释。%s", + "loc.messages.RenameLockedFilesEnabled": "已对应用服务启用“重命名已锁定文件”。", + "loc.messages.FailedToEnableRenameLockedFiles": "未能启用“重命名已锁定文件”。错误: %s", + "loc.messages.WebJobsInProgressIssue": "几个处于运行状态的 Web 作业阻止部署删除这些文件。可禁用“删除目标处的其他文件”选项或在部署前停止连续作业。", + "loc.messages.FailedToFetchKuduAppSettings": "未能提取 Kudu 应用设置。错误: %s", + "loc.messages.FailedToCreatePath": "未能从 Kudu 创建路径“%s”。错误: %s", + "loc.messages.FailedToDeleteFile": "未能从 Kudu 删除文件“%s/%s”。错误: %s", + "loc.messages.FailedToDeleteFolder": "未能从 Kudu 删除文件夹“%s”。错误: %s", + "loc.messages.FailedToUploadFile": "未能从 Kudu 上传文件“%s/%s”。错误: %s", + "loc.messages.FailedToGetFileContent": "未能从 Kudu 获取文件内容“%s/%s”。错误: %s", + "loc.messages.FailedToListPath": "未能从 Kudu 列出路径“%s”。错误: %s", + "loc.messages.RetryToDeploy": "正在重新尝试部署包。", + "loc.messages.FailedToGetAppServiceDetails": "未能提取应用服务“%s”详细信息。错误: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "未能提取应用服务“%s”发布配置文件。错误: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "未能更新应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToGetAppServiceMetadata": "未能获取应用服务“%s”元数据。错误: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "未能修补应用服务“%s”配置。错误: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "未能更新应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "未能获取应用服务“%s”配置。错误: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "未能提取应用服务“%s”发布凭据。错误: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "未能获取应用服务“%s”应用程序设置。错误: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "未能更新应用服务“%s”应用程序设置。错误: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在尝试更新应用服务配置设置。数据: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新应用服务配置设置。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在尝试更新应用服务应用程序设置。数据: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "应用服务应用程序设置已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "应用服务连接字符串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新应用服务应用程序设置和 Kudu 应用程序设置。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到了应用服务“%s”的多个资源组。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP 部署的包部署失败。有关更多详细信息,请参阅日志。", + "loc.messages.PackageDeploymentInitiated": "已启动使用 ZIP 部署的包部署。", + "loc.messages.WarPackageDeploymentInitiated": "已启动使用 WAR 部署的包部署。", + "loc.messages.FailedToGetDeploymentLogs": "未能获取部署日志。错误: %s", + "loc.messages.GoExeNameNotPresent": "Go exe 名称不存在", + "loc.messages.WarDeploymentRetry": "正在重试 war 文件部署,因为它之前未成功扩展。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "请确保计算机使用的是 TLS 1.2 协议或更高版本。请访问 https://aka.ms/enableTlsv2 获取有关如何在计算机中启用 TLS 的详细信息。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "无法提取 Azure 的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "无法提取托管服务主体的访问令牌。请为虚拟机配置托管服务标识(MSI)(https://aka.ms/azure-msi-docs)。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "无法提取托管服务主体的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.XmlParsingFailed": "无法分析 publishProfileXML 文件,错误: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s]发布配置文件中不存在属性", + "loc.messages.InvalidConnectionType": "无效的服务连接类型", + "loc.messages.InvalidImageSourceType": "无效的映像源类型", + "loc.messages.InvalidPublishProfile": "发布配置文件无效。", + "loc.messages.ASE_SSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在生成或发布管道中,将名为 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的变量设置为 true 值", + "loc.messages.ZipDeployLogsURL": "可以在 %s 查看 Zip 部署日志", + "loc.messages.DeployLogsURL": "可在 %s 查看部署日志", + "loc.messages.AppServiceApplicationURL": "应用服务应用程序 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "要在应用服务中使用某个证书,该证书必须由受信任的证书颁发机构签名。如果 Web 应用显示证书验证错误,则使用的可能是自签名证书,要解决验证问题,需要在 Web 部署选项的其他参数中传递 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "未能获取资源类型“%s”和资源名称“%s”的资源 ID。错误: %s", + "loc.messages.JarPathNotPresent": "Java jar 路径不存在", + "loc.messages.FailedToUpdateApplicationInsightsResource": "未能更新 Application Insights“%s”资源。错误: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "从 Web 部署移动到 RunFrom 包,这有助于避免 FILE_IN_USE 错误。请注意,“从包运行”不支持 msBuild 包类型。请更改包格式以使用此部署方法。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..7bcbc1329826 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,229 @@ +{ + "loc.friendlyName": "Azure App Service 部署", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurermwebdeployreadme)", + "loc.description": "使用 Docker、Java、.NET、.NET Core、Node.js、PHP、Python 或 Ruby 對 Azure App Service 部署 Web、行動或 API 應用程式", + "loc.instanceNameFormat": "Azure App Service 部署: $(WebAppName)", + "loc.releaseNotes": "4.* 版的新功能 (預覽)
支援 Zip 部署、Run From Package (從套件執行)、War 部署 ([詳細資料在此](https://aka.ms/appServiceDeploymentMethods))
支援 App Service 環境
改善 UI,以供探索工作所支援的各種應用程式服務類型
「從套件執行」為偏好的部署方法,會使 wwwroot 資料夾中的檔案變成唯讀
如需詳細資訊,請按一下[這裡](https://aka.ms/azurermwebdeployreadme)。", + "loc.group.displayName.FileTransformsAndVariableSubstitution": "檔案轉換及變數替代選項", + "loc.group.displayName.AdditionalDeploymentOptions": "其他部署選項", + "loc.group.displayName.PostDeploymentAction": "部署後動作", + "loc.group.displayName.ApplicationAndConfigurationSettings": "應用程式和組態設定", + "loc.input.label.ConnectionType": "連線類型", + "loc.input.help.ConnectionType": "請選取要用來部署 Web 應用程式的服務連線類型。
請選取發佈設定檔以使用 Visual Studio 建立的發佈設定檔。[詳細資訊](https://aka.ms/vsPublishProfile).", + "loc.input.label.ConnectedServiceName": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceName": "選取部署的 Azure Resource Manager 訂用帳戶。", + "loc.input.label.PublishProfilePath": "發行設定檔的路徑", + "loc.input.help.PublishProfilePath": "從 Visual Studio 所建立之發佈設定檔的路徑", + "loc.input.label.PublishProfilePassword": "發行設定檔的密碼", + "loc.input.help.PublishProfilePassword": "建議您將密碼儲存在祕密變數中,並在此處使用該變數,例如 $(Password)。", + "loc.input.label.WebAppKind": "App Service 類型", + "loc.input.help.WebAppKind": "從 Windows 上的 Web 應用程式、Linux 上的 Web 應用程式、用於容器的 Web App、函數應用程式、Linux 上的函數應用程式、用於容器的函數應用程式及行動裝置應用程式中選擇。", + "loc.input.label.WebAppName": "App Service 名稱", + "loc.input.help.WebAppName": "輸入或選取現有 Azure App Service 的名稱。僅依選取的應用程式類型列出應用程式服務。", + "loc.input.label.DeployToSlotOrASEFlag": "將部署到位置或 App Service 環境", + "loc.input.help.DeployToSlotOrASEFlag": "請選取選項以部署至現有的部署位置或 Azure App Service 環境。
對於這兩個目標而言,工作都需要資源群組名稱。
假如部署目標是位置,預設會對生產位置進行部署。此外,也能提供任何其他現有的位置名稱。
假如部署目標是 Azure App Service 環境,請將位置名稱保留為 ‘production’,並請僅指定資源群組名稱。", + "loc.input.label.ResourceGroupName": "資源群組", + "loc.input.help.ResourceGroupName": "當部署目標為部署位置或 App Service 環境時,資源群組名稱為必要項。
請輸入或選取包含上方所指定 Azure App Service 的 Azure 資源群組。", + "loc.input.label.SlotName": "位置", + "loc.input.help.SlotName": "請輸入或選取現有的位置,而不是生產位置。", + "loc.input.label.DockerNamespace": "登錄或命名空間", + "loc.input.help.DockerNamespace": "您的特定登錄或命名空間的全域唯一頂層網域名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerRepository": "映像", + "loc.input.help.DockerRepository": "容器映像儲存所在的存放庫名稱。
注意: 完整映像名稱的格式為: '`<登錄或命名空間`>/`<存放庫`>:`<標記`>'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.DockerImageTag": "標記", + "loc.input.help.DockerImageTag": "標記是選擇項,這是登錄提供版本給 Docker 映像時所使用的機制。
注意: 完整映像名稱的格式為: '`/`:`'。例如,'myregistry.azurecr.io/nginx:latest'。", + "loc.input.label.VirtualApplication": "虛擬應用程式", + "loc.input.help.VirtualApplication": "指定在 Azure 入口網站中設定的虛擬應用程式名稱。若要部署到 App Service 的根目錄,則無須使用此選項。", + "loc.input.label.Package": "套件或資料夾", + "loc.input.help.Package": "包含應用程式服務內容的套件或資料夾路徑,產生該內容的來源為 MSBuild,或壓縮的 zip 或 war 檔案。
變數 ( [組建](https://docs.microsoft.com/vsts/pipelines/build/variables) | [發行](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支援使用萬用字元。
例如 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war。", + "loc.input.label.RuntimeStack": "執行階段堆疊", + "loc.input.help.RuntimeStack": "選取架構及版本。", + "loc.input.label.RuntimeStackFunction": "執行階段堆疊", + "loc.input.help.RuntimeStackFunction": "選取架構和版本。如需支援的執行階段版本,請參閱[本文件](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages)。`DOCKER|microsoft/azure-functions-*` 等舊值已淘汰,請使用下拉式清單中的新值。", + "loc.input.label.StartupCommand": "啟動命令 ", + "loc.input.help.StartupCommand": "輸入啟動命令。例如
dotnet exec filename.dll
dotnet filename.dll", + "loc.input.label.ScriptType": "部署指令碼類型", + "loc.input.help.ScriptType": "當工作已成功完成部署時,就提供將在 Azure App Service 上執行的指令碼以自訂部署。例如,還原 Node、PHP、Python 應用程式的套件。[深入了解](https://go.microsoft.com/fwlink/?linkid=843471)。", + "loc.input.label.InlineScript": "內嵌指令碼", + "loc.input.label.ScriptPath": "部署指令碼路徑", + "loc.input.label.WebConfigParameters": "產生 Python、Node.js、Go 和 Java 應用程式的 web.config 參數", + "loc.input.help.WebConfigParameters": "若應用程式沒有標準 Web.config,會予以產生並部署至 Azure App Service。Web.config 中的值可編輯,並會因應用程式架構而有所不同。例如若是 node.js 應用程式,web.config 會具有啟動檔案和 iis_node 模組值。此編輯功能僅適用於所產生的 web.config。[深入了解](https://go.microsoft.com/fwlink/?linkid=843469)。", + "loc.input.label.AppSettings": "應用程式設定", + "loc.input.help.AppSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例: -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "loc.input.label.ConfigurationSettings": "組態設定", + "loc.input.help.ConfigurationSettings": "請使用語法「-索引鍵 值」編輯 Web 應用程式設定。若值包含空格,應將其括以雙引號。
範例 -phpVersion 5.6 -linuxFxVersion: node|6.11", + "loc.input.label.UseWebDeploy": "選取部署方法", + "loc.input.help.UseWebDeploy": "若取消選取,我們會根據您的應用程式類型、套件格式及其他參數,自動偵測最適合的部署方法。
選取選項即可檢視支援的部署方法,並請選擇一項以部署應用程式。", + "loc.input.label.DeploymentType": "部署方法", + "loc.input.help.DeploymentType": "選擇應用程式的部署方法。", + "loc.input.label.TakeAppOfflineFlag": "將應用程式設為離線", + "loc.input.help.TakeAppOfflineFlag": "選取此選項可在同步作業開始之前,將 app_offline.htm 檔案置於 App Service 的根目錄中而使此 Azure App Service 離線。此檔案將會在同步作業成功完成後移除。", + "loc.input.label.SetParametersFile": "SetParameters 檔案", + "loc.input.help.SetParametersFile": "選擇性: 要使用之 SetParameters.xml 檔案的位置。", + "loc.input.label.RemoveAdditionalFilesFlag": "移除目的地的其他檔案", + "loc.input.help.RemoveAdditionalFilesFlag": "選取此選項可刪除在 Azure App Service 上,於 App Service 套件或資料夾中沒有任何相符檔案的檔案。

注意: 這也會移除與此 Azure App Service 上所安裝之任何延伸模組相關的所有檔案。若要避免,請選取 'Exclude files from App_Data folder' 核取方塊。 ", + "loc.input.label.ExcludeFilesFromAppDataFlag": "排除 App_Data 資料夾內的檔案", + "loc.input.help.ExcludeFilesFromAppDataFlag": "選取此選項可避免將 App_Data 資料夾中的檔案部署至 Azure App Service 或從中刪除。", + "loc.input.label.AdditionalArguments": "其他引數", + "loc.input.help.AdditionalArguments": "其他 Web Deploy 引數,接在 -key:value 語法後方。
部署 Azure App Service 時會加以套用。例如: -disableLink:AppPoolExtension -disableLink:ContentExtension。
如需其他 Web Deploy 作業設定範例,請參閱[這裡](https://go.microsoft.com/fwlink/?linkid=838471)。", + "loc.input.label.RenameFilesFlag": "重新命名鎖定的檔案", + "loc.input.help.RenameFilesFlag": "選取此選項可在 Azure App Service 應用程式設定中啟用 MSDeploy 旗標 MSDEPLOY_RENAME_LOCKED_FILES=1。若設定此選項,MSDeploy 即可為鎖定於應用程式部署期間的鎖定檔案重新命名", + "loc.input.label.XmlTransformation": "XML 轉換", + "loc.input.help.XmlTransformation": "將為 `*.config file` 上 `*.Release.config` 及 `*.<環境名稱>.config` 執行的組態轉換。
將會在變數替代前執行組態轉換。
只有在 Windows 平台上才支援 XML 轉換。", + "loc.input.label.XmlVariableSubstitution": "XML 變數替代", + "loc.input.help.XmlVariableSubstitution": "組建或發行管線中定義的變數,會與組態檔及 parameters.xml 中 appSettings、applicationSettings 及 connectionStrings 的 'key' 或 'name' 項目進行比對。變數替代會在組態轉換後執行。

注意: 若發行管線與環境所定義的變數相同,則環境變數會取代發行管線變數。
", + "loc.input.label.JSONFiles": "JSON 變數替代", + "loc.input.help.JSONFiles": "提供新行分隔的 JSON 檔案清單,以替代變數值。提供的檔案名稱必須相對於根資料夾。
若要替代巢狀或階層式 JSON 變數,請使用 JSONPath 運算式加以指定。

例如,若要取代下方範例中的 ‘ConnectionString’ 值,您必須在組建/發行管線 (或發行管線的環境) 中定義 ‘Data.DefaultConnection.ConnectionString’ 這樣的變數。
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
變數替代會在組態轉換之後執行。

注意: 管線變數不在替代範圍內。", + "loc.messages.Invalidwebapppackageorfolderpathprovided": "提供的 App Service 套件或資料夾路徑無效: %s", + "loc.messages.SetParamFilenotfound0": "找不到設定參數檔案: %s", + "loc.messages.XDTTransformationsappliedsuccessfully": "已成功套用 XML 轉換", + "loc.messages.GotconnectiondetailsforazureRMWebApp0": "取得 Azure App Service 的服務連線詳細資料: '%s'", + "loc.messages.ErrorNoSuchDeployingMethodExists": "錯誤: 此類部署方法不存在", + "loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp": "無法擷取 Azure App Service 的服務連線詳細資料 : %s。狀態碼: %s (%s)", + "loc.messages.UnabletoretrieveResourceID": "無法擷取 Azure 資源的服務連線詳細資料:'%s'。狀態碼: %s", + "loc.messages.Successfullyupdateddeploymenthistory": "已成功於 %s 更新部署歷程記錄", + "loc.messages.Failedtoupdatedeploymenthistory": "無法更新部署歷程記錄。錯誤: %s", + "loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "警告: 無法更新部署狀態: 此網站未啟用 SCM 端點", + "loc.messages.Unabletoretrievewebconfigdetails": "無法擷取 App Service 組態詳細資料。狀態碼: '%s'", + "loc.messages.Unabletoretrievewebappsettings": "無法擷取 App Service 應用程式設定。[狀態碼: '%s',錯誤訊息: '%s']", + "loc.messages.Unabletoupdatewebappsettings": "無法更新 App Service 應用程式設定。狀態碼: '%s'", + "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "無法更新部署狀態: 無法擷取唯一部署識別碼", + "loc.messages.PackageDeploymentSuccess": "已成功將 Web 套件部署到 App Service。", + "loc.messages.PackageDeploymentFailed": "無法將 Web 套件部署到 App Service。", + "loc.messages.Runningcommand": "正在執行命令: %s", + "loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath": "正於虛擬路徑 (實體路徑) 部署網頁套件 %s: %s (%s)", + "loc.messages.Successfullydeployedpackageusingkuduserviceat": "已成功使用 Kudu 服務部署套件 %s 於 %s ", + "loc.messages.Failedtodeploywebapppackageusingkuduservice": "無法部署使用 Kudu 服務的 App Service 套件: %s", + "loc.messages.Unabletodeploywebappresponsecode": "因以下錯誤碼而無法部署 App Service: %s", + "loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "僅 Windows 平台支援 MSDeploy 產生的套件。", + "loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "發現對 MSDeploy 安裝了不受支援的版本: %s。版本至少應為 3 (含) 以上", + "loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError": "電腦上的登錄找不到 MS 部署的位置 (錯誤: %s)", + "loc.messages.Nopackagefoundwithspecifiedpattern": "找不到具有指定模式的套件: %s
請確認工作中所提及的套件已在組建或上一個階段中發行為成品,並已在目前的作業中下載。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "有多個套件與指定模式相符: %s。請縮小搜尋模式範圍。", + "loc.messages.Trytodeploywebappagainwithappofflineoptionselected": "請先選取 [讓應用程式成為離線狀態] 選項,然後嘗試再次部署 App Service。", + "loc.messages.Trytodeploywebappagainwithrenamefileoptionselected": "請先選取 [重新命名鎖定的檔案] 選項,然後嘗試再次部署 App Service。", + "loc.messages.NOJSONfilematchedwithspecificpattern": "沒有符合特定模式 %s 的 JSON 檔案。", + "loc.messages.Configfiledoesntexists": "組態檔 %s 不存在。", + "loc.messages.Failedtowritetoconfigfilewitherror": "無法寫入組態檔 %s,錯誤為: %s", + "loc.messages.AppOfflineModeenabled": "已啟用 [應用程式離線] 模式。", + "loc.messages.Failedtoenableappofflinemode": "無法啟用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.AppOflineModedisabled": "已停用 [應用程式離線] 模式。", + "loc.messages.FailedtodisableAppOfflineMode": "無法停用 [應用程式離線] 模式。狀態碼: %s (%s)", + "loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform": "無法在非 Windows 平台執行 XML 轉換。", + "loc.messages.XdtTransformationErrorWhileTransforming": "轉換 %s (使用 %s) 時發生 XML 轉換錯誤。", + "loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "僅限使用 Windows 代理程式時才可使用 webdeploy 選項發佈", + "loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage": "msBuild 套件類型不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication": "虛擬應用程式不支援使用 zip deploy 發佈的選項。", + "loc.messages.Publishusingzipdeploydoesnotsupportwarfile": "使用 zip deploy 或 RunFromZip 發佈的選項不支援 war 檔案部署。", + "loc.messages.Publishusingrunfromzipwithpostdeploymentscript": "如果使用 RunFromZip 發佈會對 wwwroot 進行變更,就可能會因為資料夾是唯讀的,而不支援部署後指令碼。", + "loc.messages.ResourceDoesntExist": "資源 '%s' 不存在。應具備資源才可部署。", + "loc.messages.EncodeNotSupported": "偵測到檔案 %s 的檔案編碼為 %s。檔案編碼 %s 不支援變數替代。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.UnknownFileEncodeError": "無法偵測檔案 %s 的編碼 (typeCode: %s)。支援的編碼為 UTF-8 及 UTF-16 LE。", + "loc.messages.ShortFileBufferError": "檔案緩衝區太短而無法偵測編碼類型: %s", + "loc.messages.FailedToUpdateAzureRMWebAppConfigDetails": "無法更新 App Service 組態詳細資料。錯誤: %s", + "loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails": "已成功更新 App Service 組態詳細資料", + "loc.messages.RequestedURLforkuduphysicalpath": "Kudu 實體路徑的要求 URL: %s", + "loc.messages.Physicalpathalreadyexists": "實體路徑 '%s' 已存在", + "loc.messages.KuduPhysicalpathCreatedSuccessfully": "已成功建立 Kudu 實體路徑: %s", + "loc.messages.FailedtocreateKuduPhysicalPath": "無法建立 Kudu 實體路徑。錯誤 : %s", + "loc.messages.FailedtocheckphysicalPath": "無法檢查 Kudu 實體路徑。錯誤碼: %s", + "loc.messages.VirtualApplicationDoesNotExist": "虛擬應用程式不存在: %s", + "loc.messages.JSONParseError": "無法剖析 JSON 檔案: %s。錯誤: %s", + "loc.messages.JSONvariablesubstitutionappliedsuccessfully": "已成功套用 JSON 變數替代。", + "loc.messages.XMLvariablesubstitutionappliedsuccessfully": "已成功套用替代的 XML 變數。", + "loc.messages.failedtoUploadFileToKudu": "無法將檔案 %s 上傳到 Kudu (%s)。狀態碼: %s", + "loc.messages.failedtoUploadFileToKuduError": "無法將檔案 %s 上傳到 Kudu (%s)。錯誤: %s", + "loc.messages.ExecuteScriptOnKudu": "正在於 Kudu 服務上執行指定的指令碼。", + "loc.messages.FailedToRunScriptOnKuduError": "無法在 Kudu 服務上執行指令碼。錯誤: %s", + "loc.messages.FailedToRunScriptOnKudu": "無法在 Kudu 上執行指令碼: %s。狀態碼: %s", + "loc.messages.ScriptExecutionOnKuduSuccess": "已成功在 Kudu 上執行指令碼。", + "loc.messages.ScriptExecutionOnKuduFailed": "執行的指令碼傳回了下列傳回碼: '%s'。錯誤: %s", + "loc.messages.FailedtoDeleteFileFromKudu": "無法從 Kudu (%s) 刪除檔案 %s。狀態碼: %s", + "loc.messages.FailedtoDeleteFileFromKuduError": "無法從下列 Kudu 刪除檔案 %s: %s。錯誤: %s", + "loc.messages.ScriptFileNotFound": "找不到指令碼檔案 '%s'。", + "loc.messages.InvalidScriptFile": "提供的指令檔 '%s' 無效。有效的副檔名為 .bat 與 .cmd (Windows),以及 .sh (Linux)", + "loc.messages.RetryForTimeoutIssue": "因為逾時,導致指令碼執行失敗。請重試。", + "loc.messages.stdoutFromScript": "指令碼的標準輸出:", + "loc.messages.stderrFromScript": "指令碼的標準錯誤:", + "loc.messages.WebConfigAlreadyExists": "已有 web.config 檔案。未產生任何檔案。", + "loc.messages.SuccessfullyGeneratedWebConfig": "已成功產生 web.config 檔案", + "loc.messages.FailedToGenerateWebConfig": "無法產生 web.config。%s", + "loc.messages.FailedToGetKuduFileContent": "無法取得檔案內容: %s。狀態碼: %s (%s)", + "loc.messages.FailedToGetKuduFileContentError": "無法取得檔案內容: %s。錯誤: %s", + "loc.messages.ScriptStatusTimeout": "因為逾時,所以無法擷取指令碼狀態。", + "loc.messages.PollingForFileTimeOut": "因為逾時,所以無法擷取指令碼狀態。您可以將 'appservicedeploy.retrytimeout' 變數設定為所需的分鐘數來提高逾時限制。", + "loc.messages.InvalidPollOption": "提供的輪詢選項無效: %s。", + "loc.messages.MissingAppTypeWebConfigParameters": "Web.config 參數中缺少屬性 '-appType'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask'、'node' 和 'Go'。
假如是 Python Bottle 架構,即為 '-appType python_Bottle' (不含括號)。", + "loc.messages.AutoDetectDjangoSettingsFailed": "偵測不到 DJANGO_SETTINGS_MODULE 'settings.py' 檔案路徑。請確定 'settings.py' 檔案存在,或依下列格式在 Web.config 參數輸入中提供正確的路徑: '-DJANGO_SETTINGS_MODULE <資料夾名稱>.settings'", + "loc.messages.FailedToApplyTransformation": "無法對指定的套件套用轉換。請確認下列事項。", + "loc.messages.FailedToApplyTransformationReason1": "1. 是否已對建置期間由 MSBuild 產生的套件套用轉換。若已套用,請移除 csproj 檔案中每項設定的 標記,然後重建。", + "loc.messages.FailedToApplyTransformationReason2": "2. 確認組態檔與轉換檔皆位於套件內的同一個資料夾中。", + "loc.messages.AutoParameterizationMessage": "根據預設,Web.config 中的 ConnectionString 屬性已經過參數化。請注意,轉換對 connectionString 屬性無效,因為 'Parameters.xml' 或 'SetParameters.xml' 檔案已於部署期間覆寫該值。您可在產生 MSBuild 套件期間設定 /p:AutoParameterizationWebConfigConnectionStrings=False,停用自動參數化。", + "loc.messages.UnsupportedAppType": "產生 Web.config 時不支援應用程式類型 '%s'。'-appType' 的有效值為: 'python_Bottle'、'python_Django'、'python_Flask' 與 'node'", + "loc.messages.UnableToFetchAuthorityURL": "無法擷取授權單位 URL。", + "loc.messages.UnableToFetchActiveDirectory": "無法擷取 Active Directory 資源識別碼。", + "loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand": "已成功更新執行階段堆疊與啟動命令。", + "loc.messages.FailedToUpdateRuntimeStackAndStartupCommand": "無法更新執行階段堆疊與啟動命令。錯誤: %s。", + "loc.messages.SuccessfullyUpdatedWebAppSettings": "已成功更新應用程式設定。", + "loc.messages.FailedToUpdateAppSettingsInConfigDetails": "無法更新應用程式設定。錯誤: %s。", + "loc.messages.UnableToGetAzureRMWebAppMetadata": "無法擷取 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.UnableToUpdateAzureRMWebAppMetadata": "無法更新 AzureRM WebApp 中繼資料。錯誤碼: %s", + "loc.messages.Unabletoretrieveazureregistrycredentials": "無法擷取 Azure Container Registry 認證。[狀態碼: '%s']", + "loc.messages.UnableToReadResponseBody": "無法讀取回應主體。錯誤: %s", + "loc.messages.UnableToUpdateWebAppConfigDetails": "無法更新 WebApp 組態詳細資料。StatusCode: '%s'", + "loc.messages.AddingReleaseAnnotation": "正在新增 Application Insights 資源 '%s' 的版本註釋", + "loc.messages.SuccessfullyAddedReleaseAnnotation": "已成功將版本註釋新增至 Application Insights: %s", + "loc.messages.FailedAddingReleaseAnnotation": "無法新增版本註釋。%s", + "loc.messages.RenameLockedFilesEnabled": "將為 App Service 啟用的已鎖定檔案重新命名。", + "loc.messages.FailedToEnableRenameLockedFiles": "無法允許已鎖定重新命名的檔案。錯誤: %s", + "loc.messages.WebJobsInProgressIssue": "有幾個處於執行狀態的 WebJob 導致部署無法移除檔案。您可以在部署前停用 [移除目的地的其他檔案] 選項或停止連續的作業。", + "loc.messages.FailedToFetchKuduAppSettings": "無法擷取 Kudu 應用程式設定。錯誤: %s", + "loc.messages.FailedToCreatePath": "無法從 Kudu 建立路徑 '%s'。錯誤: %s", + "loc.messages.FailedToDeleteFile": "無法從 Kudu 刪除檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToDeleteFolder": "無法從 Kudu 刪除資料夾 '%s'。錯誤: %s", + "loc.messages.FailedToUploadFile": "無法從 Kudu 上傳檔案 '%s/%s'。錯誤: %s", + "loc.messages.FailedToGetFileContent": "無法從 Kudu 取得檔案內容 '%s/%s'。錯誤: %s", + "loc.messages.FailedToListPath": "無法從 Kudu 列出路徑 '%s'。錯誤: %s", + "loc.messages.RetryToDeploy": "正在重試部署套件。", + "loc.messages.FailedToGetAppServiceDetails": "無法擷取 App Service '%s' 詳細資料。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingProfile": "無法擷取 App Service '%s' 發佈設定檔。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceMetadata": "無法更新 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToGetAppServiceMetadata": "無法取得 App Service '%s' 中繼資料。錯誤: %s", + "loc.messages.FailedToPatchAppServiceConfiguration": "無法修補 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceConfiguration": "無法更新 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServiceConfiguration": "無法取得 App Service '%s' 組態。錯誤: %s", + "loc.messages.FailedToGetAppServicePublishingCredentials": "無法擷取 App Service '%s' 發佈認證。錯誤: %s", + "loc.messages.FailedToGetAppServiceApplicationSettings": "無法取得 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.FailedToUpdateAppServiceApplicationSettings": "無法更新 App Service '%s' 應用程式設定。錯誤: %s", + "loc.messages.UpdatingAppServiceConfigurationSettings": "正在嘗試更新 App Service 組態設定。資料: %s", + "loc.messages.UpdatedAppServiceConfigurationSettings": "已更新 App Service 組態設定。", + "loc.messages.UpdatingAppServiceApplicationSettings": "正在嘗試更新 App Service 應用程式設定。資料: %s", + "loc.messages.AppServiceApplicationSettingsAlreadyPresent": "App Service 應用程式設定已存在。", + "loc.messages.AppServiceConnectionStringsAlreadyPresent": "App Service 連接字串已存在。", + "loc.messages.UpdatedAppServiceApplicationSettings": "已更新 App Service 應用程式設定與 Kudu 應用程式設定。", + "loc.messages.MultipleResourceGroupFoundForAppService": "找到 App Service '%s' 的多個資源群組。", + "loc.messages.PackageDeploymentUsingZipDeployFailed": "使用 ZIP Deploy 的套件部署失敗。如需詳細資料,請查看記錄。", + "loc.messages.PackageDeploymentInitiated": "已起始使用 ZIP Deploy 部署套件。", + "loc.messages.WarPackageDeploymentInitiated": "已開始使用 WAR Deploy 部署套件。", + "loc.messages.FailedToGetDeploymentLogs": "無法取得部署記錄。錯誤: %s", + "loc.messages.GoExeNameNotPresent": "沒有 Go 可執行檔的名稱", + "loc.messages.WarDeploymentRetry": "因為 war 檔案稍早未成功展開,所以正在重試其部署。", + "loc.messages.Updatemachinetoenablesecuretlsprotocol": "請確定電腦目前使用 TLS 1.2 通訊協定或更高的版本。請查看 https://aka.ms/enableTlsv2,以取得如何於您的電腦上啟用 TLS 的詳細資訊。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "無法擷取 Azure 的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "無法擷取受控服務主體的存取權杖。請設定虛擬機器的受控服務識別 (MSI) (https://aka.ms/azure-msi-docs)。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "無法擷取受控服務主體的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.XmlParsingFailed": "無法剖析 publishProfileXML 檔案,錯誤: %s", + "loc.messages.PropertyDoesntExistPublishProfile": "[%s] 屬性不存在於發佈設定檔中", + "loc.messages.InvalidConnectionType": "服務連線類型無效", + "loc.messages.InvalidImageSourceType": "映像來源類型無效", + "loc.messages.InvalidPublishProfile": "發佈設定檔的檔案無效。", + "loc.messages.ASE_SSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在建置或發行管線中將名為 VSTS_ARM_REST_IGNORE_SSL_ERRORS 的變數設為 true 值", + "loc.messages.ZipDeployLogsURL": "可於 %s 檢視 Zip 部署記錄", + "loc.messages.DeployLogsURL": "在 %s 可檢視部署記錄檔", + "loc.messages.AppServiceApplicationURL": "App Service 應用程式 URL: %s", + "loc.messages.ASE_WebDeploySSLIssueRecommendation": "若要在 App Service 中使用憑證,該憑證必須經過信任的憑證授權單位所簽署。若您的 Web 應用程式顯示憑證驗證錯誤,可能是您使用了自我簽署憑證。若要解決這些錯誤,您必須在 Web 部署選項的其他引數中傳遞 -allowUntrusted。", + "loc.messages.FailedToGetResourceID": "無法取得資源類型 '%s' 和資源名稱 '%s' 的資源識別碼。錯誤: %s", + "loc.messages.JarPathNotPresent": "沒有 Java 的 jar 路徑", + "loc.messages.FailedToUpdateApplicationInsightsResource": "無法更新 Application Insights '%s' 資源。錯誤: %s", + "loc.messages.RunFromZipPreventsFileInUseError": "從 Web Deploy 移至 RunFrom Package 可協助避免 FILE_IN_USE 錯誤。請注意,Run From Package 不支援 msBuild 套件類型。請變更您的套件格式以使用此部署方法。" +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/.npmrc b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/.npmrc new file mode 100644 index 000000000000..969ccea07661 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/.npmrc @@ -0,0 +1,3 @@ +registry=https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..5737c680118f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,69 @@ +import tl = require('azure-pipelines-task-lib'); +import { AzureRmWebAppDeploymentProvider } from '../deploymentProvider/AzureRmWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); + +export class AzureRmWebAppDeploymentProviderL0Tests { + + public static async startAzureRmWebAppDeploymentProviderL0Tests() { + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps(); + await AzureRmWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled(); + await AzureRmWebAppDeploymentProviderL0Tests.testForVirtualApplication(); + await AzureRmWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus(); + } + + public static async testForPreDeploymentSteps() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps should succeeded but failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with slot enabled failed with error'); + } + } + + public static async testForVirtualApplication() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + taskParameters.VirtualApplication = "VirtualApplication"; + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps with virtual application should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps with virtual application failed with error'); + } + } + + public static async testForUpdateDeploymentStatus() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var azureRmWebAppDeploymentProvider : AzureRmWebAppDeploymentProvider = new AzureRmWebAppDeploymentProvider(taskParameters); + await azureRmWebAppDeploymentProvider.PreDeploymentStep(); + await azureRmWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus steps should succeeded but failed with error'); + } + } + +} + +AzureRmWebAppDeploymentProviderL0Tests.startAzureRmWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..0bf907fcc75e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/AzureRmWebAppDeploymentProviderTests.ts @@ -0,0 +1,41 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class AzureRmWebAppDeploymentProviderTests { + + public static startAzureRmWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'AzureRmWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +AzureRmWebAppDeploymentProviderTests.startAzureRmWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..2029bd44bab3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,115 @@ +import tl = require('azure-pipelines-task-lib'); +import { BuiltInLinuxWebAppDeploymentProvider } from '../deploymentProvider/BuiltInLinuxWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockLinuxAppSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockLinuxAppSettings(); + +export class BuiltInLinuxWebAppDeploymentProviderL0Tests { + + public static async startBuiltInLinuxWebAppDeploymentProviderL0Tests() { + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_BuiltInLinuxWebApp(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage(); + await BuiltInLinuxWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage(); + } + + public static async testForPreDeploymentSteps_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for built in linux web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in linux web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_BuiltInLinuxWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for built in linux web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_ZipPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_FolderPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with folder package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_WarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with war package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_BuiltInLinuxWebApp_JarPackage() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.jar" }; + var builtInLinuxWebAppDeploymentProvider : BuiltInLinuxWebAppDeploymentProvider = new BuiltInLinuxWebAppDeploymentProvider(taskParameters); + await builtInLinuxWebAppDeploymentProvider.PreDeploymentStep(); + await builtInLinuxWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for built in linux web app steps with jar package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for built in linux web app steps with jar package should succeeded but failed with error'); + } + } + +} + +BuiltInLinuxWebAppDeploymentProviderL0Tests.startBuiltInLinuxWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..3995adce9d91 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/BuiltInLinuxWebAppDeploymentProviderTests.ts @@ -0,0 +1,80 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class BuiltInLinuxWebAppDeploymentProviderTests { + + public static startBuiltInLinuxWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'BuiltInLinuxWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + + +} + +BuiltInLinuxWebAppDeploymentProviderTests.startBuiltInLinuxWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..6cc81a9913d1 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,70 @@ +import tl = require('azure-pipelines-task-lib'); +import { ContainerWebAppDeploymentProvider } from '../deploymentProvider/ContainerWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockContainerDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockContainerDeploySettings(); + +export class ContainerWebAppDeploymentProviderL0Tests { + + public static async startContainerWebAppDeploymentProviderL0Tests() { + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_ContainerWebApp(); + await ContainerWebAppDeploymentProviderL0Tests.testForDeployWebSteps_ContainerWebApp(); + } + + public static async testForPreDeploymentSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for container web app with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for container web app with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for container web app steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebSteps_ContainerWebApp() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = null; + var containerWebAppDeploymentProvider : ContainerWebAppDeploymentProvider = new ContainerWebAppDeploymentProvider(taskParameters); + await containerWebAppDeploymentProvider.PreDeploymentStep(); + await containerWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'Web app Deployment steps for container should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'Deployment web app steps for container failed with error'); + } + } + +} + +ContainerWebAppDeploymentProviderL0Tests.startContainerWebAppDeploymentProviderL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..fb1d790687ac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/ContainerWebAppDeploymentProviderTests.ts @@ -0,0 +1,43 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class ContainerWebAppDeploymentProviderTests { + + public static startContainerWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'ContainerWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + tr.setInput("DockerNamespace", "DockerNamespace"); + tr.setInput("DockerRepository", "DockerRepository"); + tr.setInput("DockerImageTag","DockerImageTag"); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(_) { + return "MOCK_DEPLOYMENT_ID"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + + } + +} + +ContainerWebAppDeploymentProviderTests.startContainerWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryL0Tests.ts new file mode 100644 index 000000000000..552c63e6d0fe --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryL0Tests.ts @@ -0,0 +1,177 @@ +import tl = require('azure-pipelines-task-lib'); +import { DeploymentFactory } from '../deploymentProvider/DeploymentFactory'; +import { IWebAppDeploymentProvider } from '../deploymentProvider/IWebAppDeploymentProvider'; +import { TaskParametersUtility, TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +export class DeploymentFactoryL0Tests { + + public static async startDeploymentFactoryL0Tests() { + await DeploymentFactoryL0Tests.testForLinuxWebDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWarDeployProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider() + await DeploymentFactoryL0Tests.testForPublishProfileProvider(); + await DeploymentFactoryL0Tests.testForContainerWebAppDeploymentProvider(); + await DeploymentFactoryL0Tests.testForWindowsWebAppZipDeployProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppRunFromZipProvider_UserSelected(); + await DeploymentFactoryL0Tests.testForWindowsWebAppWebDeployProvider_UserSelected() + } + + public static async testForLinuxWebDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var linuxWebAppDeploymentProvider: IWebAppDeploymentProvider = await new DeploymentFactory(taskParameters).GetDeploymentProvider(); + if(linuxWebAppDeploymentProvider.constructor.name === "BuiltInLinuxWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'LinuxWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'LinuxWebAppDeploymentProvider should be excepted but failed with error.'+error); + } + } + + public static async testForWindowsWebAppRunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.isMSBuildPackage = () :Promise => {return Promise.resolve(false)}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWarDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWarDeployProvider.constructor.name === "WindowsWebAppWarDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWarDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWarDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.jar}; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppWebDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.webDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppWebDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppWebDeployProvider.constructor.name === "WindowsWebAppWebDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppWebDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppWebDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppZipDeployProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.zipDeploy; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppZipDeployProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppZipDeployProvider.constructor.name === "WindowsWebAppZipDeployProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppZipDeployProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppZipDeployProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForWindowsWebAppRunFromZipProvider_UserSelected() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = false; + taskParameters.UseWebDeploy = true; + taskParameters.DeploymentType = DeploymentType.runFromZip; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var windowsWebAppRunFromZipProvider: IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(windowsWebAppRunFromZipProvider.constructor.name === "WindowsWebAppRunFromZipProvider"){ + tl.setResult(tl.TaskResult.Succeeded, 'WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'WindowsWebAppRunFromZipProvider for user selected should be excepted but failed with error.'); + } + } + + public static async testForPublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ConnectionType = "PublishProfile"; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var publishProfileProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(publishProfileProvider.constructor.name === "PublishProfileWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'PublishProfileWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PublishProfileWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + + public static async testForContainerWebAppDeploymentProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.isLinuxApp = true; + taskParameters.isBuiltinLinuxWebApp = false; + taskParameters.isContainerWebApp = true; + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParameters); + var containerWebAppDeploymentProvider : IWebAppDeploymentProvider = await deploymentFactory.GetDeploymentProvider(); + if(containerWebAppDeploymentProvider.constructor.name === "ContainerWebAppDeploymentProvider") { + tl.setResult(tl.TaskResult.Succeeded, 'ContainerWebAppDeploymentProvider should be excepted.'); + } else { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed.'); + } + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'ContainerWebAppDeploymentProvider should be excepted but failed with error.'); + } + } + +} + +DeploymentFactoryL0Tests.startDeploymentFactoryL0Tests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryTests.ts new file mode 100644 index 000000000000..6cbde3e31e5a --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/DeploymentFactoryTests.ts @@ -0,0 +1,19 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class DeploymentFactoryTests { + + public static startDeploymentFactoryTests() { + let tp = path.join(__dirname, 'DeploymentFactoryL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setAgentsData(); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +DeploymentFactoryTests.startDeploymentFactoryTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0.ts new file mode 100644 index 000000000000..b2eb464a706f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0.ts @@ -0,0 +1,236 @@ +import * as path from "path"; +import * as assert from "assert"; +import * as ttm from "azure-pipelines-task-lib/mock-test"; +import tl = require('azure-pipelines-task-lib'); + +var AppServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service.js"); +var KuduServiceTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-app-service-kudu-tests.js"); +var ApplicationInsightsTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-appinsights-tests.js"); +var ResourcesTests = require("../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/L0-azure-arm-resource-tests.js"); + +const tmpDir = path.join(__dirname, 'temp'); + +describe('AzureRmWebAppDeployment Suite', function() { + this.timeout(60000); + this.beforeAll(done => { + tl.mkdirP(tmpDir); + done(); + }); + this.afterAll(done => { + tl.rmRF(tmpDir); + done(); + }); + + before((done) => { + if(!tl.exist(path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/node_modules'))) { + tl.cp(path.join( __dirname, 'node_modules'), path.join(__dirname, '..', 'node_modules/azure-pipelines-tasks-azure-arm-rest/Tests'), '-rf', true); + } + + done(); + }); + + ApplicationInsightsTests.ApplicationInsightsTests(); + AppServiceTests.AzureAppServiceMockTests(); + KuduServiceTests.KuduServiceTests(); + ResourcesTests.ResourcesTests(); + + it('AzureRmWebAppDeploymentV4 DeploymentFactoryTests', (done: MochaDone) => { + let tp = path.join(__dirname,'DeploymentFactoryTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('LinuxWebAppDeploymentProvider should be excepted.'), 'Should have printed: LinuxWebAppDeploymentProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppWarDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppWarDeployProvider should be expected.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider should be expected.'); + assert(tr.stdOutContained('PublishProfileWebAppDeploymentProvider should be excepted.'), 'Should have printed: PublishProfileWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('ContainerWebAppDeploymentProvider should be excepted.'), 'Should have printed: ContainerWebAppDeploymentProvider should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppRunFromZipProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppRunFromZipProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppZipDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppZipDeployProvider for user selected should be excepted.'); + assert(tr.stdOutContained('WindowsWebAppWebDeployProvider for user selected should be excepted.'), 'Should have printed: WindowsWebAppWebDeployProvider for user selected should be excepted.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 AzureRmWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'AzureRmWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('PreDeployment steps with slot enabled should succeeded'), 'Should have printed: PreDeployment steps withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('PreDeployment steps with virtual application should succeeded'), 'Should have printed: PreDeployment steps with slot enabled should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 BuiltInLinuxWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'BuiltInLinuxWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for built in linux web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for built in linux web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess'); + assert(tr.stdOutContained('Skipped updating the SCM value'), 'Should have printed: Skipped updating the SCM value'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with zip package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with folder package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with war package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with war package succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for built in linux web app steps with jar package succeeded'), 'Should have printed: DeployWebAppStep for built in linux web app steps with jar package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 ContainerWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'ContainerWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for container web app should succeeded'), 'Should have printed: PreDeployment steps for container web app should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for container web app with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for container web app withSlotEnabled should succeeded'); + assert(tr.stdOutContained('Resource Group: MOCK_RESOURCE_GROUP_NAME'), 'Should have printed: Resource Group: MOCK_RESOURCE_GROUP_NAME'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'), 'Should have printed: loc_mock_UpdatingAppServiceConfigurationSettings {"linuxFxVersion":"DOCKER|dockernamespace/dockerrepository:DockerImageTag"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceConfigurationSettings'), 'Should have printed: loc_mock_UpdatedAppServiceConfigurationSettings'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('Web app Deployment steps for container should succeeded'), 'Should have printed: Web app Deployment steps for container should succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppRunFromZipProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppRunFromZipProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for run from zip should succeeded'), 'Should have printed: PreDeployment steps for run from zip should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for run from zip with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for run from zip with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.') + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'), 'Should have printed: loc_mock_UpdatingAppServiceApplicationSettings {"WEBSITE_RUN_FROM_PACKAGE":"1"}'); + assert(tr.stdOutContained('loc_mock_UpdatedAppServiceApplicationSettings') || tr.stdOutContained('loc_mock_AppServiceApplicationSettingsAlreadyPresent'), 'Should have printed: loc_mock_UpdatedAppServiceApplicationSettings or loc_mock_AppServiceApplicationSettingsAlreadyPresent'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + assert(tr.stdOutContained('DeployWebAppStep for run from zip steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for run from zip steps with folder package succeeded.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWarDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWarDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for war deploy should succeeded'), 'Should have printed: PreDeployment steps for war deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for war deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for war deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for war deploy steps with war package succeeded'), 'Should have printed: DeployWebAppStep for war deploy steps with war package succeeded.') + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('loc_mock_WarPackageDeploymentInitiated'), 'Should have printed: loc_mock_WarPackageDeploymentInitiated.'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 WindowsWebAppZipDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppZipDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for zip deploy should succeeded'), 'Should have printed: PreDeployment steps for zip deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for zip deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for zip deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with zip package succeeded.') + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_PackageDeploymentSuccess'), 'Should have printed: loc_mock_PackageDeploymentSuccess.'); + assert(tr.stdOutContained('DeployWebAppStep for zip deploy steps with folder package succeeded'), 'Should have printed: DeployWebAppStep for zip deploy steps with folder package succeeded.'); + assert(tr.stdOutContained('Compressed folder into zip webAppPkg.zip'), 'Should have printed: Compressed folder into zip webAppPkg.zip.'); + done(); + } + catch(error) { + done(error); + } + }); + + + it('AzureRmWebAppDeploymentV4 WindowsWebAppWebDeployProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'WindowsWebAppWebDeployProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for web deploy should succeeded'), 'Should have printed: PreDeployment steps for web deploy should succeeded'); + assert(tr.stdOutContained('PreDeployment steps for web deploy with slot enabled should succeeded'), 'Should have printed: PreDeployment steps for web deploy with slot enabled should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'), 'Should have printed: set AppServiceApplicationUrl=http://mytestapp.azurewebsites.net'); + assert(tr.stdOutContained('Active DeploymentId :MOCK_DEPLOYMENT_ID'), 'Should have printed: Active DeploymentId :MOCK_DEPLOYMENT_ID.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with zip package succeeded.'); + assert(tr.stdOutContained('loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'), 'Should have printed: loc_mock_GotconnectiondetailsforazureRMWebApp0 mytestapp'); + assert(tr.stdOutContained('loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net'), 'Should have printed: loc_mock_AppServiceApplicationURL http://mytestapp.azurewebsites.net.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip /site/wwwroot.'); + assert(tr.stdOutContained('loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'), 'Should have printed: loc_mock_Successfullydeployedpackageusingkuduserviceat webAppPkg.zip physicalPath'); + assert(tr.stdOutContained('DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'), 'Should have printed: DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 PublishProfileWebAppDeploymentProviderTests', (done: MochaDone) => { + let tp = path.join(__dirname,'PublishProfileWebAppDeploymentProviderTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('PreDeployment steps for publish profile should succeeded'), 'Should have printed: PreDeployment steps for publish profile should succeeded'); + assert(tr.stdOutContained('set AppServiceApplicationUrl=SiteUrl'), 'Should have printed: set AppServiceApplicationUrl=SiteUrl'); + assert(tr.stdOutContained('UpdateDeploymentStatus for publish profile steps should succeeded'), 'Should have printed: UpdateDeploymentStatus for publish profile steps should succeeded'); + assert(tr.stdOutContained('DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'), 'Should have printed: DeployWebAppStep for publish profile steps steps failed with errorError: loc_mock_PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent'); + done(); + } + catch(error) { + done(error); + } + }); + + it('AzureRmWebAppDeploymentV4 Validate TaskParameters', (done: MochaDone) => { + let tp = path.join(__dirname,'TaskParametersTests.js'); + let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp); + try { + tr.run(); + assert(tr.stdOutContained('SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'), 'Should have printed: SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + assert(tr.stdOutContained('msbuild package PRESENT'), 'Should have printed: msbuild package PRESENT'); + done(); + } + catch(error) { + console.log(tr.stdout); + console.log(tr.stderr); + done(error); + } + }); + +}); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0GenerateWebConfigForNode.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0GenerateWebConfigForNode.ts new file mode 100644 index 000000000000..1e1459c9eec6 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0GenerateWebConfigForNode.ts @@ -0,0 +1,283 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('GenerateWebConfig','true'); +tr.setInput('WebConfigParameters','-appType node -Handler iisnode -NodeStartFile server.js'); +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "temp_web_package_random_path/web.config": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function() { + console.log('App Service availability check.'); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + } +}); + +tr.registerMock('./ParameterParserUtility', { + parse: function (data) { + return { + "appType": { + "value": "node" + }, + "Handler": { + "value": "iisnode" + }, + "NodeStartFile": { + "value": "server.js" + } + } + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(webConfigPath,options) { + return ""; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0LinuxBuiltinImage.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0LinuxBuiltinImage.ts new file mode 100644 index 000000000000..bb1e5decedef --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0LinuxBuiltinImage.ts @@ -0,0 +1,236 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('ImageSource', "Builtin Image"); +tr.setInput('WebAppKind', "applinux"); +tr.setInput('RuntimeStack', "dummy|version"); +tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + testAzureWebAppAvailability: function(Url, port) { + console.log("Testing availability of the webApp"); + }, + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated web app config details"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getWebAppAppSettings: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var appSettings = { + properties: { + } + }; + return appSettings; + }, + updateWebAppAppSettings: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName){ + console.log("Successfully updated webApp app-settings"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function () { + return false; + }, + canUseWebDeploy: function () { + return false; + }, + findfiles: function () { + return ['linuxPkg']; + }, + isMSDeployPackage: function () { + return false; + } +}); +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsDefault.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsDefault.ts new file mode 100644 index 000000000000..b69c217af9d7 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsDefault.ts @@ -0,0 +1,217 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js",{ + getArchivedEntries: function(webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + ] + }; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailArchive.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailArchive.ts new file mode 100644 index 000000000000..3bebf8379159 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailArchive.ts @@ -0,0 +1,230 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = true; + return isParamFilePresent; + } +}); + +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + unzip: zipUtility.unzip, + getArchivedEntries: zipUtility.getArchivedEntries +}); + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailParamPkg.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailParamPkg.ts new file mode 100644 index 000000000000..a584aa554afd --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFailParamPkg.ts @@ -0,0 +1,213 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + + +import mockTask = require('azure-pipelines-task-lib/mock-task'); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + }, + containsParamFile: function(webAppPackage: string) { + var taskResult = mockTask.execSync("cmd", ['/C',"DefaultWorkingDirectory\\msDeployParam.bat"]); + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + throw new Error('Folder Archiving Failed'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + } +}); + +tr.registerMock("azure-pipelines-tasks-webdeployment-common/ziputility.js", { + getArchivedEntries: function( webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFolderPkg.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFolderPkg.ts new file mode 100644 index 000000000000..fe9247e0807f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsFolderPkg.ts @@ -0,0 +1,237 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'false'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + } + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.registerMock('webdeployment-common/ziputility.js', { + archiveFolder : function() { + console.log('Folder Archiving Successful'); + } +}); + +tr.registerMock('webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return true; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return false; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderOrZipPath: function() { + return 'temp_web_package_random_path'; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsParamFileinPkg.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsParamFileinPkg.ts new file mode 100644 index 000000000000..ed36177767db --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsParamFileinPkg.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "cmd" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Linux" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('./kuduutility.js', { + deployWebAppPackage: function(webAppPackage, webAppZipFile) { + console.log ('Deployed using KuduDeploy'); + }, + getVirtualAndPhysicalPaths: function (virtualApplication, virtualApplicationMappings) { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = "/site/wwwroot"; + var virtualPath = "/"; + if (virtualApplication) { + virtualPath = "/" + virtualApplication; + } + for (var index in virtualApplicationMappings) { + var mapping = virtualApplicationMappings[index]; + if (mapping.virtualPath == virtualPath) { + physicalPath = mapping.physicalPath; + break; + } + } + return [virtualPath, physicalPath]; + }, + containsParamFile: function (webAppPackage) { + var isParamFilePresent = false; + return isParamFilePresent; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsXdtTransformationFail.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..8fa7ec87fa34 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0NonWindowsXdtTransformationFail.ts @@ -0,0 +1,185 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'false'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + archiveFolder: function() { + return "DefaultWorkingDirectory\\temp_web_package.zip" + }, + getArchivedEntries: function() { + return { + entries: ['Web.config', 'Web.debug.config'] + } + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScript.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScript.ts new file mode 100644 index 000000000000..826ec50f3335 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScript.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.cmd', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.cmd' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "File Path", null, 'myscript.cmd', false, false); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScriptForLinux.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScriptForLinux.ts new file mode 100644 index 000000000000..07b0f60c6d58 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0RunPostDeploymentScriptForLinux.ts @@ -0,0 +1,207 @@ +var mockery = require('mockery'); +var path = require('path'); +mockery.enable({ + useCleanCache: true, + warnOnReplace: false, + warnOnUnregistered: false +}); + +mockery.registerMock('typed-rest-client/HttpClient', { + HttpClient: function() { + return { + get: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return { + then: function(handler) { + handler({ + message: { + statusCode: 200, + statusMessage: "Success" + }, + readBody: function() { + return getUrlMap[url]; + } + }); + } + }; + } + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, headers) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return; + } + + throw Error('Unknown verb or URL - GET'); + }, + post: function(url, data, headers) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return; + } + throw Error('Unknown verb or URL - SEND'); + }, + sendStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('typed-rest-client/RestClient', { + RestClient: function() { + return { + get: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var getUrlMap = { + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stdout.txt': 'stdout content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/stderr.txt': 'sterr content', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/script_result.txt': '0' + }; + + if(getUrlMap[url]) { + console.log('GET:' + url); + return getUrlMap[url]; + } + + throw Error('Unknown verb or URL - GET'); + }, + del: function(url, options) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + + var deleteUrlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh' + ]; + + if (deleteUrlArray.indexOf(url) != -1) { + console.log("DELETED:" + url); + return { + then: function() { + } + }; + } + + throw Error('Unknown verb or URL - GET'); + }, + create: function(url, resources, options) { + if (url == 'https://mytestappKuduUrl/api/command') { + console.log('POST:https://mytestappKuduUrl/api/command'); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - SEND'); + }, + uploadStream: function(verb, url) { + url = url.substring(0, url.lastIndexOf('_')) + path.extname(url); + var urlArray = [ + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/kuduPostDeploymentScript.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/mainCmdFile.sh', + 'https://mytestappKuduUrl/api/vfs/site/wwwroot/delete_log_file.sh' + ]; + + if(verb == 'PUT' && urlArray.indexOf(url) != -1) { + console.log('PUT:' + url); + return { + then: function() { + } + }; + } + throw Error('Unknown verb or URL - sendStream'); + } + } + } +}); + +mockery.registerMock('azure-pipelines-task-lib/task', { + exist: function() { + return true; + }, + getVariable: function(variable) { + if(variable == "agent.proxyurl") { + return null; + } + return 'workingDirectory'; + }, + debug: function(message) { + console.log('##debug : ' + message); + }, + loc: function(message, argument) { + console.log('##LOC: ' + message + ' : ' + argument); + }, + writeFile: function(fileName, content) { + console.log('##FileWrite: ' + fileName); + }, + rmRF: function(fileName) { + console.log('##rmRF: ' + fileName); + } + +}); +mockery.registerMock('q', { + 'defer': function() { + return { + promise: { + 'content': '0' + }, + resolve: function(result) { + return result; + } + }; + } +}); + +var fs = require('fs'); +mockery.registerMock('fs', { + 'createReadStream': function() { + return ''; + }, + statSync: fs.statSync, + writeFileSync: fs.writeFileSync, + readFileSync: fs.readFileSync +}); +var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' +}; + +var kuduUtility = require('../kuduutility.js'); +kuduUtility.runPostDeploymentScript(mockPublishProfile, 'site/wwwroot', "Inline Script", "run command xyz", null, false, true); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsAllInput.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsAllInput.ts new file mode 100644 index 000000000000..094f74ff0059 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsAllInput.ts @@ -0,0 +1,232 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('RemoveAdditionalFilesFlag', 'true'); +tr.setInput('ExcludeFilesFromAppDataFlag', 'true'); +tr.setInput('TakeAppOfflineFlag', 'false'); +tr.setInput('VirtualApplication', 'virtualApp'); +tr.setInput('AdditionalArguments', 'additionalArguments'); +tr.setInput('WebAppUri', 'someuri'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp/virtualApp\' -skip:Directory=App_Data additionalArguments -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('./kuduutility.js', { + getVirtualAndPhysicalPaths : function() { + return ["/virtualApp", "/test/path"] + }, + ensurePhysicalPathExists: function() { + return true; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefault.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefault.ts new file mode 100644 index 000000000000..47fc64f9c0dc --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefault.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + return { }; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefaultReleaseAnnotationFail.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefaultReleaseAnnotationFail.ts new file mode 100644 index 000000000000..cfb4c7d8bb2e --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsDefaultReleaseAnnotationFail.ts @@ -0,0 +1,228 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:sync -source:package='webAppPkg.zip' -dest:auto,ComputerName='https://mytestappKuduUrl/msdeploy.axd?site=mytestapp',UserName='$mytestapp',Password='mytestappPwd',AuthType='Basic' -setParam:name='IIS Web Application Name',value='mytestapp' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern": ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg": [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function (webDeployPkg) { + return { + "entries": [ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs: msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath: function () { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if (deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function (SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [['Object'], ['Object'], ['Object']], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function (publishingProfile, isDeploymentSuccess, customMessage) { + if (isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings: function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string) { + var appSettings = { + properties: { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings: function () { + return true; + }, + updateAzureRMWebAppConfigDetails: function () { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function () { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function () { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return [{ + name: "ApplicationInsights", + id: "ApplicationInsightsResourceId", + InstrumentationKey: "00000000-0000-0000-0000-000000000000" + }]; + }, + addReleaseAnnotation: () => { + throw "Random error"; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end": () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function (fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailDefault.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailDefault.ts new file mode 100644 index 000000000000..ad27403c48d7 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailDefault.ts @@ -0,0 +1,210 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["SYSTEM_TEAMPROJECTID"] = "1"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: any = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 1, + "stdout": "Failed to Deploy WebSite" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\error.txt": true + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY" : "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT" : "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "release.releaseId": '1', + "release.releaseName": "Release-1", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + }, + "rmRF": { + "DefaultWorkingDirectory\\error.txt": true + } +}; + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + shouldRetryMSDeploy: msDeployUtility.shouldRetryMSDeploy, + redirectMSDeployErrorToConsole : msDeployUtility.redirectMSDeployErrorToConsole, + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess, customMessage ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess, customMessage); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + var retryFunction; + return { + "isWriteStreamObj": true, + "on": (name, functionOnFinish) => { retryFunction = functionOnFinish;}, + "end" : () => { + if(retryFunction != null) { + retryFunction(); + } + return true; + } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailSetParamFile.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailSetParamFile.ts new file mode 100644 index 000000000000..3dda39d63518 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFailSetParamFile.ts @@ -0,0 +1,167 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'invalidparameterFile.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "invalidparameterFile.xml": { + "isFile" : false + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "osType": { + "osType": "Windows" + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code" : 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code" : 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true + }, + "findMatch": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFolderPkg.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFolderPkg.ts new file mode 100644 index 000000000000..0e16cec39849 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsFolderPkg.ts @@ -0,0 +1,211 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "msdeploy": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:IisApp=\'webAppPkg\' -dest:iisApp=\'mytestapp\',ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent":{ + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has been triggered"); + }, + "end" : () => { return true; } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + }, + fstat: fs.fstat, + read: fs.read, + open: fs.open, + writeFile: fs.writeFile, + symlink: fs.symlink, + stat: fs.stat +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsManyPackage.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsManyPackage.ts new file mode 100644 index 000000000000..c36cdcb27a2b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsManyPackage.ts @@ -0,0 +1,180 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'C:/pattern/**/*.zip'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "match": { + "C:/pattern/**/*.zip":["webAppPkg1", "webAppPkg2"] + }, + "find" : { + "C:/pattern/":["C:/pattern/webAppPkg.zip", "C:/pattern/webAppPkg1.zip"] + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsNoPackage.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsNoPackage.ts new file mode 100644 index 000000000000..bf8eef36d07f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsNoPackage.ts @@ -0,0 +1,175 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'Invalid_webAppPkg'); +tr.setInput('UseWebDeploy', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "Invalid_webAppPkg": false + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsParamFileinPkg.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsParamFileinPkg.ts new file mode 100644 index 000000000000..92c4fbc4a6e8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsParamFileinPkg.ts @@ -0,0 +1,219 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('SetParametersFile', 'parameterFilePresent.xml'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "parameterFilePresent.xml": { + "isFile" : true + }, + "parameterFileUser.xml": { + "isFile" : true + } + }, + "checkPath": { + "msdeploy" : true, + "webAppPkg.zip": true, + "webAppPkg": true + }, + "osType": { + "osType": "Windows" + }, + "rmRF": { + "DefaultWorkingDirectory\\tempSetParameters.xml": { + "success": true + } + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -setParamFile=tempSetParameters.xml -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "DefaultWorkingDirectory\\tempSetParameters.xml": true + }, + "glob": { + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "SYSTEM_DEFAULTWORKINGDIRECTORY": "defaultWorkingDirectory", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory" : "DefaultWorkingDirectory", + "build.sourcesDirectory": "DefaultWorkingDirectory" + } +}; + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + readFileSync: function(msDeployErrorFilePath) { + console.log("reading the error file"); + return "ERROR DEPLOYING WEBSITE"; + }, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsSpecificSlot.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsSpecificSlot.ts new file mode 100644 index 000000000000..c5ad17b9ec24 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsSpecificSlot.ts @@ -0,0 +1,225 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('DeployToSlotFlag', 'true'); +tr.setInput('ResourceGroupName', 'mytestappRg'); +tr.setInput('SlotName', 'testslot'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = '1', +process.env["RELEASE_RELEASEID"] = '1'; +process.env["BUILD_BUILDNUMBER"] = '1'; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "msdeploy": "msdeploy" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true + }, + "exec": { + "msdeploy -verb:getParameters -source:package=\'webAppPkg.zip\'": { + "code": 0, + "stdout": "Executed Successfully" + }, + "msdeploy -verb:sync -source:package=\'webAppPkg.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl-testslot/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp__testslot\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "glob": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": '1', + "release.releaseId": '1', + "build.buildNumber": '1', + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +} + + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + appInsightsInstrumentationKeyAppSetting: "APPINSIGHTS_INSTRUMENTATIONKEY", + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES: '1', + APPINSIGHTS_INSTRUMENTATIONKEY: "00000000-0000-0000-0000-000000000000" + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + }, + getApplicationInsightsResources: () => { + return []; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformation.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformation.ts new file mode 100644 index 000000000000..c0a9e1693f38 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformation.ts @@ -0,0 +1,278 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = 'true'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "msdeploy": "msdeploy", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "msdeploy": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i verbose": { + "code": 0, + "stdout": "ctt execution successful" + }, + "msdeploy -verb:sync -source:package=\'DefaultWorkingDirectory\\temp_web_package.zip\' -dest:auto,ComputerName=\'https://mytestappKuduUrl/msdeploy.axd?site=mytestapp\',UserName=\'$mytestapp\',Password=\'mytestappPwd\',AuthType=\'Basic\' -setParam:name=\'IIS Web Application Name\',value=\'mytestapp\' -enableRule:DoNotDeleteRule -userAgent:TFS_useragent": { + "code": 0, + "stdout": "Executed Successfully" + } + }, + "rmRF": { + "temp_web_package_random_path": { + "success": true + }, + "DefaultWorkingDirectory\\temp_web_package.zip": { + "success": true + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + }, + getAzureRMWebAppMetadata: function() { + return { + properties: {} + } + }, + updateAzureRMWebAppMetadata: function() { + console.log("Successfully updated Web App metadata"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + unzip: function() { + + }, + getArchivedEntries: function(webDeployPkg) { + return { + "entries":[ + "systemInfo.xml", + "parameters.xml" + ] + }; + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return true; + } +}); + +var fs = require('fs'); +tr.registerMock('fs', { + createWriteStream: function (filePath, options) { + return { + "isWriteStreamObj": true, + "on": (event) => { + console.log("event: " + event + " has occurred"); + }, + "end" : () => { return true } + }; + }, + ReadStream: fs.ReadStream, + WriteStream: fs.WriteStream, + openSync: function (fd, options) { + return true; + }, + closeSync: function (fd) { + return true; + }, + fsyncSync: function(fd) { + return true; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformationFail.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformationFail.ts new file mode 100644 index 000000000000..b5c7a3c79fac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0WindowsXdtTransformationFail.ts @@ -0,0 +1,227 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; +process.env['SYSTEM_DEBUG'] = "false"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw i": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config", "C:\\tempFolder\\web.Release.config", "C:\\tempFolder\\web.Debug.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0XdtTransformationFailMSBuildPackage.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0XdtTransformationFailMSBuildPackage.ts new file mode 100644 index 000000000000..95867a366375 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/L0XdtTransformationFailMSBuildPackage.ts @@ -0,0 +1,226 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'azurermwebappdeployment.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('ConnectedServiceName', 'AzureRMSpn'); +tr.setInput('WebAppName', 'mytestapp'); +tr.setInput('Package', 'webAppPkg.zip'); +tr.setInput('UseWebDeploy', 'true'); +tr.setInput('XmlTransformation', 'true'); + +process.env['TASK_TEST_TRACE'] = "1"; +process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "spId"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "spKey"; +process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "tenant"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "sName"; +process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "sId"; +process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; +process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; +process.env["BUILD_SOURCEVERSION"] = "46da24f35850f455185b9188b4742359b537076f"; +process.env["BUILD_BUILDID"] = "1", +process.env["RELEASE_RELEASEID"] = "1"; +process.env["BUILD_BUILDNUMBER"] = "1"; +process.env["RELEASE_RELEASENAME"] = "Release-1"; +process.env["BUILD_REPOSITORY_PROVIDER"] = "TfsGit"; +process.env["BUILD_REPOSITORY_NAME"] = "MyFirstProject"; +process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"] = "https://abc.visualstudio.com/"; +process.env["SYSTEM_TEAMPROJECT"] = "MyFirstProject"; +process.env["BUILD_SOURCEVERISONAUTHOR"] = "author"; +process.env["RELEASE_RELEASEURI"] = "vstfs:///ReleaseManagement/Release/1"; +process.env["AGENT_NAME"] = "author"; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd", + "DefaultWorkingDirectory/ctt/ctt.exe": "DefaultWorkingDirectory/ctt/ctt.exe" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + } + }, + "osType": { + "osType": "Windows" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "webAppPkg": true, + "DefaultWorkingDirectory/ctt/ctt.exe": true + }, + "exec": { + "cmd /C DefaultWorkingDirectory\\msDeployCommand.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "cmd /C DefaultWorkingDirectory\\msDeployParam.bat": { + "code": 0, + "stdout": "Executed Successfully" + }, + "DefaultWorkingDirectory/ctt/ctt.exe s:C:\\tempFolder\\web.config t:C:\\tempFolder\\web.Release.config d:C:\\tempFolder\\web.config pw": { + "code": 1, + "stderr": "ctt execution failed" + } + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true + }, + "findMatch": { + "webAppPkgPattern" : ["webAppPkg1", "webAppPkg2"], + "Invalid_webAppPkg" : [], + "webAppPkg.zip": ["webAppPkg.zip"], + "webAppPkg": ["webAppPkg"], + "**/*.config": ["C:\\tempFolder\\web.config"] + }, + "getVariable": { + "ENDPOINT_AUTH_AzureRMSpn": "{\"parameters\":{\"serviceprincipalid\":\"spId\",\"serviceprincipalkey\":\"spKey\",\"tenantid\":\"tenant\"},\"scheme\":\"ServicePrincipal\"}", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME": "sName", + "ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID": "sId", + "AZURE_HTTP_USER_AGENT": "TFS_useragent", + "System.DefaultWorkingDirectory": "DefaultWorkingDirectory", + "build.sourceVersion": "46da24f35850f455185b9188b4742359b537076f", + "build.buildId": 1, + "release.releaseId": 1, + "build.buildNumber": 1, + "release.releaseName": "Release-1", + "build.repository.provider": "TfsGit", + "build.repository.name": "MyFirstProject", + "system.TeamFoundationCollectionUri": "https://abc.visualstudio.com/", + "system.teamProject": "MyFirstProject", + "build.sourceVersionAuthor": "author", + "release.releaseUri": "vstfs:///ReleaseManagement/Release/1", + "agent.name": "agent" + } +}; + +var kuduDeploymentLog = require('azurerest-common/kududeploymentstatusutility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); +tr.registerMock('./msdeployutility.js', { + getMSDeployCmdArgs : msDeployUtility.getMSDeployCmdArgs, + getMSDeployFullPath : function() { + var msDeployFullPath = "msdeploypath\\msdeploy.exe"; + return msDeployFullPath; + } +}); + +tr.registerMock('azurerest-common/azurerestutility.js', { + getAzureRMWebAppPublishProfile: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var mockPublishProfile = { + profileName: 'mytestapp - Web Deploy', + publishMethod: 'MSDeploy', + publishUrl: 'mytestappKuduUrl', + msdeploySite: 'mytestapp', + userName: '$mytestapp', + userPWD: 'mytestappPwd', + destinationAppUrl: 'mytestappUrl', + SQLServerDBConnectionString: '', + mySQLDBConnectionString: '', + hostingProviderForumLink: '', + controlPanelLink: '', + webSystem: 'WebSites' + }; + if(deployToSlotFlag) { + mockPublishProfile.profileName = 'mytestapp-' + slotName + ' - Web Deploy'; + mockPublishProfile.publishUrl = 'mytestappKuduUrl-' + slotName; + mockPublishProfile.msdeploySite = 'mytestapp__' + slotName; + mockPublishProfile.userName = '$mytestapp__' + slotName; + mockPublishProfile.userPWD = 'mytestappPwd'; + mockPublishProfile.destinationAppUrl = 'mytestappUrl-' + slotName; + } + return mockPublishProfile; + }, + getAzureRMWebAppConfigDetails: function(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName) { + var config = { + id: 'appid', + properties: { + virtualApplications: [ ['Object'], ['Object'], ['Object'] ], + scmType: "None" + } + } + + return config; + }, + updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) { + if(isDeploymentSuccess) { + console.log('Updated history to kudu'); + } + else { + console.log('Failed to update history to kudu'); + } + var webAppPublishKuduUrl = publishingProfile.publishUrl; + var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess); + requestDetails["requestBody"].author = 'author'; + console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"])); + }, + getResourceGroupName: function (SPN, webAppName) { + return "foobar"; + }, + getWebAppAppSettings : function (SPN, webAppName: string, resourceGroupName: string, deployToSlotFlag: boolean, slotName: string){ + var appSettings = { + properties : { + MSDEPLOY_RENAME_LOCKED_FILES : '1' + } + }; + return appSettings; + }, + updateWebAppAppSettings : function (){ + return true; + }, + updateAzureRMWebAppConfigDetails: function() { + console.log("Successfully updated scmType to VSTSRM"); + } +}); + +tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + isInputPkgIsFolder: function() { + return false; + }, + fileExists: function() { + return true; + }, + canUseWebDeploy: function() { + return true; + }, + findfiles: function() { + return ['webDeployPkg'] + }, + generateTemporaryFolderForDeployment: function() { + return 'temp_web_package_random_path'; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "DefaultWorkingDirectory\\temp_web_package.zip", + "tempPackagePath": "DefaultWorkingDirectory\\temp_web_package.zip" + }; + }, + isMSDeployPackage: function() { + return false; + } +}); + +tr.registerMock('path', { + win32: { + basename: function(filePath, extension) { + return path.win32.basename(filePath, extension); + } + }, + join: function() { + if(arguments[arguments.length -1] === 'ctt.exe') { + return 'DefaultWorkingDirectory/ctt/ctt.exe'; + } + var args = []; + for(var i=0; i < arguments.length; i += 1) { + args.push(arguments[i]); + } + return args.join('\\'); + }, + dirname: path.dirname +}); + +tr.setAnswers(a); +tr.run(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts new file mode 100644 index 000000000000..73aeb2693678 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderL0Tests.ts @@ -0,0 +1,56 @@ +import tl = require('azure-pipelines-task-lib'); +import { PublishProfileWebAppDeploymentProvider } from '../deploymentProvider/PublishProfileWebAppDeploymentProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class PublishProfileWebAppDeploymentProviderL0Tests { + + public static async startPublishProfileWebAppDeploymentProviderL0Tests() { + await PublishProfileWebAppDeploymentProviderL0Tests.testForPreDeploymentSteps_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForUpdateDeploymentStatus_PublishProfileProvider(); + await PublishProfileWebAppDeploymentProviderL0Tests.testForDeployWebAppStep_PublishProfileProvider(); + } + + public static async testForPreDeploymentSteps_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for publish profile should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for publish profile failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.UpdateDeploymentStatus(true); + tl.setResult(tl.TaskResult.Succeeded, 'UpdateDeploymentStatus for publish profile steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for publish profile steps failed with error'); + } + } + + public static async testForDeployWebAppStep_PublishProfileProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var publishProfileWebAppDeploymentProvider : PublishProfileWebAppDeploymentProvider = new PublishProfileWebAppDeploymentProvider(taskParameters); + await publishProfileWebAppDeploymentProvider.PreDeploymentStep(); + await publishProfileWebAppDeploymentProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for publish profile steps steps should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for publish profile steps steps failed with error'+ error); + } + } + +} + +PublishProfileWebAppDeploymentProviderL0Tests.startPublishProfileWebAppDeploymentProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderTests.ts new file mode 100644 index 000000000000..e0844fd33b28 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/PublishProfileWebAppDeploymentProviderTests.ts @@ -0,0 +1,63 @@ +import tl = require('azure-pipelines-task-lib'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument } from './utils'; + +export class PublishProfileWebAppDeploymentProviderTests { + + public static startPublishProfileWebAppDeploymentProviderTests(){ + let tp = path.join(__dirname, 'PublishProfileWebAppDeploymentProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + tr.setInput("ConnectionType", "PublishProfile"); + tr.setInput('PublishProfilePath', 'publishxml.pubxml'); + tr.setInput('PublishProfilePassword', 'password'); + tr.setInput('Package', 'webAppPkg.zip'); + + setEndpointData(); + setAgentsData(); + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu', { + Kudu: function(A, B, C) { + return { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + } + } + }); + + + tr.registerMock('../operations/PublishProfileUtility', { + PublishProfileUtility: function(A) { + return { + GetPropertyValuefromPublishProfile : function(B) { + return "SiteUrl"; + } + } + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +PublishProfileWebAppDeploymentProviderTests.startPublishProfileWebAppDeploymentProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersLinuxAppL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersLinuxAppL0Tests.ts new file mode 100644 index 000000000000..764e7f213c03 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersLinuxAppL0Tests.ts @@ -0,0 +1,34 @@ +import tl = require('azure-pipelines-task-lib'); +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; + +function ValidatePostDeploymentInput() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + if (taskParameters.AppSettings.indexOf('-SCM_COMMAND_IDLE_TIMEOUT') != -1) { + tl.setResult(tl.TaskResult.Succeeded, 'SCM_COMMAND_IDLE_TIMEOUT variable PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'SCM_COMMAND_IDLE_TIMEOUT variable NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +async function ValidateMsBuildPackage() { + try { + let taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + const isMsBuildType = await taskParameters.Package.isMSBuildPackage(); + if (isMsBuildType) { + tl.setResult(tl.TaskResult.Succeeded, 'msbuild package PRESENT'); + } + else { + tl.setResult(tl.TaskResult.Failed, 'msbuild package NOT PRESENT'); + } + } catch (error) { + tl.setResult(tl.TaskResult.Failed, error.message); + } +} + +ValidatePostDeploymentInput(); +ValidateMsBuildPackage(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersTests.ts new file mode 100644 index 000000000000..9fbb4d0d4eab --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/TaskParametersTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setAgentsData, setEndpointData, mockTaskArgument } from './utils'; + +import path = require('path'); +import * as JSZip from "jszip" +import * as uuid from 'uuid'; +import * as fs from 'fs'; + +const tempDir = path.join(__dirname, 'temp'); + +setEndpointData(); + +export class TaskParametersTests { + public static async ValidateLinuxAppTaskParameters() { + let tp = path.join(__dirname, 'TaskParametersLinuxAppL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + const zipFilePath = await TaskParametersTests.createSampleZipFile(tempDir); + + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', zipFilePath); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', zipFilePath); + tr.setInput('ScriptType', 'Inline Script'); + tr.setInput('InlineScript','npm install --production'); + setAgentsData() + + const answers = mockTaskArgument(); + answers.exist[zipFilePath] = true; + answers.stats[zipFilePath] = { "isFile": true }; + answers.checkPath[zipFilePath] = true; + + tr.setAnswers(answers); + tr.run(); + } + + public static async createSampleZipFile(tempDir: string): Promise { + const zip = new JSZip(); + zip.file("index.html", "index"); + zip.file("parameters.xml", "parameters"); + zip.file("systemInfo.xml", "systemInfo"); + zip.file("file:../s.txt", `1\n`); + + const content = await zip.generateAsync({ type: "nodebuffer" }); + const outZipPath = path.join(tempDir, `${uuid.v1()}.zip`); + fs.writeFileSync(outZipPath, content); + return outZipPath; + } +} + +TaskParametersTests.ValidateLinuxAppTaskParameters(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilityFailureTest.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilityFailureTest.ts new file mode 100644 index 000000000000..d723b6482a1c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilityFailureTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net') + .get("/") + .reply(299, {"statusCode":"299", "statusMessage": "Fail"}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilitySuccessTest.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilitySuccessTest.ts new file mode 100644 index 000000000000..6d56b67d8547 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WebAppAvailabilitySuccessTest.ts @@ -0,0 +1,8 @@ +var nock = require('nock'); +var azureRestUtiltiy = require('azurerest-common/azurerestutility.js'); + +nock('http://testwebapp.azurewebsites.net/') + .get("/") + .reply(200, {}); + +azureRestUtiltiy.testAzureWebAppAvailability('http://testwebapp.azurewebsites.net',100); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts new file mode 100644 index 000000000000..afe94231e8d6 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppRunFromZipProvider } from '../deploymentProvider/WindowsWebAppRunFromZipProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppRunFromZipProviderL0Tests { + + public static async startWindowsWebAppRunFromZipProviderL0Tests() { + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentSteps_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForUpdateDeploymentStatus_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStep_RunFromZipProvider(); + await WindowsWebAppRunFromZipProviderL0Tests.testForDeployWebAppStepForFolder_RunFromZipProvider(); + } + + public static async testForPreDeploymentSteps_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for built in run from zip failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for run from zip with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for run from zip with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for run from zip steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_RunFromZipProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppRunFromZipProvider : WindowsWebAppRunFromZipProvider = new WindowsWebAppRunFromZipProvider(taskParameters); + await windowsWebAppRunFromZipProvider.PreDeploymentStep(); + await windowsWebAppRunFromZipProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for run from zip steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for run from zip steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppRunFromZipProviderL0Tests.startWindowsWebAppRunFromZipProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderTests.ts new file mode 100644 index 000000000000..9f176751a5a1 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppRunFromZipProviderTests.ts @@ -0,0 +1,82 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppRunFromZipProviderTests { + + public static startWindowsWebAppRunFromZipProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppRunFromZipProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppRunFromZipProviderTests.startWindowsWebAppRunFromZipProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderL0Tests.ts new file mode 100644 index 000000000000..f6e6f446b222 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderL0Tests.ts @@ -0,0 +1,78 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWarDeployProvider } from '../deploymentProvider/WindowsWebAppWarDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockRunFromZipSettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockRunFromZipSettings(); + +export class WindowsWebAppWarDeployProviderL0Tests { + + public static async startWindowsWebAppWarDeployProviderL0Tests() { + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentSteps_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForUpdateDeploymentStatus_WarDeployProvider(); + await WindowsWebAppWarDeployProviderL0Tests.testForDeployWebAppStep_WarDeployProvider(); + } + + public static async testForPreDeploymentSteps_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for war deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for war deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for war deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WarDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.war}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.war" }; + var windowsWebAppWarDeployProvider : WindowsWebAppWarDeployProvider = new WindowsWebAppWarDeployProvider(taskParameters); + await windowsWebAppWarDeployProvider.PreDeploymentStep(); + await windowsWebAppWarDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for war deploy steps with war package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for war deploy steps with war package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWarDeployProviderL0Tests.startWindowsWebAppWarDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderTests.ts new file mode 100644 index 000000000000..81fd7dcc2b07 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWarDeployProviderTests.ts @@ -0,0 +1,55 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWarDeployProviderTests { + + public static startWindowsWebAppWarDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWarDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + map.set('WEBSITE_RUN_FROM_PACKAGE', '1'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWarDeployProviderTests.startWindowsWebAppWarDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderL0Tests.ts new file mode 100644 index 000000000000..e0a2d5e9062f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderL0Tests.ts @@ -0,0 +1,89 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppWebDeployProvider } from '../deploymentProvider/WindowsWebAppWebDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppWebDeployProviderL0Tests { + + public static async startWindowsWebAppWebDeployProviderL0Tests() { + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentSteps_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForUpdateDeploymentStatus_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStep_WebDeployProvider(); + await WindowsWebAppWebDeployProviderL0Tests.testForDeployWebAppStepForVirtualApplication_WebDeployProvider(); + } + + public static async testForPreDeploymentSteps_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for web deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for web deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for web deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForVirtualApplication_WebDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + taskParameters.VirtualApplication = "VirtualApplication"; + var windowsWebAppWebDeployProvider : WindowsWebAppWebDeployProvider = new WindowsWebAppWebDeployProvider(taskParameters); + await windowsWebAppWebDeployProvider.PreDeploymentStep(); + await windowsWebAppWebDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for web deploy steps with virtual application with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for web deploy steps with virtual application with zip package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppWebDeployProviderL0Tests.startWindowsWebAppWebDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderTests.ts new file mode 100644 index 000000000000..85f07ba20ebb --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppWebDeployProviderTests.ts @@ -0,0 +1,60 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppWebDeployProviderTests { + + public static startWindowsWebAppWebDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppWebDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + }, + extractZIP: function(J, K){ + + }, + listDir: function(L){ + return "VirtualApplication"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppWebDeployProviderTests.startWindowsWebAppWebDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderL0Tests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderL0Tests.ts new file mode 100644 index 000000000000..8061a036fe02 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderL0Tests.ts @@ -0,0 +1,88 @@ +import tl = require('azure-pipelines-task-lib'); +import { WindowsWebAppZipDeployProvider } from '../deploymentProvider/WindowsWebAppZipDeployProvider' +import { TaskParametersUtility, TaskParameters } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { getMockEndpoint } from '../node_modules/azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { mockAzureARMPreDeploymentSteps, mockZipDeploySettings } from "./mock_utils"; + +getMockEndpoint(); +mockAzureARMPreDeploymentSteps(); +mockZipDeploySettings(); + +export class WindowsWebAppZipDeployProviderL0Tests { + + public static async startWindowsWebAppZipDeployProviderL0Tests() { + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentSteps_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForUpdateDeploymentStatus_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStep_ZipDeployProvider(); + await WindowsWebAppZipDeployProviderL0Tests.testForDeployWebAppStepForFolder_ZipDeployProvider(); + } + + public static async testForPreDeploymentSteps_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy failed with error'); + } + } + + public static async testForPreDeploymentStepsWithSlotEnabled_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.DeployToSlotOrASEFlag = true; + taskParameters.ResourceGroupName = "MOCK_RESOURCE_GROUP_NAME"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + tl.setResult(tl.TaskResult.Succeeded, 'PreDeployment steps for zip deploy with slot enabled should succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'PreDeployment steps for zip deploy with slot enabled failed with error'); + } + } + + public static async testForUpdateDeploymentStatus_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.ScriptType = "Run Script"; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.UpdateDeploymentStatus(true); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'UpdateDeploymentStatus for zip deploy steps should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStep_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.zip}; + taskParameters.Package.getPath = () :string => { return "webAppPkg.zip" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with zip package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with zip package should succeeded but failed with error'); + } + } + + public static async testForDeployWebAppStepForFolder_ZipDeployProvider() { + try { + var taskParameters: TaskParameters = TaskParametersUtility.getParameters(); + taskParameters.Package.getPackageType = () :PackageType => {return PackageType.folder}; + taskParameters.Package.getPath = () :string => { return "webAppPkg" }; + var windowsWebAppZipDeployProvider : WindowsWebAppZipDeployProvider = new WindowsWebAppZipDeployProvider(taskParameters); + await windowsWebAppZipDeployProvider.PreDeploymentStep(); + await windowsWebAppZipDeployProvider.DeployWebAppStep(); + tl.setResult(tl.TaskResult.Succeeded, 'DeployWebAppStep for zip deploy steps with folder package succeeded'); + } catch(error) { + tl.setResult(tl.TaskResult.Failed, 'DeployWebAppStep for zip deploy steps with folder package should succeeded but failed with error'); + } + } + +} + +WindowsWebAppZipDeployProviderL0Tests.startWindowsWebAppZipDeployProviderL0Tests(); \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderTests.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderTests.ts new file mode 100644 index 000000000000..4c012622208d --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/WindowsWebAppZipDeployProviderTests.ts @@ -0,0 +1,79 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import * as path from 'path'; +import { setEndpointData, setAgentsData, mockTaskArgument, mockTaskInputParameters } from './utils'; + +export class WindowsWebAppZipDeployProviderTests { + + public static startWindowsWebAppZipDeployProviderTests(){ + let tp = path.join(__dirname, 'WindowsWebAppZipDeployProviderL0Tests.js'); + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner(tp); + mockTaskInputParameters(tr); + setEndpointData(); + setAgentsData(); + + const kudu = { + updateDeployment : function(D) { + return "MOCK_DEPLOYMENT_ID"; + }, + getAppSettings : function() { + var map: Map = new Map(); + map.set('MSDEPLOY_RENAME_LOCKED_FILES', '1'); + map.set('ScmType', 'ScmType'); + return map; + }, + zipDeploy: function(E, F) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + warDeploy: function(G, H) { + return '{id: "ZIP_DEPLOY_FAILED_ID", status: 3, deployer: "VSTS_ZIP_DEPLOY", author: "VSTS USER"}'; + }, + getDeploymentDetails: function(I) { + return "{ type: 'Deployment',url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID'}"; + } + }; + + const utility = { + getKuduService: function() + { + return Promise.resolve(kudu); + } + }; + + tr.registerMock('azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility', { + AzureAppServiceUtility: function(_) { + return utility; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/utility.js', { + generateTemporaryFolderForDeployment: function () { + return "webAppPkg"; + }, + archiveFolderForDeployment: function() { + return { + "webDeployPkg": "webAppPkg", + "tempPackagePath": "webAppPkg" + }; + }, + getFileNameFromPath: function(A, B) { + return "webAppPkg"; + }, + generateTemporaryFolderOrZipPath: function(C, D) { + return "webAppPkg.zip"; + } + }); + + tr.registerMock('azure-pipelines-tasks-webdeployment-common/ziputility.js', { + archiveFolder: function(A, B){ + return "webAppPkg.zip"; + } + }); + + + tr.setAnswers(mockTaskArgument()); + tr.run(); + } + +} + +WindowsWebAppZipDeployProviderTests.startWindowsWebAppZipDeployProviderTests(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/mock_utils.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/mock_utils.ts new file mode 100644 index 000000000000..4b4c62c316ff --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/mock_utils.ts @@ -0,0 +1,310 @@ +export var nock = require('nock'); + +export function mockAzureARMPreDeploymentSteps() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resources?$filter=resourceType%20EQ%20%27Microsoft.Web%2FSites%27%20AND%20name%20EQ%20%27mytestapp%27&api-version=2016-07-01") + .reply(200, { + value: [{ + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/microsoft.web/sites/mytestapp", + name: "MOCK_APP_INSIGHTS_NAME", + type: "microsoft.insights/components", + tags: {}, + properties: {} + }] + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/publishingcredentials/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/publishingcredentials/$mytestapp", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + publishingUserName: "$mytestapp", + publishingPassword: "MOCK_APP_SERVICE_MSDEPLOY_PASSWORD", + scmUri: "https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net" + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/publishxml?api-version=2016-08-01") + .reply(200,` + + + `).persist(); + + nock('https://$mytestapp:MOCK_APP_SERVICE_MSDEPLOY_PASSWORD@mytestapp.scm.azurewebsites.net', + { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }). + put('/api/deployments/MOCK_DEPLOYMENT_ID').reply(200, { + type: 'Deployment', + url: 'http://MOCK_SCM_WEBSITE/api/deployments/MOCK_DEPLOYMENT_ID' + }); + + // linux built in app + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true, + "virtualApplications": [ {"physicalPath" : "physicalPath", "virtualPath": "/virtualApplication" }] + } + }).persist(); + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).patch("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/web?api-version=2018-02-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/vincaAzureRG/providers/Microsoft.Web/sites/mytestapp/config/web", + name: "mytestapp", + type: "Microsoft.Web/sites", + kind: "app", + location: "South Central US", + properties: { + "alwaysOn": true + } + }).persist(); +} + +export function mockLinuxAppSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "INIT_SCRIPT":"/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "INIT_SCRIPT": "/home/site/wwwroot/startupscript_webAppPkg.sh" + } + }).persist(); +} + +export function mockRunFromZipSettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "WEBSITE_RUN_FROM_PACKAGE":"1" + } + }).persist(); +} + +export function mockZipDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1" + } + }).persist(); +} + +export function mockContainerDeploySettings() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings/list?api-version=2016-08-01") + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); + + var appSettings = { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION":"6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES":"1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }; + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).put("/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/config/appsettings?api-version=2016-08-01", JSON.stringify(appSettings)) + .reply(200, { + id: "/subscriptions/MOCK_SUBSCRIPTION_ID/resourceGroups/MOCK_RESOURCE_GROUP_NAME/providers/Microsoft.Web/sites/mytestapp/appsettings", + name: "mytestapp", + type: "Microsoft.Web/sites/config", + location: "South Central US", + properties: { + "WEBSITE_NODE_DEFAULT_VERSION": "6.9.1", + "MSDEPLOY_RENAME_LOCKED_FILES": "1", + "DOCKER_CUSTOM_IMAGE_NAME": "dockernamespace/dockerrepository:DockerImageTag" + } + }).persist(); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package-lock.json b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..a4a148b61c0b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package-lock.json @@ -0,0 +1,168 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "license": "MIT", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/nock": { + "version": "13.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + } + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package.json b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package.json new file mode 100644 index 000000000000..756191a90e5b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.1", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "azurermappservicedeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "jszip": "^3.10.1", + "nock": "^13.4.0" + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/utils.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/utils.ts new file mode 100644 index 000000000000..9b1aa18cb2c3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/Tests/utils.ts @@ -0,0 +1,87 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); + +export function extendObject(output, target) { + output = output || {}; + + if (target) { + for (var key in target) { + if (target.hasOwnProperty(key)) { + output[key] = target[key]; + } + } + } + + return output; +} + +export function setEndpointData() { + process.env["ENDPOINT_AUTH_AzureRMSpn"] = "{\"parameters\":{\"serviceprincipalid\":\"MOCK_SPN_ID\",\"serviceprincipalkey\":\"MOCK_SPN_KEY\",\"tenantid\":\"MOCK_TENANT_ID\"},\"scheme\":\"ServicePrincipal\"}"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALID"] = "MOCK_SPN_ID"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_SERVICEPRINCIPALKEY"] = "MOCK_SPN_KEY"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRMSpn_TENANTID"] = "MOCK_TENANT_ID"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONNAME"] = "MOCK_SUBSCRIPTION_NAME"; + process.env["ENDPOINT_DATA_AzureRMSpn_SUBSCRIPTIONID"] = "MOCK_SUBSCRIPTION_ID"; + process.env["ENDPOINT_URL_AzureRMSpn"] = "https://management.azure.com/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ENVIRONMENTAUTHORITYURL"] = "https://login.windows.net/"; + process.env["ENDPOINT_DATA_AzureRMSpn_ACTIVEDIRECTORYSERVICEENDPOINTRESOURCEID"] = "https://management.azure.com/"; +} + +export function setAgentsData() { + process.env['TASK_TEST_TRACE'] = "1"; + process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; + process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; + process.env["AGENT_NAME"] = "author"; + process.env["AGENT_TEMPDIRECTORY"] = process.cwd(); + process.env["BUILD_BUILDID"] = 'Build.BuildId'; + process.env["USE_MSAL"] = "false"; +} + +export function mockTaskArgument(): ma.TaskLibAnswers{ + // provide answers for task mock + let a: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "webAppPkg.zip": { + "isFile": true + }, + "publishxml.pubxml": { + "isFile": true + }, + "webAppPkg": { + "isDirectory": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "webAppPkg.zip": true, + "publishxml.pubxml": true, + "publishxml": true, + "webAppPkg": true + }, + "exist": { + "webAppPkg.zip": true, + "webAppPkg": true, + "publishxml.pubxml": true, + "publishxml": true + } + } + + return a; +} + +export function mockTaskInputParameters(tr) { + tr.setInput("ConnectionType", "AzureRM"); + tr.setInput('ConnectedServiceName', 'AzureRMSpn'); + tr.setInput('WebAppName', 'mytestapp'); + tr.setInput('Package', 'webAppPkg.zip'); + tr.setInput('UseWebDeploy', 'false'); + tr.setInput('ImageSource', "Builtin Image"); + tr.setInput('WebAppKind', "webAppLinux"); + tr.setInput('RuntimeStack', "dummy|version"); + tr.setInput('BuiltinLinuxPackage', 'webAppPkg.zip'); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/ThirdPartyNotices.txt b/_generated/AzureRmWebAppDeploymentV5_Node20/ThirdPartyNotices.txt new file mode 100644 index 000000000000..23bf6b698d0c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/ThirdPartyNotices.txt @@ -0,0 +1,2248 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Azure App Service Deploy incorporates third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. abbrev (https://github.com/isaacs/abbrev-js) +2. Archiver (https://github.com/archiverjs/node-archiver) +3. archiver-utils (https://github.com/archiverjs/archiver-utils) +4. async (https://github.com/caolan/async) +5. balanced-match (https://github.com/juliangruber/balanced-match) +6. binary (https://github.com/substack/node-binary) +7. bl (Buffer List) (https://github.com/rvagg/bl) +8. brace-expansion (https://github.com/juliangruber/brace-expansion) +9. buffer-crc32 (https://github.com/brianloveswords/buffer-crc32) +10. buffers (DefinitelyTyped) (https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/buffers) +11. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +12. buffer-shims (https://github.com/calvinmetcalf/buffer-shims) +13. chainsaw (https://github.com/substack/node-chainsaw) +14. compress-commons (https://github.com/archiverjs/node-compress-commons) +15. concat-map (https://github.com/substack/node-concat-map) +16. core-util-is (https://github.com/isaacs/core-util-is) +17. Crc32-stream (https://github.com/archiverjs/node-crc32-stream) +18. Ctt (https://ctt.codeplex.com) +19. decompress-zip (https://github.com/bower/decompress-zip) +20. end-of-stream (https://github.com/mafintosh/end-of-stream) +21. fs.realpath (https://github.com/isaacs/fs.realpath) +22. Glob (https://github.com/isaacs/node-glob) +23. graceful-fs (https://github.com/isaacs/node-graceful-fs) +24. hoek (https://github.com/hapijs/hoek) +25. inflight (https://github.com/npm/inflight) +26. inherits (https://github.com/isaacs/inherits) +27. isarray (https://github.com/juliangruber/isarray/) +28. isemail (https://github.com/hapijs/isemail) +29. joi (https://github.com/hapijs/joi) +30. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +31. lazystream (https://github.com/jpommerening/node-lazystream) +32. lodash (https://lodash.com/) + Includes:File(s) copyright John Resig (http://ejohn.org/blog/javascript-micro-templating/) + Includes:File(s) copyright Laura Doktorova (https://github.com/olado/doT) +33. lodash.once (https://github.com/lodash/lodash) +34. Ltx (https://github.com/node-xmpp/ltx) +35. minimatch (https://github.com/isaacs/minimatch) +36. mkpath (https://github.com/jrajav/mkpath) +37. Mockery (https://github.com/mfncooper/mockery) +38. Moment (https://github.com/moment/moment) +39. ms (https://github.com/zeit/ms) +40. Node.js (https://nodejs.org/) +41. node-ecdsa-sig-formatter (https://github.com/Brightspace/node-ecdsa-sig-formatter) +42. node-jwa (https://github.com/brianloveswords/node-jwa) +43. node-jws (https://github.com/brianloveswords/node-jws) +44. node-tar (https://github.com/npm/node-tar/) +45. node-uuid (https://github.com/broofa/node-uuid/) +46. nopt (https://github.com/npm/nopt) +47. normalize-path (https://github.com/jonschlinkert/normalize-path) +48. OpenSSL (http://www.openssl.org) +49. once (https://github.com/isaacs/once) +50. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +51. process-nextick-args (https://github.com/calvinmetcalf/process-nextick-args) +52. Q (https://github.com/kriskowal/q) +53. readable-stream (https://github.com/isaacs/readable-stream) +54. safe-buffer (https://github.com/feross/safe-buffer) +55. sax js (https://github.com/isaacs/sax-js) +56. semver (https://github.com/npm/node-semver/) +57. ShellJS (https://github.com/shelljs/shelljs) +58. string_decoder (https://github.com/rvagg/string_decoder) +59. tar-stream (https://github.com/mafintosh/tar-stream) +60. topo (https://github.com/hapijs/topo) +61. touch (https://github.com/isaacs/node-touch) +62. traverse (https://github.com/substack/js-traverse) +63. tunnel (https://github.com/koichik/node-tunnel) +64. underscore.js (http://underscorejs.org/; https://github.com/jashkenas/underscore) +65. util-deprecate (https://github.com/TooTallNate/util-deprecate) +66. VSTS-task-lib (https://github.com/Microsoft/vsts-task-lib) +67. winreg (https://github.com/fresc81/node-winreg) +68. wrappy (https://github.com/npm/wrappy) +69. Xml2JS (https://github.com/Leonidas-from-XIV/node-xml2js) +70. Xmlbuilder (https://github.com/oozcitak/xmlbuilder-js) +71. xtend (https://github.com/Raynos/xtend) +72. zip-stream (https://github.com/archiverjs/node-zip-stream) +73. uuid (https://github.com/kelektiv/node-uuid) +74. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +75. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +76. @types/mocha (https://github.com/DefinitelyTyped/DefinitelyTyped.git) + + +%% abbrev NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF abbrev NOTICES, INFORMATION, AND LICENSE + +%% Archiver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Archiver NOTICES, INFORMATION, AND LICENSE + +%% archiver-utils NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Chris Talkington. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF archiver-utils NOTICES, INFORMATION, AND LICENSE + +%% async NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2010-2016 Caolan McMahon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF async NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% binary NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF binary NOTICES, INFORMATION, AND LICENSE + +%% bl (Buffer List) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) +Copyright (c) 2014 bl contributors + +bl contributors listed at https://github.com/rvagg/bl#contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF bl (Buffer List) NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-crc32 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License + +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF buffer-crc32 NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES, INFORMATION, AND LICENSE + +%% buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is licensed under the MIT license. + +Copyrights are respective of each contributor listed at the beginning of each definition file. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF buffers (DefinitelyTyped) NOTICES, INFORMATION, AND LICENSE + +%% buffer-shims NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2016 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** + +========================================= +END OF buffer-shims NOTICES, INFORMATION, AND LICENSE + +%% chainsaw NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF chainsaw NOTICES, INFORMATION, AND LICENSE + +%% compress-commons NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF compress-commons NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% Crc32-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Crc32-stream NOTICES, INFORMATION, AND LICENSE + +%% Ctt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. +========================================= +END OF Ctt NOTICES, INFORMATION, AND LICENSE + +%% decompress-zip NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Bower Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF decompress-zip NOTICES, INFORMATION, AND LICENSE + +%% end-of-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF end-of-stream NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license, as follows: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% Glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF Glob NOTICES, INFORMATION, AND LICENSE + +%% graceful-fs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF graceful-fs NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% isemail NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES, INFORMATION, AND LICENSE + +%% joi NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES, INFORMATION, AND LICENSE + +%% jsonwebtoken NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES, INFORMATION, AND LICENSE + +%% lazystream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 J. Pommerening, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF lazystream NOTICES, INFORMATION, AND LICENSE + +%% lodash NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +========================================= +// Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/) + +Copyright 2008 John Resig + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +// Based on Laura Doktorova's doT.js (https://github.com/olado/doT). + +Copyright (c) 2011 Laura Doktorova + +Software includes portions from jQote2 Copyright (c) 2010 aefxx, +http://aefxx.com/ licensed under the MIT license. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF lodash NOTICES, INFORMATION, AND LICENSE + +%% lodash.once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES, INFORMATION, AND LICENSE + +%% Ltx NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010 Stephan Maka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +========================================= +END OF Ltx NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mkpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (C) 2012 Jonathan Rajavuori + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF mkpath NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following +terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +========================================= +END OF Moment NOTICES, INFORMATION, AND LICENSE + +%% ms NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES, INFORMATION, AND LICENSE + +%% Node.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. +========================================= +END OF Node.js NOTICES, INFORMATION, AND LICENSE + +%% node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF node-ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% node-jwa NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES, INFORMATION, AND LICENSE + +%% node-jws NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES, INFORMATION, AND LICENSE + +%% node-tar NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License +Copyright (c) Isaac Z. Schlueter and Contributors +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF node-tar NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% nopt NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF nopt NOTICES, INFORMATION, AND LICENSE + +%% normalize-path NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014-2015, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF normalize-path NOTICES, INFORMATION, AND LICENSE + +%% OpenSSL NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/) + * + * 4. The names OpenSSL Toolkit and OpenSSL Project must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called OpenSSL + * nor may OpenSSL appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/) + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com) + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * This product includes software written by Tim Hudson (tjh@cryptsoft.com) + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] +========================================= +END OF OpenSSL NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +path-is-absolute + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +node.js: + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% Q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009�2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +The file q.js is prefaced by the following additional third-party subcomponent information: + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +========================================= +END OF Q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + + +%% sax js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax js NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% tar-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tar-stream NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES, INFORMATION, AND LICENSE + +%% touch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF touch NOTICES, INFORMATION, AND LICENSE + +%% traverse NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 license: +http://www.opensource.org/licenses/mit-license.php + +Copyright 2010 James Halliday (mail@substack.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF traverse NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% underscore.js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore.js NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the Software), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% VSTS-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF VSTS-task-lib NOTICES, INFORMATION, AND LICENSE + +%% winreg NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This project is released under BSD 2-Clause License. + +Copyright (c) 2016, Paul Bottin All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF winreg NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% Xml2JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF Xml2JS NOTICES, INFORMATION, AND LICENSE + +%% Xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF Xmlbuilder NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES, INFORMATION, AND LICENSE + +%% zip-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2014 Chris Talkington, contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF zip-stream NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Includes Chris Veness' SHA1 + +Copyright (c) 2014 Chris Veness + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/azurermwebappdeployment.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/azurermwebappdeployment.ts new file mode 100644 index 000000000000..a77a66ee795b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/azurermwebappdeployment.ts @@ -0,0 +1,40 @@ +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); +import { TaskParameters, TaskParametersUtility } from './operations/TaskParameters'; +import { DeploymentFactory } from './deploymentProvider/DeploymentFactory'; +import * as Endpoint from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; + +async function main() { + let isDeploymentSuccess: boolean = true; + + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + tl.setResourcePath(path.join( __dirname, 'node_modules/azure-pipelines-tasks-webdeployment-common/module.json')); + var taskParams: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentFactory: DeploymentFactory = new DeploymentFactory(taskParams); + var deploymentProvider = await deploymentFactory.GetDeploymentProvider(); + + tl.debug("Predeployment Step Started"); + await deploymentProvider.PreDeploymentStep(); + + tl.debug("Deployment Step Started"); + + await deploymentProvider.DeployWebAppStep(); + + } + catch(error) { + tl.debug("Deployment Failed with Error: " + error); + isDeploymentSuccess = false; + tl.setResult(tl.TaskResult.Failed, error); + } + finally { + if(deploymentProvider != null) { + await deploymentProvider.UpdateDeploymentStatus(isDeploymentSuccess); + } + Endpoint.dispose(); + tl.debug(isDeploymentSuccess ? "Deployment Succeded" : "Deployment failed"); + + } +} + +main(); diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/AzureRmWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/AzureRmWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..728449091d96 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/AzureRmWebAppDeploymentProvider.ts @@ -0,0 +1,90 @@ +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { TaskParameters } from '../operations/TaskParameters'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { AzureResourceFilterUtility } from '../operations/AzureResourceFilterUtility'; +import { KuduServiceUtility } from '../operations/KuduServiceUtility'; +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +import { PackageUtility } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { AzureDeployPackageArtifactAlias } from '../operations/Constants'; + +export class AzureRmWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + protected taskParams:TaskParameters; + protected appService: AzureAppService; + protected kuduService: Kudu; + protected appServiceUtility: AzureAppServiceUtility; + protected kuduServiceUtility: KuduServiceUtility; + protected virtualApplicationPath: string = ""; + protected azureEndpoint: AzureEndpoint; + protected activeDeploymentID; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + let packageArtifactAlias = this.taskParams.Package ? PackageUtility.getArtifactAlias(this.taskParams.Package.getPath()) : null; + tl.setVariable(AzureDeployPackageArtifactAlias, packageArtifactAlias); + } + + public async PreDeploymentStep() { + + if (this.taskParams.WebAppKind.includes("functionAppContainer")){ + tl.warning(`Recommendation: Use Azure Functions for container Task to deploy Function app.`); + } + else if (this.taskParams.WebAppKind.includes("functionApp")){ + tl.warning(`Recommendation: Use Azure Functions Task to deploy Function app.`); + } + + this.azureEndpoint = await new AzureRMEndpoint(this.taskParams.connectedServiceName).getEndpoint(); + console.log(tl.loc('GotconnectiondetailsforazureRMWebApp0', this.taskParams.WebAppName)); + if(!this.taskParams.DeployToSlotOrASEFlag) { + this.taskParams.ResourceGroupName = await AzureResourceFilterUtility.getResourceGroupName(this.azureEndpoint, this.taskParams.WebAppName); + } + + this.appService = new AzureAppService(this.azureEndpoint, this.taskParams.ResourceGroupName, this.taskParams.WebAppName, + this.taskParams.SlotName, this.taskParams.WebAppKind); + this.appServiceUtility = new AzureAppServiceUtility(this.appService); + + this.kuduService = await this.appServiceUtility.getKuduService(); + this.kuduServiceUtility = new KuduServiceUtility(this.kuduService); + tl.debug(`Resource Group: ${this.taskParams.ResourceGroupName}`); + } + + public async DeployWebAppStep() {} + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + this.activeDeploymentID = await this.kuduServiceUtility.updateDeploymentStatus(isDeploymentSuccess, null, {'type': 'Deployment', slotName: this.appService.getSlot()}); + tl.debug('Active DeploymentId :'+ this.activeDeploymentID); + } + + if(this.appServiceUtility) { + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + } + + protected async PostDeploymentStep() { + if(this.taskParams.AppSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.AppSettings); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSettings); + } + + if(this.taskParams.ConfigurationSettings) { + var customApplicationSettings = ParameterParser.parse(this.taskParams.ConfigurationSettings); + await this.appServiceUtility.updateConfigurationSettings(customApplicationSettings); + } + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams, this.virtualApplicationPath); + } + + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..2d2371181ca4 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/BuiltInLinuxWebAppDeploymentProvider.ts @@ -0,0 +1,123 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import path = require('path'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentTypeLinux } from '../operations/TaskParameters'; + +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE true'; +const linuxFunctionRuntimeSettingName: string = '-FUNCTIONS_WORKER_RUNTIME '; + +const linuxFunctionRuntimeSettingValue = new Map([ + [ 'DOCKER|microsoft/azure-functions-dotnet-core2.0:2.0', 'dotnet ' ], + [ 'DOCKER|microsoft/azure-functions-node8:2.0', 'node ' ], + [ 'DOCKER|microsoft/azure-functions-python3.6:2.0', 'python '], + [ 'DOTNET|2.2', 'dotnet ' ], + [ 'DOTNET|3.1', 'dotnet ' ], + [ 'JAVA|8', 'java ' ], + [ 'JAVA|11', 'java ' ], + [ 'NODE|8', 'node ' ], + [ 'NODE|10', 'node ' ], + [ 'NODE|12', 'node ' ], + [ 'NODE|14', 'node ' ], + [ 'PYTHON|3.6', 'python '], + [ 'PYTHON|3.7', 'python '], + [ 'PYTHON|3.8', 'python '] +]); + +export class BuiltInLinuxWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let packageType = this.taskParams.Package.getPackageType(); + let deploymentMethodtelemetry = packageType === PackageType.war ? '{"deploymentMethod":"War Deploy"}' : '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug('Performing Linux built-in package deployment'); + var isNewValueUpdated: boolean = false; + + if(this.taskParams.isFunctionApp) { + var linuxFunctionRuntimeSetting = ""; + if(this.taskParams.RuntimeStack){ + linuxFunctionRuntimeSetting = linuxFunctionRuntimeSettingName + linuxFunctionRuntimeSettingValue.get(this.taskParams.RuntimeStack); + } + var linuxFunctionAppSetting = linuxFunctionRuntimeSetting + linuxFunctionStorageSetting; + var customApplicationSetting = ParameterParser.parse(linuxFunctionAppSetting); + isNewValueUpdated = await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + var zipDeploy: boolean = this.taskParams.DeploymentTypeLinux === DeploymentTypeLinux.zipDeploy; + var isClean: boolean = this.taskParams.CleanDeploymentFlag; + if (!zipDeploy && !isClean) { + console.log(tl.loc('OneDeployWithIncrementalDeploymentOption')); + } + + switch(packageType){ + case PackageType.folder: + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + let archivedWebPackage = await zipUtility.archiveFolder(this.taskParams.Package.getPath(), "", tempPackagePath); + tl.debug("Compressed folder into zip " + archivedWebPackage); + await this.InvokeDeploymentMethod(zipDeploy, archivedWebPackage, 'Zip', isClean); + + break; + + case PackageType.zip: + await this.InvokeDeploymentMethod(zipDeploy, this.taskParams.Package.getPath(), 'Zip', isClean); + + break; + + case PackageType.jar: + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ this.taskParams.Package.getPath()); + var folderPath = await webCommonUtility.generateTemporaryFolderForDeployment(false, this.taskParams.Package.getPath(), PackageType.jar); + var output = await webCommonUtility.archiveFolderForDeployment(false, folderPath); + var webPackage = output.webDeployPkg; + tl.debug("Initiated deployment via kudu service for webapp jar package : "+ webPackage); + await this.InvokeDeploymentMethod(zipDeploy, webPackage, 'Jar', isClean); + + break; + + case PackageType.war: + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + break; + + default: + throw new Error(tl.loc('Invalidwebapppackageorfolderpathprovided', this.taskParams.Package.getPath())); + } + + await this.appServiceUtility.updateStartupCommandAndRuntimeStack(this.taskParams.RuntimeStack, this.taskParams.StartupCommand); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + } + + private async InvokeDeploymentMethod(zipDeploy: boolean, packagePath: string, packageType: string, isClean: boolean){ + if (zipDeploy) { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(packagePath, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, true); + } + else { + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingOneDeploy(packagePath, isClean, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }, packageType, true); + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/ContainerWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/ContainerWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..542ab8d73728 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/ContainerWebAppDeploymentProvider.ts @@ -0,0 +1,25 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { ContainerBasedDeploymentUtility } from '../operations/ContainerBasedDeploymentUtility'; +const linuxFunctionStorageSetting: string = '-WEBSITES_ENABLE_APP_SERVICE_STORAGE false'; + +export class ContainerWebAppDeploymentProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + tl.debug("Performing container based deployment."); + + if(this.taskParams.isFunctionApp) { + var customApplicationSetting = ParameterParser.parse(linuxFunctionStorageSetting); + await this.appServiceUtility.updateAndMonitorAppSettings(customApplicationSetting); + } + + let containerDeploymentUtility: ContainerBasedDeploymentUtility = new ContainerBasedDeploymentUtility(this.appService); + await containerDeploymentUtility.deployWebAppImage(this.taskParams); + + if(this.taskParams.ScriptType) { + await this.kuduServiceUtility.runPostDeploymentScript(this.taskParams); + } + await this.appServiceUtility.updateScmTypeAndConfigurationDetails(); + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/DeploymentFactory.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/DeploymentFactory.ts new file mode 100644 index 000000000000..a6cd9ec9f01b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/DeploymentFactory.ts @@ -0,0 +1,99 @@ +import { TaskParameters, DeploymentType } from '../operations/TaskParameters'; +import * as Constant from '../operations/Constants' +import { PublishProfileWebAppDeploymentProvider } from './PublishProfileWebAppDeploymentProvider'; +import { BuiltInLinuxWebAppDeploymentProvider } from './BuiltInLinuxWebAppDeploymentProvider'; +import { IWebAppDeploymentProvider } from './IWebAppDeploymentProvider'; +import { WindowsWebAppWebDeployProvider } from './WindowsWebAppWebDeployProvider'; +import { WindowsWebAppZipDeployProvider } from './WindowsWebAppZipDeployProvider'; +import { WindowsWebAppRunFromZipProvider } from './WindowsWebAppRunFromZipProvider'; +import { ContainerWebAppDeploymentProvider } from './ContainerWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { WindowsWebAppWarDeployProvider } from './WindowsWebAppWarDeployProvider'; + +export class DeploymentFactory { + + private _taskParams: TaskParameters; + + constructor(taskParams: TaskParameters) { + this._taskParams = taskParams; + } + + public async GetDeploymentProvider(): Promise { + switch(this._taskParams.ConnectionType) { + case Constant.ConnectionType.PublishProfile: + return new PublishProfileWebAppDeploymentProvider(this._taskParams); + case Constant.ConnectionType.AzureRM: + if(this._taskParams.isLinuxApp) { + tl.debug("Depolyment started for linux app service"); + return await this._getLinuxDeploymentProvider(); + } if(this._taskParams.isHyperVContainerApp) { + tl.debug("Depolyment started for hyperV container app service"); + return await this._getContainerDeploymentProvider(); + } + else { + tl.debug("Depolyment started for windows app service"); + return await this._getWindowsDeploymentProvider() + } + default: + throw new Error(tl.loc('InvalidConnectionType')); + } + } + + private async _getLinuxDeploymentProvider(): Promise { + if(this._taskParams.isBuiltinLinuxWebApp) { + return new BuiltInLinuxWebAppDeploymentProvider(this._taskParams); + } else if(this._taskParams.isContainerWebApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getContainerDeploymentProvider(): Promise { + if(this._taskParams.isHyperVContainerApp) { + return new ContainerWebAppDeploymentProvider(this._taskParams); + } else { + throw new Error(tl.loc('InvalidImageSourceType')); + } + } + + private async _getWindowsDeploymentProvider(): Promise { + tl.debug("Package type of deployment is: "+ this._taskParams.Package.getPackageType()); + switch(this._taskParams.Package.getPackageType()){ + case PackageType.war: + return new WindowsWebAppWarDeployProvider(this._taskParams); + case PackageType.jar: + return new WindowsWebAppZipDeployProvider(this._taskParams); + default: + return await this._getWindowsDeploymentProviderForZipAndFolderPackageType(); + } + } + + private async _getWindowsDeploymentProviderForZipAndFolderPackageType(): Promise { + if(this._taskParams.UseWebDeploy) { + return await this._getUserSelectedDeploymentProviderForWindow(); + } else { + var _isMSBuildPackage = await this._taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage || this._taskParams.VirtualApplication) { + return new WindowsWebAppWebDeployProvider(this._taskParams); + } else if(this._taskParams.ScriptType) { + return new WindowsWebAppZipDeployProvider(this._taskParams); + } else { + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + } + + private async _getUserSelectedDeploymentProviderForWindow(): Promise { + switch(this._taskParams.DeploymentType){ + case DeploymentType.webDeploy: + return new WindowsWebAppWebDeployProvider(this._taskParams); + case DeploymentType.zipDeploy: + return new WindowsWebAppZipDeployProvider(this._taskParams); + case DeploymentType.runFromZip: + return new WindowsWebAppRunFromZipProvider(this._taskParams); + } + } + +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/IWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/IWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..3ed6e50c86f4 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/IWebAppDeploymentProvider.ts @@ -0,0 +1,5 @@ +export interface IWebAppDeploymentProvider{ + PreDeploymentStep(); + DeployWebAppStep(); + UpdateDeploymentStatus(isDeploymentSuccess: boolean); +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts new file mode 100644 index 000000000000..363fc8557366 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/PublishProfileWebAppDeploymentProvider.ts @@ -0,0 +1,143 @@ +import { IWebAppDeploymentProvider } from "./IWebAppDeploymentProvider"; +import { TaskParameters } from "../operations/TaskParameters"; +import { PublishProfileUtility, PublishingProfile } from '../operations/PublishProfileUtility'; +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import { AzureAppServiceUtility } from '../operations/AzureAppServiceUtility'; +import * as Constant from '../operations/Constants'; +import tl = require('azure-pipelines-task-lib/task'); +import fs = require('fs'); +import path = require('path'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var msDeployUtility = require('azure-pipelines-tasks-webdeployment-common/msdeployutility.js'); + +const DEFAULT_RETRY_COUNT = 3; + +export class PublishProfileWebAppDeploymentProvider implements IWebAppDeploymentProvider{ + private taskParams: TaskParameters; + private publishProfileUtility: PublishProfileUtility; + private origWebPackage: string; + private modWebPackage: string; + private bakWebPackage: string; + private origEnvPath: string; + + constructor(taskParams: TaskParameters) { + this.taskParams = taskParams; + } + + public async PreDeploymentStep() { + this.publishProfileUtility = new PublishProfileUtility(this.taskParams.PublishProfilePath); + try { + var siteUrl = await this.publishProfileUtility.GetPropertyValuefromPublishProfile(Constant.PublishProfileXml.SiteUrlToLaunchAfterPublish); + await AzureAppServiceUtility.pingApplication(siteUrl); + tl.setVariable('AppServiceApplicationUrl', siteUrl); + } + catch (error){ + tl.debug('Unable to ping webapp, Error: ' + error); + } + } + + public async DeployWebAppStep() { + if(!tl.osType().match(/^Win/)){ + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + tl.debug("Performing the deployment of webapp using publish profile."); + + var applyFileTransformFlag = this.taskParams.JSONFiles.length != 0 || this.taskParams.XmlTransformation || this.taskParams.XmlVariableSubstitution; + if(applyFileTransformFlag) { + await this.ApplyFileTransformation(); + } + + var msDeployPublishingProfile: PublishingProfile = await this.publishProfileUtility.GetTaskParametersFromPublishProfileFile(this.taskParams); + var deployCmdFilePath = this.GetDeployCmdFilePath(); + + await this.SetMsdeployEnvPath(); + var cmdArgs:string = this.GetDeployScriptCmdArgs(msDeployPublishingProfile); + + var retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + var retryCount = (retryCountParam && !(isNaN(Number(retryCountParam)))) ? Number(retryCountParam): DEFAULT_RETRY_COUNT; + + try { + while(true) { + try { + retryCount -= 1; + await this.publishProfileUtility.RunCmd(deployCmdFilePath, cmdArgs); + break; + } + catch (error) { + if(retryCount == 0) { + throw error; + } + console.log(error); + console.log(tl.loc('RetryToDeploy')); + } + } + console.log(tl.loc('PackageDeploymentSuccess')); + } + catch (error) { + tl.error(tl.loc('PackageDeploymentFailed')); + tl.debug(JSON.stringify(error)); + msDeployUtility.redirectMSDeployErrorToConsole(); + throw Error(error.message); + } + finally { + this.ResetMsdeployEnvPath(); + if(applyFileTransformFlag) { + this.ResetFileTransformation(); + } + } + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean){ } + + private async SetMsdeployEnvPath() { + var msDeployPath = await msDeployUtility.getMSDeployFullPath(); + var msDeployDirectory = msDeployPath.slice(0, msDeployPath.lastIndexOf('\\') + 1); + this.origEnvPath = process.env.PATH; + process.env.PATH = msDeployDirectory + ";" + process.env.PATH ; + } + + private async ResetMsdeployEnvPath() { + process.env.PATH = this.origEnvPath; + } + + private GetDeployCmdFilePath(): string { + var webPackagePath = this.taskParams.Package.getPath(); + var packageDir = path.dirname(webPackagePath); + return packageUtility.PackageUtility.getPackagePath(packageDir + "\\*.deploy.cmd"); + } + + private GetDeployScriptCmdArgs(msDeployPublishingProfile:any): string { + var deployCmdArgs: string = " /Y /A:basic \"/U:" + msDeployPublishingProfile.UserName + "\" \"\\\"/P:" + msDeployPublishingProfile.UserPWD + + "\\\"\" \"\\\"/M:" + "https://" + msDeployPublishingProfile.PublishUrl + "/msdeploy.axd?site=" + msDeployPublishingProfile.WebAppName + "\\\"\""; + + if(msDeployPublishingProfile.TakeAppOfflineFlag) { + deployCmdArgs += ' -enableRule:AppOffline'; + } + + if(msDeployPublishingProfile.RemoveAdditionalFilesFlag) { + deployCmdArgs += " -enableRule:DoNotDeleteRule"; + } + + if(this.taskParams.AdditionalArguments) { + deployCmdArgs += " " + this.taskParams.AdditionalArguments; + } + + return deployCmdArgs; + } + + private async ApplyFileTransformation() { + this.origWebPackage = packageUtility.PackageUtility.getPackagePath(this.taskParams.Package); + this.modWebPackage = await FileTransformsUtility.applyTransformations(this.origWebPackage, this.taskParams); + this.bakWebPackage = this.origWebPackage + ".bak"; + fs.renameSync(this.origWebPackage, this.bakWebPackage); + fs.renameSync(this.modWebPackage, this.origWebPackage); + } + + private ResetFileTransformation() { + tl.rmRF(this.origWebPackage); + fs.renameSync(this.bakWebPackage, this.origWebPackage); + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppRunFromZipProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppRunFromZipProvider.ts new file mode 100644 index 000000000000..165930ea5baa --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppRunFromZipProvider.ts @@ -0,0 +1,68 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { addReleaseAnnotation } from '../operations/ReleaseAnnotationUtility'; +const oldRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP'; +const runFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE 1'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppRunFromZipProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Run from Package"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.runFromZip) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var addCustomApplicationSetting = ParameterParser.parse(runFromZipAppSetting); + var deleteCustomApplicationSetting = ParameterParser.parse(oldRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(addCustomApplicationSetting, deleteCustomApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + await this.kuduServiceUtility.deployUsingRunFromZip(webPackage, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.taskParams.ScriptType && this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + } + else { + await addReleaseAnnotation(this.azureEndpoint, this.appService, isDeploymentSuccess); + let appServiceApplicationUrl: string = await this.appServiceUtility.getApplicationURL(!this.taskParams.isLinuxApp + ? this.taskParams.VirtualApplication : null); + console.log(tl.loc('AppServiceApplicationURL', appServiceApplicationUrl)); + tl.setVariable('AppServiceApplicationUrl', appServiceApplicationUrl); + } + + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWarDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWarDeployProvider.ts new file mode 100644 index 000000000000..fba9f86f6519 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWarDeployProvider.ts @@ -0,0 +1,36 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + + +export class WindowsWebAppWarDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"War Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp war package : "+ this.taskParams.Package.getPath()); + + await this.kuduServiceUtility.warmpUp(); + + var warName = webCommonUtility.getFileNameFromPath(this.taskParams.Package.getPath(), ".war"); + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingWarDeploy(this.taskParams.Package.getPath(), + { slotName: this.appService.getSlot() }, warName); + + await this.PostDeploymentStep(); + } + + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWebDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWebDeployProvider.ts new file mode 100644 index 000000000000..55467fa83d97 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppWebDeployProvider.ts @@ -0,0 +1,53 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import * as Constant from '../operations/Constants'; +import { WebDeployUtility } from '../operations/WebDeployUtility'; +import { Package } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_ZIP -WEBSITE_RUN_FROM_PACKAGE'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export class WindowsWebAppWebDeployProvider extends AzureRmWebAppDeploymentProvider{ + + public async DeployWebAppStep() { + var physicalPath: string = Constant.SiteRoot; + var webPackage = this.taskParams.Package.getPath(); + + if(this.taskParams.VirtualApplication) { + physicalPath = await this.appServiceUtility.getPhysicalPath(this.taskParams.VirtualApplication); + await this.kuduServiceUtility.createPathIfRequired(physicalPath); + this.virtualApplicationPath = physicalPath; + } + + webPackage = await FileTransformsUtility.applyTransformations(webPackage, this.taskParams); + this.taskParams.Package = new Package(webPackage); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting) + await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if (deployUtility.canUseWebDeploy(this.taskParams.UseWebDeploy)) { + const webDeployUtility = new WebDeployUtility(this.appServiceUtility); + const deploymentMethodtelemetry = '{"deploymentMethod":"Web Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Performing the deployment of webapp."); + + if (tl.getPlatform() !== tl.Platform.Windows) { + throw Error(tl.loc("PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent")); + } + + await webDeployUtility.publishUsingWebDeploy(this.taskParams); + } + else { + const deploymentMethodtelemetry = '{"deploymentMethod":"Zip API"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + tl.debug("Initiated deployment via kudu service for webapp package : "); + await this.kuduServiceUtility.deployWebPackage(webPackage, physicalPath, this.taskParams.VirtualApplication, this.taskParams.TakeAppOfflineFlag); + } + + await this.PostDeploymentStep(); + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppZipDeployProvider.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppZipDeployProvider.ts new file mode 100644 index 000000000000..9d3429714c79 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/deploymentProvider/WindowsWebAppZipDeployProvider.ts @@ -0,0 +1,64 @@ +import { AzureRmWebAppDeploymentProvider } from './AzureRmWebAppDeploymentProvider'; +import tl = require('azure-pipelines-task-lib/task'); +import { FileTransformsUtility } from '../operations/FileTransformsUtility'; +import * as ParameterParser from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { DeploymentType } from '../operations/TaskParameters'; +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +const removeRunFromZipAppSetting: string = '-WEBSITE_RUN_FROM_PACKAGE -WEBSITE_RUN_FROM_ZIP'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); + +export class WindowsWebAppZipDeployProvider extends AzureRmWebAppDeploymentProvider{ + + private zipDeploymentID: string; + + public async DeployWebAppStep() { + let deploymentMethodtelemetry = '{"deploymentMethod":"Zip Deploy"}'; + console.log("##vso[telemetry.publish area=TaskDeploymentMethod;feature=AzureWebAppDeployment]" + deploymentMethodtelemetry); + + var webPackage = await FileTransformsUtility.applyTransformations(this.taskParams.Package.getPath(), this.taskParams); + + if(this.taskParams.UseWebDeploy && this.taskParams.DeploymentType === DeploymentType.zipDeploy) { + var _isMSBuildPackage = await this.taskParams.Package.isMSBuildPackage(); + if(_isMSBuildPackage) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedformsbuildpackage")); + } + else if(this.taskParams.VirtualApplication) { + throw Error(tl.loc("Publishusingzipdeploynotsupportedforvirtualapplication")); + } + else if(this.taskParams.Package.getPackageType() === PackageType.war) { + throw Error(tl.loc("Publishusingzipdeploydoesnotsupportwarfile")); + } + } + + if(tl.stats(webPackage).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + webPackage = await zipUtility.archiveFolder(webPackage, "", tempPackagePath); + tl.debug("Compressed folder into zip " + webPackage); + } + + tl.debug("Initiated deployment via kudu service for webapp package : "); + + var deleteApplicationSetting = ParameterParser.parse(removeRunFromZipAppSetting); + var isNewValueUpdated: boolean = await this.appServiceUtility.updateAndMonitorAppSettings(null, deleteApplicationSetting); + + if(!isNewValueUpdated) { + await this.kuduServiceUtility.warmpUp(); + } + + this.zipDeploymentID = await this.kuduServiceUtility.deployUsingZipDeploy(webPackage, this.taskParams.TakeAppOfflineFlag, + { slotName: this.appService.getSlot() }); + + await this.PostDeploymentStep(); + } + + public async UpdateDeploymentStatus(isDeploymentSuccess: boolean) { + if(this.kuduServiceUtility) { + await super.UpdateDeploymentStatus(isDeploymentSuccess); + if(this.zipDeploymentID && this.activeDeploymentID && isDeploymentSuccess) { + await this.kuduServiceUtility.postZipDeployOperation(this.zipDeploymentID, this.activeDeploymentID); + } + } + + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/icon.png b/_generated/AzureRmWebAppDeploymentV5_Node20/icon.png new file mode 100644 index 000000000000..9ee7be815737 Binary files /dev/null and b/_generated/AzureRmWebAppDeploymentV5_Node20/icon.png differ diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/icon.svg b/_generated/AzureRmWebAppDeploymentV5_Node20/icon.svg new file mode 100644 index 000000000000..4b1d57e6a85b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/make.json b/_generated/AzureRmWebAppDeploymentV5_Node20/make.json new file mode 100644 index 000000000000..541eb613f8ec --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/make.json @@ -0,0 +1,28 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "ctt.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/ctt/1.6/ctt.zip", + "dest": "./" + } + ] + }, + "cp": [ + { + "source": "postDeploymentScript", + "options": "-R" + } + ], + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base", + "node_modules/https-proxy-agent/node_modules/agent-base" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureAppServiceUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureAppServiceUtility.ts new file mode 100644 index 000000000000..e9286351c825 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureAppServiceUtility.ts @@ -0,0 +1,336 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +var parseString = require('xml2js').parseString; +import Q = require('q'); +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { AzureAppServiceUtility as AzureAppServiceUtilityCommon } from 'azure-pipelines-tasks-azure-arm-rest/azureAppServiceUtility'; + +//todo replace this class with azure-arm-rest/azureAppServiceUtility +export class AzureAppServiceUtility { + private _appService: AzureAppService; + constructor(appService: AzureAppService) { + this._appService = appService; + } + + public async updateScmTypeAndConfigurationDetails(): Promise { + try { + var configDetails = await this._appService.getConfiguration(); + var scmType: string = configDetails.properties.scmType; + let shouldUpdateMetadata = false; + if (scmType && scmType.toLowerCase() === "none") { + configDetails.properties.scmType = 'VSTSRM'; + tl.debug('updating SCM Type to VSTS-RM'); + await this._appService.updateConfiguration(configDetails); + tl.debug('updated SCM Type to VSTS-RM'); + shouldUpdateMetadata = true; + } + else if (scmType && scmType.toLowerCase() == "vstsrm") { + tl.debug("SCM Type is VSTSRM"); + shouldUpdateMetadata = true; + } + else { + tl.debug(`Skipped updating the SCM value. Value: ${scmType}`); + } + + if (shouldUpdateMetadata) { + tl.debug('Updating metadata with latest pipeline details'); + let newMetadataProperties = this._getNewMetadata(); + let siteMetadata = await this._appService.getMetadata(); + let skipUpdate = true; + for (let property in newMetadataProperties) { + if (siteMetadata.properties[property] !== newMetadataProperties[property]) { + siteMetadata.properties[property] = newMetadataProperties[property]; + skipUpdate = false; + } + } + + if (!skipUpdate) { + await this._appService.patchMetadata(siteMetadata.properties); + tl.debug('Updated metadata with latest pipeline details'); + console.log(tl.loc("SuccessfullyUpdatedAzureRMWebAppConfigDetails")); + } + else { + tl.debug("No changes in metadata properties, skipping update."); + } + } + } + catch (error) { + tl.warning(tl.loc("FailedToUpdateAzureRMWebAppConfigDetails", error)); + } + } + + public async getWebDeployPublishingProfile(): Promise { + var publishingProfile = await this._appService.getPublishingProfileWithSecrets(); + var defer = Q.defer(); + parseString(publishingProfile, (error, result) => { + if(!!error) { + defer.reject(error); + } + var publishProfile = result && result.publishData && result.publishData.publishProfile ? result.publishData.publishProfile : null; + if(publishProfile) { + for (var index in publishProfile) { + if (publishProfile[index].$ && publishProfile[index].$.publishMethod === "MSDeploy") { + defer.resolve(result.publishData.publishProfile[index].$); + } + } + } + + defer.reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + + return defer.promise; + } + + public async getApplicationURL(virtualApplication?: string): Promise { + let webDeployProfile: any = await this.getWebDeployPublishingProfile(); + return await webDeployProfile.destinationAppUrl + ( virtualApplication ? "/" + virtualApplication : "" ); + } + + public async pingApplication(): Promise { + try { + var applicationUrl: string = await this.getApplicationURL(); + + if(!applicationUrl) { + tl.debug("Application Url not found."); + return; + } + await AzureAppServiceUtility.pingApplication(applicationUrl); + } catch(error) { + tl.debug("Unable to ping App Service. Error: ${error}"); + } + } + + public static async pingApplication(applicationUrl: string) { + if(!applicationUrl) { + tl.debug('Application Url empty.'); + return; + } + try { + var webRequest = new webClient.WebRequest(); + webRequest.method = 'GET'; + webRequest.uri = applicationUrl; + let webRequestOptions: webClient.WebRequestOptions = {retriableErrorCodes: [], retriableStatusCodes: [], retryCount: 1, retryIntervalInSeconds: 5, retryRequestTimedout: true}; + var response = await webClient.sendRequest(webRequest, webRequestOptions); + tl.debug(`App Service status Code: '${response.statusCode}'. Status Message: '${response.statusMessage}'`); + } + catch(error) { + tl.debug(`Unable to ping App Service. Error: ${error}`); + } + } + + public async getKuduService(): Promise { + + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.getKuduService(); + + } + + public async isSitePublishingCredentialsEnabled(): Promise { + const utility = new AzureAppServiceUtilityCommon(this._appService); + return await utility.isSitePublishingCredentialsEnabled(); + } + + public async getAuthToken(): Promise { + const token = await this._appService._client.getCredentials().getToken(); + tl.setSecret(token); + return token; + } + + public async getPhysicalPath(virtualApplication: string): Promise { + + if(!virtualApplication) { + return '/site/wwwroot'; + } + + virtualApplication = (virtualApplication.startsWith("/")) ? virtualApplication.substr(1) : virtualApplication; + + var physicalToVirtualPathMap = await this._getPhysicalToVirtualPathMap(virtualApplication); + + if(!physicalToVirtualPathMap) { + throw Error(tl.loc("VirtualApplicationDoesNotExist", virtualApplication)); + } + + tl.debug(`Virtual Application Map: Physical path: '${physicalToVirtualPathMap.physicalPath}'. Virtual path: '${physicalToVirtualPathMap.virtualPath}'.`); + return physicalToVirtualPathMap.physicalPath; + } + + public async updateConfigurationSettings(properties: any) : Promise { + for(var property in properties) { + if(!!properties[property] && properties[property].value !== undefined) { + properties[property] = properties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceConfigurationSettings', JSON.stringify(properties))); + await this._appService.patchConfiguration({'properties': properties}); + console.log(tl.loc('UpdatedAppServiceConfigurationSettings')); + } + + public async updateAndMonitorAppSettings(addProperties: any, deleteProperties?: any): Promise { + for(var property in addProperties) { + if(!!addProperties[property] && addProperties[property].value !== undefined) { + addProperties[property] = addProperties[property].value; + } + } + + console.log(tl.loc('UpdatingAppServiceApplicationSettings', JSON.stringify(addProperties))); + var isNewValueUpdated: boolean = await this._appService.patchApplicationSettings(addProperties, deleteProperties); + + if(!!isNewValueUpdated) { + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + } + else { + console.log(tl.loc('AppServiceApplicationSettingsAlreadyPresent')); + return isNewValueUpdated; + } + + var kuduService = await this.getKuduService(); + var noOftimesToIterate: number = 12; + tl.debug('retrieving values from Kudu service to check if new values are updated'); + while(noOftimesToIterate > 0) { + var kuduServiceAppSettings = await kuduService.getAppSettings(); + var propertiesChanged: boolean = true; + for(var property in addProperties) { + if(kuduServiceAppSettings[property] != addProperties[property]) { + tl.debug('New properties are not updated in Kudu service :('); + propertiesChanged = false; + break; + } + } + for(var property in deleteProperties) { + if(kuduServiceAppSettings[property]) { + tl.debug('Deleted properties are not reflected in Kudu service :('); + propertiesChanged = false; + break; + } + } + + if(propertiesChanged) { + tl.debug('New properties are updated in Kudu service.'); + console.log(tl.loc('UpdatedAppServiceApplicationSettings')); + return isNewValueUpdated; + } + + noOftimesToIterate -= 1; + await webClient.sleepFor(5); + } + + tl.debug('Timing out from app settings check'); + return isNewValueUpdated; + } + + public async enableRenameLockedFiles(): Promise { + try { + var webAppSettings = await this._appService.getApplicationSettings(); + if(webAppSettings && webAppSettings.properties) { + if(webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES !== '1') { + tl.debug(`Rename locked files value found to be ${webAppSettings.properties.MSDEPLOY_RENAME_LOCKED_FILES}. Updating the value to 1`); + await this.updateAndMonitorAppSettings({ 'MSDEPLOY_RENAME_LOCKED_FILES' : '1' }); + console.log(tl.loc('RenameLockedFilesEnabled')); + } + else { + tl.debug('Rename locked files is already enabled in App Service'); + } + } + } + catch(error) { + throw new Error(tl.loc('FailedToEnableRenameLockedFiles', error)); + } + } + + public async updateStartupCommandAndRuntimeStack(runtimeStack: string, startupCommand?: string): Promise { + var configDetails = await this._appService.getConfiguration(); + var appCommandLine: string = configDetails.properties.appCommandLine; + startupCommand = (!!startupCommand) ? startupCommand : appCommandLine; + var linuxFxVersion: string = configDetails.properties.linuxFxVersion; + runtimeStack = (!!runtimeStack) ? runtimeStack : linuxFxVersion; + + if (appCommandLine != startupCommand || runtimeStack != linuxFxVersion) { + await this.updateConfigurationSettings({linuxFxVersion: runtimeStack, appCommandLine: startupCommand}); + } + else { + tl.debug(`Skipped updating the values. linuxFxVersion: ${linuxFxVersion} : appCommandLine: ${appCommandLine}`) + } + } + + private async _getPhysicalToVirtualPathMap(virtualApplication: string): Promise { + // construct URL depending on virtualApplication or root of webapplication + var physicalPath = null; + var virtualPath = "/" + virtualApplication; + var appConfigSettings = await this._appService.getConfiguration(); + var virtualApplicationMappings = appConfigSettings.properties && appConfigSettings.properties.virtualApplications; + + if(virtualApplicationMappings) { + for( var mapping of virtualApplicationMappings ) { + if(mapping.virtualPath.toLowerCase() == virtualPath.toLowerCase()) { + physicalPath = mapping.physicalPath; + break; + } + } + } + + return physicalPath ? { + 'virtualPath': virtualPath, + 'physicalPath': physicalPath + }: null; + } + + private _getNewMetadata(): any { + var collectionUri = tl.getVariable("system.teamfoundationCollectionUri"); + var projectId = tl.getVariable("system.teamprojectId"); + var releaseDefinitionId = tl.getVariable("release.definitionId"); + + // Log metadata properties based on whether task is running in build OR release. + + let newProperties = { + VSTSRM_ProjectId: projectId, + VSTSRM_AccountId: tl.getVariable("system.collectionId") + } + + if(!!releaseDefinitionId) { + // Task is running in Release + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + tl.debug("Artifact Source Alias is: "+ artifactAlias); + + let buildDefinitionUrl = ""; + let buildDefintionId = ""; + + if (artifactAlias) { + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + // Get build definition info only when artifact type is build. + if (artifactType && artifactType.toLowerCase() == "build") { + + buildDefintionId = tl.getVariable("build.definitionId"); + let buildProjectId = tl.getVariable("build.projectId") || projectId; + let artifactBuildDefinitionId = tl.getVariable("release.artifacts." + artifactAlias + ".definitionId"); + let artifactBuildProjectId = tl.getVariable("release.artifacts." + artifactAlias + ".projectId"); + + if (artifactBuildDefinitionId && artifactBuildProjectId) { + buildDefintionId = artifactBuildDefinitionId; + buildProjectId = artifactBuildProjectId; + } + + buildDefinitionUrl = collectionUri + buildProjectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + } + } + + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + newProperties["VSTSRM_ReleaseDefinitionId"] = releaseDefinitionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl; + newProperties["VSTSRM_ConfiguredCDEndPoint"] = collectionUri + projectId + "/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?definitionId=" + releaseDefinitionId; + } + else { + // Task is running in Build + let buildDefintionId = tl.getVariable("system.definitionId"); + newProperties["VSTSRM_BuildDefinitionId"] = buildDefintionId; + let buildDefinitionUrl = collectionUri + projectId + "/_build?_a=simple-process&definitionId=" + buildDefintionId; + newProperties["VSTSRM_BuildDefinitionWebAccessUrl"] = buildDefinitionUrl + newProperties["VSTSRM_ConfiguredCDEndPoint"] = buildDefinitionUrl; + } + + return newProperties; + } + +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureResourceFilterUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureResourceFilterUtility.ts new file mode 100644 index 000000000000..091a77d51a06 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/AzureResourceFilterUtility.ts @@ -0,0 +1,20 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { Resources } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-resource'; + +export class AzureResourceFilterUtility { + public static async getResourceGroupName(endpoint: AzureEndpoint, resourceName: string): Promise { + const azureResources: Resources = new Resources(endpoint); + const resources: Array = await azureResources.getResources('Microsoft.Web/Sites', resourceName); + const resourceGroupIds: string[] = [...new Set(resources.map(r => r.id as string))]; + if(!resourceGroupIds || resourceGroupIds.length == 0) { + throw new Error(tl.loc('ResourceDoesntExist', resourceName)); + } + else if(resourceGroupIds.length > 1) { + throw new Error(tl.loc('MultipleResourceGroupFoundForAppService', resourceName)); + } + else { + return resourceGroupIds[0].split("/")[4]; + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/Constants.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/Constants.ts new file mode 100644 index 000000000000..3289e7f10524 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/Constants.ts @@ -0,0 +1,19 @@ +export const ConnectionType = { + PublishProfile: "PublishProfile", + AzureRM: "AzureRM" +} + +export const SiteRoot: string = '/site/wwwroot'; + +export const PublishProfileXml = { + ExcludeApp_Data: "ExcludeApp_Data", + EnableMSDeployAppOffline: "EnableMSDeployAppOffline", + SkipExtraFilesOnServer: "SkipExtraFilesOnServer", + SiteUrlToLaunchAfterPublish: "SiteUrlToLaunchAfterPublish", + MSDeployServiceURL: "MSDeployServiceURL", + DeployIisAppPath: "DeployIisAppPath", + MSDeploy: "MSDeploy", + UserName: "UserName" +} + +export const AzureDeployPackageArtifactAlias = "Azure_App_Service_Deploy_PackageArtifactAlias"; \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ContainerBasedDeploymentUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ContainerBasedDeploymentUtility.ts new file mode 100644 index 000000000000..8390173487b8 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ContainerBasedDeploymentUtility.ts @@ -0,0 +1,226 @@ +import tl = require('azure-pipelines-task-lib/task'); +import url = require('url'); +import util = require('util'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +enum registryTypes { + "AzureContainerRegistry", + "Registry", // TODO: Rename it to DockerHub while supporting all the registry types. Also add all these registry types in Task.json in ImageSource pick list. + "PrivateRegistry" +} + +export class ContainerBasedDeploymentUtility { + private _appService: AzureAppService; + private _appServiceUtility: AzureAppServiceUtility; + + constructor(appService: AzureAppService) { + this._appService = appService; + this._appServiceUtility = new AzureAppServiceUtility(appService); + } + + public async deployWebAppImage(taskParameters: TaskParameters): Promise { + let imageName: string = this._getDockerHubImageName(); + tl.debug("Deploying an image " + imageName + " to the webapp " + this._appService.getName()); + + tl.debug("Updating the webapp configuration."); + await this._updateConfigurationDetails(taskParameters, imageName); + + tl.debug('Updating web app settings'); + await this._updateApplicationSettings(taskParameters, imageName); + } + + private async _updateApplicationSettings(taskParameters: TaskParameters, imageName: string): Promise { + var appSettingsParameters = taskParameters.AppSettings; + appSettingsParameters = appSettingsParameters ? appSettingsParameters.trim() : ""; + appSettingsParameters = await this._getContainerRegistrySettings(imageName, null) + ' ' + appSettingsParameters; + var appSettingsNewProperties = parse(appSettingsParameters); + await this._appServiceUtility.updateAndMonitorAppSettings(appSettingsNewProperties); + } + + private async _updateConfigurationDetails(taskParameters: TaskParameters, imageName: string): Promise { + var startupCommand: string = taskParameters.StartupCommand; + var configSettingsParameters = taskParameters.ConfigurationSettings; + var appSettingsNewProperties = !!configSettingsParameters ? parse(configSettingsParameters.trim()): { }; + if(!!startupCommand) { + appSettingsNewProperties.appCommandLine = { + 'value': startupCommand + } + } + + if (taskParameters.isHyperVContainerApp){ + appSettingsNewProperties.windowsFxVersion = { + 'value': "DOCKER|" + imageName + } + } + else { + appSettingsNewProperties.linuxFxVersion = { + 'value': "DOCKER|" + imageName + } + } + + tl.debug(`CONATINER UPDATE CONFIG VALUES : ${appSettingsNewProperties}`); + await this._appServiceUtility.updateConfigurationSettings(appSettingsNewProperties); + } + + private getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _getAzureContainerImageName(): string { + var registry = tl.getInput('AzureContainerRegistryLoginServer', true) + ".azurecr.io"; + var image = tl.getInput('AzureContainerRegistryImage', true); + var tag = tl.getInput('AzureContainerRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _getDockerHubImageName(): string { + var namespace = tl.getInput('DockerNamespace', true); + var image = tl.getInput('DockerRepository', true); + var tag = tl.getInput('DockerImageTag', false); + + return this._constructImageName(namespace, image, tag); + } + + private _constructImageName(namespace, repository, tag): string { + var imageName = null; + /* + Special Case : If release definition is not linked to build artifacts + then $(Build.BuildId) variable don't expand in release. So clearing state + of dockerImageTag if $(Build.BuildId) not expanded in value of dockerImageTag. + */ + if(tag && (tag.trim() == "$(Build.BuildId)")) { + tag = null; + } + + if(tag) { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase() + ":" + tag; + } else { + imageName = namespace.toLowerCase() + "/" + repository.toLowerCase(); + } + + return imageName.replace(/ /g,""); + } + + private _getPrivateRegistryImageName(): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var loginServer = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'url', true); + + var registry = url.parse(loginServer).hostname; + var image = tl.getInput('PrivateRegistryImage', true); + var tag = tl.getInput('PrivateRegistryTag', false); + + return this._constructImageName(registry, image, tag); + } + + private _updateWebAppSettings(appSettingsParameters, webAppSettings): void { + // In case of public repo, clear the connection details of a registry + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', true); + + // Uncomment the below lines while supprting all registry types. + // if(dockerRespositoryAccess === "public") + // { + // deleteRegistryConnectionSettings(webAppSettings); + // } + + var parsedAppSettings = parse(appSettingsParameters); + for (var settingName in parsedAppSettings) { + var setting = settingName.trim(); + var settingVal = parsedAppSettings[settingName].value; + settingVal = settingVal ? settingVal.trim() : ""; + + if(setting) { + webAppSettings["properties"][setting] = settingVal; + } + } + } + + private _getImageName(): string { + var registryType = tl.getInput('ImageSource', true); + var imageName = null; + + switch(registryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + imageName = this._getAzureContainerImageName(); + break; + + case registryTypes[registryTypes.Registry]: + imageName = this._getDockerHubImageName(); + break; + + case registryTypes[registryTypes.PrivateRegistry]: + imageName = this._getPrivateRegistryImageName(); + break; + } + + return imageName; + } + + private async _getContainerRegistrySettings(imageName, endPoint): Promise { + var containerRegistryType: string = 'Registry'; + var containerRegistrySettings: string = "-DOCKER_CUSTOM_IMAGE_NAME " + imageName; + var containerRegistryAuthParamsFormatString: string = "-DOCKER_REGISTRY_SERVER_URL %s -DOCKER_REGISTRY_SERVER_USERNAME %s -DOCKER_REGISTRY_SERVER_PASSWORD %s"; + + switch(containerRegistryType) { + case registryTypes[registryTypes.AzureContainerRegistry]: + containerRegistrySettings = await this._getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + + case registryTypes[registryTypes.Registry]: + var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', false); + if(dockerRespositoryAccess === "private") + { + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + } + break; + + case registryTypes[registryTypes.PrivateRegistry]: + containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString); + break; + } + + return containerRegistrySettings; + } + + private async _getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString): Promise { + var registryServerName = tl.getInput('AzureContainerRegistryLoginServer', true); + var registryUrl = "https://" + registryServerName + ".azurecr.io"; + tl.debug("Azure Container Registry Url: " + registryUrl); + + var registryName = tl.getInput('AzureContainerRegistry', true); + var resourceGroupName = '';// await azureRESTUtility.getResourceGroupName(endPoint, registryName, "Microsoft.ContainerRegistry/registries"); + tl.debug("Resource group name of a registry: " + resourceGroupName); + + var creds = null //await azureRESTUtility.getAzureContainerRegistryCredentials(endPoint, registryName, resourceGroupName); + tl.debug("Successfully retrieved the registry credentials"); + + var username = creds.username; + var password = creds["passwords"][0].value; + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString): string { + var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true); + var username = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'username', true); + var password = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'password', true); + var registryUrl = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'registry', true); + + tl.debug("Docker or Private Container Registry Url: " + registryUrl); + + return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password); + } + + private _deleteRegistryConnectionSettings(webAppSettings): void { + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_URL"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_USERNAME"]; + delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_PASSWORD"]; + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/FileTransformsUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/FileTransformsUtility.ts new file mode 100644 index 000000000000..5483a5ca2376 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/FileTransformsUtility.ts @@ -0,0 +1,37 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var fileTransformationsUtility = require('azure-pipelines-tasks-webdeployment-common/fileTransformationsUtility.js'); +var generateWebConfigUtil = require('azure-pipelines-tasks-webdeployment-common/webconfigutil.js'); + +export class FileTransformsUtility { + + private static rootDirectoryPath: string = "D:\\home\\site\\wwwroot"; + public static async applyTransformations(webPackage: string, taskParams: TaskParameters): Promise { + tl.debug("WebConfigParameters is "+ taskParams.WebConfigParameters); + var applyFileTransformFlag = taskParams.JSONFiles.length != 0 || taskParams.XmlTransformation || taskParams.XmlVariableSubstitution; + if (applyFileTransformFlag || taskParams.WebConfigParameters) { + var isFolderBasedDeployment: boolean = tl.stats(webPackage).isDirectory(); + var folderPath = await deployUtility.generateTemporaryFolderForDeployment(isFolderBasedDeployment, webPackage, taskParams.Package.getPackageType()); + if (taskParams.WebConfigParameters) { + tl.debug('parsing web.config parameters'); + var webConfigParameters = parse(taskParams.WebConfigParameters); + generateWebConfigUtil.addWebConfigFile(folderPath, webConfigParameters, this.rootDirectoryPath); + } + + if (applyFileTransformFlag) { + var isMSBuildPackage = !isFolderBasedDeployment && (await deployUtility.isMSDeployPackage(webPackage)); + fileTransformationsUtility.fileTransformations(isFolderBasedDeployment, taskParams.JSONFiles, taskParams.XmlTransformation, taskParams.XmlVariableSubstitution, folderPath, isMSBuildPackage); + } + + var output = await deployUtility.archiveFolderForDeployment(isFolderBasedDeployment, folderPath); + webPackage = output.webDeployPkg; + } + else { + tl.debug('File Tranformation not enabled'); + } + + return webPackage; + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/KuduServiceUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/KuduServiceUtility.ts new file mode 100644 index 000000000000..85bf06da55ba --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/KuduServiceUtility.ts @@ -0,0 +1,576 @@ +import tl = require('azure-pipelines-task-lib/task'); +import Q = require('q'); +import path = require('path'); + +import { DeploymentType, TaskParameters } from './TaskParameters'; + +import { AzureDeployPackageArtifactAlias } from './Constants'; +import { KUDU_DEPLOYMENT_CONSTANTS } from 'azure-pipelines-tasks-azure-arm-rest/constants'; +import { Kudu } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service-kudu'; + +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +import { PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; + +var deployUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); +var zipUtility = require('azure-pipelines-tasks-webdeployment-common/ziputility.js'); +const physicalRootPath: string = '/site/wwwroot'; +const deploymentFolder: string = 'site/deployments'; +const manifestFileName: string = 'manifest'; +const VSTS_ZIP_DEPLOY: string = 'VSTS_ZIP_DEPLOY'; +const VSTS_ONE_DEPLOY: string = 'VSTS_ONE_DEPLOY'; +const VSTS_DEPLOY: string = 'VSTS'; + +export class KuduServiceUtility { + private _appServiceKuduService: Kudu; + private _deploymentID: string; + + constructor(kuduService: Kudu) { + this._appServiceKuduService = kuduService; + } + + public async createPathIfRequired(phsyicalPath: string): Promise { + var listDir = await this._appServiceKuduService.listDir(phsyicalPath); + if(listDir == null) { + await this._appServiceKuduService.createPath(phsyicalPath); + } + } + + public async updateDeploymentStatus(taskResult: boolean, DeploymentID: string, customMessage: any): Promise { + try { + let requestBody = this._getUpdateHistoryRequest(taskResult, DeploymentID, customMessage); + return await this._appServiceKuduService.updateDeployment(requestBody); + } + catch(error) { + tl.warning(error); + } + } + + public async runPostDeploymentScript(taskParams: TaskParameters, directoryPath?: string): Promise { + var uniqueID = this.getDeploymentID(); + let vstsPostDeploymentFolderPath: string = path.join(physicalRootPath.substring(1), '..', 'VSTS_PostDeployment_' + uniqueID); + try { + var rootDirectoryPath = directoryPath || physicalRootPath.substring(1); + + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, true); + } + + var scriptFile = this._getPostDeploymentScript(taskParams.ScriptType, taskParams.InlineScript, taskParams.ScriptPath, taskParams.isLinuxApp); + var fileExtension : string = taskParams.isLinuxApp ? '.sh' : '.cmd'; + var mainCmdFilePath = path.join(__dirname, '..', 'postDeploymentScript', 'mainCmdFile' + fileExtension); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'mainCmdFile' + fileExtension, mainCmdFilePath); + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'kuduPostDeploymentScript' + fileExtension, scriptFile.filePath); + console.log(tl.loc('ExecuteScriptOnKudu')); + var cmdFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\mainCmdFile' + fileExtension; + var scriprResultPath = '/site/VSTS_PostDeployment_' + uniqueID; + if (taskParams.isLinuxApp){ + cmdFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/mainCmdFile' + fileExtension; + } + await this.runCommand(rootDirectoryPath, cmdFilePath + ' ' + uniqueID, 30, scriprResultPath, 'script_result.txt'); + await this._printPostDeploymentLogs(vstsPostDeploymentFolderPath); + + } + catch(error) { + if(taskParams.UseWebDeploy && taskParams.DeploymentType === DeploymentType.runFromZip) { + var debugMode = tl.getVariable('system.debug'); + if(debugMode && debugMode.toLowerCase() == 'true') { + tl.warning(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + else { + console.log(tl.loc('Publishusingrunfromzipwithpostdeploymentscript')); + } + } + throw Error(tl.loc('FailedToRunScriptOnKuduError', error)); + } + finally { + try { + let deleteFilePath = '%Home%\\site\\VSTS_PostDeployment_' + uniqueID + '\\delete_log_file' + fileExtension; + if(taskParams.isLinuxApp) { + deleteFilePath = '/home/site/VSTS_PostDeployment_' + uniqueID + '/delete_log_file' + fileExtension; + } + + await this._appServiceKuduService.uploadFile(vstsPostDeploymentFolderPath, 'delete_log_file' + fileExtension, path.join(__dirname, '..', 'postDeploymentScript', 'deleteLogFile' + fileExtension)); + await this.runCommand(vstsPostDeploymentFolderPath, deleteFilePath); + await this._appServiceKuduService.deleteFolder(vstsPostDeploymentFolderPath); + } + catch(error) { + tl.debug('Unable to delete log files : ' + error); + } + if(taskParams.TakeAppOfflineFlag) { + await this._appOfflineKuduService(rootDirectoryPath, false); + } + } + } + + public getDeploymentID(): string { + if(this._deploymentID) { + return this._deploymentID; + } + + var buildUrl = tl.getVariable('build.buildUri'); + var releaseUrl = tl.getVariable('release.releaseUri'); + + var buildId = tl.getVariable('build.buildId'); + var releaseId = tl.getVariable('release.releaseId'); + + var buildNumber = tl.getVariable('build.buildNumber'); + var releaseName = tl.getVariable('release.releaseName'); + + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + + var commitId = tl.getVariable('build.sourceVersion'); + var repoName = tl.getVariable('build.repository.name'); + var repoProvider = tl.getVariable('build.repository.provider'); + + var buildOrReleaseUrl = "" ; + var deploymentID: string = (releaseId ? releaseId : buildId) + Date.now().toString(); + + return deploymentID; + } + + public async deployWebPackage(packagePath: string, physicalPath: string, virtualPath: string, appOffline?: boolean): Promise { + physicalPath = physicalPath ? physicalPath : physicalRootPath; + try { + if(appOffline) { + await this._appOfflineKuduService(physicalPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if(tl.stats(packagePath).isDirectory()) { + let tempPackagePath = deployUtility.generateTemporaryFolderOrZipPath(tl.getVariable('AGENT.TEMPDIRECTORY'), false); + packagePath = await zipUtility.archiveFolder(packagePath, "", tempPackagePath); + tl.debug("Compressed folder " + packagePath + " into zip : " + packagePath); + } + else if(packagePath.toLowerCase().endsWith('.war')) { + physicalPath = await this._warFileDeployment(packagePath, physicalPath, virtualPath); + } + + await this._appServiceKuduService.extractZIP(packagePath, physicalPath); + if(appOffline) { + await this._appOfflineKuduService(physicalPath, false); + } + + console.log(tl.loc("Successfullydeployedpackageusingkuduserviceat", packagePath, physicalPath)); + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingZipDeploy(packagePath: string, appOffline?: boolean, customMessage?: any, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + let queryParameters: Array = [ + 'isAsync=true', + 'deployer=' + VSTS_ZIP_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.zipDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingOneDeploy(packagePath: string, isClean: boolean, appOffline?: boolean, customMessage?: any, packageType?:string, addChecksumHeader?: boolean): Promise { + try { + console.log(tl.loc('PackageDeploymentInitiatedWithOneDeploy')); + + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, true); + tl.debug('Wait for 5 seconds for app_offline to take effect'); + await webClient.sleepFor(5); + } + + if (!packageType){ + tl.debug('No package type provided. Defaulting to zip package type'); + packageType = PackageType[PackageType.zip]; + } + + let queryParameters: Array = [ + 'async=true', + 'deployer=' + VSTS_ONE_DEPLOY, + 'type=' + packageType, + 'clean=' + isClean + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + + let deploymentDetails = await this._appServiceKuduService.oneDeploy(packagePath, queryParameters, addChecksumHeader); + + await this._processDeploymentResponse(deploymentDetails); + if(appOffline) { + await this._appOfflineKuduService(physicalRootPath, false); + } + + console.log(tl.loc('PackageDeploymentSuccess')); + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingRunFromZip(packagePath: string, customMessage?: any) : Promise { + try { + console.log(tl.loc('PackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'deployer=' + VSTS_DEPLOY + ]; + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + await this._appServiceKuduService.zipDeploy(packagePath, queryParameters); + + console.log(tl.loc('PackageDeploymentSuccess')); + console.log(tl.loc('RunFromPackageAppsetting')); + + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async deployUsingWarDeploy(packagePath: string, customMessage?: any, targetFolderName?: any): Promise { + try { + console.log(tl.loc('WarPackageDeploymentInitiated')); + + let queryParameters: Array = [ + 'isAsync=true' + ]; + + if(targetFolderName) { + queryParameters.push('name=' + encodeURIComponent(targetFolderName)); + } + + var deploymentMessage = this._getUpdateHistoryRequest(true, null, customMessage).message; + + queryParameters.push('message=' + encodeURIComponent(deploymentMessage)); + let deploymentDetails = await this._appServiceKuduService.warDeploy(packagePath, queryParameters); + await this._processDeploymentResponse(deploymentDetails); + console.log(tl.loc('PackageDeploymentSuccess')); + + return deploymentDetails.id; + } + catch(error) { + tl.error(tl.loc('PackageDeploymentFailed')); + throw Error(error); + } + } + + public async postZipDeployOperation(oldDeploymentID: string, activeDeploymentID: string): Promise { + try { + tl.debug(`ZIP DEPLOY - Performing post zip-deploy operation: ${oldDeploymentID} => ${activeDeploymentID}`); + let manifestFileContent = await this._appServiceKuduService.getFileContent(`${deploymentFolder}/${oldDeploymentID}`, manifestFileName); + if(!!manifestFileContent) { + let tempManifestFile: string = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), manifestFileName); + tl.writeFile(tempManifestFile, manifestFileContent); + await this._appServiceKuduService.uploadFile(`${deploymentFolder}/${activeDeploymentID}`, manifestFileName, tempManifestFile); + } + tl.debug('ZIP DEPLOY - Performed post-zipdeploy operation.'); + } + catch(error) { + tl.debug(`Failed to execute post zip-deploy operation: ${JSON.stringify(error)}.`); + } + } + + public async warmpUp() { + try { + + tl.debug('warming up Kudu Service'); + await this._appServiceKuduService.getAppSettings(); + tl.debug('warmed up Kudu Service'); + + } + catch(error) { + tl.debug('Failed to warm-up Kudu: ' + error.toString()); + } + } + + private async _processDeploymentResponse(deploymentDetails: any): Promise { + try { + var kuduDeploymentDetails = await this._appServiceKuduService.getDeploymentDetails(deploymentDetails.id); + tl.debug(`logs from kudu deploy: ${kuduDeploymentDetails.log_url}`); + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED || tl.getVariable('system.debug') && tl.getVariable('system.debug').toLowerCase() == 'true') { + await this._printZipDeployLogs(kuduDeploymentDetails.log_url); + } + else { + console.log(tl.loc('DeployLogsURL', kuduDeploymentDetails.log_url)); + } + } + catch(error) { + tl.debug(`Unable to fetch logs for kudu Deploy: ${JSON.stringify(error)}`); + } + + if(deploymentDetails.status == KUDU_DEPLOYMENT_CONSTANTS.FAILED) { + throw tl.loc('PackageDeploymentUsingZipDeployFailed'); + } + } + + private async _printZipDeployLogs(log_url: string): Promise { + if(!log_url) { + return; + } + + var deploymentLogs = await this._appServiceKuduService.getDeploymentLogs(log_url); + for(var deploymentLog of deploymentLogs) { + console.log(`${deploymentLog.message}`); + + if(deploymentLog.details_url) { + await this._printZipDeployLogs(deploymentLog.details_url); + } + } + } + + private async _printPostDeploymentLogs(physicalPath: string) : Promise { + var stdoutLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stdout.txt'); + var stderrLog = await this._appServiceKuduService.getFileContent(physicalPath, 'stderr.txt'); + var scriptReturnCode = await this._appServiceKuduService.getFileContent(physicalPath, 'script_result.txt'); + + if(scriptReturnCode == null) { + throw new Error('File not found in Kudu Service. ' + 'script_result.txt'); + } + + if(stdoutLog) { + console.log(tl.loc('stdoutFromScript')); + console.log(stdoutLog); + } + if(stderrLog) { + console.log(tl.loc('stderrFromScript')); + if(scriptReturnCode != '0') { + tl.error(stderrLog); + throw Error(tl.loc('ScriptExecutionOnKuduFailed', scriptReturnCode, stderrLog)); + } + else { + console.log(stderrLog); + } + } + } + + private async runCommand(physicalPath: string, command: string, timeOutInMinutes?: number, pollFolderPath?: string, pollFile?: string): Promise { + try { + await this._appServiceKuduService.runCommand(physicalPath, command); + } + catch(error) { + if(!!pollFolderPath && !!pollFile && timeOutInMinutes > 0 && error.toString().indexOf('Request timeout: /api/command') != -1) { + tl.debug('Request timeout occurs. Trying to poll for file: ' + pollFile); + await this._pollForFile(pollFolderPath, pollFile, timeOutInMinutes); + } + else { + if(typeof error.valueOf() == 'string') { + throw error; + } + + throw `${error.statusCode} - ${error.statusMessage}`; + } + } + } + + private _getPostDeploymentScript(scriptType, inlineScript, scriptPath, isLinux): any { + if(scriptType === 'Inline Script') { + tl.debug('creating kuduPostDeploymentScript_local file'); + var scriptFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), isLinux ? 'kuduPostDeploymentScript_local.sh' : 'kuduPostDeploymentScript_local.cmd'); + tl.writeFile(scriptFilePath, inlineScript); + tl.debug('Created temporary script file : ' + scriptFilePath); + return { + "filePath": scriptFilePath, + "isCreated": true + }; + } + if(!tl.exist(scriptPath)) { + throw Error(tl.loc('ScriptFileNotFound', scriptPath)); + } + var scriptExtension = path.extname(scriptPath); + if(isLinux){ + if(scriptExtension != '.sh'){ + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } else { + if(scriptExtension != '.bat' && scriptExtension != '.cmd') { + throw Error(tl.loc('InvalidScriptFile', scriptPath)); + } + } + tl.debug('postDeployment script path to execute : ' + scriptPath); + return { + filePath: scriptPath, + isCreated: false + } + } + + private async _warFileDeployment(packagePath: string, physicalPath: string, virtualPath?: string): Promise { + tl.debug('WAR: webAppPackage = ' + packagePath); + let warFile = path.basename(packagePath.slice(0, packagePath.length - '.war'.length)); + let warExt = packagePath.slice(packagePath.length - '.war'.length) + tl.debug('WAR: warFile = ' + warFile); + warFile = warFile + ((virtualPath) ? "/" + virtualPath : ""); + tl.debug('WAR: warFile = ' + warFile); + physicalPath = physicalPath + "/webapps/" + warFile; + await this.createPathIfRequired(physicalPath); + return physicalPath; + + } + + private async _appOfflineKuduService(physicalPath: string, enableFeature: boolean): Promise { + if(enableFeature) { + tl.debug('Trying to enable app offline mode.'); + var appOfflineFilePath = path.join(tl.getVariable('AGENT.TEMPDIRECTORY'), 'app_offline_temp.htm'); + tl.writeFile(appOfflineFilePath, '

App Service is offline.

'); + await this._appServiceKuduService.uploadFile(physicalPath, 'app_offline.htm', appOfflineFilePath); + tl.debug('App Offline mode enabled.'); + } + else { + tl.debug('Trying to disable app offline mode.'); + await this._appServiceKuduService.deleteFile(physicalPath, 'app_offline.htm'); + tl.debug('App Offline mode disabled.'); + } + } + + private async _pollForFile(physicalPath: string, fileName: string, timeOutInMinutes: number): Promise { + var attempts: number = 0; + const retryInterval: number = 10; + if(tl.getVariable('appservicedeploy.retrytimeout')) { + timeOutInMinutes = Number(tl.getVariable('appservicedeploy.retrytimeout')); + tl.debug('Retry timeout in minutes provided by user: ' + timeOutInMinutes); + } + + var timeOutInSeconds = timeOutInMinutes * 60; + var noOfRetry = timeOutInSeconds / retryInterval; + + tl.debug(`Polling started for file: ${fileName} with retry count: ${noOfRetry}`); + + while (attempts < noOfRetry) { + attempts += 1; + var fileContent: string = await this._appServiceKuduService.getFileContent(physicalPath, fileName); + if(fileContent == null) { + tl.debug('File: ' + fileName + ' not found. retry after 5 seconds. Attempt: ' + attempts); + await webClient.sleepFor(5); + } + else { + tl.debug('Found file: ' + fileName); + return ; + } + } + + if(attempts == noOfRetry) { + throw new Error(tl.loc('PollingForFileTimeOut')); + } + } + + private _getUpdateHistoryRequest(isDeploymentSuccess: boolean, deploymentID?: string, customMessage?: any): any { + + var artifactAlias = tl.getVariable(AzureDeployPackageArtifactAlias); + var status = isDeploymentSuccess ? KUDU_DEPLOYMENT_CONSTANTS.SUCCESS : KUDU_DEPLOYMENT_CONSTANTS.FAILED; + var releaseId = tl.getVariable('release.releaseId'); + var releaseName = tl.getVariable('release.releaseName'); + var collectionUrl = tl.getVariable('system.TeamFoundationCollectionUri'); + var teamProject = tl.getVariable('system.teamProjectId'); + let buildId = '', buildNumber = '', buildProject = '', commitId = '', repoProvider = '', repoName = '', branch = '', repositoryUrl = '', author = ''; + + if (releaseId && artifactAlias) { + // Task is running in release determine build information of selected artifact using artifactAlias + author = tl.getVariable('release.requestedfor') || tl.getVariable('agent.name'); + tl.debug(`Artifact Source Alias is: ${artifactAlias}`); + + commitId = tl.getVariable(`release.artifacts.${artifactAlias}.sourceVersion`); + repoProvider = tl.getVariable(`release.artifacts.${artifactAlias}.repository.provider`); + repoName = tl.getVariable(`release.artifacts.${artifactAlias}.repository.name`); + branch = tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranchname`) || tl.getVariable(`release.artifacts.${artifactAlias}.sourcebranch`); + + let artifactType = tl.getVariable(`release.artifacts.${artifactAlias}.type`); + if (artifactType && artifactType.toLowerCase() == "tfvc") { + repositoryUrl = `${collectionUrl}${buildProject}/_versionControl`; + repoProvider = "tfsversioncontrol"; + } + else if(artifactType && artifactType.toLowerCase() == "build") { + buildId = tl.getVariable(`release.artifacts.${artifactAlias}.buildId`); + buildNumber = tl.getVariable(`release.artifacts.${artifactAlias}.buildNumber`); + buildProject = tl.getVariable(`release.artifacts.${artifactAlias}.projectId`); + } + else { + repositoryUrl = tl.getVariable(`release.artifacts.${artifactAlias}.repository.uri`); + } + } + else { + // Task is running in build OR artifact alias not found so use primary artifact variables + author = tl.getVariable('build.requestedfor') || tl.getVariable('agent.name'); + + buildId = tl.getVariable('build.buildId'); + buildNumber = tl.getVariable('build.buildNumber'); + buildProject = teamProject; + + commitId = tl.getVariable('build.sourceVersion'); + repoName = tl.getVariable('build.repository.name'); + repoProvider = tl.getVariable('build.repository.provider'); + repositoryUrl = tl.getVariable("build.repository.uri") || ""; + branch = tl.getVariable("build.sourcebranchname") || tl.getVariable("build.sourcebranch"); + } + + deploymentID = !!deploymentID ? deploymentID : this.getDeploymentID(); + + var message = { + type : "deployment", + commitId : commitId, + buildId : buildId, + releaseId : releaseId, + buildNumber : buildNumber, + releaseName : releaseName, + repoProvider : repoProvider, + repoName : repoName, + collectionUrl : collectionUrl, + teamProject : teamProject, + buildProjectUrl: buildProject ? collectionUrl + buildProject : "", + repositoryUrl: repositoryUrl, + branch: branch, + teamProjectName: tl.getVariable("system.teamproject") + }; + + if(!!customMessage) { + // Append Custom Messages to original message + for(var attribute in customMessage) { + message[attribute] = customMessage[attribute]; + } + + } + var deploymentLogType: string = message['type']; + var active: boolean = false; + if(deploymentLogType.toLowerCase() === "deployment" && isDeploymentSuccess) { + active = true; + } + + return { + id: deploymentID, + active : active, + status : status, + message : JSON.stringify(message), + author : author, + deployer : 'VSTS' + }; + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/PublishProfileUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/PublishProfileUtility.ts new file mode 100644 index 000000000000..147ab48de5e3 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/PublishProfileUtility.ts @@ -0,0 +1,123 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters } from './TaskParameters'; +import fs = require('fs'); +import * as Constant from './Constants'; +import path = require('path'); +import Q = require('q'); + +var packageUtility = require('azure-pipelines-tasks-webdeployment-common/packageUtility.js'); +var parseString = require('xml2js').parseString; +const ERROR_FILE_NAME = "error.txt"; + +export interface PublishingProfile{ + PublishUrl:string; + UserName: string; + UserPWD: string; + WebAppName: string; + TakeAppOfflineFlag: boolean; + RemoveAdditionalFilesFlag: boolean; +} + +export class PublishProfileUtility { + + private _publishProfileJs: any = null; + private _publishProfilePath: string; + + constructor(publishProfilePath: string) { + this._publishProfilePath = publishProfilePath; + } + + public async GetTaskParametersFromPublishProfileFile(taskParams: TaskParameters): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + var msDeployPublishingProfile: PublishingProfile = { + WebAppName: this._publishProfileJs.DeployIisAppPath[0], + TakeAppOfflineFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.EnableMSDeployAppOffline) ? + this._publishProfileJs.EnableMSDeployAppOffline[0] : false, + RemoveAdditionalFilesFlag: this._publishProfileJs.hasOwnProperty(Constant.PublishProfileXml.SkipExtraFilesOnServer) ? + this._publishProfileJs.SkipExtraFilesOnServer[0] : false, + PublishUrl: this._publishProfileJs.MSDeployServiceURL[0], + UserName: this._publishProfileJs.UserName[0], + UserPWD: taskParams.PublishProfilePassword + } + return msDeployPublishingProfile; + } + + public async GetPropertyValuefromPublishProfile(propertyKey: string): Promise { + try { + if(this._publishProfileJs === null) { + this._publishProfileJs = await this.GetPublishProfileJsonFromFile(); + } + } catch(error) { + throw new Error(error); + } + return new Promise ((response, reject) => { + this._publishProfileJs.hasOwnProperty(propertyKey) ? + response(this._publishProfileJs[propertyKey][0]) : reject(tl.loc('PropertyDoesntExistPublishProfile', propertyKey)); + }); + } + + private async GetPublishProfileJsonFromFile(): Promise { + return new Promise((response, reject) => { + var pubxmlFile = packageUtility.PackageUtility.getPackagePath(this._publishProfilePath); + var publishProfileXML = fs.readFileSync(pubxmlFile); + parseString(publishProfileXML, (error, result) => { + if(!!error) { + reject(tl.loc('XmlParsingFailed', error)); + } + var propertyGroup = result && result.Project && result.Project.PropertyGroup ? result.Project.PropertyGroup : null; + if(propertyGroup) { + for (var index in propertyGroup) { + if (propertyGroup[index] && propertyGroup[index].WebPublishMethod[0] === Constant.PublishProfileXml.MSDeploy) { + if(!propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.MSDeployServiceURL) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.DeployIisAppPath) + || !propertyGroup[index].hasOwnProperty(Constant.PublishProfileXml.UserName)) { + reject(tl.loc('InvalidPublishProfile')); + } + tl.debug("Publish Profile: " + JSON.stringify(propertyGroup[index])); + response(propertyGroup[index]); + } + } + } + reject(tl.loc('ErrorNoSuchDeployingMethodExists')); + }); + }); + } + + public async RunCmd(cmdTool: string, cmdArgs: string) { + var deferred = Q.defer(); + var cmdError = null; + var errorFile = path.join(tl.getVariable('System.DefaultWorkingDirectory'), ERROR_FILE_NAME); + var errObj = fs.createWriteStream(errorFile); + errObj.on('finish', () => { + if(cmdError) { + deferred.reject(cmdError); + } else { + deferred.resolve(); + } + }); + + try { + await tl.exec(cmdTool, cmdArgs, { + errStream: errObj, + outStream: process.stdout, + failOnStdErr: true, + windowsVerbatimArguments: true, + // shell should be true, otherwise see https://github.com/microsoft/azure-pipelines-tasks/issues/17634 + // workaround https://github.com/nodejs/node/issues/7367#issuecomment-229728704 + shell: true + }); + } catch (error) { + cmdError = error; + } finally { + errObj.end(); + } + + return deferred.promise; + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ReleaseAnnotationUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ReleaseAnnotationUtility.ts new file mode 100644 index 000000000000..1ed0aef6bcaf --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/ReleaseAnnotationUtility.ts @@ -0,0 +1,93 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAppService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-app-service'; +import { AzureApplicationInsights, ApplicationInsightsResources} from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-appinsights'; +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +var uuidV4 = require("uuid/v4"); + +export async function addReleaseAnnotation(endpoint: AzureEndpoint, azureAppService: AzureAppService, isDeploymentSuccess: boolean): Promise { + try { + var appSettings = await azureAppService.getApplicationSettings(); + var instrumentationKey = appSettings && appSettings.properties && appSettings.properties.APPINSIGHTS_INSTRUMENTATIONKEY; + if(instrumentationKey) { + let appinsightsResources: ApplicationInsightsResources = new ApplicationInsightsResources(endpoint); + var appInsightsResources = await appinsightsResources.list(null, [`$filter=InstrumentationKey eq '${instrumentationKey}'`]); + if(appInsightsResources.length > 0) { + var appInsights: AzureApplicationInsights = new AzureApplicationInsights(endpoint, appInsightsResources[0].id.split('/')[4], appInsightsResources[0].name); + var releaseAnnotationData = getReleaseAnnotation(isDeploymentSuccess); + await appInsights.addReleaseAnnotation(releaseAnnotationData); + console.log(tl.loc("SuccessfullyAddedReleaseAnnotation", appInsightsResources[0].name)); + } + else { + tl.debug(`Unable to find Application Insights resource with Instrumentation key ${instrumentationKey}. Skipping adding release annotation.`); + } + } + else { + tl.debug(`Application Insights is not configured for the App Service. Skipping adding release annotation.`); + } + } + catch(error) { + console.log(tl.loc("FailedAddingReleaseAnnotation", error)); + } +} + +function getReleaseAnnotation(isDeploymentSuccess: boolean): {[key: string]: any} { + let annotationName = "Release Annotation"; + let releaseUri = tl.getVariable("Release.ReleaseUri"); + let buildUri = tl.getVariable("Build.BuildUri"); + + if (!!releaseUri) { + annotationName = `${tl.getVariable("Release.DefinitionName")} - ${tl.getVariable("Release.ReleaseName")}`; + } + else if (!!buildUri) { + annotationName = `${tl.getVariable("Build.DefinitionName")} - ${tl.getVariable("Build.BuildNumber")}`; + } + + let releaseAnnotationProperties = { + "Label": isDeploymentSuccess ? "Success" : "Error", // Label decides the icon for release annotation + "Deployment Uri": getDeploymentUri(), + "BuildNumber": getPipelineVariable("Build.BuildNumber"), + "BuildRepositoryName": getPipelineVariable("Build.Repository.Name"), + "BuildRepositoryProvider": getPipelineVariable("Build.Repository.Provider"), + "SourceBranch": getPipelineVariable("Build.SourceBranch"), + "ReleaseId": getPipelineVariable("Release.ReleaseId"), + "ReleaseDescription": getPipelineVariable("Release.ReleaseDescription"), + "ReleaseDefinitionName": getPipelineVariable("Release.DefinitionName"), + "ReleaseEnvironmentName": getPipelineVariable("Release.EnvironmentName"), + "ReleaseRequestedFor": getPipelineVariable("Release.RequestedForId") || getPipelineVariable("Release.RequestedFor") + }; + + let releaseAnnotation = { + "AnnotationName": annotationName, + "Category": "Deployment", + "EventTime": new Date(), + "Id": uuidV4(), + "Properties": JSON.stringify(releaseAnnotationProperties) + }; + + return releaseAnnotation; +} + +function getDeploymentUri(): string { + let buildUri = tl.getVariable("Build.BuildUri"); + let releaseWebUrl = tl.getVariable("Release.ReleaseWebUrl"); + let collectionUrl = tl.getVariable('System.TeamFoundationCollectionUri'); + let teamProject = tl.getVariable('System.TeamProjectId'); + let buildId = tl.getVariable('build.buildId'); + + if (!!releaseWebUrl) { + return releaseWebUrl; + } + + if (!!buildUri) { + return `${collectionUrl}${teamProject}/_build?buildId=${buildId}&_a=summary`; + } + + return ""; +} + +function getPipelineVariable(variableName: string): string | undefined { + let variable = tl.getVariable(variableName); + //we dont want to set a variable to be empty string + return !!variable ? variable : undefined; +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/TaskParameters.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/TaskParameters.ts new file mode 100644 index 000000000000..a0efa0c2f176 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/TaskParameters.ts @@ -0,0 +1,313 @@ +import tl = require('azure-pipelines-task-lib/task'); +import * as Constant from '../operations/Constants' +import { Package, PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +var webCommonUtility = require('azure-pipelines-tasks-webdeployment-common/utility.js'); + +export enum DeploymentType { + webDeploy, + zipDeploy, + runFromZip, + warDeploy +} + +export enum DeploymentTypeLinux { + oneDeploy, + zipDeploy +} + +type AdditionalArgumentsTelemetry = { + deploymentMethod: DeploymentType; + doubleQuoteCount: number; + singleQuoteCount: number; + escapeCharCount: number; + spaceCharCount: number; + totalArgs: number; +} +export class TaskParametersUtility { + public static getParameters(): TaskParameters { + var taskParameters: TaskParameters = { + ConnectionType: tl.getInput('ConnectionType', true), + WebAppKind: tl.getInput('WebAppKind', false), + DeployToSlotOrASEFlag: tl.getBoolInput('DeployToSlotOrASEFlag', false), + GenerateWebConfig: tl.getBoolInput('GenerateWebConfig', false), + WebConfigParameters: tl.getInput('WebConfigParameters', false), + XmlTransformation: tl.getBoolInput('XmlTransformation', false), + JSONFiles: tl.getDelimitedInput('JSONFiles', '\n', false), + XmlVariableSubstitution: tl.getBoolInput('XmlVariableSubstitution', false), + TakeAppOfflineFlag: tl.getBoolInput('TakeAppOfflineFlag', false), + RenameFilesFlag: tl.getBoolInput('RenameFilesFlag', false), + AdditionalArguments: tl.getInput('AdditionalArguments', false), + ScriptType: tl.getInput('ScriptType', false), + InlineScript: tl.getInput('InlineScript', false), + ScriptPath : tl.getPathInput('ScriptPath', false), + DockerNamespace: tl.getInput('DockerNamespace', false), + AppSettings: tl.getInput('AppSettings', false), + StartupCommand: tl.getInput('StartupCommand', false), + ConfigurationSettings: tl.getInput('ConfigurationSettings', false) + } + + if(taskParameters.ConnectionType === Constant.ConnectionType.PublishProfile) { + this._initializeDefaultParametersForPublishProfile(taskParameters); + return taskParameters; + } + + taskParameters.connectedServiceName = tl.getInput('ConnectedServiceName', true); + taskParameters.WebAppName = tl.getInput('WebAppName', true); + taskParameters.isFunctionApp = taskParameters.WebAppKind.indexOf("function") != -1; + taskParameters.isLinuxApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.indexOf("Linux") !=-1 || taskParameters.WebAppKind.indexOf("Container") != -1); + taskParameters.isHyperVContainerApp = taskParameters.WebAppKind && (taskParameters.WebAppKind.toLowerCase().indexOf("hyperv") !=-1 && taskParameters.WebAppKind.toLowerCase().indexOf("container") != -1); + taskParameters.isBuiltinLinuxWebApp = taskParameters.WebAppKind.indexOf('Linux') != -1; + taskParameters.isContainerWebApp =taskParameters.WebAppKind.indexOf('Container') != -1; + taskParameters.ResourceGroupName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('ResourceGroupName', false) : null; + taskParameters.SlotName = taskParameters.DeployToSlotOrASEFlag ? tl.getInput('SlotName', false) : null; + + var endpointTelemetry = '{"endpointId":"' + taskParameters.connectedServiceName + '"}'; + console.log("##vso[telemetry.publish area=TaskEndpointId;feature=AzureRmWebAppDeployment]" + endpointTelemetry); + + if(!taskParameters.isContainerWebApp){ + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + tl.debug("intially web config parameters :" + taskParameters.WebConfigParameters); + if(taskParameters.Package.getPackageType() === PackageType.jar && (!taskParameters.isLinuxApp)) { + if(!taskParameters.WebConfigParameters) { + taskParameters.WebConfigParameters = "-appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-appType java_springboot") < 0) { + taskParameters.WebConfigParameters += " -appType java_springboot"; + } + if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH D:\\home\\site\\wwwroot\\*.jar") >= 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("D:\\home\\site\\wwwroot\\*.jar", jarPath); + } else if(taskParameters.WebConfigParameters.indexOf("-JAR_PATH ") < 0) { + var jarPath = webCommonUtility.getFileNameFromPath(taskParameters.Package.getPath()); + taskParameters.WebConfigParameters += " -JAR_PATH " + jarPath; + } + if(taskParameters.WebConfigParameters.indexOf("-Dserver.port=%HTTP_PLATFORM_PORT%") > 0) { + taskParameters.WebConfigParameters = taskParameters.WebConfigParameters.replace("-Dserver.port=%HTTP_PLATFORM_PORT%", ""); + } + tl.debug("web config parameters :" + taskParameters.WebConfigParameters); + } + } + + taskParameters.UseWebDeploy = !taskParameters.isLinuxApp ? tl.getBoolInput('UseWebDeploy', false) : false; + + if(taskParameters.isLinuxApp && taskParameters.isBuiltinLinuxWebApp) { + if(taskParameters.isFunctionApp) { + taskParameters.RuntimeStack = tl.getInput('RuntimeStackFunction', false); + } + else { + taskParameters.RuntimeStack = tl.getInput('RuntimeStack', false); + } + taskParameters.TakeAppOfflineFlag = false; + } + if (!taskParameters.isFunctionApp && !taskParameters.isLinuxApp) { + taskParameters.VirtualApplication = tl.getInput('VirtualApplication', false); + taskParameters.VirtualApplication = taskParameters.VirtualApplication && taskParameters.VirtualApplication.startsWith('/') + ? taskParameters.VirtualApplication.substr(1) : taskParameters.VirtualApplication; + } + + if(taskParameters.UseWebDeploy) { + taskParameters.DeploymentType = this.getDeploymentType(tl.getInput('DeploymentType', false)); + if(taskParameters.DeploymentType == DeploymentType.webDeploy) { + taskParameters.RemoveAdditionalFilesFlag = tl.getBoolInput('RemoveAdditionalFilesFlag', false); + taskParameters.SetParametersFile = tl.getPathInput('SetParametersFile', false); + taskParameters.ExcludeFilesFromAppDataFlag = tl.getBoolInput('ExcludeFilesFromAppDataFlag', false) + taskParameters.AdditionalArguments = tl.getInput('AdditionalArguments', false) || ''; + } + } + else if(taskParameters.isLinuxApp) { + taskParameters.DeploymentTypeLinux = this.getDeploymentTypeLinux(tl.getInput('DeploymentTypeLinux', false)); + taskParameters.CleanDeploymentFlag = tl.getBoolInput('CleanDeploymentFlag', false); + } + else { + // Retry Attempt is passed by default + taskParameters.AdditionalArguments = '-retryAttempts:6 -retryInterval:10000'; + } + if (taskParameters.DeploymentType === DeploymentType.runFromZip) { + taskParameters.TakeAppOfflineFlag = false; + } + + if(taskParameters.isLinuxApp && taskParameters.ScriptType) { + this.UpdateLinuxAppTypeScriptParameters(taskParameters); + } + + try { + var additionalArgsTelemetry = this._getAdditionalArgumentsTelemetry(taskParameters.AdditionalArguments, taskParameters.DeploymentType); + console.log("##vso[telemetry.publish area=AdditionalArgumentsVerification;feature=AzureRmWebAppDeployment]" + JSON.stringify(additionalArgsTelemetry)); + } catch (error) { + // Ignore errors in telemetry + }; + + return taskParameters; + } + + private static _initializeDefaultParametersForPublishProfile(taskParameters: TaskParameters): void { + taskParameters.PublishProfilePath = tl.getInput('PublishProfilePath', true); + taskParameters.PublishProfilePassword = tl.getInput('PublishProfilePassword', true); + taskParameters.Package = new Package(tl.getPathInput('Package', true)); + taskParameters.AdditionalArguments = "-retryAttempts:6 -retryInterval:10000"; + } + + private static UpdateLinuxAppTypeScriptParameters(taskParameters: TaskParameters) { + let retryTimeoutValue = tl.getVariable('appservicedeploy.retrytimeout'); + let timeoutAppSettings = retryTimeoutValue ? Number(retryTimeoutValue) * 60 : 1800; + + tl.debug(`setting app setting SCM_COMMAND_IDLE_TIMEOUT to ${timeoutAppSettings}`); + if(taskParameters.AppSettings) { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings} ` + taskParameters.AppSettings; + } + else { + taskParameters.AppSettings = `-SCM_COMMAND_IDLE_TIMEOUT ${timeoutAppSettings}`; + } + } + + private static getDeploymentType(type): DeploymentType { + switch(type) { + case "webDeploy": return DeploymentType.webDeploy; + case "zipDeploy": return DeploymentType.zipDeploy; + case "runFromZip": return DeploymentType.runFromZip; + case "warDeploy": return DeploymentType.warDeploy; + } + } + + private static getDeploymentTypeLinux(type): DeploymentTypeLinux { + switch(type) { + case "oneDeploy": return DeploymentTypeLinux.oneDeploy; + case "zipDeploy": return DeploymentTypeLinux.zipDeploy; + } + } + + private static _getAdditionalArgumentsTelemetry(additionalArguments: string, deploymentType: DeploymentType): AdditionalArgumentsTelemetry { + const telemetry = { + deploymentMethod: deploymentType, + doubleQuoteCount: 0, + singleQuoteCount: 0, + escapeCharCount: 0, + spaceCharCount: 0, + totalArgs: 0 + } + + if (!additionalArguments) return telemetry; + + const parsedArgs = this.parseAdditionalArguments(additionalArguments); + const escapedChars = new RegExp(/[\\\^\.\*\?\-\&\|\(\)\<\>\t\n\r\f]/); + const separator = ","; + + parsedArgs.forEach(function (arg) { + let formattedArg = ''; + let equalsSignEncountered = false; + for (let i = 0; i < arg.length; i++) { + const char = arg.charAt(i); + if (char == separator && equalsSignEncountered) { + equalsSignEncountered = false; + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + telemetry.totalArgs++; + formattedArg = ''; + continue; + } + if (equalsSignEncountered) { + formattedArg += char; + } + if (char == '=') { + equalsSignEncountered = true; + } + }; + + if (formattedArg.length > 0) { + if (formattedArg.startsWith('"') && formattedArg.endsWith('"')) telemetry.doubleQuoteCount++; + if (formattedArg.startsWith("'") && formattedArg.endsWith("'")) telemetry.singleQuoteCount++; + if (escapedChars.test(formattedArg)) telemetry.escapeCharCount++; + if (/\s+/.test(formattedArg)) telemetry.spaceCharCount++; + + + telemetry.totalArgs++;; + } + }); + + return telemetry; + } + + /** + * Parses additional arguments for the msdeploy command-line utility. + * @param {string} additionalArguments - The additional arguments to parse. + * @returns {string[]} An array of parsed arguments. + */ + private static parseAdditionalArguments(additionalArguments: string): string[] { + var parsedArgs = []; + var isInsideQuotes = false; + for (let i = 0; i < additionalArguments.length; i++) { + var arg = ''; + var qouteSymbol = ''; + let char = additionalArguments.charAt(i); + // command parse start + if (char === '-') { + while (i < additionalArguments.length) { + char = additionalArguments.charAt(i); + const prevSym = additionalArguments.charAt(i - 1); + // If we reach space and we are not inside quotes, then it is the end of the argument + if (char === ' ' && !isInsideQuotes) break; + // If we reach unescaped comma and we inside qoutes we assume that it is the end of quoted line + if (isInsideQuotes && char === qouteSymbol && prevSym !== '\\') { + isInsideQuotes = false; + qouteSymbol = ''; + // If we reach unescaped comma and we are not inside qoutes we assume that it is the beggining of quoted line + } else if (!isInsideQuotes && (char === '"' || char === "'") && prevSym !== '\\') { + isInsideQuotes = !isInsideQuotes; + qouteSymbol = char; + } + + arg += char; + i += 1; + } + parsedArgs.push(arg); + } + } + return parsedArgs; + } +} + +export interface TaskParameters { + ConnectionType: string; + connectedServiceName?: string; + PublishProfilePath?: string; + PublishProfilePassword?: string; + WebAppName?: string; + WebAppKind?: string; + DeployToSlotOrASEFlag?: boolean; + ResourceGroupName?: string; + SlotName?: string; + VirtualApplication?: string; + Package?: Package; + GenerateWebConfig?: boolean; + WebConfigParameters?: string; + XmlTransformation?: boolean; + JSONFiles?: string[]; + XmlVariableSubstitution?: boolean; + UseWebDeploy?: boolean; + DeploymentType?: DeploymentType; + DeploymentTypeLinux?: DeploymentTypeLinux; + CleanDeploymentFlag?: boolean; + RemoveAdditionalFilesFlag?: boolean; + SetParametersFile?: string; + ExcludeFilesFromAppDataFlag?: boolean; + TakeAppOfflineFlag?: boolean; + RenameFilesFlag?: boolean; + AdditionalArguments?: string; + ScriptType?: string; + InlineScript?: string; + ScriptPath ?: string; + DockerNamespace?: string; + AppSettings?: string; + StartupCommand?: string; + RuntimeStack?: string; + ConfigurationSettings?: string; + /** Additional parameters */ + isLinuxApp?: boolean; + isHyperVContainerApp?: boolean; + isBuiltinLinuxWebApp?: boolean; + isContainerWebApp?: boolean; + isFunctionApp?: boolean; +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/operations/WebDeployUtility.ts b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/WebDeployUtility.ts new file mode 100644 index 000000000000..00dcbff4683c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/operations/WebDeployUtility.ts @@ -0,0 +1,135 @@ +import tl = require('azure-pipelines-task-lib/task'); + +import { WebDeployArguments, WebDeployResult, shouldUseMSDeployTokenAuth, installedMSDeployVersionSupportsTokenAuth } from 'azure-pipelines-tasks-webdeployment-common/msdeployutility'; +import { executeWebDeploy } from 'azure-pipelines-tasks-webdeployment-common/deployusingmsdeploy'; +import { copySetParamFileIfItExists } from 'azure-pipelines-tasks-webdeployment-common/utility'; + +import { TaskParameters } from './TaskParameters'; +import { AzureAppServiceUtility } from './AzureAppServiceUtility'; + +const DEFAULT_RETRY_COUNT = 3; + +export class WebDeployUtility { + + private readonly _azureAppServiceUtility: AzureAppServiceUtility; + + constructor(azureAppServiceUtility: AzureAppServiceUtility) { + this._azureAppServiceUtility = azureAppServiceUtility; + } + + public async publishUsingWebDeploy(taskParameters: TaskParameters) { + const webDeployArguments = await this.constructWebDeployArguments(taskParameters); + const retryCountParam = tl.getVariable("appservice.msdeployretrycount"); + let retryCount = (retryCountParam && !isNaN(Number(retryCountParam))) ? Number(retryCountParam) : DEFAULT_RETRY_COUNT; + let webDeployResult: WebDeployResult; + + while (retryCount > 0) { + webDeployResult = await executeWebDeploy(webDeployArguments); + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, false); + } + else { + break; + } + + retryCount--; + } + + if (webDeployArguments.setParametersFile) { + try { + tl.rmRF(webDeployArguments.setParametersFile); + } + catch(error) { + tl.debug('unable to delete setparams file: '); + tl.debug(error); + } + } + + if (!webDeployResult.isSuccess) { + await this.webDeployRecommendationForIssue(taskParameters, webDeployResult.errorCode, true); + throw new Error(webDeployResult.error); + } + } + + private async constructWebDeployArguments(taskParameters: TaskParameters): Promise { + const publishProfile = await this._azureAppServiceUtility.getWebDeployPublishingProfile(); + const webDeployArguments = {} as WebDeployArguments; + + if (await this._azureAppServiceUtility.isSitePublishingCredentialsEnabled()) { + tl.debug("Using Basic authentication."); + webDeployArguments.authType = "Basic"; + webDeployArguments.userName = publishProfile.userName; + webDeployArguments.password = publishProfile.userPWD; + } + else if (!shouldUseMSDeployTokenAuth()) { + throw new Error(tl.loc("BasicAuthNotSupported")); + } + else if (await installedMSDeployVersionSupportsTokenAuth() === false) { + throw new Error(tl.loc("MSDeployNotSupportTokenAuth")); + } + else { + tl.debug("Basic authentication is disabled, using token based authentication."); + webDeployArguments.authType = "Bearer"; + webDeployArguments.password = await this._azureAppServiceUtility.getAuthToken(); + webDeployArguments.userName = "user"; // arbitrary but not empty + } + + webDeployArguments.publishUrl = publishProfile.publishUrl; + webDeployArguments.package = taskParameters.Package; + webDeployArguments.additionalArguments = taskParameters.AdditionalArguments; + webDeployArguments.appName = taskParameters.WebAppName; + webDeployArguments.excludeFilesFromAppDataFlag = taskParameters.ExcludeFilesFromAppDataFlag; + webDeployArguments.removeAdditionalFilesFlag = taskParameters.RemoveAdditionalFilesFlag; + webDeployArguments.takeAppOfflineFlag = taskParameters.TakeAppOfflineFlag; + webDeployArguments.useWebDeploy = taskParameters.UseWebDeploy; + webDeployArguments.virtualApplication = taskParameters.VirtualApplication; + + const setParametersFile = copySetParamFileIfItExists(taskParameters.SetParametersFile); + if (setParametersFile) { + webDeployArguments.setParametersFile = setParametersFile.slice(setParametersFile.lastIndexOf('\\') + 1, setParametersFile.length); + } + + return webDeployArguments; + } + + private async webDeployRecommendationForIssue(taskParameters: TaskParameters, errorCode: string, isRecommendation: boolean) { + switch(errorCode) { + case 'ERROR_CONNECTION_TERMINATED': { + if(!isRecommendation) { + await this._azureAppServiceUtility.pingApplication(); + } + break; + } + case 'ERROR_INSUFFICIENT_ACCESS_TO_SITE_FOLDER': { + tl.warning(tl.loc("Trytodeploywebappagainwithappofflineoptionselected")); + break; + } + case 'WebJobsInProgressIssue': { + tl.warning(tl.loc('WebJobsInProgressIssue')); + break; + } + case 'FILE_IN_USE': { + if(!isRecommendation && taskParameters.RenameFilesFlag) { + await this._azureAppServiceUtility.enableRenameLockedFiles(); + } + else { + tl.warning(tl.loc("Trytodeploywebappagainwithrenamefileoptionselected")); + tl.warning(tl.loc("RunFromZipPreventsFileInUseError")); + } + break; + } + case 'transport connection': { + tl.warning(tl.loc("Updatemachinetoenablesecuretlsprotocol")); + break; + } + case 'ERROR_CERTIFICATE_VALIDATION_FAILED': { + if(isRecommendation) { + tl.warning(tl.loc('ASE_WebDeploySSLIssueRecommendation')); + } + break; + } + default: + break; + } + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/package-lock.json b/_generated/AzureRmWebAppDeploymentV5_Node20/package-lock.json new file mode 100644 index 000000000000..034d5482d866 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/package-lock.json @@ -0,0 +1,1438 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } + }, + "node_modules/@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": "sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@types/events": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/events/-/events-3.0.3.tgz", + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==" + }, + "node_modules/@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": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ltx": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/ltx/-/ltx-3.0.6.tgz", + "integrity": "sha512-ZdHUgFEaBVUHI0si050pQkuGzHQC5UU46JsljUUJkGWbsjKeV3RUspJvvdV80Inrnhx8d3JqXw4qCDRX4A/BdA==", + "dependencies": { + "@types/events": "*" + } + }, + "node_modules/@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==" + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/q": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.6", + "resolved": "git+ssh://git@github.com/xmldom/xmldom.git#238b1ea8431fae8817812c68d55b4933248af07e", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/archiver": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha512-5GQRAgpHGPwWIiMzL9lthd+t75fLi8BpRBYtflomSYv2i6+EO9trtwWAm2+zGjIuwKmVmBRknAZFFBSqxYxiJw==", + "dependencies": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-utils": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "dependencies": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/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": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/azure-devops-node-api": { + "version": "14.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-14.0.1.tgz", + "integrity": "sha512-oVnFfTNmergd3JU852EpGY64d1nAxW8lCyzZqFDPhfQVZkdApBeK/ZMN7yoFiq/C50Ru304X1L/+BFblh2SRJw==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^2.0.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "4.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.11.0.tgz", + "integrity": "sha512-svPdgXPmX9j5aLcb+ZmddBsKlkK5TJnlFfgPrDlY8EZAmnR9jLOYiHLLyLph3UO6hoHucsiqvIpH1SBFfH1I8w==", + "dependencies": { + "adm-zip": "^0.5.10", + "deasync": "^0.1.28", + "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" + } + }, + "node_modules/azure-pipelines-task-lib/node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.251.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.251.0.tgz", + "integrity": "sha1-9989r2zWGXLLREIAQHuYci00+EM=", + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-webdeployment-common": { + "version": "4.243.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-pipelines-tasks-webdeployment-common/-/azure-pipelines-tasks-webdeployment-common-4.243.1.tgz", + "integrity": "sha512-FWjNQDguvLmqfKgCYxcevgvid5RJdv3FrqyrAmMfIe0gLOpyp57yjQ6QCaO5GFc3niWV/MgIxadqlnwrq2haUQ==", + "dependencies": { + "@types/ltx": "3.0.6", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@xmldom/xmldom": "git+https://github.com/xmldom/xmldom.git#0.8.6", + "archiver": "1.2.0", + "azure-pipelines-task-lib": "^4.2.0", + "ltx": "2.8.0", + "node-stream-zip": "^1.15.0", + "q": "1.4.1", + "semver": "^7.5.4", + "winreg": "1.2.2", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/@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==" + }, + "node_modules/azure-pipelines-tasks-webdeployment-common/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/compress-commons": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "dependencies": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/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": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/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==" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc32-stream": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "dependencies": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/deasync": { + "version": "0.1.30", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/deasync/-/deasync-0.1.30.tgz", + "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + }, + "engines": { + "node": ">=0.11.0" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/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": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/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": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent/node_modules/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": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/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": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==" + }, + "node_modules/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": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/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": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/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": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/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": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/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": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/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": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/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": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/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": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/ltx": { + "version": "2.8.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-SJJUrmDgXP0gkUzgErfkaeD+pugM8GYxerTALQa1gTUb5W1wrC4k07GZU+QNZd7MpFqJSYWXTQSUy8Ps03hx5Q==", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/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_modules/msalv1": { + "name": "@azure/msal-node", + "version": "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": "sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==", + "deprecated": "A newer major version of this library is available. Please upgrade to the latest available version.", + "dependencies": { + "@azure/msal-common": "13.3.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": "10 || 12 || 14 || 16 || 18" + } + }, + "node_modules/msalv1/node_modules/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": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/msalv2": { + "name": "@azure/msal-node", + "version": "2.10.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-node/-/msal-node-2.10.0.tgz", + "integrity": "sha512-JxsSE0464a8IA/+q5EHKmchwNyUFJHtCH00tSXsLaOddwLjG6yVvTH6lGgPcWMhO7YWUXj/XVgVgeE9kZtsPUQ==", + "dependencies": { + "@azure/msal-common": "14.13.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/msalv2/node_modules/@azure/msal-common": { + "version": "14.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/msal-common/-/msal-common-14.13.0.tgz", + "integrity": "sha512-b4M/tqRzJ4jGU91BiwCsLTqChveUEyFK3qY2wGfZ0zBswIBZjAxopx5CYt5wzZFKuN15HqRDYXQbztttuIC3nA==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msalv2/node_modules/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": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "node_modules/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==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/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==", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/nodejs-file-downloader/node_modules/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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==" + }, + "node_modules/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==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "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" + } + }, + "node_modules/readable-stream/node_modules/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==" + }, + "node_modules/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": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/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": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/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==" + }, + "node_modules/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/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": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/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==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/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==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typed-rest-client/-/typed-rest-client-2.0.1.tgz", + "integrity": "sha512-LSfgVu+jKUbkceVBGJ6bdIMzzpvjhw6A+aKsVnGa2S7bT82QCALh/RAtq/fdV3aLXxHqsChuClrQ93fXMrIckA==", + "dependencies": { + "des.js": "^1.1.0", + "js-md4": "^0.3.2", + "qs": "^6.10.3", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/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==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/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==" + }, + "node_modules/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": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/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": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/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": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/winreg": { + "version": "1.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/winreg/-/winreg-1.2.2.tgz", + "integrity": "sha512-I1mQ2HDZbOXm3XctfGPNzm9p/md7FAxHtACVFeBNrnOE4p4b3a0baqNObx1OqHE8DEx25l5CaCDipxFM5FSYOg==" + }, + "node_modules/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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/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": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zip-stream": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "dependencies": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + } + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/package.json b/_generated/AzureRmWebAppDeploymentV5_Node20/package.json new file mode 100644 index 000000000000..01e6b8d8e0da --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/package.json @@ -0,0 +1,35 @@ +{ + "name": "vsts-tasks-azurermappservicedeployment", + "version": "1.0.0", + "description": "Azure Pipelines Azure RM App Service Deployment", + "main": "AzureRmWebAppDeployment.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "1.0.7", + "agent-base": "^6.0.2", + "azure-pipelines-task-lib": "4.11.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.251.0", + "azure-pipelines-tasks-webdeployment-common": "4.243.1", + "moment": "^2.29.4", + "q": "1.4.1", + "uuid": "3.1.0", + "xml2js": "^0.6.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.cmd b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.cmd new file mode 100644 index 000000000000..fa7c06b0765f --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.cmd @@ -0,0 +1,24 @@ +@echo off + +DEL "mainCmdFile.cmd" + +DEL "kuduPostDeploymentScript.cmd" + +:: Do not delete file if the execution is not completed within time range +:: This can help in retrieving the logs and script result + +if exist "script_result.txt" ( + + echo remove log files + + DEL "stdout.txt" + + DEL "stderr.txt" + + DEL "script_result.txt" +) + +:: Delete the file after execution +echo remove delete_log_file + +DEL "%~f0" >nul 2>&1 diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.sh b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.sh new file mode 100644 index 000000000000..71eec07fc33d --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/deleteLogFile.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +rm "mainCmdFile.sh" + +rm "kuduPostDeploymentScript.sh" + +# Do not delete file if the execution is not completed within time range +# This can help in retrieving the logs and script result + +if [ -f "script_result.txt" ] +then + echo "Removing log files." + rm "stdout.txt" + rm "stderr.txt" + rm "script_result.txt" +else + echo "Execution is not over." +fi + +# Delete the file after execution +echo "Removing the delete_log_file.sh file." + +rm "delete_log_file.sh" diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.cmd b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.cmd new file mode 100644 index 000000000000..b4ede19c9c1c --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.cmd @@ -0,0 +1,9 @@ +@echo off + +:: Send stdout and stderr to seperate file +call cmd /c "%Home%\\site\\VSTS_PostDeployment_%1\\kuduPostDeploymentScript.cmd" > "%Home%\\site\\VSTS_PostDeployment_%1\\stdout.txt" 2> "%Home%\\site\\VSTS_PostDeployment_%1\\stderr.txt" + +:: write return code of previous command to script_result file +:: only return code (Numeric code) should present inside script_result + +echo %errorlevel% > "%Home%\\site\\VSTS_PostDeployment_%1\\script_result.txt" \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.sh b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.sh new file mode 100644 index 000000000000..6501857c8b43 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/postDeploymentScript/mainCmdFile.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# Send stdout and stderr to seperate file +sh "$HOME/site/VSTS_PostDeployment_$1/kuduPostDeploymentScript.sh" 2> "$HOME/site/VSTS_PostDeployment_$1/stderr.txt" 1> "$HOME/site/VSTS_PostDeployment_$1/stdout.txt" +echo "$?" > "$HOME/site/VSTS_PostDeployment_$1/script_result.txt" diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/task.json b/_generated/AzureRmWebAppDeploymentV5_Node20/task.json new file mode 100644 index 000000000000..cbd2526fc7d0 --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/task.json @@ -0,0 +1,701 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "Azure App Service deploy", + "description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "[Learn more about this task](https://aka.ms/azurermwebdeployreadme)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 1 + }, + "releaseNotes": "What's new in version 4.*
Supports Zip Deploy, Run From Package, War Deploy [Details here](https://aka.ms/appServiceDeploymentMethods)
Supports App Service Environments
Improved UI for discovering different App service types supported by the task
Run From Package is the preferred deployment method, which makes files in wwwroot folder read-only
Click [here](https://aka.ms/azurermwebdeployreadme) for more information.", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "File Transforms & Variable Substitution Options", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "Additional Deployment Options", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "Post Deployment Action", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "Application and Configuration Settings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "Connection type", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "Select the service connection type to use to deploy the Web App.
Select Publish Profile for using Visual Studio created Publish profile. [More Information](https://aka.ms/vsPublishProfile)." + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "defaultValue": "", + "required": true, + "helpMarkDown": "Select the Azure Resource Manager subscription for the deployment.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "Publish profile path", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "Path of the Publish profile created from Visual Studio", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "Publish profile password", + "required": true, + "helpMarkDown": "It is recommended to store password in a secret variable and use that variable here e.g. $(Password).", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "App Service type", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "Choose from Web App On Windows, Web App On Linux, Web App for Containers, Function App, Function App on Linux, Function App for Containers and Mobile App.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "App Service name", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select the name of an existing Azure App Service. App services based on selected app type will only be listed.", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "Deploy to Slot or App Service Environment", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Select the option to deploy to an existing deployment slot or Azure App Service Environment.
For both the targets, the task needs Resource group name.
In case the deployment target is a slot, by default the deployment is done to the production slot. Any other existing slot name can also be provided.
In case the deployment target is an Azure App Service environment, leave the slot name as ‘production’ and just specify the Resource group name.", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "Resource group", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "The Resource group name is required when the deployment target is either a deployment slot or an App Service Environment.
Enter or Select the Azure Resource group that contains the Azure App Service specified above.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "Slot", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Enter or Select an existing Slot other than the Production slot.", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "Registry or Namespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "A globally unique top-level domain name for your specific registry or namespace.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerRepository", + "type": "string", + "label": "Image", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Name of the repository where the container images are stored.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "Tag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Tags are optional, it is the mechanism that registries use to give Docker images a version.
Note: Fully qualified image name will be of the format: '`/`:`'. For example, 'myregistry.azurecr.io/nginx:latest'." + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "Virtual application", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "Specify the name of the Virtual application that has been configured in the Azure portal. The option is not required for deployments to the App Service root." + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "Package or folder", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "File path to the package or a folder containing app service contents generated by MSBuild or a compressed zip or war file.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.zip or $(System.DefaultWorkingDirectory)/\\*\\*/\\*.war." + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "Select the framework and version.", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "Runtime Stack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "Select the framework and version. Refer [this doc](https://docs.microsoft.com/azure/azure-functions/functions-versions#languages) for supported runtime versions. Old values like `DOCKER|microsoft/azure-functions-*` are deprecated, please use the new values from dropdown.", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "Startup command ", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "Enter the start up command. For ex.
dotnet exec filename.dll
dotnet filename.dll" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "Deployment script type", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "Customize the deployment by providing a script that will run on the Azure App service once the task has completed the deployment successfully . For example restore packages for Node, PHP, Python applications. [Learn more](https://go.microsoft.com/fwlink/?linkid=843471)." + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "Inline Script", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "Deployment script path", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "Generate web.config parameters for Python, Node.js, Go and Java apps", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "A standard Web.config will be generated and deployed to Azure App Service if the application does not have one. The values in web.config can be edited and vary based on the application framework. For example for node.js application, web.config will have startup file and iis_node module values. This edit feature is only for the generated web.config. [Learn more](https://go.microsoft.com/fwlink/?linkid=843469).", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "App settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app application settings following the syntax -key value . Value containing spaces should be enclosed in double quotes.
Example : -Port 5000 -RequestTimeout 5000
-WEBSITE_TIME_ZONE \"Eastern Standard Time\"", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "Configuration settings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "Edit web app configuration settings following the syntax -key value. Value containing spaces should be enclosed in double quotes.
Example : -phpVersion 5.6 -linuxFxVersion: node|6.11", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "Select deployment method", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "If unchecked we will auto-detect the best deployment method based on your app type, package format and other parameters.
Select the option to view the supported deployment methods and choose one for deploying your app." + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "Choose the deployment method for the app.", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "Take App Offline", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "Select the option to take the Azure App Service offline by placing an app_offline.htm file in the root directory of the App Service before the sync operation begins. The file will be removed after the sync operation completes successfully." + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "SetParameters file", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Optional: location of the SetParameters.xml file to use." + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "Remove additional files at destination", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to delete files on the Azure App Service that have no matching files in the App Service package or folder.

Note: This will also remove all files related to any extension installed on this Azure App Service. To prevent this, select 'Exclude files from App_Data folder' checkbox. " + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "Exclude files from the App_Data folder", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Select the option to prevent files in the App_Data folder from being deployed to/ deleted from the Azure App Service." + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "Additional arguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "Additional Web Deploy arguments following the syntax -key:value .
These will be applied when deploying the Azure App Service. Example: -disableLink:AppPoolExtension -disableLink:ContentExtension.
For more examples of Web Deploy operation settings, refer to [this](https://go.microsoft.com/fwlink/?linkid=838471)." + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "Rename locked files", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "Select the option to enable msdeploy flag MSDEPLOY_RENAME_LOCKED_FILES=1 in Azure App Service application settings. The option if set enables msdeploy to rename locked files that are locked during app deployment" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "XML transformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "The config transforms will be run for `*.Release.config` and `*..config` on the `*.config file`.
Config transforms will be run prior to the Variable Substitution.
XML transformations are supported only for Windows platform." + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "XML variable substitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Variables defined in the build or release pipelines will be matched against the 'key' or 'name' entries in the appSettings, applicationSettings, and connectionStrings sections of any config file and parameters.xml. Variable Substitution is run after config transforms.

Note: If same variables are defined in the release pipeline and in the environment, then the environment variables will supersede the release pipeline variables.
" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "JSON variable substitution", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "Provide new line separated list of JSON files to substitute the variable values. Files names are to be provided relative to the root folder.
To substitute JSON variables that are nested or hierarchical, specify them using JSONPath expressions.

For example, to replace the value of ‘ConnectionString’ in the sample below, you need to define a variable as ‘Data.DefaultConnection.ConnectionString’ in the build or release pipeline (or release pipeline's environment).
{
  \"Data\": {
    \"DefaultConnection\": {
      \"ConnectionString\": \"Server=(localdb)\\SQLEXPRESS;Database=MyDB;Trusted_Connection=True\"
    }
  }
}
Variable Substitution is run after configuration transforms.

Note: pipeline variables are excluded in substitution." + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "Deployment method", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "Choose the deployment method for the app." + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "Enable clean deployment", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "Deployment mode for complete sync (clean) deployment" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "Azure App Service Deploy: $(WebAppName)", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + }, + "Node20_1": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "Invalid App Service package or folder path provided: %s", + "SetParamFilenotfound0": "Set parameters file not found: %s", + "XDTTransformationsappliedsuccessfully": "XML Transformations applied successfully", + "GotconnectiondetailsforazureRMWebApp0": "Got service connection details for Azure App Service:'%s'", + "ErrorNoSuchDeployingMethodExists": "Error : No such deploying method exists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "Unable to retrieve service connection details for Azure App Service : %s. Status Code: %s (%s)", + "UnabletoretrieveResourceID": "Unable to retrieve service connection details for Azure Resource:'%s'. Status Code: %s", + "Successfullyupdateddeploymenthistory": "Successfully updated deployment History at %s", + "Failedtoupdatedeploymenthistory": "Failed to update deployment history. Error: %s", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "WARNING : Cannot update deployment status : SCM endpoint is not enabled for this website", + "Unabletoretrievewebconfigdetails": "Unable to retrieve App Service configuration details. Status Code: '%s'", + "Unabletoretrievewebappsettings": "Unable to retrieve App Service application settings. [Status Code: '%s', Error Message: '%s']", + "Unabletoupdatewebappsettings": "Unable to update App service application settings. Status Code: '%s'", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "Cannot update deployment status : Unique Deployment ID cannot be retrieved", + "PackageDeploymentSuccess": "Successfully deployed web package to App Service.", + "PackageDeploymentFailed": "Failed to deploy web package to App Service.", + "Runningcommand": "Running command: %s", + "Deployingwebapplicationatvirtualpathandphysicalpath": "Deploying web package : %s at virtual path (physical path) : %s (%s)", + "Successfullydeployedpackageusingkuduserviceat": "Successfully deployed package %s using kudu service at %s", + "Failedtodeploywebapppackageusingkuduservice": "Failed to deploy App Service package using kudu service : %s", + "Unabletodeploywebappresponsecode": "Unable to deploy App Service due to error code : %s", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "MSDeploy generated packages are only supported for Windows platform.", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "Unsupported installed version: %s found for MSDeploy. version should be at least 3 or above", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "Unable to find the location of MS Deploy from registry on machine (Error : %s)", + "Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s
Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern.", + "Trytodeploywebappagainwithappofflineoptionselected": "Try to deploy app service again with Take application offline option selected.", + "Trytodeploywebappagainwithrenamefileoptionselected": "Try to deploy app service again with Rename locked files option selected.", + "NOJSONfilematchedwithspecificpattern": "NO JSON file matched with specific pattern: %s.", + "Configfiledoesntexists": "Configuration file %s doesn't exist.", + "Failedtowritetoconfigfilewitherror": "Failed to write to config file %s with error : %s", + "AppOfflineModeenabled": "App offline mode enabled.", + "Failedtoenableappofflinemode": "Failed to enable app offline mode. Status Code: %s (%s)", + "AppOflineModedisabled": "App offline mode disabled.", + "FailedtodisableAppOfflineMode": "Failed to disable App offline mode. Status Code: %s (%s)", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "Cannot perform XML transformations on a non-Windows platform.", + "XdtTransformationErrorWhileTransforming": "XML transformation error while transforming %s using %s.", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "Publish using zip deploy option is not supported for msBuild package type.", + "Publishusingzipdeploynotsupportedforvirtualapplication": "Publish using zip deploy option is not supported for virtual application.", + "Publishusingzipdeploydoesnotsupportwarfile": "Publish using zip deploy or RunFromZip options do not support war file deployment.", + "Publishusingrunfromzipwithpostdeploymentscript": "Publish using RunFromZip might not support post deployment script if it makes changes to wwwroot, since the folder is ReadOnly.", + "ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution is not supported with file encoding %s. Supported encodings are UTF-8 and UTF-16 LE.", + "UnknownFileEncodeError": "Unable to detect encoding of the file %s (typeCode: %s). Supported encodings are UTF-8 and UTF-16 LE.", + "ShortFileBufferError": "File buffer is too short to detect encoding type : %s", + "FailedToUpdateAzureRMWebAppConfigDetails": "Failed to update App Service configuration details. Error: %s", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "Successfully updated App Service configuration details", + "RequestedURLforkuduphysicalpath": "Requested URL for kudu physical path : %s", + "Physicalpathalreadyexists": "Physical path '%s' already exists", + "KuduPhysicalpathCreatedSuccessfully": "Kudu physical path created successfully : %s", + "FailedtocreateKuduPhysicalPath": "Failed to create kudu physical path. Error : %s", + "FailedtocheckphysicalPath": "Failed to check kudu physical path. Error Code: %s", + "VirtualApplicationDoesNotExist": "Virtual application doesn't exists : %s", + "JSONParseError": "Unable to parse JSON file: %s. Error: %s", + "JSONvariablesubstitutionappliedsuccessfully": "JSON variable substitution applied successfully.", + "XMLvariablesubstitutionappliedsuccessfully": "XML variable substitution applied successfully.", + "failedtoUploadFileToKudu": "Unable to upload file: %s to Kudu (%s). Status Code: %s", + "failedtoUploadFileToKuduError": "Unable to upload file: %s to Kudu (%s). Error: %s", + "ExecuteScriptOnKudu": "Executing given script on Kudu service.", + "FailedToRunScriptOnKuduError": "Unable to run the script on Kudu Service. Error: %s", + "FailedToRunScriptOnKudu": "Unable to run the script on Kudu: %s. Status Code: %s", + "ScriptExecutionOnKuduSuccess": "Successfully executed script on Kudu.", + "ScriptExecutionOnKuduFailed": "Executed script returned '%s' as return code. Error: %s", + "FailedtoDeleteFileFromKudu": "Unable to delete file: %s from Kudu (%s). Status Code: %s", + "FailedtoDeleteFileFromKuduError": "Unable to delete file: %s from Kudu (%s). Error: %s", + "ScriptFileNotFound": "Script file '%s' not found.", + "InvalidScriptFile": "Invalid script file '%s' provided. Valid extensions are .bat and .cmd for windows and .sh for linux", + "RetryForTimeoutIssue": "Script execution failed with timeout issue. Retrying once again.", + "stdoutFromScript": "Standard output from script: ", + "stderrFromScript": "Standard error from script: ", + "WebConfigAlreadyExists": "web.config file already exists. Not generating.", + "SuccessfullyGeneratedWebConfig": "Successfully generated web.config file", + "FailedToGenerateWebConfig": "Failed to generate web.config. %s", + "FailedToGetKuduFileContent": "Unable to get file content: %s . Status code: %s (%s)", + "FailedToGetKuduFileContentError": "Unable to get file content: %s. Error: %s", + "ScriptStatusTimeout": "Unable to fetch script status due to timeout.", + "PollingForFileTimeOut": "Unable to fetch script status due to timeout. You can increase the timeout limit by setting 'appservicedeploy.retrytimeout' variable to number of minutes required.", + "InvalidPollOption": "Invalid polling option provided: %s.", + "MissingAppTypeWebConfigParameters": "Attribute '-appType' is missing in the Web.config parameters. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask', 'node' and 'Go'.
For example, '-appType python_Bottle' (sans-quotes) in case of Python Bottle framework..", + "AutoDetectDjangoSettingsFailed": "Unable to detect DJANGO_SETTINGS_MODULE 'settings.py' file path. Ensure that the 'settings.py' file exists or provide the correct path in Web.config parameter input in the following format '-DJANGO_SETTINGS_MODULE .settings'", + "FailedToApplyTransformation": "Unable to apply transformation for the given package. Verify the following.", + "FailedToApplyTransformationReason1": "1. Whether the Transformation is already applied for the MSBuild generated package during build. If yes, remove the tag for each config in the csproj file and rebuild. ", + "FailedToApplyTransformationReason2": "2. Ensure that the config file and transformation files are present in the same folder inside the package.", + "AutoParameterizationMessage": "ConnectionString attributes in Web.config is parameterized by default. Note that the transformation has no effect on connectionString attributes as the value is overridden during deployment by 'Parameters.xml or 'SetParameters.xml' files. You can disable the auto-parameterization by setting /p:AutoParameterizationWebConfigConnectionStrings=False during MSBuild package generation.", + "UnsupportedAppType": "App type '%s' not supported in Web.config generation. Valid values for '-appType' are: 'python_Bottle', 'python_Django', 'python_Flask' and 'node'", + "UnableToFetchAuthorityURL": "Unable to fetch authority URL.", + "UnableToFetchActiveDirectory": "Unable to fetch Active Directory resource ID.", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "Successfully updated the Runtime Stack and Startup Command.", + "FailedToUpdateRuntimeStackAndStartupCommand": "Failed to update the Runtime Stack and Startup Command. Error: %s.", + "SuccessfullyUpdatedWebAppSettings": "Successfully updated the App settings.", + "FailedToUpdateAppSettingsInConfigDetails": "Failed to update the App settings. Error: %s.", + "UnableToGetAzureRMWebAppMetadata": "Failed to fetch AzureRM WebApp metadata. ErrorCode: %s", + "UnableToUpdateAzureRMWebAppMetadata": "Unable to update AzureRM WebApp metadata. Error Code: %s", + "Unabletoretrieveazureregistrycredentials": "Unable to retrieve Azure Container Registry credentials.[Status Code: '%s']", + "UnableToReadResponseBody": "Unable to read response body. Error: %s", + "UnableToUpdateWebAppConfigDetails": "Unable to update WebApp config details. StatusCode: '%s'", + "AddingReleaseAnnotation": "Adding release annotation for the Application Insights resource '%s'", + "SuccessfullyAddedReleaseAnnotation": "Successfully added release annotation to the Application Insight : %s", + "FailedAddingReleaseAnnotation": "Failed to add release annotation. %s", + "RenameLockedFilesEnabled": "Rename locked files enabled for App Service.", + "FailedToEnableRenameLockedFiles": "Failed to enable rename locked files. Error: %s", + "WebJobsInProgressIssue": "Few WebJobs in running state prevents the deployment from removing the files. You can disable 'Remove additional files at destination' option or Stop continuous Jobs before deployment.", + "FailedToFetchKuduAppSettings": "Failed to fetch Kudu App Settings. Error: %s", + "FailedToCreatePath": "Failed to create path '%s' from Kudu. Error: %s", + "FailedToDeleteFile": "Failed to delete file '%s/%s' from Kudu. Error: %s", + "FailedToDeleteFolder": "Failed to delete folder '%s' from Kudu. Error: %s", + "FailedToUploadFile": "Failed to upload file '%s/%s' from Kudu. Error: %s", + "FailedToGetFileContent": "Failed to get file content '%s/%s' from Kudu. Error: %s", + "FailedToListPath": "Failed to list path '%s' from Kudu. Error: %s", + "RetryToDeploy": "Retrying to deploy the package.", + "FailedToGetAppServiceDetails": "Failed to fetch App Service '%s' details. Error: %s", + "FailedToGetAppServicePublishingProfile": "Failed to fetch App Service '%s' publishing profile. Error: %s", + "FailedToUpdateAppServiceMetadata": "Failed to update App service '%s' Meta data. Error: %s", + "FailedToGetAppServiceMetadata": "Failed to get App service '%s' Meta data. Error: %s", + "FailedToPatchAppServiceConfiguration": "Failed to patch App Service '%s' configuration. Error: %s", + "FailedToUpdateAppServiceConfiguration": "Failed to update App service '%s' configuration. Error: %s", + "FailedToGetAppServiceConfiguration": "Failed to get App service '%s' configuration. Error: %s", + "FailedToGetAppServicePublishingCredentials": "Failed to fetch App Service '%s' publishing credentials. Error: %s", + "FailedToGetAppServiceApplicationSettings": "Failed to get App service '%s' application settings. Error: %s", + "FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", + "UpdatingAppServiceConfigurationSettings": "Trying to update App Service Configuration settings. Data: %s", + "UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", + "UpdatingAppServiceApplicationSettings": "Trying to update App Service Application settings. Data: %s", + "AppServiceApplicationSettingsAlreadyPresent": "App Service Application settings are already present.", + "AppServiceConnectionStringsAlreadyPresent": "App Service Connection Strings are already present.", + "UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", + "MultipleResourceGroupFoundForAppService": "Multiple resource group found for App Service '%s'.", + "PackageDeploymentUsingZipDeployFailed": "Package deployment using ZIP Deploy failed. Refer logs for more details.", + "PackageDeploymentInitiated": "Package deployment using ZIP Deploy initiated.", + "PackageDeploymentInitiatedWithOneDeploy": "Package deployment using One Deploy initiated.", + "OneDeployWithIncrementalDeploymentOption": "Deploying using incremental deployment.", + "WarPackageDeploymentInitiated": "Package deployment using WAR Deploy initiated.", + "FailedToGetDeploymentLogs": "Failed to get deployment logs. Error: %s", + "GoExeNameNotPresent": "Go exe name is not present", + "WarDeploymentRetry": "Retrying war file deployment as it did not expand successfully earlier.", + "Updatemachinetoenablesecuretlsprotocol": "Make sure the machine is using TLS 1.2 protocol or higher. Check https://aka.ms/enableTlsv2 for more information on how to enable TLS in your machine.", + "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", + "XmlParsingFailed": "Unable to parse publishProfileXML file, Error: %s", + "PropertyDoesntExistPublishProfile": "[%s] Property does not exist in publish profile", + "InvalidConnectionType": "Invalid service connection type", + "InvalidImageSourceType": "Invalid Image source Type", + "InvalidPublishProfile": "Publish profile file is invalid.", + "ASE_SSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to set a variable named VSTS_ARM_REST_IGNORE_SSL_ERRORS to the value true in the build or release pipeline", + "ZipDeployLogsURL": "Zip Deploy logs can be viewed at %s", + "DeployLogsURL": "Deploy logs can be viewed at %s", + "AppServiceApplicationURL": "App Service Application URL: %s", + "ASE_WebDeploySSLIssueRecommendation": "To use a certificate in App Service, the certificate must be signed by a trusted certificate authority. If your web app gives you certificate validation errors, you're probably using a self-signed certificate and to resolve them you need to pass -allowUntrusted in additional arguments of web deploy option.", + "FailedToGetResourceID": "Failed to get resource ID for resource type '%s' and resource name '%s'. Error: %s", + "JarPathNotPresent": "Java jar path is not present", + "FailedToUpdateApplicationInsightsResource": "Failed to update Application Insights '%s' Resource. Error: %s", + "RunFromZipPreventsFileInUseError": "Move from Web Deploy to RunFrom Package, which helps in avoiding FILE_IN_USE error. Note that Run From Package does not support msBuild package type. Please change your package format to use this deployment method.", + "MSDeployNotSupportTokenAuth": "App Service is configured to not use basic authentication. This requires Web Deploy msdeploy.exe version 7.1.7225 or higher. You need a version of Visual Studio that includes an updated version of msdeploy.exe. For more information, visit https://aka.ms/azdo-webapp-msdeploy .", + "RunFromPackageAppsetting": "NOTE: Run From Package makes wwwroot read-only, so you will receive an error when writing files to this directory." + }, + "_buildConfigMapping": { + "Default": "5.251.0", + "Node20-225": "5.251.1" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/task.loc.json b/_generated/AzureRmWebAppDeploymentV5_Node20/task.loc.json new file mode 100644 index 000000000000..ba41335b384b --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/task.loc.json @@ -0,0 +1,701 @@ +{ + "id": "497D490F-EEA7-4F2B-AB94-48D9C1ACDCB1", + "name": "AzureRmWebAppDeployment", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azureappservicetroubleshooting", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 5, + "Minor": 251, + "Patch": 1 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "2.104.1", + "groups": [ + { + "name": "FileTransformsAndVariableSubstitution", + "displayName": "ms-resource:loc.group.displayName.FileTransformsAndVariableSubstitution", + "isExpanded": false, + "visibleRule": "WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != webAppLinux && webAppKind != functionAppLinux && Package NotEndsWith .war" + }, + { + "name": "AdditionalDeploymentOptions", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptions", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && webAppKind != functionAppLinux && WebAppKind != \"\" && Package NotEndsWith .war && Package NotEndsWith .jar" + }, + { + "name": "AdditionalDeploymentOptionsLinux", + "displayName": "ms-resource:loc.group.displayName.AdditionalDeploymentOptionsLinux", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind = webAppLinux" + }, + { + "name": "PostDeploymentAction", + "displayName": "ms-resource:loc.group.displayName.PostDeploymentAction", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\" && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer" + }, + { + "name": "ApplicationAndConfigurationSettings", + "displayName": "ms-resource:loc.group.displayName.ApplicationAndConfigurationSettings", + "isExpanded": false, + "visibleRule": "ConnectionType = AzureRM" + } + ], + "inputs": [ + { + "name": "ConnectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ConnectionType", + "defaultValue": "AzureRM", + "options": { + "AzureRM": "Azure Resource Manager", + "PublishProfile": "Publish Profile" + }, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectionType" + }, + { + "name": "ConnectedServiceName", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.ConnectedServiceName", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "PublishProfilePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.PublishProfilePath", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.pubxml", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePath", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "PublishProfilePassword", + "type": "string", + "label": "ms-resource:loc.input.label.PublishProfilePassword", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PublishProfilePassword", + "visibleRule": "ConnectionType = PublishProfile" + }, + { + "name": "WebAppKind", + "aliases": [ + "appType" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppKind", + "defaultValue": "webApp", + "required": true, + "options": { + "webApp": "Web App on Windows", + "webAppLinux": "Web App on Linux", + "webAppContainer": "Web App for Containers (Linux)", + "webAppHyperVContainer": "Web App for Containers (Windows)", + "functionApp": "Function App on Windows (Not Recommended, Use Azure Functions Task)", + "functionAppLinux": "Function App on Linux (Not Recommended, Use Azure Functions Task)", + "functionAppContainer": "Function App for Containers (Linux) (Not Recommended, Use Azure Functions for container Task)", + "apiApp": "API App", + "mobileApp": "Mobile App" + }, + "properties": { + "EditableOptions": "true" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppKind", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "WebAppName", + "type": "pickList", + "label": "ms-resource:loc.input.label.WebAppName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.WebAppName", + "visibleRule": "ConnectionType = AzureRM" + }, + { + "name": "DeployToSlotOrASEFlag", + "aliases": [ + "deployToSlotOrASE" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.DeployToSlotOrASEFlag", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.DeployToSlotOrASEFlag", + "visibleRule": "ConnectionType = AzureRM && WebAppKind != \"\"" + }, + { + "name": "ResourceGroupName", + "type": "pickList", + "label": "ms-resource:loc.input.label.ResourceGroupName", + "defaultValue": "", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.ResourceGroupName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "SlotName", + "type": "pickList", + "label": "ms-resource:loc.input.label.SlotName", + "defaultValue": "production", + "required": true, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.SlotName", + "visibleRule": "DeployToSlotOrASEFlag = true" + }, + { + "name": "DockerNamespace", + "type": "string", + "label": "ms-resource:loc.input.label.DockerNamespace", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerNamespace" + }, + { + "name": "DockerRepository", + "type": "string", + "label": "ms-resource:loc.input.label.DockerRepository", + "defaultValue": "", + "required": true, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerRepository" + }, + { + "name": "DockerImageTag", + "type": "string", + "label": "ms-resource:loc.input.label.DockerImageTag", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.DockerImageTag" + }, + { + "name": "VirtualApplication", + "type": "string", + "label": "ms-resource:loc.input.label.VirtualApplication", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind != webAppLinux && WebAppKind != webAppContainer && WebAppKind != webAppHyperVContainer && WebAppkind != functionAppContainer && WebAppKind != functionApp && webAppKind != functionAppLinux && WebAppKind != \"\"", + "helpMarkDown": "ms-resource:loc.input.help.VirtualApplication" + }, + { + "name": "Package", + "aliases": [ + "packageForLinux" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.Package", + "defaultValue": "$(System.DefaultWorkingDirectory)/**/*.zip", + "required": true, + "visibleRule": "ConnectionType = PublishProfile || WebAppKind = webApp || WebAppKind = apiApp || WebAppKind = functionApp || WebAppKind = mobileApp || WebAppKind = webAppLinux || webAppKind = functionAppLinux", + "helpMarkDown": "ms-resource:loc.input.help.Package" + }, + { + "name": "RuntimeStack", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStack", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStack", + "visibleRule": "WebAppKind = webAppLinux" + }, + { + "name": "RuntimeStackFunction", + "type": "pickList", + "label": "ms-resource:loc.input.label.RuntimeStackFunction", + "defaultValue": "", + "required": false, + "properties": { + "EditableOptions": "True" + }, + "options": { + "DOTNET|2.2": "DOTNET|2.2 (functionapp v2)", + "DOTNET|3.1": "DOTNET|3.1 (functionapp v3)", + "JAVA|8": "JAVA|8 (functionapp v2/v3)", + "JAVA|11": "JAVA|11 (functionapp v3)", + "NODE|8": "NODE|8 (functionapp v2)", + "NODE|10": "NODE|10 (functionapp v2/v3)", + "NODE|12": "NODE|12 (functionapp v3)", + "NODE|14": "NODE|14 (functionapp v3)", + "PYTHON|3.6": "PYTHON|3.6 (functionapp v2/v3)", + "PYTHON|3.7": "PYTHON|3.7 (functionapp v2/v3)", + "PYTHON|3.8": "PYTHON|3.8 (functionapp v3)" + }, + "helpMarkDown": "ms-resource:loc.input.help.RuntimeStackFunction", + "visibleRule": "WebAppKind = functionAppLinux" + }, + { + "name": "StartupCommand", + "type": "string", + "label": "ms-resource:loc.input.label.StartupCommand", + "defaultValue": "", + "required": false, + "visibleRule": "WebAppKind = webAppLinux || WebAppKind = webAppContainer || WebAppkind = functionAppContainer || WebAppKind = functionAppLinux || WebAppKind = webAppHyperVContainer", + "helpMarkDown": "ms-resource:loc.input.help.StartupCommand" + }, + { + "name": "ScriptType", + "type": "pickList", + "label": "ms-resource:loc.input.label.ScriptType", + "defaultValue": "", + "options": { + "": "Select deployment script type (inline or file)", + "Inline Script": "Inline Script", + "File Path": "Script File Path" + }, + "groupName": "PostDeploymentAction", + "helpMarkDown": "ms-resource:loc.input.help.ScriptType" + }, + { + "name": "InlineScript", + "type": "multiLine", + "label": "ms-resource:loc.input.label.InlineScript", + "defaultValue": ":: You can provide your deployment commands here. One command per line.", + "groupName": "PostDeploymentAction", + "required": true, + "visibleRule": "ScriptType == Inline Script", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "500" + } + }, + { + "name": "ScriptPath", + "type": "filePath", + "label": "ms-resource:loc.input.label.ScriptPath", + "required": true, + "groupName": "PostDeploymentAction", + "visibleRule": "ScriptType == File Path" + }, + { + "name": "WebConfigParameters", + "type": "multiLine", + "label": "ms-resource:loc.input.label.WebConfigParameters", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.WebConfigParameters", + "properties": { + "editorExtension": "ms.vss-services-azure.webconfig-parameters-grid" + } + }, + { + "name": "AppSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.AppSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.AppSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "ConfigurationSettings", + "type": "multiLine", + "label": "ms-resource:loc.input.label.ConfigurationSettings", + "defaultValue": "", + "required": false, + "groupName": "ApplicationAndConfigurationSettings", + "helpMarkDown": "ms-resource:loc.input.help.ConfigurationSettings", + "properties": { + "editorExtension": "ms.vss-services-azure.parameters-grid" + } + }, + { + "name": "UseWebDeploy", + "aliases": [ + "enableCustomDeployment" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.UseWebDeploy", + "required": false, + "defaultValue": "false", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.UseWebDeploy" + }, + { + "name": "DeploymentType", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentType", + "defaultValue": "webDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptions", + "options": { + "webDeploy": "Web Deploy", + "zipDeploy": "Zip Deploy", + "runFromZip": "Run From Package" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentType", + "visibleRule": "UseWebDeploy == true" + }, + { + "name": "TakeAppOfflineFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.TakeAppOfflineFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType != runFromZip", + "helpMarkDown": "ms-resource:loc.input.help.TakeAppOfflineFlag" + }, + { + "name": "SetParametersFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.SetParametersFile", + "defaultValue": "", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.SetParametersFile" + }, + { + "name": "RemoveAdditionalFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveAdditionalFilesFlag", + "defaultValue": "false", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.RemoveAdditionalFilesFlag" + }, + { + "name": "ExcludeFilesFromAppDataFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.ExcludeFilesFromAppDataFlag", + "defaultValue": "true", + "required": false, + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.ExcludeFilesFromAppDataFlag" + }, + { + "name": "AdditionalArguments", + "type": "string", + "label": "ms-resource:loc.input.label.AdditionalArguments", + "required": false, + "defaultValue": "-retryAttempts:6 -retryInterval:10000", + "groupName": "AdditionalDeploymentOptions", + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "helpMarkDown": "ms-resource:loc.input.help.AdditionalArguments" + }, + { + "name": "RenameFilesFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.RenameFilesFlag", + "defaultValue": "true", + "required": false, + "visibleRule": "UseWebDeploy == true && DeploymentType == webDeploy", + "groupName": "AdditionalDeploymentOptions", + "helpMarkDown": "ms-resource:loc.input.help.RenameFilesFlag" + }, + { + "name": "XmlTransformation", + "aliases": [ + "enableXmlTransform" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlTransformation", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlTransformation" + }, + { + "name": "XmlVariableSubstitution", + "aliases": [ + "enableXmlVariableSubstitution" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.XmlVariableSubstitution", + "required": false, + "defaultValue": false, + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.XmlVariableSubstitution" + }, + { + "name": "JSONFiles", + "type": "multiLine", + "label": "ms-resource:loc.input.label.JSONFiles", + "required": false, + "defaultValue": "", + "groupName": "FileTransformsAndVariableSubstitution", + "helpMarkDown": "ms-resource:loc.input.help.JSONFiles" + }, + { + "name": "DeploymentTypeLinux", + "type": "pickList", + "label": "ms-resource:loc.input.label.DeploymentTypeLinux", + "defaultValue": "oneDeploy", + "required": true, + "groupName": "AdditionalDeploymentOptionsLinux", + "options": { + "oneDeploy": "One Deploy", + "zipDeploy": "Zip Deploy" + }, + "helpMarkDown": "ms-resource:loc.input.help.DeploymentTypeLinux" + }, + { + "name": "CleanDeploymentFlag", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanDeploymentFlag", + "required": false, + "defaultValue": "true", + "groupName": "AdditionalDeploymentOptionsLinux", + "visibleRule": "DeploymentTypeLinux == oneDeploy", + "helpMarkDown": "ms-resource:loc.input.help.CleanDeploymentFlag" + } + ], + "outputVariables": [ + { + "name": "AppServiceApplicationUrl", + "description": "Application URL of the selected App Service." + } + ], + "dataSourceBindings": [ + { + "target": "WebAppName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppNamesByAppType", + "parameters": { + "WebAppKind": "$(WebAppKind)" + } + }, + { + "target": "ResourceGroupName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppResourceGroup", + "parameters": { + "WebAppName": "$(WebAppName)" + } + }, + { + "target": "SlotName", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppSlotsId", + "parameters": { + "WebAppName": "$(WebAppName)", + "ResourceGroupName": "$(ResourceGroupName)" + }, + "resultTemplate": "{\"Value\":\"{{{ #extractResource slots}}}\",\"DisplayValue\":\"{{{ #extractResource slots}}}\"}" + }, + { + "target": "RuntimeStack", + "endpointId": "$(ConnectedServiceName)", + "dataSourceName": "AzureRMWebAppRuntimeStacksByOsType", + "parameters": { + "osTypeSelected": "Linux" + }, + "resultTemplate": "{\"Value\":\"{{{ runtimeVersion }}}\",\"DisplayValue\":\"{{{ displayVersion }}} ({{{ runtimeVersion }}})\"}" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node16": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + }, + "Node10": { + "target": "azurermwebappdeployment.js" + }, + "Node20_1": { + "target": "azurermwebappdeployment.js", + "argumentFormat": "" + } + }, + "messages": { + "Invalidwebapppackageorfolderpathprovided": "ms-resource:loc.messages.Invalidwebapppackageorfolderpathprovided", + "SetParamFilenotfound0": "ms-resource:loc.messages.SetParamFilenotfound0", + "XDTTransformationsappliedsuccessfully": "ms-resource:loc.messages.XDTTransformationsappliedsuccessfully", + "GotconnectiondetailsforazureRMWebApp0": "ms-resource:loc.messages.GotconnectiondetailsforazureRMWebApp0", + "ErrorNoSuchDeployingMethodExists": "ms-resource:loc.messages.ErrorNoSuchDeployingMethodExists", + "UnabletoretrieveconnectiondetailsforazureRMWebApp": "ms-resource:loc.messages.UnabletoretrieveconnectiondetailsforazureRMWebApp", + "UnabletoretrieveResourceID": "ms-resource:loc.messages.UnabletoretrieveResourceID", + "Successfullyupdateddeploymenthistory": "ms-resource:loc.messages.Successfullyupdateddeploymenthistory", + "Failedtoupdatedeploymenthistory": "ms-resource:loc.messages.Failedtoupdatedeploymenthistory", + "WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ms-resource:loc.messages.WARNINGCannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite", + "Unabletoretrievewebconfigdetails": "ms-resource:loc.messages.Unabletoretrievewebconfigdetails", + "Unabletoretrievewebappsettings": "ms-resource:loc.messages.Unabletoretrievewebappsettings", + "Unabletoupdatewebappsettings": "ms-resource:loc.messages.Unabletoupdatewebappsettings", + "CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved": "ms-resource:loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdCannotBeRetrieved", + "PackageDeploymentSuccess": "ms-resource:loc.messages.PackageDeploymentSuccess", + "PackageDeploymentFailed": "ms-resource:loc.messages.PackageDeploymentFailed", + "Runningcommand": "ms-resource:loc.messages.Runningcommand", + "Deployingwebapplicationatvirtualpathandphysicalpath": "ms-resource:loc.messages.Deployingwebapplicationatvirtualpathandphysicalpath", + "Successfullydeployedpackageusingkuduserviceat": "ms-resource:loc.messages.Successfullydeployedpackageusingkuduserviceat", + "Failedtodeploywebapppackageusingkuduservice": "ms-resource:loc.messages.Failedtodeploywebapppackageusingkuduservice", + "Unabletodeploywebappresponsecode": "ms-resource:loc.messages.Unabletodeploywebappresponsecode", + "MSDeploygeneratedpackageareonlysupportedforWindowsplatform": "ms-resource:loc.messages.MSDeploygeneratedpackageareonlysupportedforWindowsplatform", + "UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove": "ms-resource:loc.messages.UnsupportedinstalledversionfoundforMSDeployversionshouldbeatleast3orabove", + "UnabletofindthelocationofMSDeployfromregistryonmachineError": "ms-resource:loc.messages.UnabletofindthelocationofMSDeployfromregistryonmachineError", + "Nopackagefoundwithspecifiedpattern": "ms-resource:loc.messages.Nopackagefoundwithspecifiedpattern", + "MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "ms-resource:loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern", + "Trytodeploywebappagainwithappofflineoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithappofflineoptionselected", + "Trytodeploywebappagainwithrenamefileoptionselected": "ms-resource:loc.messages.Trytodeploywebappagainwithrenamefileoptionselected", + "NOJSONfilematchedwithspecificpattern": "ms-resource:loc.messages.NOJSONfilematchedwithspecificpattern", + "Configfiledoesntexists": "ms-resource:loc.messages.Configfiledoesntexists", + "Failedtowritetoconfigfilewitherror": "ms-resource:loc.messages.Failedtowritetoconfigfilewitherror", + "AppOfflineModeenabled": "ms-resource:loc.messages.AppOfflineModeenabled", + "Failedtoenableappofflinemode": "ms-resource:loc.messages.Failedtoenableappofflinemode", + "AppOflineModedisabled": "ms-resource:loc.messages.AppOflineModedisabled", + "FailedtodisableAppOfflineMode": "ms-resource:loc.messages.FailedtodisableAppOfflineMode", + "CannotPerformXdtTransformationOnNonWindowsPlatform": "ms-resource:loc.messages.CannotPerformXdtTransformationOnNonWindowsPlatform", + "XdtTransformationErrorWhileTransforming": "ms-resource:loc.messages.XdtTransformationErrorWhileTransforming", + "PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "ms-resource:loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent", + "Publishusingzipdeploynotsupportedformsbuildpackage": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedformsbuildpackage", + "Publishusingzipdeploynotsupportedforvirtualapplication": "ms-resource:loc.messages.Publishusingzipdeploynotsupportedforvirtualapplication", + "Publishusingzipdeploydoesnotsupportwarfile": "ms-resource:loc.messages.Publishusingzipdeploydoesnotsupportwarfile", + "Publishusingrunfromzipwithpostdeploymentscript": "ms-resource:loc.messages.Publishusingrunfromzipwithpostdeploymentscript", + "ResourceDoesntExist": "ms-resource:loc.messages.ResourceDoesntExist", + "EncodeNotSupported": "ms-resource:loc.messages.EncodeNotSupported", + "UnknownFileEncodeError": "ms-resource:loc.messages.UnknownFileEncodeError", + "ShortFileBufferError": "ms-resource:loc.messages.ShortFileBufferError", + "FailedToUpdateAzureRMWebAppConfigDetails": "ms-resource:loc.messages.FailedToUpdateAzureRMWebAppConfigDetails", + "SuccessfullyUpdatedAzureRMWebAppConfigDetails": "ms-resource:loc.messages.SuccessfullyUpdatedAzureRMWebAppConfigDetails", + "RequestedURLforkuduphysicalpath": "ms-resource:loc.messages.RequestedURLforkuduphysicalpath", + "Physicalpathalreadyexists": "ms-resource:loc.messages.Physicalpathalreadyexists", + "KuduPhysicalpathCreatedSuccessfully": "ms-resource:loc.messages.KuduPhysicalpathCreatedSuccessfully", + "FailedtocreateKuduPhysicalPath": "ms-resource:loc.messages.FailedtocreateKuduPhysicalPath", + "FailedtocheckphysicalPath": "ms-resource:loc.messages.FailedtocheckphysicalPath", + "VirtualApplicationDoesNotExist": "ms-resource:loc.messages.VirtualApplicationDoesNotExist", + "JSONParseError": "ms-resource:loc.messages.JSONParseError", + "JSONvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.JSONvariablesubstitutionappliedsuccessfully", + "XMLvariablesubstitutionappliedsuccessfully": "ms-resource:loc.messages.XMLvariablesubstitutionappliedsuccessfully", + "failedtoUploadFileToKudu": "ms-resource:loc.messages.failedtoUploadFileToKudu", + "failedtoUploadFileToKuduError": "ms-resource:loc.messages.failedtoUploadFileToKuduError", + "ExecuteScriptOnKudu": "ms-resource:loc.messages.ExecuteScriptOnKudu", + "FailedToRunScriptOnKuduError": "ms-resource:loc.messages.FailedToRunScriptOnKuduError", + "FailedToRunScriptOnKudu": "ms-resource:loc.messages.FailedToRunScriptOnKudu", + "ScriptExecutionOnKuduSuccess": "ms-resource:loc.messages.ScriptExecutionOnKuduSuccess", + "ScriptExecutionOnKuduFailed": "ms-resource:loc.messages.ScriptExecutionOnKuduFailed", + "FailedtoDeleteFileFromKudu": "ms-resource:loc.messages.FailedtoDeleteFileFromKudu", + "FailedtoDeleteFileFromKuduError": "ms-resource:loc.messages.FailedtoDeleteFileFromKuduError", + "ScriptFileNotFound": "ms-resource:loc.messages.ScriptFileNotFound", + "InvalidScriptFile": "ms-resource:loc.messages.InvalidScriptFile", + "RetryForTimeoutIssue": "ms-resource:loc.messages.RetryForTimeoutIssue", + "stdoutFromScript": "ms-resource:loc.messages.stdoutFromScript", + "stderrFromScript": "ms-resource:loc.messages.stderrFromScript", + "WebConfigAlreadyExists": "ms-resource:loc.messages.WebConfigAlreadyExists", + "SuccessfullyGeneratedWebConfig": "ms-resource:loc.messages.SuccessfullyGeneratedWebConfig", + "FailedToGenerateWebConfig": "ms-resource:loc.messages.FailedToGenerateWebConfig", + "FailedToGetKuduFileContent": "ms-resource:loc.messages.FailedToGetKuduFileContent", + "FailedToGetKuduFileContentError": "ms-resource:loc.messages.FailedToGetKuduFileContentError", + "ScriptStatusTimeout": "ms-resource:loc.messages.ScriptStatusTimeout", + "PollingForFileTimeOut": "ms-resource:loc.messages.PollingForFileTimeOut", + "InvalidPollOption": "ms-resource:loc.messages.InvalidPollOption", + "MissingAppTypeWebConfigParameters": "ms-resource:loc.messages.MissingAppTypeWebConfigParameters", + "AutoDetectDjangoSettingsFailed": "ms-resource:loc.messages.AutoDetectDjangoSettingsFailed", + "FailedToApplyTransformation": "ms-resource:loc.messages.FailedToApplyTransformation", + "FailedToApplyTransformationReason1": "ms-resource:loc.messages.FailedToApplyTransformationReason1", + "FailedToApplyTransformationReason2": "ms-resource:loc.messages.FailedToApplyTransformationReason2", + "AutoParameterizationMessage": "ms-resource:loc.messages.AutoParameterizationMessage", + "UnsupportedAppType": "ms-resource:loc.messages.UnsupportedAppType", + "UnableToFetchAuthorityURL": "ms-resource:loc.messages.UnableToFetchAuthorityURL", + "UnableToFetchActiveDirectory": "ms-resource:loc.messages.UnableToFetchActiveDirectory", + "SuccessfullyUpdatedRuntimeStackAndStartupCommand": "ms-resource:loc.messages.SuccessfullyUpdatedRuntimeStackAndStartupCommand", + "FailedToUpdateRuntimeStackAndStartupCommand": "ms-resource:loc.messages.FailedToUpdateRuntimeStackAndStartupCommand", + "SuccessfullyUpdatedWebAppSettings": "ms-resource:loc.messages.SuccessfullyUpdatedWebAppSettings", + "FailedToUpdateAppSettingsInConfigDetails": "ms-resource:loc.messages.FailedToUpdateAppSettingsInConfigDetails", + "UnableToGetAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToGetAzureRMWebAppMetadata", + "UnableToUpdateAzureRMWebAppMetadata": "ms-resource:loc.messages.UnableToUpdateAzureRMWebAppMetadata", + "Unabletoretrieveazureregistrycredentials": "ms-resource:loc.messages.Unabletoretrieveazureregistrycredentials", + "UnableToReadResponseBody": "ms-resource:loc.messages.UnableToReadResponseBody", + "UnableToUpdateWebAppConfigDetails": "ms-resource:loc.messages.UnableToUpdateWebAppConfigDetails", + "AddingReleaseAnnotation": "ms-resource:loc.messages.AddingReleaseAnnotation", + "SuccessfullyAddedReleaseAnnotation": "ms-resource:loc.messages.SuccessfullyAddedReleaseAnnotation", + "FailedAddingReleaseAnnotation": "ms-resource:loc.messages.FailedAddingReleaseAnnotation", + "RenameLockedFilesEnabled": "ms-resource:loc.messages.RenameLockedFilesEnabled", + "FailedToEnableRenameLockedFiles": "ms-resource:loc.messages.FailedToEnableRenameLockedFiles", + "WebJobsInProgressIssue": "ms-resource:loc.messages.WebJobsInProgressIssue", + "FailedToFetchKuduAppSettings": "ms-resource:loc.messages.FailedToFetchKuduAppSettings", + "FailedToCreatePath": "ms-resource:loc.messages.FailedToCreatePath", + "FailedToDeleteFile": "ms-resource:loc.messages.FailedToDeleteFile", + "FailedToDeleteFolder": "ms-resource:loc.messages.FailedToDeleteFolder", + "FailedToUploadFile": "ms-resource:loc.messages.FailedToUploadFile", + "FailedToGetFileContent": "ms-resource:loc.messages.FailedToGetFileContent", + "FailedToListPath": "ms-resource:loc.messages.FailedToListPath", + "RetryToDeploy": "ms-resource:loc.messages.RetryToDeploy", + "FailedToGetAppServiceDetails": "ms-resource:loc.messages.FailedToGetAppServiceDetails", + "FailedToGetAppServicePublishingProfile": "ms-resource:loc.messages.FailedToGetAppServicePublishingProfile", + "FailedToUpdateAppServiceMetadata": "ms-resource:loc.messages.FailedToUpdateAppServiceMetadata", + "FailedToGetAppServiceMetadata": "ms-resource:loc.messages.FailedToGetAppServiceMetadata", + "FailedToPatchAppServiceConfiguration": "ms-resource:loc.messages.FailedToPatchAppServiceConfiguration", + "FailedToUpdateAppServiceConfiguration": "ms-resource:loc.messages.FailedToUpdateAppServiceConfiguration", + "FailedToGetAppServiceConfiguration": "ms-resource:loc.messages.FailedToGetAppServiceConfiguration", + "FailedToGetAppServicePublishingCredentials": "ms-resource:loc.messages.FailedToGetAppServicePublishingCredentials", + "FailedToGetAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToGetAppServiceApplicationSettings", + "FailedToUpdateAppServiceApplicationSettings": "ms-resource:loc.messages.FailedToUpdateAppServiceApplicationSettings", + "UpdatingAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatingAppServiceConfigurationSettings", + "UpdatedAppServiceConfigurationSettings": "ms-resource:loc.messages.UpdatedAppServiceConfigurationSettings", + "UpdatingAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatingAppServiceApplicationSettings", + "AppServiceApplicationSettingsAlreadyPresent": "ms-resource:loc.messages.AppServiceApplicationSettingsAlreadyPresent", + "AppServiceConnectionStringsAlreadyPresent": "ms-resource:loc.messages.AppServiceConnectionStringsAlreadyPresent", + "UpdatedAppServiceApplicationSettings": "ms-resource:loc.messages.UpdatedAppServiceApplicationSettings", + "MultipleResourceGroupFoundForAppService": "ms-resource:loc.messages.MultipleResourceGroupFoundForAppService", + "PackageDeploymentUsingZipDeployFailed": "ms-resource:loc.messages.PackageDeploymentUsingZipDeployFailed", + "PackageDeploymentInitiated": "ms-resource:loc.messages.PackageDeploymentInitiated", + "PackageDeploymentInitiatedWithOneDeploy": "ms-resource:loc.messages.PackageDeploymentInitiatedWithOneDeploy", + "OneDeployWithIncrementalDeploymentOption": "ms-resource:loc.messages.OneDeployWithIncrementalDeploymentOption", + "WarPackageDeploymentInitiated": "ms-resource:loc.messages.WarPackageDeploymentInitiated", + "FailedToGetDeploymentLogs": "ms-resource:loc.messages.FailedToGetDeploymentLogs", + "GoExeNameNotPresent": "ms-resource:loc.messages.GoExeNameNotPresent", + "WarDeploymentRetry": "ms-resource:loc.messages.WarDeploymentRetry", + "Updatemachinetoenablesecuretlsprotocol": "ms-resource:loc.messages.Updatemachinetoenablesecuretlsprotocol", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "XmlParsingFailed": "ms-resource:loc.messages.XmlParsingFailed", + "PropertyDoesntExistPublishProfile": "ms-resource:loc.messages.PropertyDoesntExistPublishProfile", + "InvalidConnectionType": "ms-resource:loc.messages.InvalidConnectionType", + "InvalidImageSourceType": "ms-resource:loc.messages.InvalidImageSourceType", + "InvalidPublishProfile": "ms-resource:loc.messages.InvalidPublishProfile", + "ASE_SSLIssueRecommendation": "ms-resource:loc.messages.ASE_SSLIssueRecommendation", + "ZipDeployLogsURL": "ms-resource:loc.messages.ZipDeployLogsURL", + "DeployLogsURL": "ms-resource:loc.messages.DeployLogsURL", + "AppServiceApplicationURL": "ms-resource:loc.messages.AppServiceApplicationURL", + "ASE_WebDeploySSLIssueRecommendation": "ms-resource:loc.messages.ASE_WebDeploySSLIssueRecommendation", + "FailedToGetResourceID": "ms-resource:loc.messages.FailedToGetResourceID", + "JarPathNotPresent": "ms-resource:loc.messages.JarPathNotPresent", + "FailedToUpdateApplicationInsightsResource": "ms-resource:loc.messages.FailedToUpdateApplicationInsightsResource", + "RunFromZipPreventsFileInUseError": "ms-resource:loc.messages.RunFromZipPreventsFileInUseError", + "MSDeployNotSupportTokenAuth": "ms-resource:loc.messages.MSDeployNotSupportTokenAuth", + "RunFromPackageAppsetting": "ms-resource:loc.messages.RunFromPackageAppsetting" + }, + "_buildConfigMapping": { + "Default": "5.251.0", + "Node20-225": "5.251.1" + } +} \ No newline at end of file diff --git a/_generated/AzureRmWebAppDeploymentV5_Node20/tsconfig.json b/_generated/AzureRmWebAppDeploymentV5_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AzureRmWebAppDeploymentV5_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/make-options.json b/make-options.json index 5e8c77c4f169..6a0914274321 100644 --- a/make-options.json +++ b/make-options.json @@ -47,6 +47,7 @@ "AzureResourceManagerTemplateDeploymentV3", "AzureRmWebAppDeploymentV3", "AzureRmWebAppDeploymentV4", + "AzureRmWebAppDeploymentV5", "AzureSpringCloudV0", "AzureStaticWebAppV0", "AzureWebAppV1", @@ -271,7 +272,8 @@ "XamarinAndroidV1", "CondaEnvironmentV0", "CondaEnvironmentV1", - "OpenPolicyAgentInstallerV0" + "OpenPolicyAgentInstallerV0", + "AzureRmWebAppDeploymentV5" ], "Node20_229_1": [ "CargoAuthenticateV0",