diff --git a/Tasks/ANT/task.json b/Tasks/ANT/task.json
index 78bb74ef7131..28b23074fa2b 100644
--- a/Tasks/ANT/task.json
+++ b/Tasks/ANT/task.json
@@ -8,12 +8,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 58
+ "Patch": 59
},
"demands": [
"ant"
diff --git a/Tasks/ANT/task.loc.json b/Tasks/ANT/task.loc.json
index 3b082f3a564d..408c2e30caea 100644
--- a/Tasks/ANT/task.loc.json
+++ b/Tasks/ANT/task.loc.json
@@ -9,11 +9,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 58
+ "Patch": 59
},
"demands": [
"ant"
diff --git a/Tasks/AndroidBuild/AndroidBuild.ps1 b/Tasks/AndroidBuild/AndroidBuild.ps1
deleted file mode 100644
index a31c719873d3..000000000000
--- a/Tasks/AndroidBuild/AndroidBuild.ps1
+++ /dev/null
@@ -1,72 +0,0 @@
-param(
- [string]$gradleWrapper, # Path to gradle wrapper. Empty if using gradle installation.
- [string]$gradleProj, # Optional - Root directory of gradle project. Defaults to root of working directory if empty.
- [string]$gradleArguments, # Gradle arguments
- [string]$avdName, # Android Virtual Device name
- [string]$createAvd, # Create the named AVD
- [string]$emulatorTarget, # Emulator target version (keep name for back compat)
- [string]$emulatorDevice, # Emulator device (keep name for back compat)
- [string]$avdAbi, # Emulator ABI
- [string]$avdForce, # Overwrite existing AVD (--force)
- [string]$avdOptionalArgs, # Optional args passed to "android create avd"
- [string]$startEmulator, # True if emulator start required. Converted to Boolean
- [string]$emulatorTimeout, # Timeout value when waiting for emulator to start
- [string]$emulatorHeadless, # Headless display
- [string]$emulatorOptionalArgs, # Optional arguments to "tools/emulator"
- [string]$deleteAvd # Delete AVD
-)
-
-Write-Warning "The Android Build task has been deprecated. Use the Gradle task instead. See https://go.microsoft.com/fwlink/?LinkID=613720."
-
-Write-Verbose "Entering script AndroidBuild.ps1"
-Write-Verbose "gradleWrapper = $gradleWrapper"
-Write-Verbose "gradleProj = $gradleProj"
-Write-Verbose "gradleArguments = $gradleArguments"
-Write-Verbose "avdName = $avdName"
-Write-Verbose "createAvd = $createAvd"
-Write-Verbose "emulatorTarget = $emulatorTarget"
-Write-Verbose "emulatorDevice = $emulatorDevice"
-Write-Verbose "avdAbi = $avdAbi"
-Write-Verbose "avdForce = $avdForce"
-Write-Verbose "avdOptionalArgs = $avdOptionalArgs"
-Write-Verbose "startEmulator = $startEmulator"
-Write-Verbose "emulatorTimeout = $emulatorTimeout"
-Write-Verbose "emulatorHeadless = $emulatorHeadless"
-Write-Verbose "emulatorOptionalArgs = $emulatorOptionalArgs"
-Write-Verbose "deleteAvd = $deleteAvd"
-
-# Import the Task.Common and Task.Internal dll that has all the cmdlets we need for Build
-import-module "Microsoft.TeamFoundation.DistributedTask.Task.Internal"
-import-module "Microsoft.TeamFoundation.DistributedTask.Task.Common"
-
-
-# Set the paths of the Start and Kill Android Emulator scripts, which are in the same directory as AndroidBuild.ps1
-$PSScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
-$StartEmulatorScript = Join-Path -Path $PSScriptRoot -ChildPath "StartAndroidEmulator.ps1"
-$KillEmulatorScript = Join-Path -Path $PSScriptRoot -ChildPath "KillAndroidEmulator.ps1"
-
-# Always invoke the start up script, let the script handle create and start emulator checks
-$createAvdArgs = "-avdName `"$avdName`" -createAvd $createAvd -avdTarget `"$emulatorTarget`" -avdDevice `"$emulatorDevice`" -avdAbi `"$avdAbi`" -avdForceOverwrite $avdForce -avdOptionalArgs `"$avdOptionalArgs`""
-$emulatorArgs = "-startEmulator $startEmulator -timeout `"$emulatorTimeout`" -headlessEmulator $emulatorHeadless -emulatorOptionalArgs `"$emulatorOptionalArgs`""
-$startEmulatorCommand = "& `"$StartEmulatorScript`" $createAvdArgs $emulatorArgs"
-Write-Verbose "Calling start emulator script: $startEmulatorCommand"
-Invoke-Expression -Command $startEmulatorCommand
-
-# Use Gradle Wrapper
-if ([System.IO.File]::Exists($gradleWrapper))
-{
- Write-Verbose "Invoking gradle wrapper $gradleWrapper with arguments $gradleArguments in working directory $gradleProj"
- Invoke-BatchScript $gradleWrapper -Arguments $gradleArguments -WorkingFolder $gradleProj
-}
-else
-{
- throw "Unable to find script $gradleWrapper"
-}
-
-# Always invoke the post build script, emulator must be stopped if we started it
-# otherwise task hangs
-$killEmulatorCommand = "& `"$KillEmulatorScript`" `"$avdName`" $startEmulator $deleteAvd"
-Write-Verbose "Calling stop emulator script with command: $killEmulatorCommand"
-Invoke-Expression -Command $killEmulatorCommand
-
-Write-Verbose "Leaving script AndroidBuild.ps1"
diff --git a/Tasks/AndroidBuild/KillAndroidEmulator.ps1 b/Tasks/AndroidBuild/KillAndroidEmulator.ps1
deleted file mode 100644
index 0ce7e0287278..000000000000
--- a/Tasks/AndroidBuild/KillAndroidEmulator.ps1
+++ /dev/null
@@ -1,58 +0,0 @@
-param(
- [string]$avdName,
- [string]$startEmulator,
- [string]$deleteAvd
-)
-
-Write-Verbose "Entering script KillAndroidEmulator.ps1"
-Write-Verbose "avdName = $avdName"
-
-$emulatorStarted = Convert-String $startEmulator Boolean
-Write-Verbose "stopEmulatorChecked (converted) = $emulatorStarted"
-$deleteAvdChecked = Convert-String $deleteAvd Boolean
-Write-Verbose "deleteAvdChecked (converted) = $deleteAvdChecked"
-
-
-if ($emulatorStarted)
-{
- $emulatorPid = $env:EMULATOR_PID
-
- if ($env:ANDROID_HOME -eq $null)
- {
- throw 'Environment variable not set: ANDROID_HOME'
- }
-
- $adbexe = $env:ANDROID_HOME + "\platform-tools\adb.exe"
- if (!(Test-Path -Path $adbexe))
- {
- throw "File not found: $adbexe"
- }
-
- $androidbat = $env:ANDROID_HOME + "\tools\android.bat"
- if (!(Test-Path -Path $androidbat))
- {
- throw "File not found: $androidbat"
- }
-
- if ($emulatorPid)
- {
- $emulators = Get-WmiObject -Class Win32_Process -Filter "ParentProcessID=$emulatorPid"
- if ($emulators)
- {
- # Delete emulator device. Stop-Process is used because Wait-Job or Stop-Job hangs.
- # Emulator.exe is the parent process which spawns the actual child emulator processes
- Stop-Process $emulators.ProcessId
- }
- }
-
- if ($deleteAvdChecked)
- {
- & $androidbat delete avd -n $avdName
- }
-
- # Stop any Android Debug Bridge process, otherwise the task may hang.
- & $adbexe kill-server
- Stop-Process -processname 'adb' 2> $null
-}
-
-Write-Verbose "Leaving script KillAndroidEmulator.ps1"
diff --git a/Tasks/AndroidBuild/StartAndroidEmulator.ps1 b/Tasks/AndroidBuild/StartAndroidEmulator.ps1
deleted file mode 100755
index a64c359cb5f7..000000000000
--- a/Tasks/AndroidBuild/StartAndroidEmulator.ps1
+++ /dev/null
@@ -1,189 +0,0 @@
-param(
- [string]$createAvd, # Create AVD
- [string]$avdName, # Name of AVD
- [string]$avdTarget, # AVD target version
- [string]$avdDevice, # AVD device
- [string]$avdAbi, # AVD ABI
- [string]$avdForceOverwrite, # Force overwrite existing AVD
- [string]$avdOptionalArgs, # AVD Optional args
- [string]$startEmulator, # True if emulator start required. Converted to Boolean
- [string]$headlessEmulator, # Avoid showing the emulator interface if true
- [int]$timeout # Length of time allowed per try
-)
-
-Write-Verbose "Entering script StartAndroidEmulator.ps1"
-Write-Verbose "createAvd = $createAvd"
-Write-Verbose "avdTarget = $avdTarget"
-Write-Verbose "avdDevice = $avdDevice"
-Write-Verbose "avdName = $avdName"
-Write-Verbose "avdAbi = $avdAbi"
-Write-Verbose "avdForceOverwrite = $avdForceOverwrite"
-Write-Verbose "avdOptionalArgs = $avdOptionalArgs"
-Write-Verbose "headlessEmulator = $headlessEmulator"
-Write-Verbose "timeout = $timeout seconds"
-
-$startEmulatorChecked = Convert-String $startEmulator Boolean
-Write-Verbose "startEmulatorChecked (converted) = $startEmulatorChecked"
-$emulatorHeadlessChecked = Convert-String $headlessEmulator Boolean
-Write-Verbose "emulatorHeadlessChecked (converted) = $emulatorHeadlessChecked"
-$createAvdChecked = Convert-String $createAvd Boolean
-Write-Verbose "createAvdChecked (converted) = $createAvdChecked"
-$avdForceOverwriteChecked = Convert-String $avdForceOverwrite Boolean
-Write-Verbose "avdForceOverwriteChecked (converted) = $avdForceOverwriteChecked"
-
-function Start-EmulatorProcess
-{
- param([string]$arguments)
-
- Push-Location $env:ANDROID_HOME
-
- $processStartInfo = New-Object System.Diagnostics.ProcessStartInfo
- $processStartInfo.FileName = $env:ANDROID_HOME + "\tools\emulator.exe"
- $processStartInfo.Arguments = $arguments
- $processStartInfo.UseShellExecute = $false
- $processStartInfo.CreateNoWindow = $true
- $processStartInfo.RedirectStandardOutput = $true
-
- $process = New-Object System.Diagnostics.Process
- $process.StartInfo = $processStartInfo
-
- # Start the process
- $process.Start()
-
- Pop-Location
-
- return $process
-}
-
-function Clean-EmulatorProcess
-{
- param([int]$emulatorPid)
-
- if ($emulatorPid)
- {
- $emulators = Get-WmiObject -Class Win32_Process -Filter "ParentProcessID=$emulatorPid"
- if ($emulators)
- {
- Stop-Process $emulators.ProcessId
- }
- }
-
- # Stop any Android Debug Bridge process we started, otherwise the task may hang.
- # adb process sometimes restarts itself so we may need to kill adb again after kill the emulator
- & $adbexe kill-server
- Stop-Process -processname 'adb' 2> $null
-}
-
-if ($createAvdChecked)
-{
- if ($env:ANDROID_HOME -eq $null)
- {
- throw 'Environment variable not set: ANDROID_HOME'
- }
-
- $androidbat = $env:ANDROID_HOME + "\tools\android.bat"
- if (!(Test-Path -Path $androidbat))
- {
- throw "File not found: $androidbat"
- }
-
- # Create an emulator device
- # Exit code always returns 0. Assume success and if this failed, we will report failure later on
- $createAvdCmd = "& `"$androidbat`" create avd --name `"$avdName`" --target $avdTarget --device `"$avdDevice`" --abi $avdAbi $avdOptionalArgs"
-
- if ($avdForceOverwriteChecked)
- {
- $createAvdCmd = "$createAvdCmd --force"
- }
-
- Write-Verbose "Creating AVD with: $createAvdCmd"
- Invoke-Expression -Command $createAvdCmd
-}
-
-if ($startEmulatorChecked)
-{
- if ($env:ANDROID_HOME -eq $null)
- {
- throw 'Environment variable not set: ANDROID_HOME'
- }
-
- $adbexe = $env:ANDROID_HOME + "\platform-tools\adb.exe"
- if (!(Test-Path -Path $adbexe))
- {
- throw "File not found: $adbexe"
- }
-
- # Start emulator
- # Exit code always returns 0. Assume success and if this failed, we will report failure later on
- Push-Location $env:ANDROID_HOME
- $emulatorArgs = "-avd `"$avdName`" -prop persist.sys.language=en -prop persist.sys.country=US $emulatorOptionalArgs"
- if ($emulatorHeadlessChecked)
- {
- $emulatorArgs = "$emulatorArgs -no-skin -no-audio -no-window"
- }
-
- Write-Verbose "Starting emulator with: $emulatorArgs"
- $emulatorProcess = Start-EmulatorProcess -arguments $emulatorArgs
-
- # Record the parent process id so we will only kill what we started
- $env:EMULATOR_PID=$emulatorProcess.Id
-
- Pop-Location
-
- # Connect to emulator
- & $adbexe start-server
-
- # Script block containing WaitADBProperty. Putting function in script block so it can be called by job.
- $adbBlock = {
- function WaitADBProperty {
- param(
- [string]$property,
- [string]$expectedOutput,
- [int]$timeout = 10
- )
- Write-Verbose "Waiting for property $property to be $expectedOutput"
- $adbexe = $env:ANDROID_HOME + "\platform-tools\adb.exe"
- $adbOutput = 0
- while($adbOutput[0] -ne $expectedOutput) {
- ($adbPropertyJob = Start-Job -ScriptBlock {
- param($adbexe, $property)
- & $adbexe shell getprop $property 2> $null
- } -Argumentlist $adbexe, $property) | Out-Null
- Wait-Job $adbPropertyJob -Timeout $timeout| Out-Null
- Receive-Job $adbPropertyJob -OutVariable adbOutput | Out-Null
- }
- }
- }
-
- # Running together as a job allows us to set a time out.
- $bootJob = Start-Job -InitializationScript $adbBlock -ScriptBlock {
- WaitADBProperty "dev.bootcomplete" "1"
- WaitADBProperty "sys.boot_completed" "1"
- WaitADBProperty "init.svc.bootanim" "stopped"
- return $TRUE
- }
-
- Write-Host "Wait for $timeout seconds for emulator to start..."
- Wait-Job $bootJob -Timeout $timeout | Out-Null
- Receive-Job $bootJob -OutVariable bootCompleted | Out-Null
-
- # List attached emulator devices
- & $adbexe devices -l
-
- # Check if emulator booted up successfully
- if ([boolean]$bootCompleted -ne $TRUE)
- {
- # Must clean up otherwise the task hangs here
- # Kill whatever process we started
- Clean-EmulatorProcess $emulatorProcess.Id
-
- Write-Verbose "Emulator property dev.bootcomplete, sys.boot_completed and init.svc.bootanim do not indicate emulator was started up completely."
- throw "Error: Emulator failed to start within $timeout seconds."
- }
-
- # Stop any Android Debug Bridge process we started, otherwise the task may hang.
- & $adbexe kill-server
- Stop-Process -processname 'adb' 2> $null
-}
-
-Write-Verbose "Leaving script StartAndroidEmulator.ps1"
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/de-de/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/de-de/resources.resjson
deleted file mode 100644
index ce0c22492c0f..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/de-de/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android-Build (veraltet, verwenden Sie Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Erstellen Sie eine Android-App mithilfe von Gradle, und starten Sie optional den Emulator für Komponententests.",
- "loc.instanceNameFormat": "Android-Build $(gradleProj)",
- "loc.group.displayName.avdOptions": "Optionen für virtuelle Android-Geräte (AVD)",
- "loc.group.displayName.emulatorOptions": "Emulatoroptionen",
- "loc.input.label.gradleWrapper": "Speicherort des Gradle-Wrappers",
- "loc.input.label.gradleProj": "Projektverzeichnis",
- "loc.input.label.gradleArguments": "Gradle-Argumente",
- "loc.input.label.avdName": "Name",
- "loc.input.help.avdName": "Der Name des zu startenden oder zu erstellenden virtuellen Android-Geräts (AVD).",
- "loc.input.label.createAvd": "AVD erstellen",
- "loc.input.help.createAvd": "Erstellt das benannte virtuelle Android-Gerät (AVD).",
- "loc.input.label.emulatorTarget": "AVD-Ziel-SDK",
- "loc.input.help.emulatorTarget": "Die Ziel-ID des neuen virtuellen Android-Geräts (AVD).",
- "loc.input.label.emulatorDevice": "AVD-Gerät",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD-ABI",
- "loc.input.help.avdAbi": "Die für das virtuelle Android-Gerät (AVD) zu verwendende ABI.",
- "loc.input.label.avdForce": "Vorhandenes AVD überschreiben",
- "loc.input.help.avdForce": "Die Übergabe wird ausgeführt – Befehl \"android create avd\" erzwingen.",
- "loc.input.label.avdOptionalArgs": "Optionale AVD-Argumente erstellen",
- "loc.input.help.avdOptionalArgs": "Zusätzliche Argumente, die an \"android create avd\" übergeben werden.",
- "loc.input.label.startEmulator": "Android-Emulator starten und beenden",
- "loc.input.help.startEmulator": "Starten und beenden Sie den Android-Emulator nach Abschluss dieser Aufgabe.",
- "loc.input.label.emulatorTimeout": "Zeitüberschreitung in Sekunden",
- "loc.input.help.emulatorTimeout": "Wie lange der Buildvorgang auf den Start des Emulators wartet.",
- "loc.input.label.emulatorHeadless": "Monitorlose Anzeige",
- "loc.input.help.emulatorHeadless": "Verwenden Sie \"-no-skin -no-audio -no-window\" beim Starten des Emulators.",
- "loc.input.label.emulatorOptionalArgs": "Optionale Emulatorargumente",
- "loc.input.help.emulatorOptionalArgs": "Zusätzliche Argumente, die an Android \"tools\\emulator\" übergeben werden.",
- "loc.input.label.deleteAvd": "AVD löschen"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/en-US/resources.resjson
deleted file mode 100644
index eb8c8f442dd7..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/en-US/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android Build (deprecated; use Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Build an Android app using Gradle and optionally start the emulator for unit tests",
- "loc.instanceNameFormat": "Android Build $(gradleProj)",
- "loc.group.displayName.avdOptions": "Android Virtual Device (AVD) Options",
- "loc.group.displayName.emulatorOptions": "Emulator Options",
- "loc.input.label.gradleWrapper": "Location of Gradle Wrapper",
- "loc.input.label.gradleProj": "Project Directory",
- "loc.input.label.gradleArguments": "Gradle Arguments",
- "loc.input.label.avdName": "Name",
- "loc.input.help.avdName": "Name of the Android Virtual Device (AVD) to be started or created.",
- "loc.input.label.createAvd": "Create AVD",
- "loc.input.help.createAvd": "Create the named Android Virtual Device (AVD).",
- "loc.input.label.emulatorTarget": "AVD Target SDK",
- "loc.input.help.emulatorTarget": "Target ID of the new Android Virtual Device (AVD).",
- "loc.input.label.emulatorDevice": "AVD Device",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "The ABI to use for the Android Virtual Device (AVD).",
- "loc.input.label.avdForce": "Overwrite Existing AVD",
- "loc.input.help.avdForce": "Passing --force to 'android create avd' command.",
- "loc.input.label.avdOptionalArgs": "Create AVD Optional Arguments",
- "loc.input.help.avdOptionalArgs": "Additional arguments passed to 'android create avd'.",
- "loc.input.label.startEmulator": "Start and Stop Android Emulator",
- "loc.input.help.startEmulator": "Start Android emulator and stop emulator after this task finishes.",
- "loc.input.label.emulatorTimeout": "Timeout in Seconds",
- "loc.input.help.emulatorTimeout": "How long build will wait for the emulator to start.",
- "loc.input.label.emulatorHeadless": "Headless Display",
- "loc.input.help.emulatorHeadless": "Use '-no-skin -no-audio -no-window' when start the emulator.",
- "loc.input.label.emulatorOptionalArgs": "Emulator Optional Arguments",
- "loc.input.help.emulatorOptionalArgs": "Additional arguments passed to Android 'tools\\emulator'.",
- "loc.input.label.deleteAvd": "Delete AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/es-es/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/es-es/resources.resjson
deleted file mode 100644
index 61d754c30894..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/es-es/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Compilación de Android (en desuso, use Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Compilar una aplicación Android con Gradle y, opcionalmente, iniciar el emulador para realizar pruebas unitarias",
- "loc.instanceNameFormat": "Compilación de Android $(gradleProj)",
- "loc.group.displayName.avdOptions": "Opciones de dispositivo virtual Android (AVD)",
- "loc.group.displayName.emulatorOptions": "Opciones del emulador",
- "loc.input.label.gradleWrapper": "Ubicación del contenedor de Gradle",
- "loc.input.label.gradleProj": "Directorio del proyecto",
- "loc.input.label.gradleArguments": "Argumentos de Gradle",
- "loc.input.label.avdName": "Nombre",
- "loc.input.help.avdName": "Nombre del dispositivo virtual Android (AVD) que se va a iniciar o crear.",
- "loc.input.label.createAvd": "Crear AVD",
- "loc.input.help.createAvd": "Cree el dispositivo virtual Android (AVD) con nombre.",
- "loc.input.label.emulatorTarget": "SDK de destino AVD",
- "loc.input.help.emulatorTarget": "Id. de destino del nuevo dispositivo virtual Android (AVD).",
- "loc.input.label.emulatorDevice": "Dispositivo AVD",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "ABI AVD",
- "loc.input.help.avdAbi": "ABI que se va a usar para el dispositivo virtual Android (AVD).",
- "loc.input.label.avdForce": "Sobrescribir AVD existente",
- "loc.input.help.avdForce": "Pasando --force al comando 'android create avd'.",
- "loc.input.label.avdOptionalArgs": "Crear argumentos opcionales de AVD",
- "loc.input.help.avdOptionalArgs": "Argumentos adicionales pasados a \"android create avd\".",
- "loc.input.label.startEmulator": "Iniciar y detener el emulador de Android",
- "loc.input.help.startEmulator": "Inicie el emulador de Android y deténgalo cuando esta tarea acabe.",
- "loc.input.label.emulatorTimeout": "Tiempo de espera en segundos",
- "loc.input.help.emulatorTimeout": "Tiempo que el compilador espera a que el emulador se inicie.",
- "loc.input.label.emulatorHeadless": "Emulador de pantalla",
- "loc.input.help.emulatorHeadless": "Use \"-no-skin -no-audio -no-window\" cuando inicie el emulador.",
- "loc.input.label.emulatorOptionalArgs": "Argumentos opcionales de emulador",
- "loc.input.help.emulatorOptionalArgs": "Argumentos adicionales pasados a \"tools\\emulator\" de Android.",
- "loc.input.label.deleteAvd": "Eliminar AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/fr-fr/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/fr-fr/resources.resjson
deleted file mode 100644
index e3399e6a1bd4..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/fr-fr/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Build Android (déconseillé, utiliser Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Générer une application Android à l'aide de Gradle et démarrer éventuellement l'émulateur pour les tests unitaires",
- "loc.instanceNameFormat": "Build Android $(gradleProj)",
- "loc.group.displayName.avdOptions": "Options de l'appareil virtuel Android",
- "loc.group.displayName.emulatorOptions": "Options de l'émulateur",
- "loc.input.label.gradleWrapper": "Emplacement du wrapper Gradle",
- "loc.input.label.gradleProj": "Répertoire du projet",
- "loc.input.label.gradleArguments": "Arguments Gradle",
- "loc.input.label.avdName": "Nom",
- "loc.input.help.avdName": "Nom de l'appareil virtuel Android à démarrer ou créer.",
- "loc.input.label.createAvd": "Créer un AVD",
- "loc.input.help.createAvd": "Créez l'appareil virtuel Android nommé.",
- "loc.input.label.emulatorTarget": "Kit de développement logiciel (SDK) cible AVD",
- "loc.input.help.emulatorTarget": "ID cible du nouvel appareil virtuel Android.",
- "loc.input.label.emulatorDevice": "Appareil AVD",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "ABI AVD",
- "loc.input.help.avdAbi": "ABI à utiliser pour l'appareil virtuel Android.",
- "loc.input.label.avdForce": "Remplacer l'AVD existant",
- "loc.input.help.avdForce": "Transmission --forcée vers la commande 'android create avd'.",
- "loc.input.label.avdOptionalArgs": "Créer des arguments facultatifs AVD",
- "loc.input.help.avdOptionalArgs": "Arguments supplémentaires passés à 'android create avd'.",
- "loc.input.label.startEmulator": "Démarrer et arrêter l'émulateur Android",
- "loc.input.help.startEmulator": "Démarrez l'émulateur Android et arrêtez-le à la fin de cette tâche.",
- "loc.input.label.emulatorTimeout": "Délai d'expiration en secondes",
- "loc.input.help.emulatorTimeout": "Durée d'attente de la build avant le démarrage de l'émulateur.",
- "loc.input.label.emulatorHeadless": "Affichage sans périphérique de contrôle",
- "loc.input.help.emulatorHeadless": "Utilisez '-no-skin -no-audio -no-window' au démarrage de l'émulateur.",
- "loc.input.label.emulatorOptionalArgs": "Arguments facultatifs de l'émulateur",
- "loc.input.help.emulatorOptionalArgs": "Arguments supplémentaires passés à 'tools\\emulator' Android.",
- "loc.input.label.deleteAvd": "Supprimer un AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/it-IT/resources.resjson
deleted file mode 100644
index 47975f02cdee..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/it-IT/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Compilazione Android (deprecata; usare Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Consente di compilare un'app per Android con Gradle e facoltativamente di avviare l'emulatore per gli unit test",
- "loc.instanceNameFormat": "Build Android $(gradleProj)",
- "loc.group.displayName.avdOptions": "Opzioni del dispositivo virtuale Android (AVD)",
- "loc.group.displayName.emulatorOptions": "Opzioni emulatore",
- "loc.input.label.gradleWrapper": "Percorso del wrapper di Gradle",
- "loc.input.label.gradleProj": "Directory del progetto",
- "loc.input.label.gradleArguments": "Argomenti di Gradle",
- "loc.input.label.avdName": "Nome",
- "loc.input.help.avdName": "Nome del dispositivo virtuale Android (AVD) da avviare o creare.",
- "loc.input.label.createAvd": "Crea AVD",
- "loc.input.help.createAvd": "Crea il dispositivo virtuale Android (AVD) denominato.",
- "loc.input.label.emulatorTarget": "SDK di destinazione AVD",
- "loc.input.help.emulatorTarget": "ID di destinazione del nuovo dispositivo virtuale Android (AVD).",
- "loc.input.label.emulatorDevice": "Dispositivo AVD",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "ABI AVD",
- "loc.input.help.avdAbi": "ABI da usare per il dispositivo virtuale Android (AVD).",
- "loc.input.label.avdForce": "Sovrascrivi AVD esistente",
- "loc.input.help.avdForce": "Passaggio di --force al comando 'android create avd'.",
- "loc.input.label.avdOptionalArgs": "Argomenti facoltativi creazione AVD",
- "loc.input.help.avdOptionalArgs": "Argomenti aggiuntivi passati ad 'android create avd'.",
- "loc.input.label.startEmulator": "Avvia e arresta emulatore Android",
- "loc.input.help.startEmulator": "Avvia l'emulatore Android e lo arresta al termine di questa attività.",
- "loc.input.label.emulatorTimeout": "Timeout in secondi",
- "loc.input.help.emulatorTimeout": "Indica per quanto tempo la build attenderà l'avvio dell'emulatore.",
- "loc.input.label.emulatorHeadless": "Visualizzazione headless",
- "loc.input.help.emulatorHeadless": "All'avvio dell'emulatore usare '-no-skin -no-audio -no-window'.",
- "loc.input.label.emulatorOptionalArgs": "Argomenti facoltativi emulatore",
- "loc.input.help.emulatorOptionalArgs": "Argomenti aggiuntivi passati a 'tools\\emulator' Android.",
- "loc.input.label.deleteAvd": "Elimina AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/ja-jp/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/ja-jp/resources.resjson
deleted file mode 100644
index f56d8041c1cd..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/ja-jp/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android のビルド (非推奨。Gradle をご使用ください)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Gradle を使用して Android アプリを作成し、必要に応じて単体テストのエミュレーターを起動します",
- "loc.instanceNameFormat": "Android のビルド $(gradleProj)",
- "loc.group.displayName.avdOptions": "Android 仮想デバイス (AVD) のオプション",
- "loc.group.displayName.emulatorOptions": "エミュレーター オプション",
- "loc.input.label.gradleWrapper": "Gradle ラッパーの場所",
- "loc.input.label.gradleProj": "プロジェクト ディレクトリ",
- "loc.input.label.gradleArguments": "Gradle の引数",
- "loc.input.label.avdName": "名前",
- "loc.input.help.avdName": "起動または作成する Android 仮想デバイス (AVD) の名前。",
- "loc.input.label.createAvd": "AVD の作成",
- "loc.input.help.createAvd": "名前が指定された Android 仮想デバイス (AVD) を作成します。",
- "loc.input.label.emulatorTarget": "AVD のターゲット SDK",
- "loc.input.help.emulatorTarget": "新しい Android 仮想デバイス (AVD) のターゲット ID。",
- "loc.input.label.emulatorDevice": "AVD デバイス",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "Android 仮想デバイス (AVD) で使用する ABI。",
- "loc.input.label.avdForce": "既存の AVD の上書き",
- "loc.input.help.avdForce": "'android create avd' コマンドに --force を渡しています。",
- "loc.input.label.avdOptionalArgs": "AVD の省略可能な引数の作成",
- "loc.input.help.avdOptionalArgs": "'Android 作成 avd' に渡すその他の引数。",
- "loc.input.label.startEmulator": "Android エミュレーターの開始と停止",
- "loc.input.help.startEmulator": "Android エミュレーターを起動し、このタスクが終了したらエミュレーターを停止します。",
- "loc.input.label.emulatorTimeout": "タイムアウト (秒)",
- "loc.input.help.emulatorTimeout": "エミュレーターが起動するまでビルドが待機する時間。",
- "loc.input.label.emulatorHeadless": "ヘッドレス表示",
- "loc.input.help.emulatorHeadless": "エミュレーターの起動時に '-no-skin -no-audio -no-window' を使用します。",
- "loc.input.label.emulatorOptionalArgs": "エミュレーターの省略可能な引数",
- "loc.input.help.emulatorOptionalArgs": "Android の 'tools\\emulator' に渡すその他の引数。",
- "loc.input.label.deleteAvd": "AVD の削除"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/ko-KR/resources.resjson
deleted file mode 100644
index 1c3a3d23a1e5..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/ko-KR/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android 빌드(사용되지 않음, Gradle 사용)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Gradle을 사용하여 Android 앱을 빌드하고 원하는 경우 단위 테스트를 수행하기 위해 에뮬레이터 시작할 수 있습니다.",
- "loc.instanceNameFormat": "Android 빌드 $(gradleProj)",
- "loc.group.displayName.avdOptions": "AVD(Android 가상 장치) 옵션",
- "loc.group.displayName.emulatorOptions": "에뮬레이터 옵션",
- "loc.input.label.gradleWrapper": "Gradle 래퍼 위치",
- "loc.input.label.gradleProj": "프로젝트 디렉터리",
- "loc.input.label.gradleArguments": "Gradle 인수",
- "loc.input.label.avdName": "이름",
- "loc.input.help.avdName": "시작하거나 만들 AVD(Android 가상 장치)의 이름입니다.",
- "loc.input.label.createAvd": "AVD 만들기",
- "loc.input.help.createAvd": "명명된 AVD(Android 가상 장치)를 만듭니다.",
- "loc.input.label.emulatorTarget": "AVD 대상 SDK",
- "loc.input.help.emulatorTarget": "새 AVD(Android 가상 장치)의 대상 ID입니다.",
- "loc.input.label.emulatorDevice": "AVD 장치",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "AVD(Android 가상 장치)에 사용할 ABI입니다.",
- "loc.input.label.avdForce": "기존 AVD 덮어쓰기",
- "loc.input.help.avdForce": "'android create avd' 명령에 --force를 전달하는 중입니다.",
- "loc.input.label.avdOptionalArgs": "AVD 선택적 인수 만들기",
- "loc.input.help.avdOptionalArgs": "추가 인수를 'android create avd'에 전달했습니다.",
- "loc.input.label.startEmulator": "Android 에뮬레이터 시작 및 중지",
- "loc.input.help.startEmulator": "Android 에뮬레이터를 시작하고 이 작업이 끝나면 에뮬레이터를 중지하세요.",
- "loc.input.label.emulatorTimeout": "시간 제한(초)",
- "loc.input.help.emulatorTimeout": "빌드에서 에뮬레이터가 시작될 때까지 대기하는 시간입니다.",
- "loc.input.label.emulatorHeadless": "헤드리스 표시",
- "loc.input.help.emulatorHeadless": "에뮬레이터를 시작할 때 '-no-skin -no-audio -no-window'를 사용하세요.",
- "loc.input.label.emulatorOptionalArgs": "에뮬레이터 선택적 인수",
- "loc.input.help.emulatorOptionalArgs": "추가 인수를 Android 'tools\\emulator'에 전달했습니다.",
- "loc.input.label.deleteAvd": "AVD 삭제"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/ru-RU/resources.resjson
deleted file mode 100644
index d345643e3084..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/ru-RU/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Сборка Android (не рекомендуется; используйте Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "Сборка приложения Android с помощью Gradle и при необходимости запуск эмулятора для модульных тестов",
- "loc.instanceNameFormat": "Сборка Android $(gradleProj)",
- "loc.group.displayName.avdOptions": "Параметры виртуального устройства Android (AVD)",
- "loc.group.displayName.emulatorOptions": "Параметры эмулятора",
- "loc.input.label.gradleWrapper": "Расположение программы-оболочки Gradle",
- "loc.input.label.gradleProj": "Каталог проекта",
- "loc.input.label.gradleArguments": "Аргументы Gradle",
- "loc.input.label.avdName": "Имя",
- "loc.input.help.avdName": "Имя запускаемого или создаваемого виртуального устройства Android (AVD).",
- "loc.input.label.createAvd": "Создать AVD",
- "loc.input.help.createAvd": "Создание именованного виртуального устройства Android (AVD).",
- "loc.input.label.emulatorTarget": "Целевой пакет SDK AVD",
- "loc.input.help.emulatorTarget": "Целевой идентификатор нового виртуального устройства Android (AVD).",
- "loc.input.label.emulatorDevice": "Устройство AVD",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "ABI, используемый для виртуального устройства Android (AVD).",
- "loc.input.label.avdForce": "Перезаписать существующее устройство AVD",
- "loc.input.help.avdForce": "Передача параметра --force в команду \"android create avd\".",
- "loc.input.label.avdOptionalArgs": "Создать дополнительные аргументы AVD",
- "loc.input.help.avdOptionalArgs": "Дополнительные аргументы, передаваемые команде \"android create avd\".",
- "loc.input.label.startEmulator": "Запуск и остановка эмулятора Android",
- "loc.input.help.startEmulator": "Запустите эмулятор Android и остановите его после завершения задачи.",
- "loc.input.label.emulatorTimeout": "Время ожидания в секундах",
- "loc.input.help.emulatorTimeout": "Время ожидания сборкой запуска эмулятора.",
- "loc.input.label.emulatorHeadless": "Виртуальный дисплей",
- "loc.input.help.emulatorHeadless": "Используйте параметры \"-no-skin -no-audio -no-window\" при запуске эмулятора.",
- "loc.input.label.emulatorOptionalArgs": "Дополнительные аргументы эмулятора",
- "loc.input.help.emulatorOptionalArgs": "Дополнительные аргументы, передаваемые команде Android \"tools\\emulator\".",
- "loc.input.label.deleteAvd": "Удалить AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/zh-CN/resources.resjson
deleted file mode 100644
index 584eb2c99734..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/zh-CN/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android 生成(已弃用; 使用 Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "使用 Gradle 生成 Android 应用,可选择启动用于单元测试的仿真器",
- "loc.instanceNameFormat": "Android 版本 $(gradleProj)",
- "loc.group.displayName.avdOptions": "Android 虚拟设备(AVD)选项",
- "loc.group.displayName.emulatorOptions": "模拟器选项",
- "loc.input.label.gradleWrapper": "Gradle 包装器的位置",
- "loc.input.label.gradleProj": "项目目录",
- "loc.input.label.gradleArguments": "Gradle 参数",
- "loc.input.label.avdName": "名称",
- "loc.input.help.avdName": "要启动或创建的 Android 虚拟设备(AVD)的名称。",
- "loc.input.label.createAvd": "创建 AVD",
- "loc.input.help.createAvd": "创建命名 Android 虚拟设备(AVD)。",
- "loc.input.label.emulatorTarget": "AVD 目标 SDK",
- "loc.input.help.emulatorTarget": "新 Android 虚拟设备(AVD)的目标 ID。",
- "loc.input.label.emulatorDevice": "AVD 设备",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "要用于 Android 虚拟设备(AVD)的 ABI。",
- "loc.input.label.avdForce": "覆盖现有 AVD",
- "loc.input.help.avdForce": "正在将 --force 传递到 \"android create avd\" 命令。",
- "loc.input.label.avdOptionalArgs": "创建 AVD 可选参数",
- "loc.input.help.avdOptionalArgs": "传递给 \"android create avd\" 的其他参数。",
- "loc.input.label.startEmulator": "启动和停止 Android 仿真程序",
- "loc.input.help.startEmulator": "启动 Android 仿真程序,然后在此任务完成之后停止仿真程序。",
- "loc.input.label.emulatorTimeout": "超时秒数",
- "loc.input.help.emulatorTimeout": "生成会等待仿真程序启动的时间长度。",
- "loc.input.label.emulatorHeadless": "无外设显示",
- "loc.input.help.emulatorHeadless": "启动仿真程序时使用 \"-no-skin -no-audio -no-window\"。",
- "loc.input.label.emulatorOptionalArgs": "仿真程序可选参数",
- "loc.input.help.emulatorOptionalArgs": "传递给 Android \"tools\\emulator\" 的其他参数。",
- "loc.input.label.deleteAvd": "删除 AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AndroidBuild/Strings/resources.resjson/zh-TW/resources.resjson
deleted file mode 100644
index c9058d5faf05..000000000000
--- a/Tasks/AndroidBuild/Strings/resources.resjson/zh-TW/resources.resjson
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "loc.friendlyName": "Android 組建 (已取代; 使用 Gradle)",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "loc.description": "使用 Gradle 建置 Android 應用程式,並選擇性地啟動模擬器進行單元測試",
- "loc.instanceNameFormat": "Android 組建 $(gradleProj)",
- "loc.group.displayName.avdOptions": "Android 虛擬裝置 (AVD) 選項",
- "loc.group.displayName.emulatorOptions": "模擬器選項",
- "loc.input.label.gradleWrapper": "Gradle 包裝函式的位置",
- "loc.input.label.gradleProj": "專案目錄",
- "loc.input.label.gradleArguments": "Gradle 引數",
- "loc.input.label.avdName": "名稱",
- "loc.input.help.avdName": "要啟動或建立的 Android 虛擬裝置 (AVD) 的名稱。",
- "loc.input.label.createAvd": "建立 AVD",
- "loc.input.help.createAvd": "建立具名 Android 虛擬裝置 (AVD)。",
- "loc.input.label.emulatorTarget": "AVD 目標 SDK",
- "loc.input.help.emulatorTarget": "新 Android 虛擬裝置 (AVD) 的目標 ID。",
- "loc.input.label.emulatorDevice": "AVD 裝置",
- "loc.input.help.emulatorDevice": "The optional device definition to use. Can be a device index or ID.",
- "loc.input.label.avdAbi": "AVD ABI",
- "loc.input.help.avdAbi": "Android 虛擬裝置 (AVD) 要使用的 ABI。 ",
- "loc.input.label.avdForce": "覆寫現有 AVD",
- "loc.input.help.avdForce": "傳遞中 -- 強制使用 'android create avd' 命令。",
- "loc.input.label.avdOptionalArgs": "建立 AVD 選擇性引數",
- "loc.input.help.avdOptionalArgs": "傳遞至 'android create avd' 的額外引數。",
- "loc.input.label.startEmulator": "啟動和停止 Android 模擬器",
- "loc.input.help.startEmulator": "啟動 Android 模擬器並在此工作完成後停止模擬器。",
- "loc.input.label.emulatorTimeout": "逾時 (以秒為單位)",
- "loc.input.help.emulatorTimeout": "組建將等候模擬器啟動的時間。",
- "loc.input.label.emulatorHeadless": "無周邊顯示",
- "loc.input.help.emulatorHeadless": "啟動模擬器時使用 '-no-skin -no-audio -no-window'。",
- "loc.input.label.emulatorOptionalArgs": "模擬器選擇性引數",
- "loc.input.help.emulatorOptionalArgs": "傳遞至 Android 'tools\\emulator' 的額外引數。",
- "loc.input.label.deleteAvd": "刪除 AVD"
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/icon.png b/Tasks/AndroidBuild/icon.png
deleted file mode 100644
index f37ee8513ede..000000000000
Binary files a/Tasks/AndroidBuild/icon.png and /dev/null differ
diff --git a/Tasks/AndroidBuild/icon.svg b/Tasks/AndroidBuild/icon.svg
deleted file mode 100644
index a3c36c652328..000000000000
--- a/Tasks/AndroidBuild/icon.svg
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
diff --git a/Tasks/AndroidBuild/task.json b/Tasks/AndroidBuild/task.json
deleted file mode 100644
index b8716c9b836f..000000000000
--- a/Tasks/AndroidBuild/task.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
- "id": "DF857559-8715-46EB-A74E-AC98B9178AA0",
- "name": "AndroidBuild",
- "friendlyName": "Android Build (deprecated; use Gradle)",
- "description": "Build an Android app using Gradle and optionally start the emulator for unit tests",
- "helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613716)",
- "category": "Build",
- "visibility": [
- "Build"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 15
- },
- "demands": [
- "AndroidSDK"
- ],
- "minimumAgentVersion": "1.83.0",
- "groups": [
- {
- "name": "avdOptions",
- "displayName": "Android Virtual Device (AVD) Options",
- "isExpanded": true
- },
- {
- "name": "emulatorOptions",
- "displayName": "Emulator Options",
- "isExpanded": true
- }
- ],
- "inputs": [
- {
- "name": "gradleWrapper",
- "type": "filePath",
- "label": "Location of Gradle Wrapper",
- "defaultValue": "",
- "required": false
- },
- {
- "name": "gradleProj",
- "type": "filePath",
- "label": "Project Directory",
- "defaultValue": "",
- "required": false
- },
- {
- "name": "gradleArguments",
- "type": "string",
- "label": "Gradle Arguments",
- "defaultValue": "build",
- "required": false
- },
- {
- "name": "avdName",
- "type": "string",
- "label": "Name",
- "defaultValue": "AndroidBuildEmulator",
- "required": true,
- "helpMarkDown": "Name of the Android Virtual Device (AVD) to be started or created.",
- "groupName": "avdOptions"
- },
- {
- "name": "createAvd",
- "type": "boolean",
- "label": "Create AVD",
- "defaultValue": "AndroidBuildEmulator",
- "required": false,
- "helpMarkDown": "Create the named Android Virtual Device (AVD).",
- "groupName": "avdOptions"
- },
- {
- "name": "emulatorTarget",
- "type": "string",
- "label": "AVD Target SDK",
- "defaultValue": "android-19",
- "required": true,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "Target ID of the new Android Virtual Device (AVD).",
- "groupName": "avdOptions"
- },
- {
- "name": "emulatorDevice",
- "type": "string",
- "label": "AVD Device",
- "defaultValue": "Nexus 5",
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "The optional device definition to use. Can be a device index or ID.",
- "groupName": "avdOptions"
- },
- {
- "name": "avdAbi",
- "type": "string",
- "label": "AVD ABI",
- "defaultValue": "default/armeabi-v7a",
- "required": true,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "The ABI to use for the Android Virtual Device (AVD).",
- "groupName": "avdOptions"
- },
- {
- "name": "avdForce",
- "type": "boolean",
- "label": "Overwrite Existing AVD",
- "defaultValue": false,
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "Passing --force to 'android create avd' command.",
- "groupName": "avdOptions"
- },
- {
- "name": "avdOptionalArgs",
- "type": "string",
- "label": "Create AVD Optional Arguments",
- "defaultValue": "",
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "Additional arguments passed to 'android create avd'.",
- "groupName": "avdOptions"
- },
- {
- "name": "startEmulator",
- "type": "boolean",
- "label": "Start and Stop Android Emulator",
- "defaultValue": false,
- "required": false,
- "helpMarkDown": "Start Android emulator and stop emulator after this task finishes.",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorTimeout",
- "type": "string",
- "label": "Timeout in Seconds",
- "defaultValue": "300",
- "required": true,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "How long build will wait for the emulator to start.",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorHeadless",
- "type": "boolean",
- "label": "Headless Display",
- "defaultValue": false,
- "required": false,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "Use '-no-skin -no-audio -no-window' when start the emulator.",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorOptionalArgs",
- "type": "string",
- "label": "Emulator Optional Arguments",
- "defaultValue": "-no-snapshot-load -no-snapshot-save",
- "required": false,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "Additional arguments passed to Android 'tools\\emulator'.",
- "groupName": "emulatorOptions"
- },
- {
- "name": "deleteAvd",
- "type": "boolean",
- "label": "Delete AVD",
- "defaultValue": false,
- "required": false,
- "visibleRule": "startEmulator = true",
- "groupName": "emulatorOptions"
- }
- ],
- "instanceNameFormat": "Android Build $(gradleProj)",
- "execution": {
- "PowerShell": {
- "target": "$(currentDirectory)\\AndroidBuild.ps1",
- "argumentFormat": "",
- "workingDirectory": "$(currentDirectory)"
- }
- }
-}
\ No newline at end of file
diff --git a/Tasks/AndroidBuild/task.loc.json b/Tasks/AndroidBuild/task.loc.json
deleted file mode 100644
index 1acc7e5123bf..000000000000
--- a/Tasks/AndroidBuild/task.loc.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
- "id": "DF857559-8715-46EB-A74E-AC98B9178AA0",
- "name": "AndroidBuild",
- "friendlyName": "ms-resource:loc.friendlyName",
- "description": "ms-resource:loc.description",
- "helpMarkDown": "ms-resource:loc.helpMarkDown",
- "category": "Build",
- "visibility": [
- "Build"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 15
- },
- "demands": [
- "AndroidSDK"
- ],
- "minimumAgentVersion": "1.83.0",
- "groups": [
- {
- "name": "avdOptions",
- "displayName": "ms-resource:loc.group.displayName.avdOptions",
- "isExpanded": true
- },
- {
- "name": "emulatorOptions",
- "displayName": "ms-resource:loc.group.displayName.emulatorOptions",
- "isExpanded": true
- }
- ],
- "inputs": [
- {
- "name": "gradleWrapper",
- "type": "filePath",
- "label": "ms-resource:loc.input.label.gradleWrapper",
- "defaultValue": "",
- "required": false
- },
- {
- "name": "gradleProj",
- "type": "filePath",
- "label": "ms-resource:loc.input.label.gradleProj",
- "defaultValue": "",
- "required": false
- },
- {
- "name": "gradleArguments",
- "type": "string",
- "label": "ms-resource:loc.input.label.gradleArguments",
- "defaultValue": "build",
- "required": false
- },
- {
- "name": "avdName",
- "type": "string",
- "label": "ms-resource:loc.input.label.avdName",
- "defaultValue": "AndroidBuildEmulator",
- "required": true,
- "helpMarkDown": "ms-resource:loc.input.help.avdName",
- "groupName": "avdOptions"
- },
- {
- "name": "createAvd",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.createAvd",
- "defaultValue": "AndroidBuildEmulator",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.createAvd",
- "groupName": "avdOptions"
- },
- {
- "name": "emulatorTarget",
- "type": "string",
- "label": "ms-resource:loc.input.label.emulatorTarget",
- "defaultValue": "android-19",
- "required": true,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "ms-resource:loc.input.help.emulatorTarget",
- "groupName": "avdOptions"
- },
- {
- "name": "emulatorDevice",
- "type": "string",
- "label": "ms-resource:loc.input.label.emulatorDevice",
- "defaultValue": "Nexus 5",
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "ms-resource:loc.input.help.emulatorDevice",
- "groupName": "avdOptions"
- },
- {
- "name": "avdAbi",
- "type": "string",
- "label": "ms-resource:loc.input.label.avdAbi",
- "defaultValue": "default/armeabi-v7a",
- "required": true,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "ms-resource:loc.input.help.avdAbi",
- "groupName": "avdOptions"
- },
- {
- "name": "avdForce",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.avdForce",
- "defaultValue": false,
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "ms-resource:loc.input.help.avdForce",
- "groupName": "avdOptions"
- },
- {
- "name": "avdOptionalArgs",
- "type": "string",
- "label": "ms-resource:loc.input.label.avdOptionalArgs",
- "defaultValue": "",
- "required": false,
- "visibleRule": "createAvd = true",
- "helpMarkDown": "ms-resource:loc.input.help.avdOptionalArgs",
- "groupName": "avdOptions"
- },
- {
- "name": "startEmulator",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.startEmulator",
- "defaultValue": false,
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.startEmulator",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorTimeout",
- "type": "string",
- "label": "ms-resource:loc.input.label.emulatorTimeout",
- "defaultValue": "300",
- "required": true,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "ms-resource:loc.input.help.emulatorTimeout",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorHeadless",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.emulatorHeadless",
- "defaultValue": false,
- "required": false,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "ms-resource:loc.input.help.emulatorHeadless",
- "groupName": "emulatorOptions"
- },
- {
- "name": "emulatorOptionalArgs",
- "type": "string",
- "label": "ms-resource:loc.input.label.emulatorOptionalArgs",
- "defaultValue": "-no-snapshot-load -no-snapshot-save",
- "required": false,
- "visibleRule": "startEmulator = true",
- "helpMarkDown": "ms-resource:loc.input.help.emulatorOptionalArgs",
- "groupName": "emulatorOptions"
- },
- {
- "name": "deleteAvd",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.deleteAvd",
- "defaultValue": false,
- "required": false,
- "visibleRule": "startEmulator = true",
- "groupName": "emulatorOptions"
- }
- ],
- "instanceNameFormat": "ms-resource:loc.instanceNameFormat",
- "execution": {
- "PowerShell": {
- "target": "$(currentDirectory)\\AndroidBuild.ps1",
- "argumentFormat": "",
- "workingDirectory": "$(currentDirectory)"
- }
- }
-}
\ No newline at end of file
diff --git a/Tasks/ArchiveFiles/task.json b/Tasks/ArchiveFiles/task.json
index f115270c451d..e7f37f17c4db 100644
--- a/Tasks/ArchiveFiles/task.json
+++ b/Tasks/ArchiveFiles/task.json
@@ -9,12 +9,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 8
+ "Patch": 9
},
"groups": [
{
diff --git a/Tasks/ArchiveFiles/task.loc.json b/Tasks/ArchiveFiles/task.loc.json
index 870e25e44e8a..25c41c5cf3d3 100644
--- a/Tasks/ArchiveFiles/task.loc.json
+++ b/Tasks/ArchiveFiles/task.loc.json
@@ -10,11 +10,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 8
+ "Patch": 9
},
"groups": [
{
diff --git a/Tasks/AzureAppServiceManage/task.loc.json b/Tasks/AzureAppServiceManage/task.loc.json
index b71ef22fbf00..8550f829834b 100644
--- a/Tasks/AzureAppServiceManage/task.loc.json
+++ b/Tasks/AzureAppServiceManage/task.loc.json
@@ -140,4 +140,4 @@
"Successfullyswappedslots": "ms-resource:loc.messages.Successfullyswappedslots",
"SourceAndTargetSlotCannotBeSame": "ms-resource:loc.messages.SourceAndTargetSlotCannotBeSame"
}
-}
+}
\ No newline at end of file
diff --git a/Tasks/AzureCLI/task.json b/Tasks/AzureCLI/task.json
index f9222b3090c2..06de40fd23a8 100644
--- a/Tasks/AzureCLI/task.json
+++ b/Tasks/AzureCLI/task.json
@@ -11,13 +11,14 @@
"Release"
],
"runsOn": [
- "Agent"
+ "Agent",
+ "MachineGroup"
],
"demands": [],
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 4
+ "Patch": 5
},
"minimumAgentVersion": "1.95.0",
"instanceNameFormat": "Azure CLI $(scriptPath)",
diff --git a/Tasks/AzureCLI/task.loc.json b/Tasks/AzureCLI/task.loc.json
index be50131c695c..d831e968810b 100644
--- a/Tasks/AzureCLI/task.loc.json
+++ b/Tasks/AzureCLI/task.loc.json
@@ -11,13 +11,14 @@
"Release"
],
"runsOn": [
- "Agent"
+ "Agent",
+ "MachineGroup"
],
"demands": [],
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 4
+ "Patch": 5
},
"minimumAgentVersion": "1.95.0",
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
diff --git a/Tasks/AzureFileCopy/Tests/L0.ts b/Tasks/AzureFileCopy/Tests/L0.ts
new file mode 100644
index 000000000000..a54298f3330a
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0.ts
@@ -0,0 +1,112 @@
+///
+///
+///
+
+import Q = require('q');
+import assert = require('assert');
+import path = require('path');
+
+var psm = require('../../../Tests/lib/psRunner');
+var shell = require('shelljs');
+var ps = shell.which('powershell.exe');
+var psr = null;
+
+describe('AzureFileCopy Suite', function () {
+ this.timeout(20000);
+
+ before((done) => {
+ if (ps) {
+ psr = new psm.PSRunner();
+ psr.start();
+ }
+ done();
+ });
+
+ after(function () {
+ psr.kill();
+ });
+
+ if(ps) {
+ it('Validate AzureFileCopy.Utility Get-AzureUtility', (done) => {
+ psr.run(path.join(__dirname, 'L0GetAzureUtility.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Validate-AzurePowershellVersion', (done) => {
+ psr.run(path.join(__dirname, 'L0ValidateAzurePSVersion.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => {
+ psr.run(path.join(__dirname, 'L0GetStorageKey.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-StorageAccountType', (done) => {
+ psr.run(path.join(__dirname, 'L0GetStorageAccountType.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-blobStorageEndpoint', (done) => {
+ psr.run(path.join(__dirname, 'L0GetblobStorageEndpoint.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-StorageKey', (done) => {
+ psr.run(path.join(__dirname, 'L0UtilityThrowError.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Upload-FilesToAzureContainer', (done) => {
+ psr.run(path.join(__dirname, 'L0UploadFilesToAzureContainer.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Does-AzureVMMatchTagFilterCriteria', (done) => {
+ psr.run(path.join(__dirname, 'L0DoesAzureVMMatchTagFilter.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-TagBasedFilteredAzureVMs', (done) => {
+ psr.run(path.join(__dirname, 'L0GetTagBasedFilteredAzureVMs.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-MachineBasedFilteredAzureVMs', (done) => {
+ psr.run(path.join(__dirname, 'L0GetMachineBasedFilteredAzureVMs.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-FilteredAzureVMsInResourceGroup', (done) => {
+ psr.run(path.join(__dirname, 'L0GetFilteredAzureVmsInResourceGroup.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-FilteredAzureClassicVMsInResourceGroup', (done) => {
+ psr.run(path.join(__dirname, 'L0GetFilteredAzureClassicVmsInRG.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-FilteredAzureRMVMsInResourceGroup', (done) => {
+ psr.run(path.join(__dirname, 'L0GetFilteredAzureRMVmsInResourceGroup.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-MachineNameFromId', (done) => {
+ psr.run(path.join(__dirname, 'L0GetMachineNameFromId.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-MachinesFqdnsForLB', (done) => {
+ psr.run(path.join(__dirname, 'L0GetMachinesFqdnForLB.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-FrontEndPorts', (done) => {
+ psr.run(path.join(__dirname, 'L0GetFrontEndPorts.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-AzureRMVMsConnectionDetailsInResourceGroup', (done) => {
+ psr.run(path.join(__dirname, 'L0GetRMVMConnectionDetailsInRG.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Check-AzureCloudServiceExists', (done) => {
+ psr.run(path.join(__dirname, 'L0CheckCloudServiceExists.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-AzureVMResourcesProperties', (done) => {
+ psr.run(path.join(__dirname, 'L0GetAzureVMResourcesProperties.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-SkipCACheckOption', (done) => {
+ psr.run(path.join(__dirname, 'L0GetSkipCACheckOption.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Get-AzureVMsCredentials', (done) => {
+ psr.run(path.join(__dirname, 'L0GetAzureVMsCredentials.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Copy-FilesParallelyToAzureVMs', (done) => {
+ psr.run(path.join(__dirname, 'L0CopyFilesParallelyToAzureVMs.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Copy-FilesToAzureVMsFromStorageContainer', (done) => {
+ psr.run(path.join(__dirname, 'L0CopyFilesToAzureVMsFromStorageContainer.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Validate-CustomScriptExecutionStatus', (done) => {
+ psr.run(path.join(__dirname, 'L0ValidateCustomScriptExecutionStatus.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Add-AzureVMCustomScriptExtension', (done) => {
+ psr.run(path.join(__dirname, 'L0AddAzureVMCustomScriptExtension.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Is-WinRMCustomScriptExtensionExists', (done) => {
+ psr.run(path.join(__dirname, 'L0IsWinRMCustomScriptExtensionExists.ps1'), done);
+ });
+ it('Validate AzureFileCopy.Utility Copy-FilesSequentiallyToAzureVMs', (done) => {
+ psr.run(path.join(__dirname, 'L0CopyFilesSequentiallyToAzureVMs.ps1'), done);
+ });
+ }
+});
diff --git a/Tasks/AzureFileCopy/Tests/L0AddAzureVMCustomScriptExtension.ps1 b/Tasks/AzureFileCopy/Tests/L0AddAzureVMCustomScriptExtension.ps1
new file mode 100644
index 000000000000..2fad79a0ce96
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0AddAzureVMCustomScriptExtension.ps1
@@ -0,0 +1,67 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry { }
+
+# Test 1 "Should throw Resource group name is null"
+Assert-Throws {
+ Add-AzureVMCustomScriptExtension -resourceGroupName $null -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_CopyPrereqsFailed *"
+
+
+# Test 2 "Should throw when VM name is null"
+Assert-Throws {
+ Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $null -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_CopyPrereqsFailed *"
+
+# Test 3 "should throw when VM name is invalid"
+Register-Mock Get-Endpoint {}
+Assert-Throws {
+ Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $invalidMachineName -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_CopyPrereqsFailed AFC_UnableToSetCustomScriptExtension *"
+
+# Test 4 "Should fail to provision winrm custom script extension and remove the failed extension"
+$extensionName="WinRMCustomScriptExtension"
+Register-Mock Set-AzureMachineCustomScriptExtension {
+ return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile, $winrmConfFile -run $invalidCustomScriptName -argument $dnsName -location $location
+} -ParametersEvaluator { $run -eq $scriptToRun }
+
+Assert-Throws {
+ Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_CopyPrereqsFailed *"
+
+Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count
+
+# Test 5 "Should fail to deploy winrm custom script extension and remove the failed extension"
+$extensionName="WinRMCustomScriptExtension"
+Unregister-Mock Set-AzureMachineCustomScriptExtension
+Register-Mock Set-AzureMachineCustomScriptExtension {
+ return Set-AzureMachineCustomScriptExtension -resourceGroupName $resourceGroupName -vmName $vmName -name $extensionName -fileUri $configWinRMScriptFile, $makeCertFile -run $invalidCustomScriptName -argument $dnsName -location $location
+} -ParametersEvaluator { $run -eq $scriptToRun }
+
+Assert-Throws {
+ Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_CopyPrereqsFailed *"
+
+Assert-AreEqual 0 $vmInstanceViews[$vm0Name]["Extensions"].Count
+
+# Test 6 "Should configure winrm successfully on target azure vm for valid Input"
+Unregister-Mock Set-AzureMachineCustomScriptExtension
+Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+$tempStatus = Get-AzureMachineStatus -resourceGroupName $validRG -name $vm0Name
+$tempStatus.Extensions.Statuses.DisplayStatus.Contains("Provisioning succeeded");
+
+# Test 7 "Should skip configuring winrm on target azure vm"
+Register-Mock Set-AzureMachineCustomScriptExtension { return $null }
+Register-Mock Is-WinRMCustomScriptExtensionExists { return $true }
+Add-AzureVMCustomScriptExtension -resourceGroupName $validRG -vmName $vm0Name -dnsName $azurevmFqdn -location $location -connectedServiceName $connectedServiceName
+
+Assert-WasCalled Set-AzureMachineCustomScriptExtension -Times 0
+
+#Clean the extension
+$vmInstanceViews[$vm0Name]["Extensions"]=@()
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0CheckCloudServiceExists.ps1 b/Tasks/AzureFileCopy/Tests/L0CheckCloudServiceExists.ps1
new file mode 100644
index 000000000000..8e02b8c35950
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0CheckCloudServiceExists.ps1
@@ -0,0 +1,22 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry { }
+$invalidCloudServiceName = "invalidCloudServiceName"
+
+# Test 1 "It should throw if cloudservice does not exist and connection type is cert"
+Assert-Throws {
+ Check-AzureCloudServiceExists -cloudServiceName $invalidCloudServiceName -connectionType 'Certificate'
+} -MessagePattern "AFC_ResourceGroupNotFoundForSelectedConnection *"
+
+# Test 2 "Should not throw If cloud service exists"
+$rgWithClassicVMs = "taskplatformtesttwovm"
+Check-AzureCloudServiceExists -cloudServiceName $rgWithClassicVMs -connectionType 'Certificate'
+
+# Test 3 "Should not throw if cloud service exists and connection type is not cert"
+Check-AzureCloudServiceExists -cloudServiceName $invalidCloudServiceName -connectionType 'UserNamePassword'
diff --git a/Tasks/AzureFileCopy/Tests/L0CopyFilesParallelyToAzureVMs.ps1 b/Tasks/AzureFileCopy/Tests/L0CopyFilesParallelyToAzureVMs.ps1
new file mode 100644
index 000000000000..3cc448477edb
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0CopyFilesParallelyToAzureVMs.ps1
@@ -0,0 +1,71 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vmName = "myVM0"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$vmWinRMHttpsPort1 = '40001'
+$vmWinRMHttpsPort2 = '40003'
+$vmWinRMHttpsPort3 = '40005'
+$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -connectionType 'ServicePrincipal' -resourceFilteringMethod 'tags'
+$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword
+
+Register-Mock Get-DeploymentModulePath { Write-Output (Join-Path $(Get-Location).Path "Microsoft.TeamFoundation.DistributedTask.Task.DevTestLabs") }
+
+# Test 1 "Should throw if failed on one vm and passed on other vm"
+
+Register-Mock Copy-ToAzureMachines { return $failedDeploymentResponseForCopy } -ParametersEvaluator { $WinRMPort -eq $vmWinRMHttpsPort1 }
+Register-Mock Copy-ToAzureMachines { return $passedDeploymentResponseForCopy } -ParametersEvaluator { $WinRMPort -eq $vmWinRMHttpsPort2 }
+Register-Mock Copy-ToAzureMachines { return $passedLatestDeploymentResponseForCopy } -ParametersEvaluator { $WinRMPort -eq $vmWinRMHttpsPort3 }
+Register-Mock Get-ChildItem { return $assembly }
+Register-Mock Write-ResponseLogs { }
+
+Register-Mock Start-Job { $testJobs.Add($failedJob); return $failedJob} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort1 }
+Register-Mock Start-Job { $testJobs.Add($passedJob); return $passedJob} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort2 }
+Register-Mock Start-Job { $testJobs.Add($passedLatestJob); return $passedLatestJob} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort3 }
+Register-Mock Get-Job { return $testJobs }
+
+Register-Mock Start-Sleep { }
+
+Register-Mock Receive-Job { return $jobFailedResponse } -ParametersEvaluator{$Id -eq $failedJob.Id}
+Register-Mock Receive-Job { return $jobPassedResponse } -ParametersEvaluator{$Id -eq $passedJob.Id}
+Register-Mock Receive-Job { return $jobPassedLatestResponse } -ParametersEvaluator{$Id -eq $passedLatestJob.Id}
+Register-Mock Remove-Job { $testJobs.RemoveAt(0) }
+Register-Mock Write-Telemetry { }
+
+Assert-Throws {
+ Copy-FilesParallellyToAzureVMs -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -connectionType 'ServicePrincipal'
+} -MessagePattern "AFC_ParallelCopyFailed*"
+
+Assert-WasCalled Start-Job -Times 3
+Assert-WasCalled Receive-Job -Times 3
+
+# Test 2 "Should not throw if copy passed on both vms"
+Unregister-Mock Start-Job
+Register-Mock Start-Job { $testJobs.Add($passedJob1); return $passedJob1} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort1 }
+Register-Mock Start-Job { $testJobs.Add($passedJob); return $passedJob} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort2 }
+Register-Mock Start-Job { $testJobs.Add($passedLatestJob); return $passedLatestJob} -ParametersEvaluator{$ArgumentList -contains $vmWinRMHttpsPort3 }
+
+Unregister-Mock Copy-ToAzureMachines
+Register-Mock Copy-ToAzureMachines { return $passedDeploymentResponseForCopy }
+
+Unregister-Mock Remove-Job
+Register-Mock Remove-Job { $testJobs.RemoveAt(0) }
+
+Unregister-Mock Receive-Job
+Register-Mock Receive-Job { return $jobPassedResponse }
+Copy-FilesParallellyToAzureVMs -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -connectionType 'ServicePrincipal'
+
+Assert-WasCalled Start-Job -Times 3
+Assert-WasCalled Receive-Job -Times 3
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1 b/Tasks/AzureFileCopy/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1
new file mode 100644
index 000000000000..642d5c96d126
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0CopyFilesSequentiallyToAzureVMs.ps1
@@ -0,0 +1,38 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+. $PSScriptRoot\..\AzureFileCopyJob.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vmName = "myVM0"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$vmWinRMHttpsPort = '40003'
+$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $validRG -connectionType 'ServicePrincipal' -resourceFilteringMethod 'tags'
+$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword
+Register-Mock Get-DeploymentModulePath { Write-Output (Join-Path $(Get-Location).Path "Microsoft.TeamFoundation.DistributedTask.Task.DevTestLabs") }
+
+Register-Mock Copy-ToAzureMachines { return $failedDeploymentResponseForCopy } -ParameterFilter { $WinRMPort -eq $vmWinRMHttpsPort }
+Register-Mock Get-ChildItem { return $assembly }
+Register-Mock Write-ResponseLogs { }
+Register-Mock Get-AzureStorageAccount { return $null }
+Register-Mock Write-Telemetry { }
+
+# Test 1 "Should throw if failed on one vm"
+Assert-Throws {
+Copy-FilesSequentiallyToAzureVMs -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -connectionType "ServicePrincipal"
+} -MessagePattern "AFC_WinRMHelpMessage AFC_AzureFileCopyMoreHelp*"
+
+# Test 2 "Should not throw if copy succeded on both vms"
+Register-Mock Copy-ToAzureMachines { return $passedDeploymentResponseForCopy }
+
+ Copy-FilesSequentiallyToAzureVMs -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -connectionType "ServicePrincipal"
diff --git a/Tasks/AzureFileCopy/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1 b/Tasks/AzureFileCopy/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1
new file mode 100644
index 000000000000..0fcdf33763d4
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0CopyFilesToAzureVMsFromStorageContainer.ps1
@@ -0,0 +1,53 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$rgWithClassicVMs = "taskplatformtesttwovm"
+$azureVMsProperties = Get-AzureVMResourcesProperties -resourceGroupName $rgWithClassicVMs -connectionType 'Certificate' -resourceFilteringMethod 'tags'
+$azureVMCredntials = Get-AzureVMsCredentials -vmsAdminUserName $validInputVmsAdminUserName -vmsAdminPassword $validInputVmsAdminPassword
+$deploymentUtilitiesLocation = Join-Path $(Get-Location).Path "Microsoft.TeamFoundation.DistributedTask.Task.DevTestLabs"
+
+Register-Mock Copy-FilesParallellyToAzureVMs { }
+Register-Mock Copy-FilesSequentiallyToAzureVMs { }
+
+# Test 1 "Should Call Copy-FilesParallellyToAzureVMs for parallel option"
+Copy-FilesToAzureVMsFromStorageContainer -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -resourceGroupName $rgWithClassicVMs -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -copyFilesInParallel "true" -connectionType 'ServicePrincipal'
+
+Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 1
+Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 0
+
+
+# Test 2 "should call Copy-FilesSequentiallyToAzureVMs for sequential option with greater than one vm"
+Copy-FilesToAzureVMsFromStorageContainer -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -resourceGroupName $rgWithClassicVMs -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -copyFilesInParallel "false" -connectionType 'ServicePrincipal'
+
+
+Unregister-Mock Copy-FilesParallellyToAzureVMs
+Register-Mock Copy-FilesParallellyToAzureVMs { }
+
+Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 0
+Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 1
+
+# Test 3 "should call Copy-FilesSequentiallyToAzureVMs for parallel option with one vm"
+$azureVMsProperties.Remove("vm0")
+
+Unregister-Mock Copy-FilesSequentiallyToAzureVMs
+Register-Mock Copy-FilesSequentiallyToAzureVMs { }
+
+Copy-FilesToAzureVMsFromStorageContainer -storageAccountName $validInputStorageAccount -containerName $validInputContainerName -containerSasToken $validSasToken `
+ -targetPath $validInputTargetPath -azCopyLocation $validAzCopyLocation -resourceGroupName $rgWithClassicVMs -azureVMResourcesProperties $azureVMsProperties `
+ -azureVMsCredentials $azureVMCredntials -cleanTargetBeforeCopy "false" -communicationProtocol '' -skipCACheckOption "false" -enableDetailedLoggingString "false" `
+ -additionalArguments "" -copyFilesInParallel "false" -connectionType 'ServicePrincipal'
+
+
+Assert-WasCalled Copy-FilesParallellyToAzureVMs -Times 0
+Assert-WasCalled Copy-FilesSequentiallyToAzureVMs -Times 1
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0DoesAzureVMMatchTagFilter.ps1 b/Tasks/AzureFileCopy/Tests/L0DoesAzureVMMatchTagFilter.ps1
new file mode 100644
index 000000000000..a9debca28daa
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0DoesAzureVMMatchTagFilter.ps1
@@ -0,0 +1,33 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry { }
+Register-Mock Switch-AzureMode { }
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+$azureVMResource1 = $azureRMVMResources[0]
+$validTagFilterForVMResource1 = "role:test"
+$azureVMResource2 = $azureRMVMResources[1]
+
+# Test 1 "should return true if vm match tag filter criteria with case insensitive check"
+$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource1 -filter "Role:TEST, Test1"
+Assert-AreEqual $true $vmMatchFilterCriteria
+
+# Test 2 "should return true if vm match tag filter criteria with same tag repeated twice"
+$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:myTEST, MYTest, Test1"
+Assert-AreEqual $true $vmMatchFilterCriteria
+
+# Test 3 "should return false if vm does not match tag filter criteria"
+$vmMatchFilterCriteria = Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8, win9; Role:Test5, Test2, Test1"
+Assert-AreEqual $false $vmMatchFilterCriteria
+
+# Test 4 "Should throw if invalid tag filter format"
+Assert-Throws {
+ Does-AzureVMMatchTagFilterCriteria -azureVMResource $azureVMResource2 -filter "OS:win8 : win9; Role:myTEST, MYTest, Test1"
+} -MessagePattern "AFC_IncorrectTags"
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetAzureUtility.ps1 b/Tasks/AzureFileCopy/Tests/L0GetAzureUtility.ps1
new file mode 100644
index 000000000000..22d347cf078f
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetAzureUtility.ps1
@@ -0,0 +1,37 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+$requireSwitchAzureModeVersion = New-Object -TypeName System.Version -ArgumentList "0.9.7"
+$notRequireSwitchAzureModeVersion = New-Object -TypeName System.Version -ArgumentList "1.0.1"
+$azureRMVersion104 = New-Object -TypeName System.Version -ArgumentList "1.0.4"
+$azureRMVersion133 = New-Object -TypeName System.Version -ArgumentList "1.3.3"
+$connectedServiceName = "DummyConnectedServiceName"
+
+Register-Mock Get-TypeOfConnection { return "ServicePrincipal"}
+
+. $PSScriptRoot\..\Utility.ps1
+
+#Test 1 "Should return AzureUtilityLTE9.8.ps1 if version is less than equal to 0.9.8"
+Register-Mock Get-AzureCmdletsVersion { return $requireSwitchAzureModeVersion }
+$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName
+Assert-AreEqual $azureUtilityFile "AzureUtilityLTE9.8.ps1"
+
+#Test 2 "Should return AzureUtilityGTE1.0.ps1 if version is greater than equal to 1.0.0"
+Unregister-Mock Get-AzureCmdletsVersion
+Register-Mock Get-AzureCmdletsVersion { return $notRequireSwitchAzureModeVersion }
+$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName
+Assert-AreEqual $azureUtilityFile "AzureUtilityGTE1.0.ps1"
+
+#Test 3 "Should return AzureUtilityGTE1.1.0.ps1 if version is greater than equal to 1.0.3"
+Unregister-Mock Get-AzureCmdletsVersion
+Register-Mock Get-AzureCmdletsVersion { return $azureRMVersion104 }
+$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName
+Assert-AreEqual $azureUtilityFile "AzureUtilityGTE1.1.0.ps1"
+
+#Test 4 "Should return AzureUtilityRest.ps1 if version is greater than equal to 1.3.2"
+Unregister-Mock Get-AzureCmdletsVersion
+Register-Mock Get-AzureCmdletsVersion { return $azureRMVersion133 }
+$azureUtilityFile = Get-AzureUtility -connectedServiceName $connectedServiceName
+Assert-AreEqual $azureUtilityFile "AzureUtilityRest.ps1"
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetAzureVMResourcesProperties.ps1 b/Tasks/AzureFileCopy/Tests/L0GetAzureVMResourcesProperties.ps1
new file mode 100644
index 000000000000..b329011c20cc
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetAzureVMResourcesProperties.ps1
@@ -0,0 +1,63 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry { }
+
+$rgWithClassicVMs = "taskplatformtesttwovm"
+$vmName = "vm0"
+$vmfqdn = "taskplatformtesttwovm.cloudapp.net"
+
+# Test 1 "should return azureVM resources if valid input given"
+$response = Get-AzureVMResourcesProperties -resourceGroupName $rgWithClassicVMs -connectionType 'Certificate' -resourceFilteringMethod 'tags'
+
+Assert-IsNotNullOrEmpty $response
+Assert-AreEqual 2 $response.Count
+
+$resource = $response[$vmName]
+Assert-AreEqual $vmName $resource.Name
+Assert-AreEqual $vmfqdn $resource.fqdn
+Assert-AreEqual 5986 $resource.winRMHttpsPort
+
+
+# Test 2 "should throw if no azurevm resources"
+$cloudServiceWithNoVM = "taskplatformtestnovm"
+
+Assert-Throws {
+ $response = Get-AzureVMResourcesProperties -resourceGroupName $cloudServiceWithNoVM -connectionType 'Certificate' -resourceFilteringMethod 'tags'
+} -MessagePattern "AFC_NoClassicVMResources*"
+
+# Test 3 "should throw if no azurevm resources (connection type is UserNamePassword)"
+$cloudServiceWithNoVM = "taskplatformtestnovm"
+
+Assert-Throws {
+ Get-AzureVMResourcesProperties -resourceGroupName $cloudServiceWithNoVM -connectionType 'UserNamePassword' -resourceFilteringMethod 'tags'
+} -MessagePattern "AFC_NoGenericVMResources*"
+
+# Test 4 "should throw if no azurevm resources (connection type is ServicePrincipal)"
+$cloudServiceWithNoVM = "taskplatformtestnovm"
+
+Assert-Throws {
+ Get-AzureVMResourcesProperties -resourceGroupName $cloudServiceWithNoVM -connectionType 'ServicePrincipal' -resourceFilteringMethod 'tags'
+} -MessagePattern "AFC_NoARMVMResources*"
+
+# Test 5 "should return azureVM resources if valid input given (connection type is ServicePrincipal)"
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vmName = "myVM0"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$vmWinRMHttpsPort = '40001'
+
+$response = Get-AzureVMResourcesProperties -resourceGroupName $validRG -connectionType 'ServicePrincipal' -resourceFilteringMethod 'tags'
+
+Assert-IsNotNullOrEmpty $response
+Assert-AreEqual 3 $response.Count
+
+$resource = $response[$vmName]
+
+Assert-AreEqual $vmName $resource.Name
+Assert-AreEqual $vmfqdn $resource.fqdn
+Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetAzureVMsCredentials.ps1 b/Tasks/AzureFileCopy/Tests/L0GetAzureVMsCredentials.ps1
new file mode 100644
index 000000000000..584df180c0a8
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetAzureVMsCredentials.ps1
@@ -0,0 +1,16 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$userName = "userName"
+$password = "password"
+
+# Test 1 "Should return System.Net.NetworkCredential with valid values"
+$result = Get-AzureVMsCredentials -vmsAdminUserName $userName -vmsAdminPassword $password
+Assert-AreEqual "System.Net.NetworkCredential" $result.GetType().FullName
+Assert-AreEqual $userName $result.userName
+Assert-AreEqual $password $result.Password
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureClassicVmsInRG.ps1 b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureClassicVmsInRG.ps1
new file mode 100644
index 000000000000..02b2e57cdca8
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureClassicVmsInRG.ps1
@@ -0,0 +1,20 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$rgWithClassicVMs = "taskplatformtesttwovm"
+$azureClassicVMResources = Get-AzureClassicVMsInResourceGroup -resourceGroupName $rgWithClassicVMs
+
+Register-Mock Get-FilteredAzureVMsInResourceGroup { }
+
+# Test 1 "should call Get-FilteredAzureVMsInResourceGroup"
+$filteredAzureClassicVMResources = Get-FilteredAzureClassicVMsInResourceGroup -azureClassicVMResources $azureClassicVMResources -resourceFilteringMethod "tags" -filter ""
+Assert-WasCalled Get-FilteredAzureVMsInResourceGroup -Times 1 -ParametersEvaluator {
+ $resourceFilteringMethod -eq "tags" -and $filter -eq "" -and $azureVMResources.Count -eq $azureClassicVMResources.Count
+}
+
diff --git a/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1 b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1
new file mode 100644
index 000000000000..73674a2f40d7
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureRMVmsInResourceGroup.ps1
@@ -0,0 +1,19 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+
+Register-Mock Get-FilteredAzureVMsInResourceGroup {}
+
+# Test 1 "should call Get-FilteredAzureVMsInResourceGroup with proper paramters"
+Get-FilteredAzureRMVMsInResourceGroup -azureRMVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter ""
+Assert-WasCalled Get-FilteredAzureVMsInResourceGroup -Times 1 -ParametersEvaluator {
+ $resourceFilteringMethod -eq "tags"-and $filter -eq "" -and $azureVMResources.Count -eq $azureRMVMResources.Count
+}
diff --git a/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1 b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1
new file mode 100644
index 000000000000..987c1cbe2fac
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetFilteredAzureVmsInResourceGroup.ps1
@@ -0,0 +1,27 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry {}
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+
+# Test 1 "should call tag filter if machineNames filter selected and no filter provided"
+$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter ""
+Assert-AreEqual 3 $filteredAzureVMResources.Count
+
+# Test 2 "should call tag filter when tags filter selected and non-empty filter provided"
+$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "tags" -filter "role:web"
+Assert-AreEqual 0 $filteredAzureVMResources.Count
+
+Register-Mock Get-MachineBasedFilteredAzureVMs { }
+
+# Test 3 "should call Get-MachineBasedFilteredAzureVMs for machineNames filter with non-empty filter"
+$filteredAzureVMResources = Get-FilteredAzureVMsInResourceGroup -azureVMResources $azureRMVMResources -resourceFilteringMethod "machineNames" -filter "vm0"
+Assert-AreEqual 0 $filteredAzureVMResources.Count
diff --git a/Tasks/AzureFileCopy/Tests/L0GetFrontEndPorts.ps1 b/Tasks/AzureFileCopy/Tests/L0GetFrontEndPorts.ps1
new file mode 100644
index 000000000000..3a5fd3bcaa77
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetFrontEndPorts.ps1
@@ -0,0 +1,34 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$winrmPort1 = "40001"
+$winrmPort2 = "40003"
+$winrmPort3 = "40005"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources
+$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"]
+$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"]
+$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"]
+
+# Test 1 "It should valid portList if RG deployed successfully"
+[hashtable]$winRMHttpsPortMap = @{}
+foreach($lbName in $loadBalancerResources.Keys){
+ $lbDetails = $loadBalancerResources[$lbName]
+ $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"]
+ $inboundRules = $lbDetails["inboundRules"]
+ $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules
+
+ Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[0].Id)
+ Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$azureRMVMResources[0].Id]
+
+ Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($azureRMVMResources[1].Id)
+ Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$azureRMVMResources[1].Id]
+}
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetMachineBasedFilteredAzureVMs.ps1 b/Tasks/AzureFileCopy/Tests/L0GetMachineBasedFilteredAzureVMs.ps1
new file mode 100644
index 000000000000..694e04918a38
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetMachineBasedFilteredAzureVMs.ps1
@@ -0,0 +1,30 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Write-Telemetry {}
+
+$rgWithClassicVMs = "taskplatformtesttwovm"
+$classicvm0 = "vm0"
+$classicvm1 = "VM1"
+$azureClassicVMResources = Get-AzureClassicVMsInResourceGroup -resourceGroupName $rgWithClassicVMs
+
+# Test 1 "should return all vms corresponding to filter with case insensitive check"
+$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, Vm1"
+Assert-AreEqual 2 $filteredAzureVMResources.Count
+
+# Test 2 "should return only one vm corresponding to its filter even if filter is repeated more than once"
+$filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "vM0, VM0, vm0"
+Assert-AreEqual 1 $filteredAzureVMResources.Count
+
+$nonExistingFilter = "vm2"
+
+# Test 3 "Should throw if for any filter there is not corresponding vm"
+Assert-Throws {
+ $filteredAzureVMResources = Get-MachineBasedFilteredAzureVMs -azureVMResources $azureClassicVMResources -resourceFilteringMethod "machineNames" -filter "$nonExistingFilter, Vm1"
+} -MessagePattern "AFC_MachineDoesNotExist vm2"
diff --git a/Tasks/AzureFileCopy/Tests/L0GetMachineNameFromId.ps1 b/Tasks/AzureFileCopy/Tests/L0GetMachineNameFromId.ps1
new file mode 100644
index 000000000000..8e47c1e82e23
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetMachineNameFromId.ps1
@@ -0,0 +1,91 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vm0Name = "myVM0"
+$vm1Name = "mytestVM0"
+$vm2Name = "mytestPTVM0"
+$winrmPort1 = "40001"
+$winrmPort2 = "40003"
+$winrmPort3 = "40005"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources
+$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"]
+$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"]
+$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"]
+
+[hashtable]$fqdnMap = @{}
+[hashtable]$winRMHttpsPortMap = @{}
+foreach($lbName in $loadBalancerResources.Keys)
+{
+ $lbDetails = $loadBalancerResources[$lbName]
+ $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"]
+ $inboundRules = $lbDetails["inboundRules"]
+
+ $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap
+ $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules
+}
+# Test 1 "should create valid map for map parameter FQDN"
+$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true
+
+Assert-AreEqual $true $fqdnMap.ContainsKey($vm0Name)
+Assert-AreEqual $vmfqdn $fqdnMap[$vm0Name]
+Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name)
+
+# Test 2 "should create valid map for map parameter Front End port"
+$winRMHttpsPortMap = Get-MachineNameFromId -Map $winRMHttpsPortMap -MapParameter "Front End port" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $false
+
+Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm0Name)
+Assert-AreEqual $winrmPort1 $winRMHttpsPortMap[$vm0Name]
+Assert-AreEqual $true $winRMHttpsPortMap.ContainsKey($vm1Name)
+Assert-AreEqual $winrmPort2 $winRMHttpsPortMap[$vm1Name]
+
+
+# Test 3 "It should return partial map if for not all resources map is not configured properly"
+
+[hashtable]$fqdnMap = @{}
+[hashtable]$winRMHttpsPortMap = @{}
+foreach($lbName in $loadBalancerResources.Keys)
+{
+ $lbDetails = $loadBalancerResources[$lbName]
+ $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"]
+ $inboundRules = $lbDetails["inboundRules"]
+
+ $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap
+ $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules
+}
+$fqdnMap.Remove($azureRMVMResources[0].Id)
+
+$fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavaialbility $true
+
+Assert-AreEqual $false $fqdnMap.ContainsKey($vm0Name)
+Assert-AreEqual $true $fqdnMap.ContainsKey($vm1Name)
+Assert-AreEqual $vmfqdn $fqdnMap[$vm1Name]
+
+# Test 4 "throw error if no resource is available and ThrowOnTotalUnavailability is set to true"
+
+[hashtable]$fqdnMap = @{}
+[hashtable]$winRMHttpsPortMap = @{}
+foreach($lbName in $loadBalancerResources.Keys)
+{
+ $lbDetails = $loadBalancerResources[$lbName]
+ $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"]
+ $inboundRules = $lbDetails["inboundRules"]
+
+ $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap
+ $winRMHttpsPortMap = Get-FrontEndPorts -BackEndPort "5986" -PortList $winRMHttpsPortMap -networkInterfaceResources $networkInterfaceResources -inboundRules $inboundRules
+}
+$fqdnMap.Remove($azureRMVMResources[0].Id)
+$fqdnMap.Remove($azureRMVMResources[1].Id)
+$fqdnMap.Remove($azureRMVMResources[2].Id)
+
+Assert-Throws {
+ $fqdnMap = Get-MachineNameFromId -resourceGroupName $validRG -Map $fqdnMap -MapParameter "FQDN" -azureRMVMResources $azureRMVMResources -ThrowOnTotalUnavailability $true
+} -MessagePattern "AFC_MachineNameFromIdErrorAllResources*"
diff --git a/Tasks/AzureFileCopy/Tests/L0GetMachinesFqdnForLB.ps1 b/Tasks/AzureFileCopy/Tests/L0GetMachinesFqdnForLB.ps1
new file mode 100644
index 000000000000..df9b520cca4d
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetMachinesFqdnForLB.ps1
@@ -0,0 +1,31 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+$azureRGResourcesDetails = Get-AzureRMResourceGroupResourcesDetails -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources
+$networkInterfaceResources = $azureRGResourcesDetails["networkInterfaceResources"]
+$publicIPAddressResources = $azureRGResourcesDetails["publicIPAddressResources"]
+$loadBalancerResources = $azureRGResourcesDetails["loadBalancerResources"]
+[hashtable]$fqdnMap = @{}
+
+# Test 1 "It should valid fqdnMap if RG deployed successfully"
+foreach($lbName in $loadBalancerResources.Keys) {
+ $lbDetails = $loadBalancerResources[$lbName]
+ $frontEndIPConfigs = $lbDetails["frontEndIPConfigs"]
+ $inboundRules = $lbDetails["inboundRules"]
+ $fqdnMap = Get-MachinesFqdnsForLB -resourceGroupName $validRG -publicIPAddressResources $publicIPAddressResources -networkInterfaceResources $networkInterfaceResources -frontEndIPConfigs $frontEndIPConfigs -fqdnMap $fqdnMap
+
+ Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[0].Id)
+ Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[0].Id]
+
+ Assert-AreEqual $true $fqdnMap.ContainsKey($azureRMVMResources[1].Id)
+ Assert-AreEqual $vmfqdn $fqdnMap[$azureRMVMResources[1].Id]
+}
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetRMVMConnectionDetailsInRG.ps1 b/Tasks/AzureFileCopy/Tests/L0GetRMVMConnectionDetailsInRG.ps1
new file mode 100644
index 000000000000..938128a8bb64
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetRMVMConnectionDetailsInRG.ps1
@@ -0,0 +1,31 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vmName = "myVM0"
+$vmfqdn = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"
+$vmWinRMHttpsPort = '40001'
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+
+# Test 1 "It should return azure vm connection details for valid input"
+$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $azureRMVMResources
+
+Assert-IsNotNullOrEmpty $response
+Assert-AreEqual 3 $response.Count
+
+$resource = $response[$vmName]
+
+Assert-AreEqual $vmName $resource.Name
+Assert-AreEqual $vmfqdn $resource.fqdn
+Assert-AreEqual $vmWinRMHttpsPort $resource.winRMHttpsPort
+
+#Test 2 "It should return null if no azure vms"
+$response = Get-AzureRMVMsConnectionDetailsInResourceGroup -resourceGroupName $validRG -azureRMVMResources $null
+
+Assert-IsNullOrEmpty $response
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetSkipCACheckOption.ps1 b/Tasks/AzureFileCopy/Tests/L0GetSkipCACheckOption.ps1
new file mode 100644
index 000000000000..6e696432923b
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetSkipCACheckOption.ps1
@@ -0,0 +1,15 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+# Test 1 "Check SkiCACheck flag value"
+$result = Get-SkipCACheckOption -SkipCACheck "true"
+Assert-AreEqual "-SkipCACheck" $result
+
+# Test 2 "Should return '' if passed false"
+$result = Get-SkipCACheckOption -SkipCACheck "false"
+Assert-IsNullOrEmpty $result "SkipCACheck Should be empty"
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetStorageAccountType.ps1 b/Tasks/AzureFileCopy/Tests/L0GetStorageAccountType.ps1
new file mode 100644
index 000000000000..cb89982d47a8
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetStorageAccountType.ps1
@@ -0,0 +1,36 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Validate-AzurePowershellVersion {}
+Register-Mock Get-Endpoint { return $null }
+Register-Mock Write-Telemetry { }
+
+$invalidClassicStorage = "invalidClassicStorage"
+$invalidStorage = "invalidStorage"
+$connectedServiceName = "DummyConnectedServiceName"
+$invalidRGStorage = "invalidRGStorage"
+
+# Test 1 "Should throw if Blob storage not found for connection Certificate"
+Assert-Throws {
+ Get-StorageAccountType -storageAccountName $invalidClassicStorage -connectionType 'Certificate' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_BlobStorageNotFound *"
+
+# Test 2 "Should throw if Blob storage not found for connection UserNamePassword"
+Assert-Throws {
+ Get-StorageAccountType -storageAccountName $invalidStorage -connectionType 'UserNamePassword' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_BlobStorageNotFound *"
+
+Register-Mock Get-AzureStorageAccountTypeFromARM {
+ throw "Unable to find storage type $invalidRGStorage with Connection SPN"
+}
+# Test 3 "Should throw if Blob storage not found for connection ARM endpoint"
+Assert-Throws {
+ Get-StorageAccountType -storageAccountName $invalidRGStorage -connectionType 'ServicePrincipal' -connectedServiceName $connectedServiceName
+} -MessagePattern "Unable to find storage type $invalidRGStorage with Connection SPN"
+
+Assert-WasCalled -Times 1 Get-AzureStorageAccountTypeFromARM
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetStorageKey.ps1 b/Tasks/AzureFileCopy/Tests/L0GetStorageKey.ps1
new file mode 100644
index 000000000000..bb0982e7f6f4
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetStorageKey.ps1
@@ -0,0 +1,31 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+$invalidClassicStorage = "invalidClassicStorage"
+$connectedServiceName = "DummyConnectedServiceName"
+
+Register-Mock Validate-AzurePowershellVersion {}
+Register-Mock Get-Endpoint { return $null }
+
+Register-Mock Write-Telemetry { }
+
+# Test 1 "should throw if storage not found for connection certificate"
+Assert-Throws {
+ Get-StorageKey -storageAccountName $invalidClassicStorage -connectionType 'Certificate' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_ClassicStorageAccountNotFound *"
+
+# Test 2 "should throw if storage not found for connection usernamepassword"
+$invalidStorage = "invalidStorage"
+Assert-Throws {
+ Get-StorageKey -storageAccountName $invalidStorage -connectionType 'UserNamePassword' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_GenericStorageAccountNotFound *"
+
+# Test 3 "should throw if storage not found for connection connection SPN"
+$invalidRGStorage = "invalidRGStorage"
+Assert-Throws {
+ Get-StorageKey -storageAccountName $invalidRGStorage -connectionType 'ServicePrincipal' -connectedServiceName $connectedServiceName
+} -MessagePattern "Storage account: $invalidRGStorage not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only."
diff --git a/Tasks/AzureFileCopy/Tests/L0GetTagBasedFilteredAzureVMs.ps1 b/Tasks/AzureFileCopy/Tests/L0GetTagBasedFilteredAzureVMs.ps1
new file mode 100644
index 000000000000..66522f4d90fb
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetTagBasedFilteredAzureVMs.ps1
@@ -0,0 +1,22 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$vm0Name = "myVM0"
+$azureRMVMResources = Get-AzureRMVMsInResourceGroup -resourceGroupName $validRG
+
+# Test 1 "Should Call Does-AzureVMMatchTagFilterCriteria for every VM for filter criteria"
+$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:web"
+
+#Assert-WasCalled Does-AzureVMMatchTagFilterCriteria -Times $azureRMVMResources.Count -ParametersEvaluator {$filter -eq "role:web"}
+
+# Test 2 "Should return VMs that matches tag filter criteria"
+$filteredAzureVMResources = Get-TagBasedFilteredAzureVMs -azureVMResources $azureRMVMResources -filter "role:test"
+
+Assert-AreEqual $vm0Name $filteredAzureVMResources.Name
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0GetblobStorageEndpoint.ps1 b/Tasks/AzureFileCopy/Tests/L0GetblobStorageEndpoint.ps1
new file mode 100644
index 000000000000..21f0d9c89820
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0GetblobStorageEndpoint.ps1
@@ -0,0 +1,31 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+Register-Mock Validate-AzurePowershellVersion {}
+Register-Mock Get-Endpoint { return $null }
+Register-Mock Write-Telemetry { }
+
+$invalidClassicStorage = "invalidClassicStorage"
+$invalidStorage = "invalidStorage"
+$connectedServiceName = "DummyConnectedServiceName"
+$invalidRGStorage = "invalidRGStorage"
+
+# Test 1 "Should throw if Blob storage not found for connection Certificate"
+Assert-Throws {
+ Get-blobStorageEndpoint -storageAccountName $invalidClassicStorage -connectionType 'Certificate' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_BlobStorageNotFound *"
+
+# Test 2 "Should throw if Blob storage not found for connection UserNamePassword"
+Assert-Throws {
+ Get-blobStorageEndpoint -storageAccountName $invalidStorage -connectionType 'UserNamePassword' -connectedServiceName $connectedServiceName
+} -MessagePattern "AFC_BlobStorageNotFound *"
+
+# Test 3 "Should throw if Blob storage not found for connection ARM endpoint"
+Assert-Throws {
+ Get-blobStorageEndpoint -storageAccountName $invalidRGStorage -connectionType 'ServicePrincipal' -connectedServiceName $connectedServiceName
+} -MessagePattern "Unable to find storage type $invalidRGStorage with Connection SPN"
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0IsWinRMCustomScriptExtensionExists.ps1 b/Tasks/AzureFileCopy/Tests/L0IsWinRMCustomScriptExtensionExists.ps1
new file mode 100644
index 000000000000..7c76ebec1b79
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0IsWinRMCustomScriptExtensionExists.ps1
@@ -0,0 +1,61 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$extensionName="WinRMCustomScriptExtension"
+
+# Test 1 "Should not throw when Resource group us null"
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName
+Assert-AreEqual $false $isExtensionExists
+
+# Test 2 "Should not throw when VM name is null"
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $null -extensionName $extensionName -connectedServiceName $connectedServiceName
+Assert-AreEqual $false $isExtensionExists
+
+# Test 3 "Should not throw when VM name is invalid"
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName -connectedServiceName $connectedServiceName
+Assert-AreEqual $false $isExtensionExists
+
+# Test 4 "Should not throw Extension name is null"
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $null -connectedServiceName $connectedServiceName
+Assert-AreEqual $false $isExtensionExists
+
+# Test 5 "Should not throw when Extension name is invalid"
+$invalidExtensionName="InvalidWinRMCustomScriptExtension"
+
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName -connectedServiceName $connectedServiceName
+Assert-AreEqual $false $isExtensionExists
+
+# Test 6 "Should return true for valid values, if previous extension deployed successfully"
+Register-Mock Get-AzureMachineCustomScriptExtension { return @{"ProvisioningState"="Succeeded"} }
+Register-Mock Validate-CustomScriptExecutionStatus { return }
+Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}}
+Register-Mock Get-Endpoint {}
+
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName
+Assert-AreEqual $true $isExtensionExists
+Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 1
+Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1
+Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0
+
+# Test 7 "Should return false For valid values, if previous extension failed to deploy"
+Unregister-Mock Validate-CustomScriptExecutionStatus
+Register-Mock Validate-CustomScriptExecutionStatus { throw "error" }
+
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName
+
+Assert-AreEqual $false $isExtensionExists
+Assert-WasCalled Validate-CustomScriptExecutionStatus -Times 1
+
+# Test 8 "Should return false For valid values, if previous extension failed to provision"
+Unregister-Mock Get-AzureMachineCustomScriptExtension
+Register-Mock Get-AzureMachineCustomScriptExtension { return @{properties=@{ProvisioningState="Failed"}} }
+
+$isExtensionExists = Is-WinRMCustomScriptExtensionExists -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName -connectedServiceName $connectedServiceName
+
+Assert-AreEqual $false $isExtensionExists
+Assert-WasCalled Get-AzureMachineCustomScriptExtension -Times 1
diff --git a/Tasks/AzureFileCopy/Tests/L0UploadFilesToAzureContainer.ps1 b/Tasks/AzureFileCopy/Tests/L0UploadFilesToAzureContainer.ps1
new file mode 100644
index 000000000000..1d72d979ee77
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0UploadFilesToAzureContainer.ps1
@@ -0,0 +1,37 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+
+$invalidInputStorageAccount = "invalidInputStorageAccount"
+$exceptionMessage = "Exception thrown"
+
+Register-Mock Write-Telemetry { }
+
+# Test 1 "Should throw if destination blob is invalid"
+Register-Mock Copy-FilesToAzureBlob { throw $exceptionMessage } -ParametersEvaluator {$StorageAccountName -eq $invalidInputStorageAccount}
+Assert-Throws {
+ Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName `
+ -blobPrefix $validInputBlobPrefix -storageKey $validStorageKey -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureBlobDestinationType
+} -MessagePattern "*AFC_UploadContainerStorageAccount*invalidInputStorageAccount*"
+
+# Test 2 "Should throw and delete container if destination azureVM"
+Register-Mock Remove-AzureContainer { }
+
+Assert-Throws {
+ Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -storageAccountName $invalidInputStorageAccount -containerName $validInputContainerName `
+ -blobPrefix $validInputBlobPrefix -storageKey $validStorageKey -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureVmsDestinationType
+} -MessagePattern "*AFC_UploadContainerStorageAccount*invalidInputStorageAccount*"
+
+Assert-WasCalled Remove-AzureContainer -Times 1
+
+
+# Test 3 "Success in Upload blob destination"
+Register-Mock Copy-FilesToAzureBlob { return $succeededCopyResponse } -ParametersEvaluator {$StorageAccountName -eq $validInputStorageAccount}
+
+Upload-FilesToAzureContainer -sourcePath $validInputSourcePath -storageAccountName $validInputStorageAccount -containerName $validInputContainerName `
+ -blobPrefix $validInputBlobPrefix -storageKey $validStorageKey -azCopyLocation $validAzCopyLocation -destinationType $validInputAzureBlobDestinationType
+
+Assert-WasCalled Copy-FilesToAzureBlob -Times 1 -ParametersEvaluator {$StorageAccountName -eq $validInputStorageAccount}
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/L0UtilityThrowError.ps1 b/Tasks/AzureFileCopy/Tests/L0UtilityThrowError.ps1
new file mode 100644
index 000000000000..0736af738f66
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0UtilityThrowError.ps1
@@ -0,0 +1,12 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+
+ $exceptionMessage = "Exception thrown"
+
+Assert-Throws {
+ ThrowError -errorMessage $exceptionMessage
+} -MessagePattern "$exceptionMessage AFC_AzureFileCopyMoreHelp https://aka.ms/azurefilecopyreadme"
diff --git a/Tasks/AzureFileCopy/Tests/L0ValidateAzurePSVersion.ps1 b/Tasks/AzureFileCopy/Tests/L0ValidateAzurePSVersion.ps1
new file mode 100644
index 000000000000..941f6bd65080
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0ValidateAzurePSVersion.ps1
@@ -0,0 +1,25 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+
+. $PSScriptRoot\..\Utility.ps1
+
+$lowerThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "0.8.8"
+$minimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "0.9.0"
+$greaterThanMinimumAzureVersion = New-Object -TypeName System.Version -ArgumentList "0.9.8"
+
+Register-Mock Get-AzureCmdletsVersion { return $lowerThanMinimumAzureVersion }
+Register-Mock Write-Telemetry
+
+#Test 1 "Should throw if lower azureps version"
+Assert-Throws {
+ Validate-AzurePowershellVersion
+} -MessagePattern "*AFC_AzurePSNotInstalled*"
+
+#Test 2 "Should throw if lower azureps version"
+Unregister-Mock Get-AzureCmdletsVersion
+Register-Mock Get-AzureCmdletsVersion { return $greaterThanMinimumAzureVersion }
+
+Validate-AzurePowershellVersion
+Assert-WasCalled -Times 1 Get-AzureCmdletsVersion
diff --git a/Tasks/AzureFileCopy/Tests/L0ValidateCustomScriptExecutionStatus.ps1 b/Tasks/AzureFileCopy/Tests/L0ValidateCustomScriptExecutionStatus.ps1
new file mode 100644
index 000000000000..87807e415b4c
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/L0ValidateCustomScriptExecutionStatus.ps1
@@ -0,0 +1,66 @@
+[CmdletBinding()]
+param()
+
+. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
+. $PSScriptRoot\MockVariable.ps1
+. $PSScriptRoot\..\Utility.ps1
+. $PSScriptRoot\MockHelper.ps1
+
+$extensionName="WinRMCustomScriptExtension"
+
+# Test 1 "Should throw Resource group name is null"
+Assert-Throws {
+ $response = Validate-CustomScriptExecutionStatus -resourceGroupName $null -vmName $vm0Name -extensionName $extensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+
+# Test 2 "Should throw when VM name is null"
+Assert-Throws {
+ $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $null -extensionName $extensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+
+
+# Test 3 "Should throw when VM name is invalid"
+Assert-Throws {
+ $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $invalidMachineName -extensionName $extensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+
+# Test 4 "Should throw Extension name is null"
+Assert-Throws {
+ $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $null
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+
+# Test 5 "should throw when Extension name is invalid"
+$invalidExtensionName="InvalidWinRMCustomScriptExtension"
+Assert-Throws {
+ $response = Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $invalidExtensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+
+# Test 6 "Should not throw" "For valid values, if previous extension deployed successfully"
+Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}}
+$vmInstanceViews[$vm0Name]["Extensions"]=$extensions
+
+Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName
+Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 0
+
+# Test 7 "Should throw for valid values, if previous extension failed to deploy"
+$extensions[0]["SubStatuses"][1]["Message"]="Extension script execution failed."
+$vmInstanceViews[$vm0Name]["Extensions"]=$extensions
+
+Assert-Throws {
+ Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1
+
+# Test 8 "For valid values, if previous extension failed to provision"
+Unregister-Mock Remove-AzureMachineCustomScriptExtension
+Register-Mock Remove-AzureMachineCustomScriptExtension { return @{}}
+$extensions[0]["SubStatuses"][1]["Message"]="Failed to apply the extension."
+$vmInstanceViews[$vm0Name]["Extensions"]=$extensions
+
+Assert-Throws {
+ Validate-CustomScriptExecutionStatus -resourceGroupName $validRG -vmName $vm0Name -extensionName $extensionName
+} -MessagePattern "AFC_SetCustomScriptExtensionFailed *"
+Assert-WasCalled Remove-AzureMachineCustomScriptExtension -Times 1
+
+#Clean the extension
+$vmInstanceViews[$vm0Name]["Extensions"]=@()
diff --git a/Tasks/AzureFileCopy/Tests/MockHelper.ps1 b/Tasks/AzureFileCopy/Tests/MockHelper.ps1
new file mode 100644
index 000000000000..e785b4859988
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/MockHelper.ps1
@@ -0,0 +1,678 @@
+############## Constants ##########
+$invalidParam = "invalidParam"
+$validRG = "AzureFileCopyTaskPlatformTestDoNotDelete"
+$rgWithNoVM = "AzureFIleCopyPTRGNoVMDoNotDelete"
+$rgNameWithSecurityGroup = "AzureFIleCopyPTRGWithSGDoNotDelete"
+$validStorage = "azurefilecopyptsstore"
+$validStorageKey = "validStorageKey"
+$storageAccounts = @{}
+$storageAccounts.Add($validStorage, $validStorageKey)
+$validClassicStorage = "ptclassicstoredontdelete"
+$validClassicStorageKey = "validClassicStorageKey"
+$storageAccounts.Add($validClassicStorage, $validClassicStorageKey)
+
+$storageAccountsRG = @{}
+$storageAccountsRG.Add($validStorage, $validRG)
+$storageAccountsRG.Add($validClassicStorage, $validClassicStorageKey)
+
+$storageAccountsContext = @{}
+$storageAccountContext = @{}
+$storageAccountContext.StorageAccountName = $validStorage
+$storageAccountsContext.Add($validStorage, $storageAccountContext)
+
+$validSasToken = 'anyValidSaasToken'
+
+$location = "West US"
+$vm0Name = "myVM0"
+$vm1Name = "mytestVM0"
+$vm2Name = "mytestPTVM1"
+$lbName = "myLB"
+$classicvmfqdn = "taskplatformtesttwovm.cloudapp.net"
+$rgWithNoClassicVms = "taskplatformtestnovm"
+$rgWithClassicVMs = "taskplatformtesttwovm"
+$classicvm0 = "vm0"
+$classicvm1 = "VM1"
+$azurevmFqdn = "azurefilecopyplatformtestsdns.westus.cloudapp.azure.com"
+$winrmPort1 = "40001"
+$winrmPort2 = "40003"
+$winrmPort3 = "40005"
+$classicWinrmPort1 = "5986"
+$classicWinrmPort2 = "57148"
+$classicWinrmPort3 = "57149"
+
+# creating resourcegroups dictionary
+$resourceGroups = @{}
+$resourceGroup = @{}
+$resourceGroup.ResourceGroupName = $validRG
+$resourceGroup.Location = $location
+$resourceGroups.Add($validRG, $resourceGroup)
+
+$resourceGroup.ResourceGroupName = $rgWithNoVM
+$resourceGroups.Add($rgWithNoVM, $resourceGroup)
+$resourceGroup.ResourceGroupName = $rgWithNoClassicVms
+$resourceGroups.Add($rgWithNoClassicVms, $resourceGroup)
+
+$validActionResponse = @{"Status" = "Succeeded"}
+$VMsStatus = @{$vm0Name = "Running"; $vm1Name = "Running";$vm2Name = "Running"}
+
+$resourceGroups[$validRG].VMsDetails = $VMsStatus
+
+$vmInstanceView = @{"Statuses" = @(@{"DisplayStatus" = "Provisioning succeeded"},@{"DisplayStatus" = "VM running"}); "Extensions" = @(); "VMAgent" = @{"ExtensionHandlers" = @()}}
+$vmInstanceViews = @{$vm0Name = $vmInstanceView; $vm1Name = $vmInstanceView ; $vm2Name = $vmInstanceView}
+$vmResources = @(@{"Id" = "Microsoft.Compute/virtualMachines/myVM0"; "Name" = $vm0Name; "Location" = $location; "Tags" = @{"role" = "Test"}}, @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"; "Name" = $vm1Name; "Location" = $location; "Tags" = @{"role" = "mytest"}} , @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"; "Name" = $vm2Name; "Location" = $location; "Tags" = @{"role" = "mytestPT"}})
+
+$virtualMachine1 = @{"Id" = "Microsoft.Compute/virtualMachines/myVM0"}
+$IpConfigurations1 = @(@{"Name" = "ipconfig1"; "Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"})})
+$networkInterface1 = @{"Name" = "nic0"; "VirtualMachine" = $virtualMachine1; "IpConfigurations" = $IpConfigurations1}
+
+$virtualMachine2 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestVM0"}
+$IpConfigurations2 = @(@{"Name" = "ipconfig2"; "Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"})})
+$networkInterface2 = @{"Name" = "nicN0"; "Id" = "Microsoft.Network/networkInterfaces/nicN0"; "VirtualMachine" = $virtualMachine2; "IpConfigurations" = $IpConfigurations2}
+
+$virtualMachine3 = @{"Id" = "Microsoft.Compute/virtualMachines/mytestPTVM1"}
+$IpConfigurations3 = @(@{"Name" = "ipconfig3"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"; "LoadBalancerInboundNatRules" = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"})})
+$networkInterface3 = @{"Name" = "mytestptvm0456"; "Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456"; "VirtualMachine" = $virtualMachine3; "IpConfigurations" = $IpConfigurations3}
+
+$networkInterfaceResources = @($networkInterface1, $networkInterface2,$networkInterface3)
+
+$IpConfiguration3 = @{"Id" = "Microsoft.Network/loadBalancers/myLB/frontendIPConfigurations/LoadBalancerFrontend"}
+$publicIPAddressResources = @(@{"Name" = "myPublicIP"; "Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "40.118.129.77"; "DnsSettings" = @{"Fqdn" = "lbipac2b71e2680c44fd987d.westus.cloudapp.azure.com"}},@{"Name" = "myTestPTVM0"; "Id" = "Microsoft.Network/publicIPAddresses/myTestPTVM0"; "IpConfiguration" = $IpConfiguration3; "IpAddress" = "13.91.111.214"; "DnsSettings" = @{"Fqdn" = "lbipeca3f178ce794301af12.westus.cloudapp.azure.com"}})
+
+$inboundNatRules = @(@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/RDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/WINRM-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/NWINRM-VM1"},@{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MRDP-VM1"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM0"}, @{"Id" = "Microsoft.Network/loadBalancers/myLB/inboundNatRules/MWINRM-VM1"})
+$frontEndIPConfigs = @(@{"Name" = "LoadBalancerFrontend"; "PublicIpAddress" = @{"Id" = "Microsoft.Network/publicIPAddresses/myPublicIP"}; "InboundNatRules" = $inboundNatRules})
+
+$inboundRule1 = @{"Name" = "RDP-VM0"; "FrontendPort" = "50001"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}}
+$inboundRule2 = @{"Name" = "RDP-VM1"; "FrontendPort" = "50002"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null}
+$inboundRule3 = @{"Name" = "WINRM-VM0"; "FrontendPort" = $winrmPort1; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nic0/ipConfigurations/ipconfig1"}}
+$inboundRule4 = @{"Name" = "WINRM-VM1"; "FrontendPort" = "40002"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null}
+$inboundRule5 = @{"Name" = "NRDP-VM0"; "FrontendPort" = "50003"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}}
+$inboundRule6 = @{"Name" = "NRDP-VM1"; "FrontendPort" = "50004"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null}
+$inboundRule7 = @{"Name" = "NWINRM-VM0"; "FrontendPort" = "$winrmPort2"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/nicN0/ipConfigurations/ipconfig2"}}
+$inboundRule8 = @{"Name" = "NWINRM-VM1"; "FrontendPort" = "40004"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null}
+$inboundRule9 = @{"Name" = "MRDP-VM0"; "FrontendPort" = "50005"; "BackendPort" = "3389"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}}
+$inboundRule10 = @{"Name" = "MRDP-VM1"; "FrontendPort" = "50006"; "BackendPort" = "3389"; "BackendIPConfiguration" = $null}
+$inboundRule11 = @{"Name" = "MWINRM-VM0"; "FrontendPort" = "$winrmPort3"; "BackendPort" = "5986"; "BackendIPConfiguration" = @{"Id" = "Microsoft.Network/networkInterfaces/mytestptvm0456/ipConfigurations/ipconfig3"}}
+$inboundRule12 = @{"Name" = "MWINRM-VM1"; "FrontendPort" = "40006"; "BackendPort" = "5986"; "BackendIPConfiguration" = $null}
+$inboundRules = @($inboundRule1, $inboundRule2, $inboundRule3, $inboundRule4, $inboundRule5, $inboundRule6, $inboundRule7, $inboundRule8,$inboundRule9,$inboundRule10,$inboundRule11,$inboundRule12)
+
+$loadBalancerDetails = @{"frontEndIPConfigs" = $frontEndIPConfigs; "inboundRules" = $inboundRules}
+$loadBalancerResources = @{$lbName = $loadBalancerDetails}
+
+$azureResourceGroupDeploymentResponse = @{"networkInterfaceResources" = $networkInterfaceResources; "publicIPAddressResources" = $publicIPAddressResources; "loadBalancerResources" = $loadBalancerResources}
+
+#creating one RG deployment to be used through out test
+$resourceGroupDeployments = @{}
+$resourceGroupVMs = @{}
+$resourceGroupDeployments.Add($validRG, $azureResourceGroupDeploymentResponse)
+$resourceGroupVMs.Add($validRG, $VMsStatus)
+
+$cloudServices = @{}
+$cloudServiceWithNoVM = @{"vms" = $null; "vmConnectionDetails" = $null}
+$vmConnectionDetailsWithTwoVms = @{$classicvm0 = @{"Name" = $classicvm0; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort1}; $classicvm1 = @{"Name" = $classicvm1; "fqdn" = $classicvmfqdn; "winRMHttpsPort" = $classicWinrmPort2}}
+$cloudServiceWithTwoVM = @{"vms" = @(@{"Name" = $classicvm0}, @{"Name" = $classicvm1}); "vmConnectionDetails" = $vmConnectionDetailsWithTwoVms}
+
+$cloudServices.Add($rgWithNoClassicVms, $cloudServiceWithNoVM)
+$cloudServices.Add($rgWithClassicVMs, $cloudServiceWithTwoVM)
+
+#Extensions
+$winRMcustomScripExtensionObject = @{}
+$winRMcustomScripExtensionObject["ExtensionType"]="Microsoft.Compute.CustomScriptExtension"
+$winRMcustomScripExtensionObject["Name"]="winrmcustomscriptextension"
+$winRMcustomScripExtensionObject["TypeHandlerVersion"]="1.4"
+
+$subStatus0 = @{}
+$subStatus0["Code"]="ComponentStatus/StdOut/succeeded"
+$subStatus0["DisplayStatus"]="Provisioning succeeded"
+$subStatus0["Level"]="Info"
+$subStatus0["Message"]="Succeeded\\n\\nDeleted 1 rule(s).\\nOk.\\n\\nOk.\\n"
+$subStatus0["Time"]=$null
+
+
+$subStatus1 = @{}
+$subStatus1["Code"]="ComponentStatus/StdErr/succeeded"
+$subStatus1["DisplayStatus"]="Provisioning succeeded"
+$subStatus1["Level"]="Info"
+$subStatus1["Message"]=""
+$subStatus1["Time"]=$null
+
+$substatuses = @()
+$substatuses+=$subStatus0
+$substatuses+=$subStatus1
+
+$winRMcustomScripExtensionObject["SubStatuses"]=@()
+$winRMcustomScripExtensionObject["SubStatuses"]+=$substatuses
+
+
+$status0 = @{}
+$status0["Code"]="ProvisioningState/succeeded"
+$status0["DisplayStatus"]="Provisioning succeeded"
+$status0["Level"]="Info"
+$status0["Message"]="Finished executing command"
+$status0["Time"]=$null
+
+$statuses = @()
+$statuses += $status0
+
+$winRMcustomScripExtensionObject["Statuses"]=@()
+$winRMcustomScripExtensionObject["Statuses"]+=$statuses
+
+$extensions = @()
+$extensions += $winRMcustomScripExtensionObject
+
+$getCustomScriptExtensionResponse = @{"Status"="Succeeded"}
+$setCustomScriptExtensionResponse = @{"Status"="Succeeded"}
+$rgustomScriptExtensionResponse = @{"Status"="Succeeded"}
+$winrmCustomScriptExtension="WinRmCustomScriptExtension"
+$invalidCustomScriptName = "InvalidConfigureWinRM.ps1"
+
+$securityGroups = New-Object System.Collections.Generic.List[System.Object]
+$securityRules = New-Object System.Collections.Generic.List[System.Object]
+
+$validSecurityGroupProps = @{"Name"="VMWithSG";"SecurityRules"=$securityRules}
+$validSecurityGroup = New-Object PSObject -Property $validSecurityGroupProps
+$securityGroups.Add($validSecurityGroup)
+
+
+$securityGroupsRecommended = New-Object System.Collections.Generic.List[System.Object]
+$securityRulesRecommended = New-Object System.Collections.Generic.List[System.Object]
+
+$validSecurityGroupPropsRecommended = @{"Name"="VMWithSGRecPS";"SecurityRules"=$securityRulesRecommended}
+$validSecurityGroupRecommended = New-Object PSObject -Property $validSecurityGroupPropsRecommended
+$securityGroupsRecommended.Add($validSecurityGroupRecommended)
+
+$securityGroupsLatest = New-Object System.Collections.Generic.List[System.Object]
+$securityRulesLatest = New-Object System.Collections.Generic.List[System.Object]
+
+$validSecurityGroupPropsLatest = @{"Name"="VMWithSGHighPS";"SecurityRules"=$securityRulesLatest}
+$validSecurityGroupLatest = New-Object PSObject -Property $validSecurityGroupPropsLatest
+$securityGroupsLatest.Add($validSecurityGroupLatest)
+
+$vmIdWhichHasSecurityGroupPrevious = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSG"
+$vmIdWhichHasSecurityGroupRecommended = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGRecPS"
+$vmIdWhichHasSecurityGroupLatest = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFIleCopyPTRGWithSGDoNotDelete/providers/Microsoft.Compute/virtualMachines/VMWithSGHighPS"
+$vmIdWhichHasNoSecurityGroup = "/subscriptions/c94bda7a-0577-4374-9c53-0e46a9fb0f70/resourceGroups/AzureFileCopyTaskPlatformTestDoNotDelete/providers/Microsoft.Compute/virtualMachines/mytestVM0"
+$duplicateRuleName = "VSO-Custom-WinRM-Https-Port-Deplicate"
+
+#Create Mock Object type for Hyak.Common.CloudException
+$Source = @"
+ using System;
+namespace Hyak.Common {
+ public class CloudException : Exception {
+ }
+}
+"@
+Add-Type -TypeDefinition $Source -Language CSharp
+
+function Get-AzureStorageKeyFromRDFE
+{
+ param([string]$storageAccountName)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ throw New-Object Hyak.Common.CloudException
+ }
+
+ return $storageAccounts[$storageAccountName]
+ }
+}
+
+function Get-AzureStorageAccountTypeFromRDFE
+{
+ param([string]$storageAccountName)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ throw New-Object Hyak.Common.CloudException
+ }
+
+ return $storageAccounts[$storageAccountName]
+ }
+}
+
+function Get-AzureBlobStorageEndpointFromRDFE
+{
+ param([string]$storageAccountName)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ throw New-Object Hyak.Common.CloudException
+ }
+
+ return $storageAccounts[$storageAccountName]
+ }
+}
+
+function Get-AzureBlobStorageEndpointFromARM
+{
+ param([string]$storageAccountName)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ throw "Unable to find storage type $storageAccountName with Connection SPN"
+ }
+
+ return $storageAccounts[$storageAccountName]
+ }
+}
+
+function Get-AzureStorageAccountResourceGroupName
+{
+ param([string]$storageAccountName)
+
+ if (-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccountsRG.ContainsKey($storageAccountName))
+ {
+ throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only."
+ }
+
+ return $storageAccountsRG[$storageAccountName]
+ }
+}
+
+function Get-AzureStorageKeyFromARM
+{
+ param([string]$storageAccountName)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ throw "Storage account: $storageAccountName not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only."
+ }
+
+ return $storageAccounts[$storageAccountName]
+ }
+}
+
+function Create-AzureStorageContext
+{
+ param([string]$storageAccountName,
+ [string]$storageAccountKey)
+
+ if(-not [string]::IsNullOrEmpty($storageAccountName) -and -not [string]::IsNullOrEmpty($storageAccountKey))
+ {
+ if(-not $storageAccounts.ContainsKey($storageAccountName))
+ {
+ return
+ }
+
+ return $storageAccountsContext[$storageAccountName]
+ }
+}
+
+function Get-AzureCloudService
+{
+ param([string]$cloudServiceName)
+
+ if(-not [string]::IsNullOrEmpty($cloudServiceName))
+ {
+ if(-not $cloudServices.ContainsKey($cloudServiceName))
+ {
+ throw New-Object Hyak.Common.CloudException
+ }
+
+ return
+ }
+}
+
+function Get-AzureClassicVMsInResourceGroup
+{
+ param([string]$resourceGroupName)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $cloudServices.ContainsKey($resourceGroupName))
+ {
+ return $($cloudServices[$resourceGroupName])["vms"]
+ }
+}
+
+function Get-AzureClassicVMsConnectionDetailsInResourceGroup
+{
+ param([string]$resourceGroupName,
+ [object]$azureClassicVMResources)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and $cloudServices.ContainsKey($resourceGroupName))
+ {
+ return $($cloudServices[$resourceGroupName])["vmConnectionDetails"]
+ }
+}
+
+function Get-AzureRMVMsInResourceGroup
+{
+ param([string]$resourceGroupName)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName))
+ {
+ if(-not $resourceGroups.ContainsKey($resourceGroupName))
+ {
+ throw "Provided resource group '$resourceGroupName' does not exist."
+ }
+
+ if($resourceGroupDeployments.ContainsKey($resourceGroupName))
+ {
+ return $vmResources
+ }
+ }
+}
+
+function Get-AzureRMResourceGroupResourcesDetails
+{
+ param([string]$resourceGroupName,
+ [object]$azureRMVMResources)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName))
+ {
+ if(-not $resourceGroups.ContainsKey($resourceGroupName))
+ {
+ throw "Resource group '$resourceGroupName' could not be found."
+ }
+
+ if($resourceGroupDeployments.ContainsKey($resourceGroupName))
+ {
+ return $resourceGroupDeployments[$resourceGroupName]
+ }
+ }
+
+ return @{}
+}
+
+function Generate-AzureStorageContainerSASToken
+{
+ param([string]$containerName,
+ [object]$storageContext,
+ [System.Int32]$tokenTimeOutInHours)
+
+ if(-not [string]::IsNullOrEmpty($containerName) -and $storageContext)
+ {
+ return $validSasToken
+ }
+}
+
+function Remove-AzureContainer
+{
+
+}
+
+function Get-AzureMachineStatus
+{
+ param([string]$resourceGroupName,
+ [string]$name)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($name))
+ {
+ if(-not $resourceGroups.ContainsKey($resourceGroupName))
+ {
+ throw "Resource group '$resourceGroupName' could not be found."
+ }
+
+ $VMs = $resourceGroups[$resourceGroupName].VMsDetails
+ if($VMs -and $VMs.ContainsKey($name))
+ {
+ $tempExts = $vmInstanceViews[$name]["Extensions"]
+ if($tempExts -and $tempExts.Count -ge 1)
+ {
+ $status = @{}
+ $status["Extensions"] = $tempExts
+ #$customScriptExtension=$tempExts[0]
+ }
+ else
+ {
+ throw "No extension exists with name '$winrmCustomScriptExtension'"
+ }
+ }
+ else
+ {
+ throw "The Resource 'Microsoft.Compute/virtualMachines/$name/extensions/$winrmCustomScriptExtension' under resource group '$resourceGroupName' was not found."
+ }
+ }
+
+ return $status
+}
+
+function Get-AzureMachineCustomScriptExtension
+{
+ param([string]$resourceGroupName,
+ [string]$vmName,
+ [string]$name)
+
+ $errMsg="The Resource 'Microsoft.Compute/virtualMachines/$vmName/extensions/$name' under resource group '$resourceGroupName' was not found."
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName))
+ {
+ if(-not $resourceGroups.ContainsKey($resourceGroupName))
+ {
+ throw "Resource group '$resourceGroupName' could not be found."
+ }
+
+ $VMs = $resourceGroups[$resourceGroupName].VMsDetails
+ if($VMs -and $VMs.ContainsKey($vmName))
+ {
+ if($name)
+ {
+ $tempExts = $vmInstanceViews[$vmName]["Extensions"]
+ if($tempExts -and $tempExts.Count -ge 1)
+ {
+ $response = @{}
+ if($tempExts[0]["SubStatuses"][1]["Message"] -and $extension[0]["SubStatuses"][1]["Message"] -ne "")
+ {
+ $response["ProvisioningState"]="Failed"
+ }
+ else
+ {
+ $response["ProvisioningState"]="Succeeded"
+ }
+ }
+ else
+ {
+ throw $errMsg
+ }
+ }
+ else
+ {
+ throw $errMsg
+ }
+ }
+ else
+ {
+ throw $errMsg
+ }
+ }
+
+ return $response
+}
+
+function Set-AzureMachineCustomScriptExtension
+{
+ param([string]$resourceGroupName,
+ [string]$vmName,
+ [string]$name,
+ [string[]]$fileUri,
+ [string]$run,
+ [string]$argument,
+ [string]$location)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name))
+ {
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName))
+ {
+ if(-not $resourceGroups.ContainsKey($resourceGroupName))
+ {
+ throw "Resource group '$resourceGroupName' could not be found."
+ }
+
+ $VMs = $resourceGroups[$resourceGroupName].VMsDetails
+ if($VMs -and $VMs.ContainsKey($vmName))
+ {
+ $response = @{}
+
+ if(-not $fileUri)
+ {
+ throw "Cannot validate argument on parameter 'FileUri'. The argument is null or empty."
+ }
+
+ if(-not $run)
+ {
+ throw "Cannot validate argument on parameter 'Run'. The argument is null or empty."
+ }
+
+ if(-not $argument)
+ {
+ throw "Cannot validate argument on parameter 'Argument'. The argument is null or empty."
+ }
+
+ if(-not $location)
+ {
+ throw "Cannot validate argument on parameter 'Location'. The argument is null or empty."
+ }
+
+ if($fileUri.Count -eq 2)
+ {
+ $extensions[0]["SubStatuses"][1]["Message"]="'.\winrmconf.cmd' is not recognized as an internal or external command,\noperable program or batch file."
+ $response["Status"]="Succeeded"
+ }
+ elseif($run -eq $invalidCustomScriptName)
+ {
+ $extensions[0]["SubStatuses"][1]["Message"]="The argument '$invalidCustomScriptName' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the -File parameter."
+ $errorDetails = @{"Message" = "VM has reported a failure when processing extension 'WinRMCustomScriptExtension'. Error message: Finished executing command."}
+ $response["Error"]= $errorDetails
+ $response["Status"]="Failed"
+ }
+ else
+ {
+ $extensions[0]["SubStatuses"][1]["Message"]=""
+ $response["Status"]="Succeeded"
+ }
+
+ $vmInstanceViews[$vmName]["Extensions"]=$extensions
+ }
+ else
+ {
+ throw "Can not perform requested operation on nested resource. Parent resource '$vmName' not found."
+ }
+ }
+ }
+
+ return $response
+}
+
+function Remove-AzureMachineCustomScriptExtension
+{
+ param([string]$resourceGroupName,
+ [string]$vmName,
+ [string]$name)
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName) -and -not [string]::IsNullOrEmpty($name))
+ {
+
+ if(-not [string]::IsNullOrEmpty($resourceGroupName) -and -not [string]::IsNullOrEmpty($vmName))
+ {
+ $response = @{}
+ $VMs = $resourceGroups[$resourceGroupName].VMsDetails
+ if($VMs -and $VMs.ContainsKey($vmName))
+ {
+ $tempExts = $vmInstanceViews[$vmName]["Extensions"]
+ if($tempExts -and $tempExts.Count -ge 1)
+ {
+ $vmInstanceViews[$vmName]["extensions"]=@()
+ $response["Status"]="Succeeded"
+ }
+ else
+ {
+ $response["Status"]="Succeeded"
+ }
+ }
+ else
+ {
+ $response["Status"]="Succeeded"
+ }
+ }
+ }
+
+ return $response
+}
+
+function Add-AzureNetworkSecurityRuleConfig
+{
+}
+
+function Add-NetworkSecurityRuleConfig
+{
+ param([string]$resourceGroupName,
+ [object]$securityGroups,
+ [string]$ruleName,
+ [string]$rulePriotity,
+ [string]$winrmHttpsPort)
+
+ if(($securityGroups.Count -gt 0) -and (-not $securityGroups[0].SecurityRules -or $ruleName -eq $duplicateRuleName))
+ {
+ Add-AzureNetworkSecurityRuleConfig
+
+ $tempRulePriority = "3986"
+ if($ruleName -eq $duplicateRuleName)
+ {
+ $tempRulePriority = "4036"
+ }
+
+ $securityRuleProps = @{"Name"=$ruleName;"Priority"=$tempRulePriority}
+ $securityRule = New-Object PSObject -Property $securityRuleProps
+ $securityGroups[0].SecurityRules += $securityRule
+ }
+
+ return $securityGroups
+}
+
+function Set-AzureNetworkSecurityGroup
+{
+ param([object]$NetworkSecurityGroup)
+
+ if($NetworkSecurityGroup.Name -eq $validSecurityGroup.Name)
+ {
+ $validSecurityGroup = $NetworkSecurityGroup
+ }
+
+ return $validSecurityGroup
+}
+
+function Get-NetworkSecurityGroups
+{
+ param([string] $resourceGroupName,
+ [string] $vmId)
+
+ if($vmId -eq $vmIdWhichHasNoSecurityGroup)
+ {
+ return @()
+ }
+ elseif($vmId -eq $vmIdWhichHasSecurityGroupPrevious)
+ {
+ return $securityGroups
+ }
+ elseif($vmId -eq $vmIdWhichHasSecurityGroupRecommended)
+ {
+ return $securityGroupsRecommended
+ }
+ elseif($vmId -eq $vmIdWhichHasSecurityGroupLatest)
+ {
+ return $securityGroupsLatest
+ }
+ else
+ {
+ throw "[Azure Call]No network interface found with virtual machine id $vmId under resource group $rgNameWithSecurityGroup"
+ }
+}
+
+# Used only in test code
+function Remove-NetworkSecurityRuleConfig
+{
+ param([object] $securityGroups,
+ [string] $ruleName)
+
+ $validSecurityGroup["SecurityRules"]=@()
+}
\ No newline at end of file
diff --git a/Tasks/AzureFileCopy/Tests/MockVariable.ps1 b/Tasks/AzureFileCopy/Tests/MockVariable.ps1
new file mode 100644
index 000000000000..373cb5bc6502
--- /dev/null
+++ b/Tasks/AzureFileCopy/Tests/MockVariable.ps1
@@ -0,0 +1,45 @@
+
+$validInputSourcePath = Join-Path $env:windir "Source"
+$validInputAzureBlobDestinationType = "AzureBlob"
+$validInputAzureVmsDestinationType = "AzureVms"
+$validInputStorageAccount = "validInputStorageAccount"
+$validInputContainerName = "validContainerName"
+$validInputBlobPrefix = "validBlobPrefix"
+$validResourceGroupName = "validResourceGroupName"
+$validInputVmsAdminUserName = "validInputVmsAdminUserName"
+$validInputVmsAdminPassword = "validInputVmsAdminPassword"
+$validSasToken = '?sv=2015-02-21&sr=c&sig=Ncs6hCfAhzwwWd19eP7ToJATsS3xS1laFfPmRwO90qY%3D&se=2016-01-04T18%3A13%3A12Z&sp=rwdl'
+
+$validStorageKey = "validsotrageKey"
+$validAzCopyLocation = Join-Path $env:windir "AzCopyLocation"
+$validInputTargetPath = Join-Path $env:windir "Target"
+
+$failedStatus = "Failed"
+$failedCopyLog = "Failed Copy Operation"
+$failedCopyError = $failedCopyLog
+$failedDeploymentResponseForCopy = @{"MachineName" = "vm0"; "Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = @{"Message" = $failedCopyError}}
+
+$passedStatus = "Passed"
+$successLog = "Success Logs"
+$passedDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null}
+$passedLatestDeploymentResponseForCopy = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null}
+
+$guidingMessageForAzureFileCopy = "For more info please refer to https://aka.ms/azurefilecopyreadme"
+$winrmHelpMsg = "To fix WinRM connection related issues, select the 'Enable Copy Prerequisites' option in the task. If set already, and the target Virtual Machines are backed by a Load balancer, ensure Inbound NAT rules are configured for target port (5986). Applicable only for ARM VMs."
+
+$succeededStatus = "Succeeded"
+$succeededCopyResponse = @{"Status" = $succeededStatus; "Log" = $null; "Error" = $null}
+
+$assembly = New-Object System.Collections.Generic.List``1[System.Object]
+
+$testJobs = New-Object System.Collections.Generic.List``1[System.Object]
+$failedJob = @{"Id" = "1"; "Status" = "Completed"}
+$passedJob = @{"Id" = "2"; "Status" = "Completed"}
+$passedLatestJob = @{"Id" = "3"; "Status" = "Completed"}
+$passedJob1 = @{"Id" = "1"; "Status" = "Completed"}
+
+$jobFailedResponse = @{"Status" = $failedStatus; "DeploymentLog" = $failedCopyLog; "ServiceLog" = $null; "Error" = $null}
+$jobPassedResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null}
+$jobPassedLatestResponse = @{"Status" = $passedStatus; "DeploymentLog" = $successLog; "ServiceLog" = $null; "Error" = $null}
+
+$connectedServiceName = "DummyConnectedServiceName"
diff --git a/Tasks/XamarinLicense/tsconfig.json b/Tasks/AzureFileCopy/tsconfig.json
similarity index 60%
rename from Tasks/XamarinLicense/tsconfig.json
rename to Tasks/AzureFileCopy/tsconfig.json
index 0438b79f69ac..79a868c8d1e3 100644
--- a/Tasks/XamarinLicense/tsconfig.json
+++ b/Tasks/AzureFileCopy/tsconfig.json
@@ -2,5 +2,8 @@
"compilerOptions": {
"target": "ES6",
"module": "commonjs"
- }
+ },
+ "exclude": [
+ "node_modules"
+ ]
}
\ No newline at end of file
diff --git a/Tasks/AzurePowerShell/task.loc.json b/Tasks/AzurePowerShell/task.loc.json
index 38ff7718d49a..380ffcc47ef9 100644
--- a/Tasks/AzurePowerShell/task.loc.json
+++ b/Tasks/AzurePowerShell/task.loc.json
@@ -84,4 +84,4 @@
"InvalidScriptArguments0": "ms-resource:loc.messages.InvalidScriptArguments0",
"InvalidScriptPath0": "ms-resource:loc.messages.InvalidScriptPath0"
}
-}
+}
\ No newline at end of file
diff --git a/Tasks/AzureRmWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzureRmWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson
index 23c19f692894..7c2698f2c9a0 100644
--- a/Tasks/AzureRmWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson
+++ b/Tasks/AzureRmWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson
@@ -5,7 +5,6 @@
"loc.instanceNameFormat": "Deploy AzureRM App Service: $(WebAppName)",
"loc.group.displayName.AdditionalDeploymentOptions": "Additional Deployment Options",
"loc.group.displayName.output": "Output",
- "loc.group.displayName.FileTransformsAndVariableSubstitution": "File Transforms and Variable Substitutions",
"loc.input.label.ConnectedServiceName": "AzureRM Subscription",
"loc.input.help.ConnectedServiceName": "Select the Azure Resource Manager subscription for the deployment.",
"loc.input.label.WebAppName": "App Service Name",
@@ -34,9 +33,6 @@
"loc.input.help.AdditionalArguments": "Additional Web Deploy arguments that will be applied when deploying the Azure Web App like,-disableLink:AppPoolExtension -disableLink:ContentExtension.",
"loc.input.label.TakeAppOfflineFlag": "Take App Offline",
"loc.input.help.TakeAppOfflineFlag": "Select the option to take the AzureRM Web App 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.",
- "loc.input.label.XmlTransformsAndVariableSubstitutions": "XML Transforms & Variable Substitutions",
- "loc.input.label.VariableSubstitution": "Variable Substitution",
- "loc.input.help.VariableSubstitution": "Variables defined in the Build or Release Definition will be automatically substituted in the appSettings, applicationSettings, and connectionStrings section of the config files. If same variables are defined in the Release Definition and in the Environment, then the Environment variables will supersede the Release Definition variables. Variable Substitution is run after Config Transforms.",
"loc.messages.Invalidwebapppackageorfolderpathprovided": "Invalid webapp package or folder path provided: %s",
"loc.messages.SetParamFilenotfound0": "Set parameters file not found: %s",
"loc.messages.GotconnectiondetailsforazureRMWebApp0": "Got connection details for azureRM WebApp:'%s'",
@@ -84,5 +80,6 @@
"loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent",
"loc.messages.WebAppDoesntExist": "Webapp '%s' doesn't exist. Webapp should exist before deployment.",
"loc.messages.EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution and Transformation 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. 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"
}
\ No newline at end of file
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0.ts
index 808db8f3bc61..0e108234e70f 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0.ts
@@ -189,7 +189,9 @@ describe('AzureRmWebAppDeployment Suite', function() {
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
var expectedErr = 'Error: loc_mock_SetParamFilenotfound0';
assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'should have said: ' + expectedErr);
- assert(tr.failed, 'task should have succeeded');
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) >= 0, 'should have said: ' + expectedOut);
+ assert(tr.failed, 'task should have failed');
done();
});
@@ -202,6 +204,8 @@ describe('AzureRmWebAppDeployment Suite', function() {
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
var expectedErr = 'Error: loc_mock_MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpatern';
assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'should have said: ' + expectedErr);
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) >= 0, 'should have said: ' + expectedOut);
assert(tr.failed, 'task should have failed');
done();
});
@@ -214,7 +218,9 @@ describe('AzureRmWebAppDeployment Suite', function() {
assert(tr.invokedToolCount == 0, 'should not have invoked any tool');
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
var expectedErr = 'Error: Not found Invalid_webAppPkg';
- assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'should have said: ' + expectedErr);
+ assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'should have said: ' + expectedErr);
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) >= 0, 'should have said: ' + expectedOut);
assert(tr.failed, 'task should have failed');
done();
});
@@ -226,7 +232,9 @@ describe('AzureRmWebAppDeployment Suite', function() {
assert(tr.invokedToolCount == 1, 'should have invoked tool once');
assert(tr.stderr.length == 0 && tr.errorIssues.length == 0, 'should not have written to stderr');
- assert(tr.succeeded, 'task should have failed');
+ assert(tr.succeeded, 'task should have succeeded');
+ var expectedOut = 'Updated history to kudu';
+ assert(tr.stdout.search(expectedOut) > 0, 'should have said: ' + expectedOut);
done();
});
@@ -249,7 +257,7 @@ describe('AzureRmWebAppDeployment Suite', function() {
let tp = path.join(__dirname, 'L0NonWindowsFolderPkg.js');
let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
tr.run();
-
+
assert(tr.invokedToolCount == 0, 'should not have invoked any tool');
assert(tr.stderr.length == 0 && tr.errorIssues.length == 0, 'should not have written to stderr');
var expectedOut = 'loc_mock_Compressedfolderintozip';
@@ -286,6 +294,8 @@ describe('AzureRmWebAppDeployment Suite', function() {
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
var expectedErr = 'Error: Error: Folder Archiving Failed';
assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'should have said: ' + expectedErr);
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) > 0, 'should have said: ' + expectedOut);
assert(tr.failed, 'task should have failed');
done();
});
@@ -328,7 +338,9 @@ describe('AzureRmWebAppDeployment Suite', function() {
var expectedErr = "Error: loc_mock_XdtTransformationErrorWhileTransforming";
assert(tr.invokedToolCount == 1, 'should have invoked tool only once');
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
- assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'E should have said: ' + expectedErr);
+ assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'E should have said: ' + expectedErr);
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) > 0, 'should have said: ' + expectedOut);
assert(tr.failed, 'task should have failed');
done();
});
@@ -341,7 +353,9 @@ describe('AzureRmWebAppDeployment Suite', function() {
var expectedErr = "Error: loc_mock_CannotPerformXdtTransformationOnNonWindowsPlatform";
assert(tr.invokedToolCount == 0, 'should not have invoked tool any tool');
assert(tr.stderr.length > 0 || tr.errorIssues.length > 0, 'should have written to stderr');
- assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'E should have said: ' + expectedErr);
+ assert(tr.stdErrContained(expectedErr) || tr.createdErrorIssue(expectedErr), 'E should have said: ' + expectedErr);
+ var expectedOut = 'Failed to update history to kudu';
+ assert(tr.stdout.search(expectedOut) > 0, 'should have said: ' + expectedOut);
assert(tr.failed, 'task should have failed');
done();
});
@@ -358,6 +372,8 @@ describe('AzureRmWebAppDeployment Suite', function() {
var resultFile = ltx.parse(fs.readFileSync(path.join(__dirname, 'L1XmlVarSub/Web_test.Debug.config')));
var expectFile = ltx.parse(fs.readFileSync(path.join(__dirname, 'L1XmlVarSub/Web_Expected.Debug.config')));
assert(ltx.equal(resultFile, expectFile) , 'Should have substituted variables in Web.Debug.config file');
+ var expectedOut = 'Updated history to kudu';
+ assert(tr.stdout.search(expectedOut) > 0, 'should have said: ' + expectedOut);
done();
});
@@ -378,4 +394,25 @@ describe('AzureRmWebAppDeployment Suite', function() {
done();
});
+ it('Validate File Encoding', (done:MochaDone) => {
+ let tp = path.join(__dirname, 'L0ValidateFileEncoding.js');
+ let tr : ttm.MockTestRunner = new ttm.MockTestRunner(tp);
+ tr.run();
+
+ assert(tr.stdout.search('UTF-8 with BOM validated') >= 0, 'Should have validated UTF-8 with BOM');
+ assert(tr.stdout.search('UTF-16LE with BOM validated') >= 0, 'Should have validated UTF-16LE with BOM');
+ assert(tr.stdout.search('UTF-16BE with BOM validated') >= 0, 'Should have validated UTF-16BE with BOM');
+ assert(tr.stdout.search('UTF-32LE with BOM validated') >= 0, 'Should have validated UTF-32LE with BOM');
+ assert(tr.stdout.search('UTF-32BE with BOM validated') >= 0, 'Should have validated UTF-32BE with BOM');
+
+ assert(tr.stdout.search('UTF-8 without BOM validated') >= 0, 'Should have validated UTF-8 without BOM');
+ assert(tr.stdout.search('UTF-16LE without BOM validated') >= 0, 'Should have validated UTF-16LE without BOM');
+ assert(tr.stdout.search('UTF-16BE without BOM validated') >= 0, 'Should have validated UTF-16BE without BOM');
+ assert(tr.stdout.search('UTF-32LE without BOM validated') >= 0, 'Should have validated UTF-32LE without BOM');
+ assert(tr.stdout.search('UTF-32BE without BOM validated') >= 0, 'Should have validated UTF-32BE without BOM');
+
+ assert(tr.stdout.search('Short File Buffer Error') >= 0, 'Should have validated short Buffer');
+ assert(tr.stdout.search('Unknown encoding type') >= 0, 'Should throw for Unknown File Buffer');
+ done();
+ });
});
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0JsonVarSub.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0JsonVarSub.ts
index 4ab159261cf0..737f96d92af0 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0JsonVarSub.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0JsonVarSub.ts
@@ -146,10 +146,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFailArchive.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFailArchive.ts
index 9ce66d807c39..e1451545debf 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFailArchive.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFailArchive.ts
@@ -139,6 +139,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
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) {
@@ -153,24 +154,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
});
-tr.registerMock('./azurerestutility.js', {
- 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"]));
- }
-});
-
tr.registerMock('./kuduutility.js', {
- archiveFolder: 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";
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFolderPkg.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFolderPkg.ts
index 698442b877c8..5f033ed4c8a4 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFolderPkg.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsFolderPkg.ts
@@ -139,6 +139,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
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) {
@@ -153,20 +154,6 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
});
-tr.registerMock('./azurerestutility.js', {
- 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"]));
- }
-});
-
tr.registerMock('./kuduutility.js', {
deployWebAppPackage: function(webAppPackage, webAppZipFile) {
console.log ('Deployed using KuduDeploy');
@@ -190,7 +177,10 @@ tr.registerMock('./kuduutility.js', {
containsParamFile: function (webAppPackage) {
var isParamFilePresent = false;
return isParamFilePresent;
- },
+ }
+});
+
+tr.registerMock('webdeployment-common/ziputility.js', {
archiveFolder : function() {
console.log('Folder Archiving Successful');
}
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsParamFileinPkg.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsParamFileinPkg.ts
index ba63698f309f..ca6b3ab76e63 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsParamFileinPkg.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0NonWindowsParamFileinPkg.ts
@@ -132,6 +132,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
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) {
@@ -146,21 +147,6 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
});
-tr.registerMock('./azurerestutility.js', {
-
- 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"]));
- }
-});
-
tr.registerMock('./kuduutility.js', {
deployWebAppPackage: function(webAppPackage, webAppZipFile) {
console.log ('Deployed using KuduDeploy');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0ValidateFileEncoding.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0ValidateFileEncoding.ts
new file mode 100644
index 000000000000..e6b26fc39c86
--- /dev/null
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0ValidateFileEncoding.ts
@@ -0,0 +1,77 @@
+var fileEncoding = require('../node_modules/webdeployment-common/fileencoding.js');
+
+var fileEncodeType = fileEncoding.detectFileEncoding('utf-8.txt', new Buffer([239, 187, 191, 0]));
+if(fileEncodeType[0] === 'utf-8' && fileEncodeType[1]) {
+ console.log('UTF-8 with BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-32le.txt', new Buffer([255, 254, 0, 0]));
+}
+catch(exception) {
+ console.log('UTF-32LE with BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-16be.txt', new Buffer([254, 255, 0 ,0]));
+}
+catch(exception) {
+ console.log('UTF-16BE with BOM validated');
+}
+
+var fileEncodeType = fileEncoding.detectFileEncoding('utf-16le.txt', new Buffer([255, 254, 10, 10]));
+if(fileEncodeType[0] === 'utf-16le' && fileEncodeType[1]) {
+ console.log('UTF-16LE with BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-32BE.txt', new Buffer([0, 0, 254, 255]));
+}
+catch(exception) {
+ console.log('UTF-32BE with BOM validated');
+}
+
+var fileEncodeType = fileEncoding.detectFileEncoding('utf-8.txt', new Buffer([10, 11, 12, 13]));
+if(fileEncodeType[0] === 'utf-8' && !fileEncodeType[1]) {
+ console.log('UTF-8 without BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-32le.txt', new Buffer([255, 0, 0, 0]));
+}
+catch(exception) {
+ console.log('UTF-32LE without BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-32be.txt', new Buffer([0, 0, 0, 255]));
+}
+catch(exception) {
+ console.log('UTF-32BE without BOM validated');
+}
+
+try {
+ var fileEncodeType = fileEncoding.detectFileEncoding('utf-16be.txt', new Buffer([0, 10, 0 ,20]));
+}
+catch(exception) {
+ console.log('UTF-16BE without BOM validated');
+}
+
+var fileEncodeType = fileEncoding.detectFileEncoding('utf-16le.txt', new Buffer([20, 0, 10, 0]));
+if(fileEncodeType[0] === 'utf-16le' && !fileEncodeType[1]) {
+ console.log('UTF-16LE without BOM validated');
+}
+
+try {
+ fileEncoding.detectFileEncoding('utfShort.txt', new Buffer([20, 0]));
+}
+catch(exception) {
+ console.log('Short File Buffer Error');
+}
+
+try {
+ fileEncoding.detectFileEncoding('utfUnknown.txt', new Buffer([0, 10, 20, 30]));
+}
+catch(exception) {
+ console.log('Unknown encoding type')
+}
\ No newline at end of file
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsAllInput.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsAllInput.ts
index 5402694f8b0b..fd6fa3363a30 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsAllInput.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsAllInput.ts
@@ -150,11 +150,8 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
- updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
+ },
+ updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
}
@@ -163,6 +160,7 @@ tr.registerMock('./azurerestutility.js', {
}
var webAppPublishKuduUrl = publishingProfile.publishUrl;
var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess);
+ requestDetails["requestBody"].author = 'author';
console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"]));
}
});
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsDefault.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsDefault.ts
index 0d89e6e081a1..737ac10c3881 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsDefault.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsDefault.ts
@@ -143,10 +143,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailDefault.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailDefault.ts
index 69f2f442c540..e94b9e3a5058 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailDefault.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailDefault.ts
@@ -130,10 +130,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
@@ -148,6 +145,5 @@ tr.registerMock('./azurerestutility.js', {
}
});
-
tr.setAnswers(a);
tr.run();
\ No newline at end of file
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailSetParamFile.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailSetParamFile.ts
index b743ca93facc..651fdd9b43b0 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailSetParamFile.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFailSetParamFile.ts
@@ -132,10 +132,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
@@ -145,6 +142,7 @@ tr.registerMock('./azurerestutility.js', {
}
var webAppPublishKuduUrl = publishingProfile.publishUrl;
var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess);
+ requestDetails["requestBody"].author = 'author';
console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"]));
}
});
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFolderPkg.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFolderPkg.ts
index f4c8f0a7d638..9aae2cf5c690 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFolderPkg.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsFolderPkg.ts
@@ -144,10 +144,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
@@ -157,6 +154,7 @@ tr.registerMock('./azurerestutility.js', {
}
var webAppPublishKuduUrl = publishingProfile.publishUrl;
var requestDetails = kuduDeploymentLog.getUpdateHistoryRequest(webAppPublishKuduUrl, isDeploymentSuccess);
+ requestDetails["requestBody"].author = 'author';
console.log("kudu log requestBody is:" + JSON.stringify(requestDetails["requestBody"]));
}
});
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsManyPackage.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsManyPackage.ts
index 0a2834a15e91..dc9b46e1d4b6 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsManyPackage.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsManyPackage.ts
@@ -145,10 +145,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsNoPackage.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsNoPackage.ts
index ccc807733bda..c124b6fbe333 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsNoPackage.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsNoPackage.ts
@@ -139,11 +139,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsParamFileinPkg.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsParamFileinPkg.ts
index 5893548cb5e7..62ae8698d2ce 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsParamFileinPkg.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsParamFileinPkg.ts
@@ -137,10 +137,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsSpecificSlot.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsSpecificSlot.ts
index ede56297c0c8..24d8266909c1 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsSpecificSlot.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsSpecificSlot.ts
@@ -148,10 +148,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformation.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformation.ts
index b0c01ef029c2..93f71d2aafeb 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformation.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformation.ts
@@ -150,10 +150,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformationFail.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformationFail.ts
index e75548a814c5..e2f759f3b33b 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformationFail.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0WindowsXdtTransformationFail.ts
@@ -145,10 +145,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
-}
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0XdtTransform.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0XdtTransform.ts
index c05cf463851c..8730810c2960 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0XdtTransform.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0XdtTransform.ts
@@ -146,10 +146,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/Tests/L0XmlVarSub.ts b/Tasks/AzureRmWebAppDeployment/Tests/L0XmlVarSub.ts
index 9ae211efbe6c..07b8b4e8079c 100644
--- a/Tasks/AzureRmWebAppDeployment/Tests/L0XmlVarSub.ts
+++ b/Tasks/AzureRmWebAppDeployment/Tests/L0XmlVarSub.ts
@@ -159,10 +159,7 @@ tr.registerMock('webdeployment-common/azurerestutility.js', {
}
return config;
- }
-});
-
-tr.registerMock('./azurerestutility.js', {
+ },
updateDeploymentStatus: function(publishingProfile, isDeploymentSuccess ) {
if(isDeploymentSuccess) {
console.log('Updated history to kudu');
diff --git a/Tasks/AzureRmWebAppDeployment/azurermwebappdeployment.ts b/Tasks/AzureRmWebAppDeployment/azurermwebappdeployment.ts
index 3eec8872e5e4..170270572b4f 100644
--- a/Tasks/AzureRmWebAppDeployment/azurermwebappdeployment.ts
+++ b/Tasks/AzureRmWebAppDeployment/azurermwebappdeployment.ts
@@ -38,11 +38,18 @@ async function run() {
var variableSubstitution: boolean = tl.getBoolInput('VariableSubstitution', false);
var endPointAuthCreds = tl.getEndpointAuthorization(connectedServiceName, true);
+ var isDeploymentSuccess: boolean = true;
+ var deploymentErrorMessage: string;
+
var SPN = new Array();
SPN["servicePrincipalClientID"] = endPointAuthCreds.parameters["serviceprincipalid"];
SPN["servicePrincipalKey"] = endPointAuthCreds.parameters["serviceprincipalkey"];
SPN["tenantID"] = endPointAuthCreds.parameters["tenantid"];
SPN["subscriptionId"] = tl.getEndpointDataParameter(connectedServiceName, 'subscriptionid', true);
+
+ var publishingProfile = await azureRESTUtility.getAzureRMWebAppPublishProfile(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName);
+ tl._writeLine(tl.loc('GotconnectiondetailsforazureRMWebApp0', webAppName));
+
var availableWebPackages = utility.findfiles(webDeployPkg);
if(availableWebPackages.length == 0) {
throw new Error(tl.loc('Nopackagefoundwithspecifiedpattern'));
@@ -55,9 +62,6 @@ async function run() {
var isFolderBasedDeployment = utility.isInputPkgIsFolder(webDeployPkg);
- var publishingProfile = await azureRESTUtility.getAzureRMWebAppPublishProfile(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName);
- tl._writeLine(tl.loc('GotconnectiondetailsforazureRMWebApp0', webAppName));
-
if(jsonVariableSubsFlag || (xmlTransformsAndVariableSubstitutions && (xmlTransformation || variableSubstitution))) {
var folderPath = path.join(tl.getVariable('System.DefaultWorkingDirectory'), 'temp_web_package_folder');
if(isFolderBasedDeployment) {
@@ -108,9 +112,23 @@ async function run() {
tl.debug(tl.loc("Initiateddeploymentviakuduserviceforwebapppackage", webDeployPkg));
var azureWebAppDetails = await azureRESTUtility.getAzureRMWebAppConfigDetails(SPN, webAppName, resourceGroupName, deployToSlotFlag, slotName);
await DeployUsingKuduDeploy(webDeployPkg, azureWebAppDetails, publishingProfile, virtualApplication, isFolderBasedDeployment, takeAppOfflineFlag);
+
}
+
} catch (error) {
- tl.setResult(tl.TaskResult.Failed, error);
+ isDeploymentSuccess = false;
+ deploymentErrorMessage = error;
+ }
+ if(publishingProfile != null) {
+ try {
+ tl._writeLine(await azureRESTUtility.updateDeploymentStatus(publishingProfile, isDeploymentSuccess));
+ }
+ catch(error) {
+ tl.warning(error);
+ }
+ }
+ if(!isDeploymentSuccess) {
+ tl.setResult(tl.TaskResult.Failed, deploymentErrorMessage);
}
}
@@ -127,9 +145,6 @@ async function run() {
*/
async function DeployUsingKuduDeploy(webDeployPkg, azureWebAppDetails, publishingProfile, virtualApplication, isFolderBasedDeployment, takeAppOfflineFlag) {
- var isDeploymentSuccess = true;
- var deploymentError = null;
-
try {
var virtualApplicationMappings = azureWebAppDetails.properties.virtualApplications;
var webAppZipFile = webDeployPkg;
@@ -147,19 +162,7 @@ async function DeployUsingKuduDeploy(webDeployPkg, azureWebAppDetails, publishin
}
catch(error) {
tl.error(tl.loc('Failedtodeploywebsite'));
- isDeploymentSuccess = false;
- deploymentError = error;
- }
-
- try {
- tl._writeLine(await azureRESTUtility.updateDeploymentStatus(publishingProfile, isDeploymentSuccess));
- }
- catch(error) {
- tl.warning(error);
- }
-
- if(!isDeploymentSuccess) {
- throw Error(deploymentError);
+ throw Error(error);
}
}
diff --git a/Tasks/AzureRmWebAppDeployment/kuduutility.ts b/Tasks/AzureRmWebAppDeployment/kuduutility.ts
index ecf98869d5cf..9f3d4a03872b 100644
--- a/Tasks/AzureRmWebAppDeployment/kuduutility.ts
+++ b/Tasks/AzureRmWebAppDeployment/kuduutility.ts
@@ -4,8 +4,6 @@ import path = require("path");
import fs = require("fs");
import httpClient = require('vso-node-api/HttpClient');
var httpObj = new httpClient.HttpClient(tl.getVariable("AZURE_HTTP_USER_AGENT"));
-var gulp = require('gulp');
-var zip = require('gulp-zip');
var zipUtility = require('webdeployment-common/ziputility.js');
export async function appOffineKuduService(publishUrl: string, physicalPath: string, headers, enableFeature: boolean) {
diff --git a/Tasks/AzureRmWebAppDeployment/package.json b/Tasks/AzureRmWebAppDeployment/package.json
index 8da9c1c0fd37..0f05112cf867 100644
--- a/Tasks/AzureRmWebAppDeployment/package.json
+++ b/Tasks/AzureRmWebAppDeployment/package.json
@@ -17,8 +17,7 @@
},
"homepage": "https://github.com/Microsoft/vsts-tasks#readme",
"dependencies": {
-
- "q": "^1.4.1"
+ "q": "1.4.1"
},
"devDependencies": {
"mocha": "^3.1.0"
diff --git a/Tasks/AzureRmWebAppDeployment/task.json b/Tasks/AzureRmWebAppDeployment/task.json
index dbb404c584cb..91333657444b 100644
--- a/Tasks/AzureRmWebAppDeployment/task.json
+++ b/Tasks/AzureRmWebAppDeployment/task.json
@@ -13,7 +13,7 @@
"version": {
"Major": 2,
"Minor": 1,
- "Patch": 5
+ "Patch": 8
},
"minimumAgentVersion": "1.102.0",
"groups": [
@@ -26,11 +26,6 @@
"name": "output",
"displayName": "Output",
"isExpanded": true
- },
- {
- "name": "FileTransformsAndVariableSubstitution",
- "displayName": "File Transforms and Variable Substitutions",
- "isExpanded": false
}
],
"inputs": [
@@ -167,26 +162,7 @@
"required": false,
"groupName": "AdditionalDeploymentOptions",
"helpMarkDown": "Select the option to take the AzureRM Web App 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."
- },
- {
- "name": "XmlTransformsAndVariableSubstitutions",
- "type": "boolean",
- "label": "XML Transforms & Variable Substitutions",
- "required": false,
- "defaultValue": false,
- "groupName": "FileTransformsAndVariableSubstitution",
- "helpMarkDown": ""
- },
- {
- "name": "VariableSubstitution",
- "type": "boolean",
- "label": "Variable Substitution",
- "required": false,
- "defaultValue": false,
- "groupName": "FileTransformsAndVariableSubstitution",
- "visibleRule": "XmlTransformsAndVariableSubstitutions == true",
- "helpMarkDown": "Variables defined in the Build or Release Definition will be automatically substituted in the appSettings, applicationSettings, and connectionStrings section of the config files. If same variables are defined in the Release Definition and in the Environment, then the Environment variables will supersede the Release Definition variables. Variable Substitution is run after Config Transforms."
- }
+ }
],
"dataSourceBindings": [
{
@@ -267,6 +243,7 @@
"PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "Publish using webdeploy options are supported only when using Windows agent",
"WebAppDoesntExist": "Webapp '%s' doesn't exist. Webapp should exist before deployment.",
"EncodeNotSupported": "Detected file encoding of the file %s as %s. Variable substitution and Transformation 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. 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"
}
}
diff --git a/Tasks/AzureRmWebAppDeployment/task.loc.json b/Tasks/AzureRmWebAppDeployment/task.loc.json
index 444d6db99bf8..763462956a6c 100644
--- a/Tasks/AzureRmWebAppDeployment/task.loc.json
+++ b/Tasks/AzureRmWebAppDeployment/task.loc.json
@@ -13,7 +13,7 @@
"version": {
"Major": 2,
"Minor": 1,
- "Patch": 5
+ "Patch": 8
},
"minimumAgentVersion": "1.102.0",
"groups": [
@@ -26,11 +26,6 @@
"name": "output",
"displayName": "ms-resource:loc.group.displayName.output",
"isExpanded": true
- },
- {
- "name": "FileTransformsAndVariableSubstitution",
- "displayName": "ms-resource:loc.group.displayName.FileTransformsAndVariableSubstitution",
- "isExpanded": false
}
],
"inputs": [
@@ -167,25 +162,6 @@
"required": false,
"groupName": "AdditionalDeploymentOptions",
"helpMarkDown": "ms-resource:loc.input.help.TakeAppOfflineFlag"
- },
- {
- "name": "XmlTransformsAndVariableSubstitutions",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.XmlTransformsAndVariableSubstitutions",
- "required": false,
- "defaultValue": false,
- "groupName": "FileTransformsAndVariableSubstitution",
- "helpMarkDown": ""
- },
- {
- "name": "VariableSubstitution",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.VariableSubstitution",
- "required": false,
- "defaultValue": false,
- "groupName": "FileTransformsAndVariableSubstitution",
- "visibleRule": "XmlTransformsAndVariableSubstitutions == true",
- "helpMarkDown": "ms-resource:loc.input.help.VariableSubstitution"
}
],
"dataSourceBindings": [
@@ -267,6 +243,7 @@
"PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent": "ms-resource:loc.messages.PublishusingwebdeployoptionsaresupportedonlywhenusingWindowsagent",
"WebAppDoesntExist": "ms-resource:loc.messages.WebAppDoesntExist",
"EncodeNotSupported": "ms-resource:loc.messages.EncodeNotSupported",
- "UnknownFileEncodeError": "ms-resource:loc.messages.UnknownFileEncodeError"
+ "UnknownFileEncodeError": "ms-resource:loc.messages.UnknownFileEncodeError",
+ "ShortFileBufferError": "ms-resource:loc.messages.ShortFileBufferError"
}
}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Publish-AzureWebDeployment.ps1 b/Tasks/AzureWebPowerShellDeployment/Publish-AzureWebDeployment.ps1
deleted file mode 100644
index aa37d4fa8ef3..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Publish-AzureWebDeployment.ps1
+++ /dev/null
@@ -1,207 +0,0 @@
-Trace-VstsEnteringInvocation $MyInvocation
-Import-VstsLocStrings "$PSScriptRoot\Task.json"
-
-Write-Warning "'Azure App Service: Classic' task will be deprecated soon. 'Azure App Service Deploy' task will replace 'Azure App Service: Classic' task and the recommendation is to migrate your Build or Release process to use the 'Azure App Service Deploy' task. Refer https://go.microsoft.com/fwlink/?LinkID=613750 for more details."
-
-function Get-SingleFile($files, $pattern)
-{
- if ($files -is [system.array])
- {
- throw (Get-VstsLocString -Key "Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone" -ArgumentList $pattern)
- }
- else
- {
- if (!$files)
- {
- throw (Get-VstsLocString -Key "Nofileswerefoundtodeploywithsearchpattern0" -ArgumentList $pattern)
- }
- return $files
- }
-}
-
-try{
-
- $WebSiteName = Get-VstsInput -Name WebSiteName -Require
- $WebSiteLocation = Get-VstsInput -Name WebSiteLocation
- $Package = Get-VstsInput -Name Package -Require
- $Slot = Get-VstsInput -Name Slot
- $DoNotDelete = Get-VstsInput -Name DoNotDelete -AsBool
- $AdditionalArguments = Get-VstsInput -Name AdditionalArguments
-
- # Initialize Azure.
- Import-Module $PSScriptRoot\ps_modules\VstsAzureHelpers_
- Initialize-Azure
-
- # adding System.Web explicitly, since we use http utility
- Add-Type -AssemblyName System.Web
-
- Write-Host "Finding $Package"
- $packageFile = Find-VstsFiles -LegacyPattern $Package
- Write-Host "packageFile= $packageFile"
-
- #Ensure that at most a single package (.zip) file is found
- $packageFile = Get-SingleFile $packageFile $Package
- $azureWebSiteError = $null
-
- #If we're provided a WebSiteLocation, check for it and create it if necessary
- if($WebSiteLocation)
- {
- #using production slot for website if website name provided doesnot contain any slot
- if ([String]::IsNullOrEmpty($Slot))
- {
- if($WebSiteName -notlike '*(*)*')
- {
- $Slot = 'Production'
- }
- }
-
- $extraParameters = @{ }
- if ($Slot) { $extraParameters['Slot'] = $Slot }
-
- Write-Host "##[command]Get-AzureWebSite -Name $WebSiteName -ErrorAction SilentlyContinue -ErrorVariable azureWebSiteError $(if ($Slot) { "-Slot $Slot" })"
- $azureWebSite = Get-AzureWebSite -Name $WebSiteName -ErrorAction SilentlyContinue -ErrorVariable azureWebSiteError @extraParameters
- if($azureWebSiteError){
- $azureWebSiteError | ForEach-Object { Write-Verbose $_.Exception.ToString() }
- }
-
- if($azureWebSite)
- {
- Write-Host "WebSite '$($azureWebSite.Name)' found."
- }
- else
- {
- Write-Host "WebSite '$WebSiteName' not found. Creating it now."
-
- if ($Slot)
- {
- Write-Host "##[command]New-AzureWebSite -Name $WebSiteName -Location $WebSiteLocation -Slot $Slot"
- $azureWebSite = New-AzureWebSite -Name $WebSiteName -Location $WebSiteLocation -Slot $Slot
- }
- else
- {
- Write-Host "##[command]New-AzureWebSite -Name $WebSiteName -Location $WebSiteLocation"
- $azureWebSite = New-AzureWebSite -Name $WebSiteName -Location $WebSiteLocation
- }
- }
- }
-
- #Deploy the package
- $azureCommand = "Publish-AzureWebsiteProject"
-
- if($DoNotDelete) {
- $AdditionalArguments = $AdditionalArguments + " -DoNotDelete"
- }
-
- if ($Slot)
- {
- $azureCommandArguments = "-Name `"$WebSiteName`" -Package `"$packageFile`" -Slot `"$Slot`" $AdditionalArguments -ErrorVariable publishAzureWebsiteError -ErrorAction SilentlyContinue"
- }
- else
- {
- $azureCommandArguments = "-Name `"$WebSiteName`" -Package `"$packageFile`" $AdditionalArguments -ErrorVariable publishAzureWebSiteError -ErrorAction SilentlyContinue"
- }
-
- $finalCommand = "$azureCommand $azureCommandArguments"
- Write-Host "$finalCommand"
- Invoke-Expression -Command $finalCommand
-
- #Update Deployment status - https://github.com/projectkudu/kudu/wiki/REST-API#deployment
-
- if($azureWebSite) {
- $matchedWebSiteName = $azureWebSite.EnabledHostNames | Where-Object { $_ -like '*.scm*azurewebsites.net*' } | Select-Object -First 1
- if ($matchedWebSiteName) {
- $status = 3 #failed
- if(!$publishAzureWebsiteError) {
- $status = 4 #succeeded
- }
-
- $username = $azureWebSite.PublishingUsername
- $securePwd = ConvertTo-SecureString $azureWebSite.PublishingPassword -AsPlainText -Force
- $credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd)
-
- $author = Get-VstsTaskVariable -Name "build.sourceVersionAuthor"
- if(!$author) {
- # fall back to build/release requestedfor
- $author = Get-VstsTaskVariable -Name "build.requestedfor"
- if(!$author) {
- $author = Get-VstsTaskVariable -Name "release.requestedfor"
- }
- # At this point if this is still null, let's use agent name
- if(!$author) {
- $author = Get-VstsTaskVariable -Name "agent.name"
- }
- }
-
- # using buildId/releaseId to update deployment status
- # using buildUrl/releaseUrl to update deployment message
- $buildUrlTaskVar = Get-VstsTaskVariable -Name "build.buildUri"
- $releaseUrlTaskVar = Get-VstsTaskVariable -Name "release.releaseUri"
- $buildIdTaskVar = Get-VstsTaskVariable -Name "build.buildId"
- $releaseIdTaskVar = Get-VstsTaskVariable -Name "release.releaseId"
- if($releaseUrlTaskVar) {
- $deploymentId = $releaseIdTaskVar
- $message = Get-VstsLocString -Key "Updatingdeploymenthistoryfordeployment0" -ArgumentList $releaseUrlTaskVar
- }
- else
- {
- $deploymentId = $buildIdTaskVar
- $message = Get-VstsLocString -Key "Updatingdeploymenthistoryfordeployment0" -ArgumentList $buildUrlTaskVar
- }
-
- Write-Verbose "Using deploymentId as: '$deploymentId' to update deployment Status"
- Write-Verbose "Using message as: '$message' to update deployment Status"
-
- if(!$deploymentId) {
- #No point in proceeding further
- Write-Warning (Get-VstsLocString -Key "CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved")
- Return
- }
-
- $collectionUrl = Get-VstsTaskVariable -Name System.TeamFoundationCollectionUri -Require
- $teamproject = Get-VstsTaskVariable -Name System.TeamProject -Require
- $buildUrl = [string]::Format("{0}/{1}/_build#buildId={2}&_a=summary", $collectionUrl, $teamproject, $buildIdTaskVar)
-
- $body = ConvertTo-Json (New-Object -TypeName psobject -Property @{
- status = $status
- message = $message
- author = $author
- deployer = 'VSTS'
- details = $buildUrl
- })
-
- $userAgent = Get-VstsTaskVariable -Name AZURE_HTTP_USER_AGENT
-
- $url = [string]::Format("https://{0}/deployments/{1}",[System.Web.HttpUtility]::UrlEncode($matchedWebSiteName),[System.Web.HttpUtility]::UrlEncode($deploymentId))
-
- Write-Verbose "##[command]Invoke-RestMethod $url -Credential $credential -Method PUT -Body $body -ContentType `"application/json`" -UserAgent `"$userAgent`""
- Write-Host (Get-VstsLocString -Key "Updatingdeploymentstatus")
- try {
- Invoke-RestMethod $url -Credential $credential -Method PUT -Body $body -ContentType "application/json" -UserAgent "$userAgent"
- }
- catch {
- Write-Verbose $_.Exception.ToString()
- $response = $_.Exception.Response
- $responseStream = $response.GetResponseStream()
- $streamReader = New-Object System.IO.StreamReader($responseStream)
- $streamReader.BaseStream.Position = 0
- $streamReader.DiscardBufferedData()
- $responseBody = $streamReader.ReadToEnd()
- $streamReader.Close()
- Write-Warning (Get-VstsLocString -Key "Cannotupdatedeploymentstatusfor01" -ArgumentList $WebSiteName, $responseBody)
- }
- }
- else {
- Write-Warning (Get-VstsLocString -Key "CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite")
- }
- }
- else {
- Write-Warning (Get-VstsLocString -Key "Cannotgetwebsitedeploymentstatusisnotupdated")
- }
-
-
-} finally {
- if($publishAzureWebsiteError) {
- throw (Get-VstsLocString -Key "FailedtodeployWebsiteError0" -ArgumentList $publishAzureWebsiteError)
- }
- Trace-VstsLeavingInvocation $MyInvocation
-}
diff --git a/Tasks/AzureWebPowerShellDeployment/Readme.md b/Tasks/AzureWebPowerShellDeployment/Readme.md
deleted file mode 100644
index 56ac15a9ebd5..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Readme.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## **Important Notice**
-The "Azure App Service Deployment: Classic" task has been **deprecated and will be removed soon**. To update Azure App Services using Web Deploy / Kudu REST APIs, please use the [**Azure App Service Deployment: ARM** task](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/AzureRmWebAppDeployment).
-We recommend you to migrate your Build or Release definitions to replace the deprecating task with the 'Azure App Service Deployment: ARM' task.
-
-
-
-
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/de-de/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/de-de/resources.resjson
deleted file mode 100644
index c484d5d8021f..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/de-de/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Azure Web App-Bereitstellung",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Ein Visual Studio-Webprojekt mithilfe von Web Deploy als Microsoft Azure Web App veröffentlichen",
- "loc.instanceNameFormat": "Azure-Bereitstellung: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Web App-Ort",
- "loc.input.help.WebSiteLocation": "Wählen Sie einen Speicherort für die Website aus.",
- "loc.input.label.WebSiteName": "Web App-Name",
- "loc.input.help.WebSiteName": "Wählen Sie den Webseitenamen ein, oder wählen Sie ihn in der Liste aus. Hinweis: Nur die Websites, die dem App Service-Standardplan für die ausgewählte Region zugeordnet sind, werden aufgeführt.",
- "loc.input.label.Slot": "Platz",
- "loc.input.help.Slot": "Platz",
- "loc.input.label.Package": "Web Deploy-Paket",
- "loc.input.help.Package": "Pfad des Visual Studio Web Deploy-Pakets unter dem Artefaktstandardverzeichnis.",
- "loc.input.label.doNotDelete": "Kennzeichen \"DoNotDelete\" festlegen",
- "loc.input.help.doNotDelete": "Durch Aktivieren dieser Option werden zusätzliche Dateien im Webbereitstellungspaket beim Veröffentlichen der Website beibehalten.",
- "loc.input.label.AdditionalArguments": "Zusätzliche Argumente",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/en-US/resources.resjson
deleted file mode 100644
index 2f87acce26da..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/en-US/resources.resjson
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "loc.friendlyName": "Azure App Service: Classic (Deprecated)",
- "loc.helpMarkDown": "More Information : “Azure App Service: Classic” Task will be deprecated. We recommend migrating your definition to use “Azure App Service Deploy” Task instead. For more information please refer [this](https://go.microsoft.com/fwlink/?LinkID=613750).",
- "loc.description": "Create or update Azure App Service using Azure PowerShell",
- "loc.instanceNameFormat": "Azure Deployment: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Web App Location",
- "loc.input.help.WebSiteLocation": "Select a location for website.",
- "loc.input.label.WebSiteName": "Web App Name",
- "loc.input.help.WebSiteName": "Enter the website name or Select from the list. Note: Only the websites associated with Default App Service plan for the selected region are listed.",
- "loc.input.label.Slot": "Slot",
- "loc.input.help.Slot": "Slot",
- "loc.input.label.Package": "Web Deploy Package",
- "loc.input.help.Package": "Path to the Visual Studio Web Deploy package under the default artifact directory.",
- "loc.input.label.doNotDelete": "Set DoNotDelete flag",
- "loc.input.help.doNotDelete": "By enabling this, additional files in web deployment package are preserved while publishing website.",
- "loc.input.label.AdditionalArguments": "Additional Arguments",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one.",
- "loc.messages.FailedtodeployWebsiteError0": "Failed to deploy Website. Error : {0}"
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/es-es/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/es-es/resources.resjson
deleted file mode 100644
index 00457ff1e52a..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/es-es/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Implementación de aplicaciones web de Azure",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Publicar un proyecto web de Visual Studio en una aplicación web de Microsoft Azure con Web Deploy",
- "loc.instanceNameFormat": "Implementación de Azure: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Ubicación de la aplicación web",
- "loc.input.help.WebSiteLocation": "Seleccione una ubicación para el sitio web.",
- "loc.input.label.WebSiteName": "Nombre de la aplicación web",
- "loc.input.help.WebSiteName": "Escriba el nombre del sitio web o selecciónelo de la lista. Nota: Solo se muestran los sitios web asociados al plan del Servicio de aplicaciones predeterminado de la región seleccionada.",
- "loc.input.label.Slot": "Ranura",
- "loc.input.help.Slot": "Ranura",
- "loc.input.label.Package": "Paquete de Web Deploy",
- "loc.input.help.Package": "Ruta de acceso al paquete de Web Deploy de Visual Studio en el directorio de artefacto predeterminado.",
- "loc.input.label.doNotDelete": "Establecer el indicador DoNotDelete",
- "loc.input.help.doNotDelete": "Al habilitar esta opción, se conservan los archivos adicionales del paquete de implementación web al tiempo que se publica el sitio web.",
- "loc.input.label.AdditionalArguments": "Argumentos adicionales",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/fr-fr/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/fr-fr/resources.resjson
deleted file mode 100644
index 63103da406e8..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/fr-fr/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Déploiement d'application web Azure",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Publier un projet web Visual Studio dans une application web Microsoft Azure à l'aide de Web Deploy",
- "loc.instanceNameFormat": "Déploiement Azure : $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Emplacement de l'application web",
- "loc.input.help.WebSiteLocation": "Sélectionnez un emplacement pour le site web.",
- "loc.input.label.WebSiteName": "Nom de l'application web",
- "loc.input.help.WebSiteName": "Entrez le nom du site web ou sélectionnez-le dans la liste. Remarque : Seuls les sites web associés au plan App Service par défaut pour la région sélectionnée sont répertoriés.",
- "loc.input.label.Slot": "Emplacement",
- "loc.input.help.Slot": "Emplacement",
- "loc.input.label.Package": "Package Web Deploy",
- "loc.input.help.Package": "Chemin d'accès au package Web Deploy de Visual Studio dans le répertoire de l'artefact par défaut.",
- "loc.input.label.doNotDelete": "Définir l'indicateur DoNotDelete",
- "loc.input.help.doNotDelete": "Une fois cette option activée, les fichiers supplémentaires du package de déploiement web sont conservés durant la publication du site web.",
- "loc.input.label.AdditionalArguments": "Arguments supplémentaires",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/it-IT/resources.resjson
deleted file mode 100644
index 44514b6a9d69..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/it-IT/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Distribuzione app Web di Azure",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Consente di pubblicare un progetto Web di Visual Studio in un'app Web di Microsoft Azure con Distribuzione Web",
- "loc.instanceNameFormat": "Distribuzione Azure: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Percorso app Web",
- "loc.input.help.WebSiteLocation": "Selezionare una località per il sito Web.",
- "loc.input.label.WebSiteName": "Nome app Web",
- "loc.input.help.WebSiteName": "Immettere il nome del sito Web o selezionarlo dall'elenco. Nota: sono elencati solo i siti Web associati al piano del servizio app predefinito per l'area geografica selezionata.",
- "loc.input.label.Slot": "Slot",
- "loc.input.help.Slot": "Slot",
- "loc.input.label.Package": "Pacchetto Distribuzione Web",
- "loc.input.help.Package": "Percorso del pacchetto Distribuzione Web di Visual Studio nella directory di artefatti predefiniti.",
- "loc.input.label.doNotDelete": "Imposta flag DoNotDelete",
- "loc.input.help.doNotDelete": "Se si abilita questa opzione, i file aggiuntivi presenti nel pacchetto di distribuzione Web verranno mantenuti durante la pubblicazione del sito Web.",
- "loc.input.label.AdditionalArguments": "Argomenti aggiuntivi",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ja-jp/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ja-jp/resources.resjson
deleted file mode 100644
index e1a42cba6313..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ja-jp/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Azure Web アプリの配置",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Web 配置を使用した Microsoft Azure Web アプリへの Visual Studio Web プロジェクトの発行",
- "loc.instanceNameFormat": "Azure 配置: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Web アプリの場所",
- "loc.input.help.WebSiteLocation": "Web サイトの場所を選びます。",
- "loc.input.label.WebSiteName": "Web アプリの名前",
- "loc.input.help.WebSiteName": "Web サイト名を入力するか、一覧から選びます。 注: 選んだ地域の既定の App Service プランに関連付けられている Web サイトのみが一覧表示されます。",
- "loc.input.label.Slot": "スロット",
- "loc.input.help.Slot": "スロット",
- "loc.input.label.Package": "Web 配置パッケージ",
- "loc.input.help.Package": "成果物の既定のディレクトリにある Visual Studio Web 配置パッケージへのパス。",
- "loc.input.label.doNotDelete": "DoNotDelete フラグの設定",
- "loc.input.help.doNotDelete": "これを有効にすると、Web 配置のパッケージ内の追加ファイルが Web サイトの発行中に保持されます。",
- "loc.input.label.AdditionalArguments": "追加引数",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ko-KR/resources.resjson
deleted file mode 100644
index 5d56ad16a378..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ko-KR/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Azure 웹앱 배포",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "웹 배포를 사용하여 Microsoft Azure 웹앱에 Visual Studio Web 프로젝트 게시",
- "loc.instanceNameFormat": "Azure 배포: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "웹앱 위치",
- "loc.input.help.WebSiteLocation": "웹 사이트의 지역을 선택하세요.",
- "loc.input.label.WebSiteName": "웹앱 이름",
- "loc.input.help.WebSiteName": "웹 사이트 이름을 입력하거나 목록에서 선택하세요. 참고: 선택한 지역의 기본 앱 서비스 계획과 연결된 웹 사이트만 나열됩니다.",
- "loc.input.label.Slot": "슬롯",
- "loc.input.help.Slot": "슬롯",
- "loc.input.label.Package": "웹 배포 패키지",
- "loc.input.help.Package": "기본 아티팩트 디렉터리의 Visual Studio 웹 배포 패키지 경로입니다.",
- "loc.input.label.doNotDelete": "DoNotDelete 플래그 설정",
- "loc.input.help.doNotDelete": "이 기능을 사용하도록 설정하면 웹 사이트를 게시하는 동안 웹 배포 패키지의 추가 파일이 유지됩니다.",
- "loc.input.label.AdditionalArguments": "추가 인수",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ru-RU/resources.resjson
deleted file mode 100644
index 493ad4c445f7..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/ru-RU/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Развертывание веб-приложения Azure",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "Публикация веб-проекта Visual Studio в веб-приложении Microsoft Azure с помощью веб-развертывания",
- "loc.instanceNameFormat": "Развертывание Azure: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Расположение веб-приложения",
- "loc.input.help.WebSiteLocation": "Выберите расположение для веб-сайта.",
- "loc.input.label.WebSiteName": "Имя веб-приложения",
- "loc.input.help.WebSiteName": "Введите имя веб-сайта или выберите его в списке. Примечание. В списке приводятся только веб-сайты, связанные с планом службы приложений по умолчанию для выбранного региона.",
- "loc.input.label.Slot": "Слот",
- "loc.input.help.Slot": "Слот",
- "loc.input.label.Package": "Пакет веб-развертывания",
- "loc.input.help.Package": "Путь к пакету веб-развертывания Visual Studio в каталоге артефактов по умолчанию.",
- "loc.input.label.doNotDelete": "Задать флаг DoNotDelete",
- "loc.input.help.doNotDelete": "При включении этого параметра дополнительные файлы в пакете веб-развертывания сохраняются при публикации веб-сайта.",
- "loc.input.label.AdditionalArguments": "Дополнительные аргументы",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-CN/resources.resjson
deleted file mode 100644
index 63e5ebea7d17..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-CN/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Azure Web 应用部署",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "使用 Web 部署将 Visual Studio Web 项目发布到 Microsoft Azure Web 应用",
- "loc.instanceNameFormat": "Azure 部署: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Web 应用位置",
- "loc.input.help.WebSiteLocation": "选择网站的位置。",
- "loc.input.label.WebSiteName": "Web 应用名称",
- "loc.input.help.WebSiteName": "输入网站名称或从列表选择。 注意: 仅列出了与所选地区的默认应用服务计划相关的网站。",
- "loc.input.label.Slot": "槽",
- "loc.input.help.Slot": "槽",
- "loc.input.label.Package": "Web 部署包",
- "loc.input.help.Package": "默认项目目录下 Visual Studio Web 部署包的路径。",
- "loc.input.label.doNotDelete": "设置 DoNotDelete 标记",
- "loc.input.help.doNotDelete": "启用此项后,将在发布网站时保留 Web 部署包中的其他文件。",
- "loc.input.label.AdditionalArguments": "其他参数",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-TW/resources.resjson
deleted file mode 100644
index 53cb51cccd5a..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/Strings/resources.resjson/zh-TW/resources.resjson
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "loc.friendlyName": "Azure Web 應用程式部署",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613750)",
- "loc.description": "使用 Web Deploy 將 Visual Studio Web 專案發行到 Microsoft Azure Web 應用程式",
- "loc.instanceNameFormat": "Azure 部署: $(WebSiteName)",
- "loc.input.label.ConnectedServiceName": "Azure Subscription (Classic)",
- "loc.input.help.ConnectedServiceName": "Azure Classic subscription to target for deployment.",
- "loc.input.label.WebSiteLocation": "Web 應用程式位置",
- "loc.input.help.WebSiteLocation": "選取網站的位置。",
- "loc.input.label.WebSiteName": "Web 應用程式名稱",
- "loc.input.help.WebSiteName": "輸入網站名稱,或從清單中選取。 注意: 只會列出與所選取區域的預設 App Service 方案相關聯的網站。",
- "loc.input.label.Slot": "位置",
- "loc.input.help.Slot": "位置",
- "loc.input.label.Package": "Web Deploy 封裝",
- "loc.input.help.Package": "預設成品目錄下之 Visual Studio Web Deploy 封裝的路徑。",
- "loc.input.label.doNotDelete": "設定 DoNotDelete 旗標 ",
- "loc.input.help.doNotDelete": "啟用此項目後,便會在發行網站時保留 Web 部署套件中的其他檔案。",
- "loc.input.label.AdditionalArguments": "其他引數",
- "loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "loc.messages.Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "loc.messages.Updatingdeploymentstatus": "Updating deployment status",
- "loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "loc.messages.Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "loc.messages.Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one."
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/icon.png b/Tasks/AzureWebPowerShellDeployment/icon.png
deleted file mode 100644
index 9ee7be815737..000000000000
Binary files a/Tasks/AzureWebPowerShellDeployment/icon.png and /dev/null differ
diff --git a/Tasks/AzureWebPowerShellDeployment/icon.svg b/Tasks/AzureWebPowerShellDeployment/icon.svg
deleted file mode 100644
index dc1c04af05ad..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/icon.svg
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/make.json b/Tasks/AzureWebPowerShellDeployment/make.json
deleted file mode 100644
index b91cbd7b08db..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/make.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "common": [
- {
- "module": "../Common/VstsAzureHelpers_",
- "type": "ps"
- }
- ]
-}
diff --git a/Tasks/AzureWebPowerShellDeployment/task.json b/Tasks/AzureWebPowerShellDeployment/task.json
deleted file mode 100644
index d8eaf142aa82..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/task.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "id": "DCBEF2C9-E4F4-4929-82B2-EA7FC9166109",
- "name": "AzureWebPowerShellDeployment",
- "friendlyName": "Azure App Service: Classic (Deprecated)",
- "description": "Create or update Azure App Service using Azure PowerShell",
- "helpMarkDown": "More Information : “Azure App Service: Classic” Task will be deprecated. We recommend migrating your definition to use “Azure App Service Deploy” Task instead. For more information please refer [this](https://go.microsoft.com/fwlink/?LinkID=613750).",
- "category": "Deploy",
- "visibility": [
- "Build",
- "Release"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 42
- },
- "demands": [
- "azureps"
- ],
- "minimumAgentVersion": "1.103.0",
- "inputs": [
- {
- "name": "ConnectedServiceName",
- "type": "connectedService:Azure:Certificate,UsernamePassword",
- "label": "Azure Subscription (Classic)",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "Azure Classic subscription to target for deployment."
- },
- {
- "name": "WebSiteLocation",
- "type": "pickList",
- "label": "Web App Location",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "Select a location for website.",
- "properties": {
- "EditableOptions": "True"
- }
- },
- {
- "name": "WebSiteName",
- "type": "pickList",
- "label": "Web App Name",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "Enter the website name or Select from the list. Note: Only the websites associated with Default App Service plan for the selected region are listed.",
- "properties": {
- "EditableOptions": "True"
- }
- },
- {
- "name": "Slot",
- "type": "string",
- "label": "Slot",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "Slot"
- },
- {
- "name": "Package",
- "type": "filePath",
- "label": "Web Deploy Package",
- "defaultValue": "",
- "helpMarkDown": "Path to the Visual Studio Web Deploy package under the default artifact directory.",
- "required": true
- },
- {
- "name": "doNotDelete",
- "type": "boolean",
- "label": "Set DoNotDelete flag",
- "defaultValue": "false",
- "helpMarkDown": "By enabling this, additional files in web deployment package are preserved while publishing website.",
- "required": false
- },
- {
- "name": "AdditionalArguments",
- "type": "string",
- "label": "Additional Arguments",
- "defaultValue": "",
- "required": false
- }
- ],
- "dataSourceBindings": [
- {
- "target": "WebSiteLocation",
- "endpointId": "$(ConnectedServiceName)",
- "dataSourceName": "AzureWebsiteLocations"
- },
- {
- "target": "WebSiteName",
- "endpointId": "$(ConnectedServiceName)",
- "dataSourceName": "AzureWebSiteNames",
- "parameters": {
- "WebSiteLocation": "$(WebSiteLocation)"
- }
- }
- ],
- "instanceNameFormat": "Azure Deployment: $(WebSiteName)",
- "execution": {
- "PowerShell3": {
- "target": "Publish-AzureWebDeployment.ps1"
- }
- },
- "messages": {
- "Cannotgetwebsitedeploymentstatusisnotupdated": "Cannot get website, deployment status is not updated",
- "CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "Cannot update deployment status, SCM endpoint is not enabled for this website",
- "Cannotupdatedeploymentstatusfor01": "Cannot update deployment status for {0} - {1}",
- "Updatingdeploymentstatus": "Updating deployment status",
- "CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "Cannot update deployment status, unique deploymentId cannot be retrieved",
- "Updatingdeploymenthistoryfordeployment0": "Updating deployment history for deployment {0}",
- "Nofileswerefoundtodeploywithsearchpattern0": "No files were found to deploy with search pattern {0}",
- "Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "Found more than one file to deploy with search pattern {0}. There can be only one.",
- "FailedtodeployWebsiteError0": "Failed to deploy Website. Error : {0}"
- }
-}
\ No newline at end of file
diff --git a/Tasks/AzureWebPowerShellDeployment/task.loc.json b/Tasks/AzureWebPowerShellDeployment/task.loc.json
deleted file mode 100644
index 134b07464364..000000000000
--- a/Tasks/AzureWebPowerShellDeployment/task.loc.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "id": "DCBEF2C9-E4F4-4929-82B2-EA7FC9166109",
- "name": "AzureWebPowerShellDeployment",
- "friendlyName": "ms-resource:loc.friendlyName",
- "description": "ms-resource:loc.description",
- "helpMarkDown": "ms-resource:loc.helpMarkDown",
- "category": "Deploy",
- "visibility": [
- "Build",
- "Release"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 42
- },
- "demands": [
- "azureps"
- ],
- "minimumAgentVersion": "1.103.0",
- "inputs": [
- {
- "name": "ConnectedServiceName",
- "type": "connectedService:Azure:Certificate,UsernamePassword",
- "label": "ms-resource:loc.input.label.ConnectedServiceName",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "ms-resource:loc.input.help.ConnectedServiceName"
- },
- {
- "name": "WebSiteLocation",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.WebSiteLocation",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "ms-resource:loc.input.help.WebSiteLocation",
- "properties": {
- "EditableOptions": "True"
- }
- },
- {
- "name": "WebSiteName",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.WebSiteName",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "ms-resource:loc.input.help.WebSiteName",
- "properties": {
- "EditableOptions": "True"
- }
- },
- {
- "name": "Slot",
- "type": "string",
- "label": "ms-resource:loc.input.label.Slot",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.Slot"
- },
- {
- "name": "Package",
- "type": "filePath",
- "label": "ms-resource:loc.input.label.Package",
- "defaultValue": "",
- "helpMarkDown": "ms-resource:loc.input.help.Package",
- "required": true
- },
- {
- "name": "doNotDelete",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.doNotDelete",
- "defaultValue": "false",
- "helpMarkDown": "ms-resource:loc.input.help.doNotDelete",
- "required": false
- },
- {
- "name": "AdditionalArguments",
- "type": "string",
- "label": "ms-resource:loc.input.label.AdditionalArguments",
- "defaultValue": "",
- "required": false
- }
- ],
- "dataSourceBindings": [
- {
- "target": "WebSiteLocation",
- "endpointId": "$(ConnectedServiceName)",
- "dataSourceName": "AzureWebsiteLocations"
- },
- {
- "target": "WebSiteName",
- "endpointId": "$(ConnectedServiceName)",
- "dataSourceName": "AzureWebSiteNames",
- "parameters": {
- "WebSiteLocation": "$(WebSiteLocation)"
- }
- }
- ],
- "instanceNameFormat": "ms-resource:loc.instanceNameFormat",
- "execution": {
- "PowerShell3": {
- "target": "Publish-AzureWebDeployment.ps1"
- }
- },
- "messages": {
- "Cannotgetwebsitedeploymentstatusisnotupdated": "ms-resource:loc.messages.Cannotgetwebsitedeploymentstatusisnotupdated",
- "CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite": "ms-resource:loc.messages.CannotupdatedeploymentstatusSCMendpointisnotenabledforthiswebsite",
- "Cannotupdatedeploymentstatusfor01": "ms-resource:loc.messages.Cannotupdatedeploymentstatusfor01",
- "Updatingdeploymentstatus": "ms-resource:loc.messages.Updatingdeploymentstatus",
- "CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved": "ms-resource:loc.messages.CannotupdatedeploymentstatusuniquedeploymentIdcannotberetrieved",
- "Updatingdeploymenthistoryfordeployment0": "ms-resource:loc.messages.Updatingdeploymenthistoryfordeployment0",
- "Nofileswerefoundtodeploywithsearchpattern0": "ms-resource:loc.messages.Nofileswerefoundtodeploywithsearchpattern0",
- "Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone": "ms-resource:loc.messages.Foundmorethanonefiletodeploywithsearchpattern0Therecanbeonlyone",
- "FailedtodeployWebsiteError0": "ms-resource:loc.messages.FailedtodeployWebsiteError0"
- }
-}
\ No newline at end of file
diff --git a/Tasks/CocoaPods/task.json b/Tasks/CocoaPods/task.json
index 8055b01a8a55..863c6c2a5569 100644
--- a/Tasks/CocoaPods/task.json
+++ b/Tasks/CocoaPods/task.json
@@ -7,12 +7,16 @@
"category": "Package",
"visibility": [
"Build"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 1,
- "Patch": 18
+ "Patch": 19
},
"instanceNameFormat": "pod install",
"inputs": [
diff --git a/Tasks/CocoaPods/task.loc.json b/Tasks/CocoaPods/task.loc.json
index 59973ad5c584..4b1ffe9aa7a1 100644
--- a/Tasks/CocoaPods/task.loc.json
+++ b/Tasks/CocoaPods/task.loc.json
@@ -8,11 +8,15 @@
"visibility": [
"Build"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 1,
- "Patch": 18
+ "Patch": 19
},
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
"inputs": [
diff --git a/Tasks/Common/VstsAzureRestHelpers_/VstsAzureRestHelpers_.psm1 b/Tasks/Common/VstsAzureRestHelpers_/VstsAzureRestHelpers_.psm1
index 4cb2820a0d56..45a95b7557c0 100644
--- a/Tasks/Common/VstsAzureRestHelpers_/VstsAzureRestHelpers_.psm1
+++ b/Tasks/Common/VstsAzureRestHelpers_/VstsAzureRestHelpers_.psm1
@@ -498,14 +498,18 @@ function Get-AzureSqlDatabaseServerResourceId
$uri = "$script:azureRmUri/subscriptions/$subscriptionId/resources?api-version=$apiVersion"
$headers = @{Authorization=("{0} {1}" -f $accessToken.token_type, $accessToken.access_token)}
- $ResourceDetails = (Invoke-RestMethod -Uri $uri -Method $method -Headers $headers -ContentType $script:jsonContentType)
- foreach ($resourceDetail in $ResourceDetails.Value)
- {
- if ($resourceDetail.name -eq $serverName -and $resourceDetail.type -eq $serverType)
+ do {
+ Write-Verbose "Fetching Resources from $uri"
+ $ResourceDetails = (Invoke-RestMethod -Uri $uri -Method $method -Headers $headers -ContentType $script:jsonContentType)
+ foreach ($resourceDetail in $ResourceDetails.Value)
{
- return $resourceDetail.id
+ if ($resourceDetail.name -eq $serverName -and $resourceDetail.type -eq $serverType)
+ {
+ return $resourceDetail.id
+ }
}
- }
+ $uri = $ResourceDetails.nextLink
+ } until([string]::IsNullOrEmpty($ResourceDetails.nextLink))
throw (Get-VstsLocString -Key AZ_NoValidResourceIdFound -ArgumentList $serverName, $serverType, $subscriptionId)
}
diff --git a/Tasks/Common/webdeployment-common/deployusingmsdeploy.ts b/Tasks/Common/webdeployment-common/deployusingmsdeploy.ts
index b4a95366ac57..ed2707435b2f 100644
--- a/Tasks/Common/webdeployment-common/deployusingmsdeploy.ts
+++ b/Tasks/Common/webdeployment-common/deployusingmsdeploy.ts
@@ -3,7 +3,6 @@ import fs = require('fs');
var msDeployUtility = require('./msdeployutility.js');
var utility = require('./utility.js');
-var azureRESTUtility = require ('./azurerestutility.js'); // should be removed
/**
* Executes Web Deploy command
@@ -29,8 +28,6 @@ export async function DeployUsingMSDeploy(webDeployPkg, webAppName, publishingPr
excludeFilesFromAppDataFlag, takeAppOfflineFlag, virtualApplication, setParametersFile, additionalArguments, isParamFilePresentInPackage, isFolderBasedDeployment,
useWebDeploy);
- var isDeploymentSuccess = true;
- var deploymentError = null;
try {
var msDeployBatchFile = tl.getVariable('System.DefaultWorkingDirectory') + '\\' + 'msDeployCommand.bat';
@@ -46,21 +43,7 @@ export async function DeployUsingMSDeploy(webDeployPkg, webAppName, publishingPr
}
catch(error) {
tl.error(tl.loc('Failedtodeploywebsite'));
- isDeploymentSuccess = false;
- deploymentError = error;
msDeployUtility.redirectMSDeployErrorToConsole();
- }
-
- if(publishingProfile != null){
- try {
- tl._writeLine(await azureRESTUtility.updateDeploymentStatus(publishingProfile, isDeploymentSuccess));
- }
- catch(error) {
- tl.warning(error);
- }
- }
-
- if(!isDeploymentSuccess) {
- throw Error(deploymentError);
+ throw Error(error);
}
}
\ No newline at end of file
diff --git a/Tasks/Common/webdeployment-common/fileencoding.ts b/Tasks/Common/webdeployment-common/fileencoding.ts
index 19d0373b1718..593fb419b9d8 100644
--- a/Tasks/Common/webdeployment-common/fileencoding.ts
+++ b/Tasks/Common/webdeployment-common/fileencoding.ts
@@ -27,9 +27,7 @@ function detectFileEncodingWithBOM(fileName: string, buffer: Buffer) {
function detectFileEncodingWithoutBOM(fileName: string, buffer: Buffer) {
tl.debug('Detecting file encoding without BOM');
- if(buffer.length < 4) {
- throw Error('File buffer is too short to detect encoding type');
- }
+
var typeCode = 0;
for(var index = 0; index < 4; index++) {
typeCode = typeCode << 1;
@@ -47,12 +45,12 @@ function detectFileEncodingWithoutBOM(fileName: string, buffer: Buffer) {
case 15:
return ['utf-8', false];
default:
- throw Error(tl.loc('UnknownFileEncodeError', typeCode));
+ throw Error(tl.loc('UnknownFileEncodeError', fileName, typeCode));
}
}
export function detectFileEncoding(fileName: string, buffer: Buffer) {
if(buffer.length < 4) {
- throw Error('ShortFileBufferError');
+ throw Error(tl.loc('ShortFileBufferError', fileName));
}
var fileEncoding = detectFileEncodingWithBOM(fileName, buffer) || detectFileEncodingWithoutBOM(fileName, buffer);
return fileEncoding;
diff --git a/Tasks/Common/webdeployment-common/ltxdomutility.ts b/Tasks/Common/webdeployment-common/ltxdomutility.ts
index 275e40c206f4..44ccdf72ac62 100644
--- a/Tasks/Common/webdeployment-common/ltxdomutility.ts
+++ b/Tasks/Common/webdeployment-common/ltxdomutility.ts
@@ -9,6 +9,7 @@ export function initializeDOM(xmlContent) {
xmlDomLookUpTable = {};
headerContent = null;
var xmlDom = ltx.parse(xmlContent);
+ readHeader(xmlContent);
buildLookUpTable(xmlDom);
return xmlDom;
}
@@ -25,7 +26,7 @@ function readHeader(xmlContent) {
}
export function getContentWithHeader(xmlDom) {
- return xmlDom ? (headerContent ? headerContent+"\n" : "") + xmlDom.root().toString() : "";
+ return xmlDom ? (headerContent ? headerContent + "\n" : "") + xmlDom.root().toString() : "";
}
/**
diff --git a/Tasks/Common/webdeployment-common/package.json b/Tasks/Common/webdeployment-common/package.json
index 4fb87b3ee02b..4cafddefe774 100644
--- a/Tasks/Common/webdeployment-common/package.json
+++ b/Tasks/Common/webdeployment-common/package.json
@@ -13,16 +13,15 @@
},
"homepage": "https://github.com/Microsoft/vsts-tasks#readme",
"dependencies": {
- "vsts-task-lib": "^0.9.20",
- "q": "^1.4.1",
- "adal-node": "^0.1.15",
- "xml2js": "^0.4.13",
- "decompress-zip": "^0.3.0",
- "gulp": "^3.9.1",
- "gulp-zip": "^3.2.0",
- "vso-node-api": "^5.0.5",
- "winreg" : "^1.2.2",
- "ltx": "^2.5.0"
+ "archiver": "1.2.0",
+ "adal-node": "0.1.15",
+ "decompress-zip": "0.3.0",
+ "ltx": "2.5.0",
+ "q": "1.4.1",
+ "vso-node-api": "5.1.1",
+ "vsts-task-lib": "0.9.20",
+ "winreg": "1.2.2",
+ "xml2js": "0.4.13"
},
"devDependencies": {
"mocha": "^3.1.2"
diff --git a/Tasks/Common/webdeployment-common/ziputility.ts b/Tasks/Common/webdeployment-common/ziputility.ts
index 6202e2106dab..4c2722e80437 100644
--- a/Tasks/Common/webdeployment-common/ziputility.ts
+++ b/Tasks/Common/webdeployment-common/ziputility.ts
@@ -1,12 +1,12 @@
import tl = require('vsts-task-lib/task');
import path = require('path');
import Q = require('q');
+import fs = require('fs');
-var gulp = require('gulp');
-var zip = require('gulp-zip');
var DecompressZip = require('decompress-zip');
+var archiver = require('archiver');
-export function unzip(zipLocation, unzipLocation) {
+export async function unzip(zipLocation, unzipLocation) {
var defer = Q.defer();
if(tl.exist(unzipLocation)) {
tl.rmRF(unzipLocation, false);
@@ -25,21 +25,26 @@ export function unzip(zipLocation, unzipLocation) {
return defer.promise;
}
-export function archiveFolder(folderPath, targetPath, zipName) {
+export async function archiveFolder(folderPath, targetPath, zipName) {
var defer = Q.defer();
tl.debug('Archiving ' + folderPath + ' to ' + zipName);
- gulp.src(path.join(folderPath, '**', '*'),
- {
- dot: true
- })
- .pipe(zip(zipName))
- .pipe(gulp.dest(targetPath)).on('end', function(error){
- if(error) {
- defer.reject(error);
- }
- defer.resolve(path.join(targetPath, zipName));
- });
- return defer.promise;
+ var outputZipPath = path.join(targetPath, zipName);
+ var output = fs.createWriteStream(outputZipPath);
+ var archive = archiver('zip');
+ output.on('close', function () {
+ tl.debug('Successfully created archive ' + zipName);
+ defer.resolve(outputZipPath);
+ });
+
+ output.on('error', function(error) {
+ defer.reject(error);
+ });
+
+ archive.pipe(output);
+ archive.directory(folderPath, '/');
+ archive.finalize();
+
+ return defer.promise;
}
/**
diff --git a/Tasks/CopyFiles/Strings/resources.resjson/en-US/resources.resjson b/Tasks/CopyFiles/Strings/resources.resjson/en-US/resources.resjson
index ccc44b5a5786..9d2ad633b54d 100644
--- a/Tasks/CopyFiles/Strings/resources.resjson/en-US/resources.resjson
+++ b/Tasks/CopyFiles/Strings/resources.resjson/en-US/resources.resjson
@@ -14,6 +14,8 @@
"loc.input.help.CleanTargetFolder": "Delete all existing files in target folder before copy",
"loc.input.label.OverWrite": "Overwrite",
"loc.input.help.OverWrite": "Replace existing file in target folder",
+ "loc.input.label.flattenFolders": "Flatten Folders",
+ "loc.input.help.flattenFolders": "Flatten the folder structure and copy all files into the specified target folder.",
"loc.messages.FoundNFiles": "found %d files",
"loc.messages.CleaningTargetFolder": "Cleaning target folder: %s",
"loc.messages.FileAlreadyExistAt": "File %s already exist at %s",
diff --git a/Tasks/CopyFiles/copyfiles.ts b/Tasks/CopyFiles/copyfiles.ts
index d1b5a799df81..f6bdbfed5097 100644
--- a/Tasks/CopyFiles/copyfiles.ts
+++ b/Tasks/CopyFiles/copyfiles.ts
@@ -85,6 +85,7 @@ var targetFolder: string = tl.getPathInput('TargetFolder', true);
var cleanTargetFolder: boolean = tl.getBoolInput('CleanTargetFolder', false);
var overWrite: boolean = tl.getBoolInput('OverWrite', false);
+var flattenFolders: boolean = tl.getBoolInput('flattenFolders', false);
// not use common root for now.
//var useCommonRoot: boolean = tl.getBoolInput('UseCommonRoot', false);
@@ -215,9 +216,14 @@ if (files.length > 0) {
try {
var createdFolders = {};
files.forEach((file: string) => {
- var relativePath = file.substring(sourceFolder.length)
+ var relativePath;
+ if(flattenFolders) {
+ relativePath = path.basename(file);
+ } else {
+ relativePath = file.substring(sourceFolder.length)
.replace(/^\\/g, "")
.replace(/^\//g, "");
+ }
if (useCommonRoot) {
relativePath = file.substring(commonRoot.length)
diff --git a/Tasks/CopyFiles/task.json b/Tasks/CopyFiles/task.json
index 7ca3ba368e47..8cb49a34e02f 100644
--- a/Tasks/CopyFiles/task.json
+++ b/Tasks/CopyFiles/task.json
@@ -16,7 +16,7 @@
"version": {
"Major": 1,
"Minor": 1,
- "Patch": 3
+ "Patch": 4
},
"demands": [],
"minimumAgentVersion": "1.91.0",
@@ -69,6 +69,15 @@
"required": false,
"helpMarkDown": "Replace existing file in target folder",
"groupName": "advanced"
+ },
+ {
+ "name": "flattenFolders",
+ "type": "boolean",
+ "label": "Flatten Folders",
+ "defaultValue": "false",
+ "required": false,
+ "helpMarkDown": "Flatten the folder structure and copy all files into the specified target folder.",
+ "groupName": "advanced"
}
],
"instanceNameFormat": "Copy Files to: $(TargetFolder)",
diff --git a/Tasks/CopyFiles/task.loc.json b/Tasks/CopyFiles/task.loc.json
index 55cdc68d2031..ef70759ef05c 100644
--- a/Tasks/CopyFiles/task.loc.json
+++ b/Tasks/CopyFiles/task.loc.json
@@ -16,7 +16,7 @@
"version": {
"Major": 1,
"Minor": 1,
- "Patch": 3
+ "Patch": 4
},
"demands": [],
"minimumAgentVersion": "1.91.0",
@@ -69,6 +69,15 @@
"required": false,
"helpMarkDown": "ms-resource:loc.input.help.OverWrite",
"groupName": "advanced"
+ },
+ {
+ "name": "flattenFolders",
+ "type": "boolean",
+ "label": "ms-resource:loc.input.label.flattenFolders",
+ "defaultValue": "false",
+ "required": false,
+ "helpMarkDown": "ms-resource:loc.input.help.flattenFolders",
+ "groupName": "advanced"
}
],
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
diff --git a/Tasks/CopyFilesOverSSH/task.json b/Tasks/CopyFilesOverSSH/task.json
index f69e16954814..be9370e131a3 100644
--- a/Tasks/CopyFilesOverSSH/task.json
+++ b/Tasks/CopyFilesOverSSH/task.json
@@ -8,12 +8,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 1,
- "Patch": 1
+ "Patch": 2
},
"demands": [],
"instanceNameFormat": "Securely copy files to the remote machine",
diff --git a/Tasks/CopyFilesOverSSH/task.loc.json b/Tasks/CopyFilesOverSSH/task.loc.json
index 9004b68fa237..e1e1a06343bc 100644
--- a/Tasks/CopyFilesOverSSH/task.loc.json
+++ b/Tasks/CopyFilesOverSSH/task.loc.json
@@ -9,11 +9,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 1,
- "Patch": 1
+ "Patch": 2
},
"demands": [],
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
diff --git a/Tasks/DecryptFile/task.json b/Tasks/DecryptFile/task.json
index 00feb7b68905..1f0b399a3e4f 100644
--- a/Tasks/DecryptFile/task.json
+++ b/Tasks/DecryptFile/task.json
@@ -7,12 +7,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 16
+ "Patch": 17
},
"groups": [
{
diff --git a/Tasks/DecryptFile/task.loc.json b/Tasks/DecryptFile/task.loc.json
index 0229322ef149..82436f27db24 100644
--- a/Tasks/DecryptFile/task.loc.json
+++ b/Tasks/DecryptFile/task.loc.json
@@ -8,11 +8,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 16
+ "Patch": 17
},
"groups": [
{
diff --git a/Tasks/DeployAzureResourceGroup/task.loc.json b/Tasks/DeployAzureResourceGroup/task.loc.json
index 40c272693d51..bb5ea6330c38 100644
--- a/Tasks/DeployAzureResourceGroup/task.loc.json
+++ b/Tasks/DeployAzureResourceGroup/task.loc.json
@@ -272,4 +272,4 @@
"ARG_SetExtensionFailedForVm": "ms-resource:loc.messages.ARG_SetExtensionFailedForVm",
"ARG_DeploymentPrereqFailed": "ms-resource:loc.messages.ARG_DeploymentPrereqFailed"
}
-}
+}
\ No newline at end of file
diff --git a/Tasks/DotNetCoreCLI/dotnetcore.ts b/Tasks/DotNetCoreCLI/dotnetcore.ts
index 65518d441fe6..1761e6599df8 100644
--- a/Tasks/DotNetCoreCLI/dotnetcore.ts
+++ b/Tasks/DotNetCoreCLI/dotnetcore.ts
@@ -44,6 +44,8 @@ export class dotNetExe {
var result = dotnet.execSync();
if (result.code != 0) {
+ var error = result.stderr.replace("\r", "%0D");
+ tl.error(error.replace("\n", "%0A"));
tl.setResult(result.code, tl.loc("dotnetCommandFailed", result.code));
}
diff --git a/Tasks/DotNetCoreCLI/task.json b/Tasks/DotNetCoreCLI/task.json
index 72181d26cd85..10a644f68271 100644
--- a/Tasks/DotNetCoreCLI/task.json
+++ b/Tasks/DotNetCoreCLI/task.json
@@ -16,7 +16,7 @@
"demands": [],
"version": {
"Major": 0,
- "Minor": 1,
+ "Minor": 2,
"Patch": 0
},
"minimumAgentVersion": "1.95.0",
diff --git a/Tasks/DotNetCoreCLI/task.loc.json b/Tasks/DotNetCoreCLI/task.loc.json
index d9b64072a1da..77ec045d7fad 100644
--- a/Tasks/DotNetCoreCLI/task.loc.json
+++ b/Tasks/DotNetCoreCLI/task.loc.json
@@ -16,7 +16,7 @@
"demands": [],
"version": {
"Major": 0,
- "Minor": 1,
+ "Minor": 2,
"Patch": 0
},
"minimumAgentVersion": "1.95.0",
diff --git a/Tasks/ExtractFiles/task.json b/Tasks/ExtractFiles/task.json
index 711bd14a01de..745bfdccdf7c 100644
--- a/Tasks/ExtractFiles/task.json
+++ b/Tasks/ExtractFiles/task.json
@@ -9,12 +9,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 7
+ "Patch": 8
},
"instanceNameFormat": "Extract files $(message)",
"inputs": [
diff --git a/Tasks/ExtractFiles/task.loc.json b/Tasks/ExtractFiles/task.loc.json
index 70b140d26780..a56851a671b2 100644
--- a/Tasks/ExtractFiles/task.loc.json
+++ b/Tasks/ExtractFiles/task.loc.json
@@ -10,11 +10,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 7
+ "Patch": 8
},
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
"inputs": [
diff --git a/Tasks/FtpUpload/task.json b/Tasks/FtpUpload/task.json
index f78fe6f51ec9..686d3f98ad83 100644
--- a/Tasks/FtpUpload/task.json
+++ b/Tasks/FtpUpload/task.json
@@ -9,12 +9,16 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 4
+ "Patch": 5
},
"instanceNameFormat": "FTP Upload: $(rootFolder)",
"groups": [
diff --git a/Tasks/FtpUpload/task.loc.json b/Tasks/FtpUpload/task.loc.json
index 0a5cf43ec634..138b69a33944 100644
--- a/Tasks/FtpUpload/task.loc.json
+++ b/Tasks/FtpUpload/task.loc.json
@@ -10,11 +10,15 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 4
+ "Patch": 5
},
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
"groups": [
diff --git a/Tasks/Gradle/README.md b/Tasks/Gradle/README.md
index d62c87c9af39..a912766e6783 100644
--- a/Tasks/Gradle/README.md
+++ b/Tasks/Gradle/README.md
@@ -36,6 +36,16 @@ Use the next options to manage your `JAVA_HOME` attribute by JDK Version and Pat
- **JDK Architecture :** Select the approriate JDK Architecture. By default it is set to `x86`
+####Code Analysis
+
+- **Run SonarQube Analysis :** You can choose to run SonarQube analysis after executing the current goals. 'install' or 'package' goals should be executed first. To know more about this option [click here](https://blogs.msdn.com/b/visualstudioalm/archive/2015/10/08/the-maven-build-task-now-simplifies-sonarqube-analysis.aspx)
+
+- **Run Checkstyle :** You can choose to run the Checkstyle static code analysis tool, which checks the compliance of your source code with coding rules. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
+- **Run PMD :** You can choose to run the PMD static code analysis tool, which examines your source code for possible bugs. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
+- **Run FindBugs :** You can choose to run the FindBugs static code analysis tool, which examines the bytecode of your program for possible bugs. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
###Q&A
####How do I generate a wrapper from my Gradle project?
diff --git a/Tasks/Gradle/make.json b/Tasks/Gradle/make.json
index 833ddb0645c3..56ef268725c6 100644
--- a/Tasks/Gradle/make.json
+++ b/Tasks/Gradle/make.json
@@ -17,7 +17,8 @@
"CodeAnalysis/checkstyle.gradle",
"CodeAnalysis/checkstyle.xml",
"CodeAnalysis/pmd.gradle",
- "CodeAnalysis/sonar.gradle"
+ "CodeAnalysis/sonar.gradle",
+ "CodeAnalysis/findbugs.gradle"
],
"dest": "CodeAnalysis/"
}
diff --git a/Tasks/Gradle/task.json b/Tasks/Gradle/task.json
index 4ab12ecd78b2..d83a95da0b21 100644
--- a/Tasks/Gradle/task.json
+++ b/Tasks/Gradle/task.json
@@ -7,12 +7,16 @@
"category": "Build",
"visibility": [
"Build"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 70
+ "Patch": 72
},
"demands": [
"java"
diff --git a/Tasks/Gradle/task.loc.json b/Tasks/Gradle/task.loc.json
index 24abe59272b1..c4c46c555d39 100644
--- a/Tasks/Gradle/task.loc.json
+++ b/Tasks/Gradle/task.loc.json
@@ -8,11 +8,15 @@
"visibility": [
"Build"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 70
+ "Patch": 72
},
"demands": [
"java"
diff --git a/Tasks/Grunt/task.json b/Tasks/Grunt/task.json
index a6afc659323a..9e6c34f10cdc 100644
--- a/Tasks/Grunt/task.json
+++ b/Tasks/Grunt/task.json
@@ -7,12 +7,16 @@
"category": "Build",
"visibility": [
"Build"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 5,
- "Patch": 24
+ "Patch": 25
},
"demands": [
"node.js"
diff --git a/Tasks/Grunt/task.loc.json b/Tasks/Grunt/task.loc.json
index e80233132aae..21a6eb0b7da4 100644
--- a/Tasks/Grunt/task.loc.json
+++ b/Tasks/Grunt/task.loc.json
@@ -8,11 +8,15 @@
"visibility": [
"Build"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 5,
- "Patch": 24
+ "Patch": 25
},
"demands": [
"node.js"
diff --git a/Tasks/Gulp/task.json b/Tasks/Gulp/task.json
index 2360e7611f96..3775e9327802 100644
--- a/Tasks/Gulp/task.json
+++ b/Tasks/Gulp/task.json
@@ -7,12 +7,16 @@
"category": "Build",
"visibility": [
"Build"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 5,
- "Patch": 28
+ "Patch": 29
},
"demands": [
"node.js"
diff --git a/Tasks/Gulp/task.loc.json b/Tasks/Gulp/task.loc.json
index ddf0d73fd055..cca2e1b333c3 100644
--- a/Tasks/Gulp/task.loc.json
+++ b/Tasks/Gulp/task.loc.json
@@ -8,11 +8,15 @@
"visibility": [
"Build"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 0,
"Minor": 5,
- "Patch": 28
+ "Patch": 29
},
"demands": [
"node.js"
diff --git a/Tasks/IISWebAppDeployment/DeployIISWebApp.ps1 b/Tasks/IISWebAppDeployment/DeployIISWebApp.ps1
deleted file mode 100644
index 71e788c73b5a..000000000000
--- a/Tasks/IISWebAppDeployment/DeployIISWebApp.ps1
+++ /dev/null
@@ -1,157 +0,0 @@
-param (
- [string]$environmentName,
- [string]$adminUserName,
- [string]$adminPassword,
- [string]$winrmProtocol,
- [string]$testCertificate,
- [string]$resourceFilteringMethod,
- [string]$machineFilter,
- [string]$webDeployPackage,
- [string]$webDeployParamFile,
- [string]$overRideParams,
- [string]$createWebSite,
- [string]$webSiteName,
- [string]$webSitePhysicalPath,
- [string]$webSitePhysicalPathAuth,
- [string]$webSiteAuthUserName,
- [string]$webSiteAuthUserPassword,
- [string]$addBinding,
- [string]$assignDuplicateBinding,
- [string]$protocol,
- [string]$ipAddress,
- [string]$port,
- [string]$hostNameWithHttp,
- [string]$hostNameWithOutSNI,
- [string]$hostNameWithSNI,
- [string]$serverNameIndication,
- [string]$sslCertThumbPrint,
- [string]$createAppPool,
- [string]$appPoolName,
- [string]$dotNetVersion,
- [string]$pipeLineMode,
- [string]$appPoolIdentity,
- [string]$appPoolUsername,
- [string]$appPoolPassword,
- [string]$appCmdCommands,
- [string]$deployInParallel
- )
-
-Write-Warning "The preview IIS Web App Deployment task has been deprecated and will be removed soon. An IIS Web App Deployment extension has been released in the Visual Studio Team Services marketplace at https://aka.ms/iisextn. Install the extension, and use its tasks in the Build/Release definitions, and delete the preview task from the definition."
-Write-Verbose "Entering script DeployIISWebApp.ps1" -Verbose
-
-$hostName = [string]::Empty
-
-if($protocol -eq "http")
-{
- $hostName = $hostNameWithHttp
-}
-elseif($serverNameIndication -eq "true")
-{
- $hostName = $hostNameWithSNI
-}
-else
-{
- $hostName = $hostNameWithOutSNI
-}
-
-Write-Verbose "environmentName = $environmentName" -Verbose
-Write-Verbose "adminUserName = $adminUserName" -Verbose
-Write-Verbose "winrm protocol to connect to machine = $winrmProtocol" -Verbose
-Write-Verbose "testCertificate = $testCertificate" -Verbose
-Write-Verbose "resourceFilteringMethod = $resourceFilteringMethod" -Verbose
-Write-Verbose "machineFilter = $machineFilter" -Verbose
-Write-Verbose "webDeployPackage = $webDeployPackage" -Verbose
-Write-Verbose "webDeployParamFile = $webDeployParamFile" -Verbose
-Write-Verbose "overRideParams = $overRideParams" -Verbose
-Write-Verbose "deployInParallel = $deployInParallel" -Verbose
-
-Write-Verbose "createWebSite = $createWebSite" -Verbose
-Write-Verbose "webSiteName = $webSiteName" -Verbose
-Write-Verbose "webSitePhysicalPath = $webSitePhysicalPath" -Verbose
-Write-Verbose "webSitePhysicalPathAuth = $webSitePhysicalPathAuth" -Verbose
-Write-Verbose "webSiteAuthUserName = $webSiteAuthUserName" -Verbose
-Write-Verbose "addBinding = $addBinding" -Verbose
-Write-Verbose "assignDuplicateBinding = $assignDuplicateBinding" -Verbose
-Write-Verbose "protocol = $protocol" -Verbose
-Write-Verbose "ipAddress = $ipAddress" -Verbose
-Write-Verbose "port = $port" -Verbose
-Write-Verbose "hostName = $hostName" -Verbose
-Write-Verbose "serverNameIndication = $serverNameIndication" -Verbose
-
-Write-Verbose "createAppPool = $createAppPool" -Verbose
-Write-Verbose "appPoolName = $appPoolName" -Verbose
-Write-Verbose "dotNetVersion = $dotNetVersion" -Verbose
-Write-Verbose "pipeLineMode = $pipeLineMode" -Verbose
-Write-Verbose "appPoolIdentity = $appPoolIdentity" -Verbose
-Write-Verbose "appPoolUsername = $appPoolUsername" -Verbose
-
-Write-Verbose "appCmdCommands = $appCmdCommands" -Verbose
-Write-Verbose "deployInParallel = $deployInParallel" -Verbose
-
-import-module "Microsoft.TeamFoundation.DistributedTask.Task.Internal"
-import-module "Microsoft.TeamFoundation.DistributedTask.Task.Common"
-import-module "Microsoft.TeamFoundation.DistributedTask.Task.DevTestLabs"
-Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Deployment.Internal"
-Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Deployment.RemoteDeployment"
-
-$webDeployPackage = $webDeployPackage.Trim('"', ' ')
-$webDeployParamFile = $webDeployParamFile.Trim('"', ' ')
-$webSiteName = $webSiteName.Trim('"', ' ')
-$webSitePhysicalPath = $webSitePhysicalPath.Trim('"', ' ')
-$webSiteAuthUserName = $webSiteAuthUserName.Trim()
-
-$appPoolName = $appPoolName.Trim('"', ' ')
-$appPoolUsername = $appPoolUsername.Trim()
-
-$appCmdCommands = $appCmdCommands.Replace('"', '`"')
-
-if($createWebSite -ieq "true" -and [string]::IsNullOrWhiteSpace($webSiteName))
-{
- throw "Website Name cannot be empty if you want to create or update the target website."
-}
-
-if($createAppPool -ieq "true" -and [string]::IsNullOrWhiteSpace($appPoolName))
-{
- throw "Application pool name cannot be empty if you want to create or update the target app pool."
-}
-
-
-if(![string]::IsNullOrWhiteSpace($webSiteName))
-{
- if([string]::IsNullOrWhiteSpace($overRideParams))
- {
- Write-Verbose "Adding override params to ensure deployment happens on $webSiteName" -Verbose
- $overRideParams = [string]::Format('name="IIS Web Application Name",value="{0}"', $webSiteName)
- }
- elseif(!$overRideParams.Contains("IIS Web Application Name"))
- {
- $overRideParams = $overRideParams + [string]::Format('{0}name="IIS Web Application Name",value="{1}"', [System.Environment]::NewLine, $webSiteName)
- }
-}
-$overRideParams = $overRideParams.Replace('"', '`"')
-$msDeployScript = Get-Content ./MsDeployOnTargetMachines.ps1 | Out-String
-$invokeMain = "Execute-Main -WebDeployPackage `"$webDeployPackage`" -WebDeployParamFile `"$webDeployParamFile`" -OverRideParams `"$overRideParams`" -WebSiteName `"$webSiteName`" -WebSitePhysicalPath `"$webSitePhysicalPath`" -WebSitePhysicalPathAuth `"$webSitePhysicalPathAuth`" -WebSiteAuthUserName `"$webSiteAuthUserName`" -WebSiteAuthUserPassword `"$webSiteAuthUserPassword`" -AddBinding $addBinding -AssignDuplicateBinding $assignDuplicateBinding -Protocol $protocol -IpAddress `"$ipAddress`" -Port $port -HostName `"$hostName`" -ServerNameIndication $serverNameIndication -SslCertThumbPrint `"$sslCertThumbPrint`" -AppPoolName `"$appPoolName`" -DotNetVersion `"$dotNetVersion`" -PipeLineMode $pipeLineMode -AppPoolIdentity $appPoolIdentity -AppPoolUsername `"$appPoolUsername`" -AppPoolPassword `"$appPoolPassword`" -AppCmdCommands `"$appCmdCommands`" -CreateWebSite $createWebSite -CreateAppPool $createAppPool"
-
-Write-Verbose "Executing main funnction in MsDeployOnTargetMachines : $invokeMain"
-$msDeployOnTargetMachinesScript = [string]::Format("{0} {1} ( {2} )", $msDeployScript, [Environment]::NewLine, $invokeMain)
-Write-Output ( Get-LocalizedString -Key "Starting deployment of IIS Web Deploy Package : {0}" -ArgumentList $webDeployPackage)
-
-$errorMessage = [string]::Empty
-
-if($resourceFilteringMethod -eq "tags")
-{
- $errorMessage = Invoke-RemoteDeployment -environmentName $environmentName -tags $machineFilter -scriptBlockContent $msDeployOnTargetMachinesScript -runPowershellInParallel $deployInParallel -adminUserName $adminUserName -adminPassword $adminPassword -protocol $winrmProtocol -testCertificate $testCertificate
-}
-else
-{
- $errorMessage = Invoke-RemoteDeployment -environmentName $environmentName -machineNames $machineFilter -scriptBlockContent $msDeployOnTargetMachinesScript -runPowershellInParallel $deployInParallel -adminUserName $adminUserName -adminPassword $adminPassword -protocol $winrmProtocol -testCertificate $testCertificate
-}
-
-if(-not [string]::IsNullOrEmpty($errorMessage))
-{
- $readmelink = "https://aka.ms/iiswebappdeployreadme"
- $helpMessage = (Get-LocalizedString -Key "For more info please refer to {0}" -ArgumentList $readmelink)
- throw "$errorMessage $helpMessage"
-}
-
-Write-Output ( Get-LocalizedString -Key "Successfully deployed IIS Web Deploy Package : {0}" -ArgumentList $webDeployPackage)
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/MsDeployOnTargetMachines.ps1 b/Tasks/IISWebAppDeployment/MsDeployOnTargetMachines.ps1
deleted file mode 100644
index 0f19c02774f2..000000000000
--- a/Tasks/IISWebAppDeployment/MsDeployOnTargetMachines.ps1
+++ /dev/null
@@ -1,617 +0,0 @@
-Write-Verbose "Entering script MsDeployOnTargetMachines.ps1"
-$AppCmdRegKey = "HKLM:\SOFTWARE\Microsoft\InetStp"
-$MsDeployInstallPathRegKey = "HKLM:\SOFTWARE\Microsoft\IIS Extensions\MSDeploy"
-
-function Run-Command
-{
- param(
- [string]$command,
- [bool] $failOnErr = $true
- )
-
- $ErrorActionPreference = 'Continue'
-
- if( $psversiontable.PSVersion.Major -le 4)
- {
- $result = cmd.exe /c "`"$command`""
- }
- else
- {
- $result = cmd.exe /c "$command"
- }
-
- $ErrorActionPreference = 'Stop'
-
- if($failOnErr -and $LASTEXITCODE -ne 0)
- {
- throw $result
- }
-
- return $result
-}
-
-function Get-MsDeployLocation
-{
- param(
- [Parameter(Mandatory=$true)]
- [string]$regKeyPath
- )
-
- $msDeployNotFoundError = "Cannot find MsDeploy.exe location. Verify MsDeploy.exe is installed on $env:ComputeName and try operation again."
-
- if( -not (Test-Path -Path $regKeyPath))
- {
- throw $msDeployNotFoundError
- }
-
- $path = (Get-ChildItem -Path $regKeyPath | Select -Last 1).GetValue("InstallPath")
-
- if( -not (Test-Path -Path $path))
- {
- throw $msDeployNotFoundError
- }
-
- return (Join-Path $path msDeploy.exe)
-}
-
-function Get-AppCmdLocation
-{
- param(
- [Parameter(Mandatory=$true)]
- [string]$regKeyPath
- )
-
- $appCmdNotFoundError = "Cannot find appcmd.exe location. Verify IIS is configured on $env:ComputerName and try operation again."
- $appCmdMinVersionError = "Version of IIS is less than 7.0 on machine $env:ComputerName. Minimum version of IIS required is 7.0"
-
-
- if(-not (Test-Path -Path $regKeyPath))
- {
- throw $appCmdNotFoundError
- }
-
- $regKey = Get-ItemProperty -Path $regKeyPath
- $path = $regKey.InstallPath
- $version = $regKey.MajorVersion
-
- if($version -le 6.0)
- {
- throw $appCmdMinVersionError
- }
-
- if( -not (Test-Path $path))
- {
- throw $appCmdNotFoundError
- }
-
- return (Join-Path $path appcmd.exe), $version
-}
-
-function Get-MsDeployCmdArgs
-{
- param(
- [Parameter(Mandatory=$true)]
- [string]$webDeployPackage,
- [string]$webDeployParamFile,
- [string]$overRideParams
- )
-
- if(-not ( Test-Path -Path $webDeployPackage))
- {
- throw "Package does not exist : `"$webDeployPackage`""
- }
-
- $msDeployCmdArgs = [string]::Empty
- if(-not [string]::IsNullOrWhiteSpace($webDeployParamFile))
- {
-
- if(-not ( Test-Path -Path $webDeployParamFile))
- {
- throw "Param file does not exist : `"$webDeployParamFile`""
- }
-
- $msDeployCmdArgs = [string]::Format(' -setParamFile="{0}"', $webDeployParamFile)
- }
-
- $setParams = $overRideParams.Split([System.Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries)
- foreach($setParam in $setParams)
- {
- $setParam = $setParam.Trim()
- if(-not [string]::IsNullOrWhiteSpace($setParam))
- {
- $msDeployCmdArgs = [string]::Format('{0} -setParam:{1}', $msDeployCmdArgs, $setParam)
- }
- }
-
- $msDeployCmdArgs = [string]::Format(' -verb:sync -source:package="{0}" {1} -dest:auto -verbose -retryAttempts:3 -retryInterval:3000', $webDeployPackage, $msDeployCmdArgs)
- return $msDeployCmdArgs
-}
-
-function Does-WebSiteExists
-{
- param([string] $siteName)
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $appCmdArgs = [string]::Format(' list site /name:"{0}"',$siteName)
- $command = "`"$appCmdPath`" $appCmdArgs"
- Write-Verbose "Checking website exists. Running command : $command"
-
- $website = Run-Command -command $command -failOnErr $false
-
- if($website -ne $null)
- {
- Write-Verbose "Website (`"$siteName`") already exists"
- return $true
- }
-
- Write-Verbose "Website (`"$siteName`") does not exist"
- return $false
-}
-
-function Does-BindingExists
-{
- param(
- [string]$siteName,
- [string]$protocol,
- [string]$ipAddress,
- [string]$port,
- [string]$hostname,
- [string]$assignDupBindings
- )
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $appCmdArgs = [string]::Format(' list sites')
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Checking binding exists for website (`"$siteName`"). Running command : $command"
-
- $sites = Run-Command -command $command -failOnErr $false
- $binding = [string]::Format("{0}/{1}:{2}:{3}", $protocol, $ipAddress, $port, $hostname)
-
- $isBindingExists = $false
-
- foreach($site in $sites)
- {
- switch($assignDupBindings)
- {
- $true
- {
- if($site.Contains($siteName) -and $site.Contains($binding))
- {
- $isBindingExists = $true
- }
- }
- default
- {
- if($site.Contains($siteName) -and $site.Contains($binding))
- {
- $isBindingExists = $true
- }
- elseif($site.Contains($binding))
- {
- throw "Binding already exists for website (`"$site`")"
- }
- }
- }
- }
-
- Write-Verbose "Does bindings exist for website (`"$siteName`") is : $isBindingExists"
- return $isBindingExists
-}
-
-function Does-AppPoolExists
-{
- param(
- [string]$appPoolName
- )
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $appCmdArgs = [string]::Format(' list apppool /name:"{0}"',$appPoolName)
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Checking application exists. Running command : $command"
-
- $appPool = Run-Command -command $command -failOnErr $false
-
- if($appPool -ne $null)
- {
- Write-Verbose "Application Pool (`"$appPoolName`") already exists"
- return $true
- }
-
- Write-Verbose "Application Pool (`"$appPoolName`") does not exists"
- return $false
-}
-
-function Enable-SNI
-{
- param(
- [string]$siteName,
- [string]$sni,
- [string]$ipAddress,
- [string]$port,
- [string]$hostname
- )
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
-
- if( -not ($sni -eq "true" -and $iisVersion -ge 8 -and -not [string]::IsNullOrWhiteSpace($hostname)))
- {
- Write-Verbose "Not enabling SNI : sni : $sni, iisVersion : $iisVersion, hostname : $hostname. Possible Reasons: `n 1. IIS Version is less than 8 `n 2. HostName input is not provided `n 3. SNI input is set to false"
- return
- }
-
- if($ipAddress -eq "All Unassigned")
- {
- $ipAddress = "*"
- }
-
- $appCmdArgs = [string]::Format(' set site /site.name:{0} /bindings.[protocol=''https'',bindingInformation=''{1}:{2}:{3}''].sslFlags:"1"',$siteName, $ipAddress, $port, $hostname)
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Enabling SNI by setting SslFlags=1 for binding. Running command : $command"
- Run-Command -command $command
-}
-
-function Add-SslCert
-{
- param(
- [string]$port,
- [string]$certhash,
- [string]$hostname,
- [string]$sni,
- [string]$iisVersion
- )
-
- if([string]::IsNullOrWhiteSpace($certhash))
- {
- Write-Verbose "CertHash is empty .. returning"
- return
- }
-
- $result = $null
- $isItSameBinding = $false
- $addCertCmd = [string]::Empty
-
- #SNI is supported IIS 8 and above. To enable SNI hostnameport option should be used
- if($sni -eq "true" -and $iisVersion -ge 8 -and -not [string]::IsNullOrWhiteSpace($hostname))
- {
- $showCertCmd = [string]::Format("netsh http show sslcert hostnameport={0}:{1}", $hostname, $port)
- Write-Verbose "Checking SslCert binding already Present. Running command : $showCertCmd"
-
- $result = Run-Command -command $showCertCmd -failOnErr $false
- $isItSameBinding = $result.Get(4).Contains([string]::Format("{0}:{1}", $hostname, $port))
-
- $addCertCmd = [string]::Format("netsh http add sslcert hostnameport={0}:{1} certhash={2} appid={{{3}}} certstorename=MY", $hostname, $port, $certhash, [System.Guid]::NewGuid().toString())
- }
- else
- {
- $showCertCmd = [string]::Format("netsh http show sslcert ipport=0.0.0.0:{0}", $port)
- Write-Verbose "Checking SslCert binding already Present. Running command : $showCertCmd"
-
- $result = Run-Command -command $showCertCmd -failOnErr $false
- $isItSameBinding = $result.Get(4).Contains([string]::Format("0.0.0.0:{0}", $port))
-
- $addCertCmd = [string]::Format("netsh http add sslcert ipport=0.0.0.0:{0} certhash={1} appid={{{2}}}", $port, $certhash, [System.Guid]::NewGuid().toString())
- }
-
- $isItSameCert = $result.Get(5).ToLower().Contains([string]::Format("{0}", $certhash.ToLower()))
-
- if($isItSameBinding -and $isItSameCert)
- {
- Write-Verbose "SSL cert binding already present.. returning"
- return
- }
-
- Write-Verbose "Setting SslCert for website."
- Run-Command -command $addCertCmd
-}
-
-function Deploy-WebSite
-{
- param(
- [string]$webDeployPkg,
- [string]$webDeployParamFile,
- [string]$overRiderParams
- )
-
- $msDeployExePath = Get-MsDeployLocation -regKeyPath $MsDeployInstallPathRegKey
- $msDeployCmdArgs = Get-MsDeployCmdArgs -webDeployPackage $webDeployPkg -webDeployParamFile $webDeployParamFile -overRideParams $overRiderParams
-
- $msDeployCmd = "`"$msDeployExePath`" $msDeployCmdArgs"
- Write-Verbose "Deploying website. Running command: $msDeployCmd"
- Run-Command -command $msDeployCmd
-}
-
-function Create-WebSite
-{
- param(
- [string]$siteName,
- [string]$physicalPath
- )
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $appCmdArgs = [string]::Format(' add site /name:"{0}" /physicalPath:"{1}"',$siteName, $physicalPath)
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Creating website. Running command : $command"
- Run-Command -command $command
-}
-
-function Create-AppPool
-{
- param(
- [string]$appPoolName
- )
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $appCmdArgs = [string]::Format(' add apppool /name:"{0}"', $appPoolName)
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Creating application Pool. Running command : $command"
- Run-Command -command $command
-}
-
-function Run-AdditionalCommands
-{
- param(
- [string]$additionalCommands
- )
-
- $appCmdCommands = $additionalCommands.Trim('"').Split([System.Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries)
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
-
- foreach($appCmdCommand in $appCmdCommands)
- {
- if(-not [string]::IsNullOrWhiteSpace($appCmdCommand.Trim(' ')))
- {
- $command = "`"$appCmdPath`" $appCmdCommand"
-
- Write-Verbose "Running additional command. $command"
- Run-Command -command $command
- }
- }
-}
-
-function Update-WebSite
-{
- param(
- [string]$siteName,
- [string]$appPoolName,
- [string]$physicalPath,
- [string]$authType,
- [string]$userName,
- [string]$password,
- [string]$addBinding,
- [string]$protocol,
- [string]$ipAddress,
- [string]$port,
- [string]$hostname,
- [string]$assignDupBindings
- )
-
- $appCmdArgs = [string]::Format(' set site /site.name:"{0}"', $siteName)
-
- if(-not [string]::IsNullOrWhiteSpace($appPoolName))
- {
- $appCmdArgs = [string]::Format('{0} -applicationDefaults.applicationPool:"{1}"', $appCmdArgs, $appPoolName)
- }
-
- if(-not [string]::IsNullOrWhiteSpace($physicalPath))
- {
- $appCmdArgs = [string]::Format("{0} -[path='/'].[path='/'].physicalPath:`"{1}`"", $appCmdArgs, $physicalPath)
- }
-
- if(-not [string]::IsNullOrWhiteSpace($userName) -and $authType -eq "WebsiteWindowsAuth")
- {
- $appCmdArgs = [string]::Format("{0} -[path='/'].[path='/'].userName:{1}", $appCmdArgs, $userName)
- }
-
- if(-not [string]::IsNullOrWhiteSpace($password) -and $authType -eq "WebsiteWindowsAuth")
- {
- $appCmdArgs = [string]::Format("{0} -[path='/'].[path='/'].password:{1}", $appCmdArgs, $password)
- }
-
- if($ipAddress -eq "All Unassigned")
- {
- $ipAddress = "*"
- }
-
- $isBindingExists = Does-BindingExists -siteName $siteName -protocol $protocol -ipAddress $ipAddress -port $port -hostname $hostname -assignDupBindings $assignDupBindings
-
- if($addBinding -eq "true" -and $isBindingExists -eq $false)
- {
- $appCmdArgs = [string]::Format("{0} /+bindings.[protocol='{1}',bindingInformation='{2}:{3}:{4}']", $appCmdArgs, $protocol, $ipAddress, $port, $hostname)
- }
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Updating website properties. Running command : $command"
- Run-Command -command $command
-}
-
-function Update-AppPool
-{
- param(
- [string]$appPoolName,
- [string]$clrVersion,
- [string]$pipeLineMode,
- [string]$identity,
- [string]$userName,
- [string]$password
- )
-
- $appCmdArgs = ' set config -section:system.applicationHost/applicationPools'
-
- if(-not [string]::IsNullOrWhiteSpace($clrVersion))
- {
- $appCmdArgs = [string]::Format('{0} /[name=''"{1}"''].managedRuntimeVersion:{2}', $appCmdArgs, $appPoolName, $clrVersion)
- }
-
- if(-not [string]::IsNullOrWhiteSpace($pipeLineMode))
- {
- $appCmdArgs = [string]::Format('{0} /[name=''"{1}"''].managedPipelineMode:{2}', $appCmdArgs, $appPoolName, $pipeLineMode)
- }
-
- if($identity -eq "SpecificUser" -and -not [string]::IsNullOrWhiteSpace($userName) -and -not [string]::IsNullOrWhiteSpace($password))
- {
- $appCmdArgs = [string]::Format('{0} /[name=''"{1}"''].processModel.identityType:SpecificUser /[name=''"{1}"''].processModel.userName:"{2}" /[name=''"{1}"''].processModel.password:"{3}"',`
- $appCmdArgs, $appPoolName, $userName, $password)
- }
- elseif ($identity -eq "SpecificUser" -and -not [string]::IsNullOrWhiteSpace($userName))
- {
- $appCmdArgs = [string]::Format('{0} /[name=''"{1}"''].processModel.identityType:SpecificUser /[name=''"{1}"''].processModel.userName:"{2}"',`
- $appCmdArgs, $appPoolName, $userName)
- }
- else
- {
- $appCmdArgs = [string]::Format('{0} /[name=''"{1}"''].processModel.identityType:{2}', $appCmdArgs, $appPoolName, $identity)
- }
-
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- $command = "`"$appCmdPath`" $appCmdArgs"
-
- Write-Verbose "Updating application pool properties. Running command : $command"
- Run-Command -command $command
-}
-
-function Create-And-Update-WebSite
-{
- param(
- [string]$siteName,
- [string]$appPoolName,
- [string]$physicalPath,
- [string]$authType,
- [string]$userName,
- [string]$password,
- [string]$addBinding,
- [string]$protocol,
- [string]$ipAddress,
- [string]$port,
- [string]$hostname,
- [string]$assignDupBindings
- )
-
- $doesWebSiteExists = Does-WebSiteExists -siteName $siteName
-
- if( -not $doesWebSiteExists)
- {
- Create-WebSite -siteName $siteName -physicalPath $physicalPath
- }
-
- Update-WebSite -siteName $siteName -appPoolName $appPoolName -physicalPath $physicalPath -authType $authType -userName $userName -password $password `
- -addBinding $addBinding -protocol $protocol -ipAddress $ipAddress -port $port -hostname $hostname -assignDupBindings $assignDupBindings
-}
-
-function Create-And-Update-AppPool
-{
- param(
- [string]$appPoolName,
- [string]$clrVersion,
- [string]$pipeLineMode,
- [string]$identity,
- [string]$userName,
- [string]$password
- )
-
- $doesAppPoolExists = Does-AppPoolExists -appPoolName $appPoolName
-
- if(-not $doesAppPoolExists)
- {
- Create-AppPool -appPoolName $appPoolName
- }
-
- Update-AppPool -appPoolName $appPoolName -clrVersion $clrVersion -pipeLineMode $pipeLineMode -identity $identity -userName $userName -password $password
-}
-
-function Execute-Main
-{
- param (
- [string]$WebDeployPackage,
- [string]$WebDeployParamFile,
- [string]$OverRideParams,
- [string]$CreateWebSite,
- [string]$WebSiteName,
- [string]$WebSitePhysicalPath,
- [string]$WebSitePhysicalPathAuth,
- [string]$WebSiteAuthUserName,
- [string]$WebSiteAuthUserPassword,
- [string]$AddBinding,
- [string]$AssignDuplicateBinding,
- [string]$Protocol,
- [string]$IpAddress,
- [string]$Port,
- [string]$HostName,
- [string]$ServerNameIndication,
- [string]$SslCertThumbPrint,
- [string]$CreateAppPool,
- [string]$AppPoolName,
- [string]$DotNetVersion,
- [string]$PipeLineMode,
- [string]$AppPoolIdentity,
- [string]$AppPoolUsername,
- [string]$AppPoolPassword,
- [string]$AppCmdCommands
- )
-
- Write-Verbose "Entering Execute-Main function"
- Write-Verbose "WebDeployPackage = $WebDeployPackage"
- Write-Verbose "WebDeployParamFile = $WebDeployParamFile"
- Write-Verbose "OverRideParams = $OverRideParams"
-
- Write-Verbose "CreateWebSite= $CreateWebSite"
- Write-Verbose "WebSiteName = $WebSiteName"
- Write-Verbose "WebSitePhysicalPath = $WebSitePhysicalPath"
- Write-Verbose "WebSitePhysicalPathAuth = $WebSitePhysicalPathAuth"
- Write-Verbose "WebSiteAuthUserName = $WebSiteAuthUserName"
- Write-Verbose "WebSiteAuthUserPassword = $WebSiteAuthUserPassword"
- Write-Verbose "AddBinding = $AddBinding"
- Write-Verbose "AssignDuplicateBinding = $AssignDuplicateBinding"
- Write-Verbose "Protocol = $Protocol"
- Write-Verbose "IpAddress = $IpAddress"
- Write-Verbose "Port = $Port"
- Write-Verbose "HostName = $HostName"
- Write-Verbose "ServerNameIndication = $ServerNameIndication"
-
- Write-Verbose "CreateAppPool = $CreateAppPool"
- Write-Verbose "AppPoolName = $AppPoolName"
- Write-Verbose "DotNetVersion = $DotNetVersion"
- Write-Verbose "PipeLineMode = $PipeLineMode"
- Write-Verbose "AppPoolIdentity = $AppPoolIdentity"
- Write-Verbose "AppPoolUsername = $AppPoolUsername"
- Write-Verbose "AppPoolPassword = $AppPoolPassword"
- Write-Verbose "AppCmdCommands = $AppCmdCommands"
-
- if($CreateAppPool -ieq "true")
- {
- Create-And-Update-AppPool -appPoolName $AppPoolName -clrVersion $DotNetVersion -pipeLineMode $PipeLineMode -identity $AppPoolIdentity -userName $AppPoolUsername -password $AppPoolPassword
- }
-
- if($CreateWebSite -ieq "true")
- {
- Create-And-Update-WebSite -siteName $WebSiteName -appPoolName $AppPoolName -physicalPath $WebSitePhysicalPath -authType $WebSitePhysicalPathAuth -userName $WebSiteAuthUserName `
- -password $WebSiteAuthUserPassword -addBinding $AddBinding -protocol $Protocol -ipAddress $IpAddress -port $Port -hostname $HostName -assignDupBindings $AssignDuplicateBinding
-
- if($Protocol -eq "https")
- {
- $appCmdPath, $iisVersion = Get-AppCmdLocation -regKeyPath $AppCmdRegKey
- Add-SslCert -port $Port -certhash $SslCertThumbPrint -hostname $HostName -sni $ServerNameIndication -iisVersion $iisVersion
- Enable-SNI -siteName $WebSiteName -sni $ServerNameIndication -ipAddress $IpAddress -port $Port -hostname $HostName
- }
- }
- else
- {
- $doesWebSiteExists = Does-WebSiteExists -siteName $WebSiteName
- if (-not $doesWebSiteExists)
- {
- Write-Verbose "Website does not exist and you did not request to create it - deployment might fail."
- }
- }
-
- Run-AdditionalCommands -additionalCommands $AppCmdCommands
-
- Deploy-WebSite -webDeployPkg $WebDeployPackage -webDeployParamFile $WebDeployParamFile -overRiderParams $OverRideParams
-
- Write-Verbose "Exiting Execute-Main function"
-}
diff --git a/Tasks/IISWebAppDeployment/README.md b/Tasks/IISWebAppDeployment/README.md
deleted file mode 100644
index b474b448c437..000000000000
--- a/Tasks/IISWebAppDeployment/README.md
+++ /dev/null
@@ -1,110 +0,0 @@
-# IIS Web Application Deployment
-
-## **Important Notice**
-The preview IIS Web Application Deployment task has been **deprecated and will be removed soon**. The task has been **shipped as an extension for Visual Studio Team Services**, and is available in the marketplace - https://marketplace.visualstudio.com/items?itemName=ms-vscs-rm.iiswebapp.
-
-**Install the extension, and add the tasks from the extension in Build or Release Definitions, and remove this IIS Web Application Deployment task from the definition.**
-
-
-## Overview
-
-The task is used to deploy a web application or a website to IIS web server and to create or update websites and application pools, and the underlying technologies used by the task is [Web Deploy](https://www.iis.net/downloads/microsoft/web-deploy) and [AppCmd.exe](https://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe). Web Deploy packages the web application content, configuration and any other artifacts like registry, GAC assemblies etc. that can be used deployment. If the package needs to be redeployed to a different environment, configuration values within the package can be parameterized during deployment without requiring modifications to the packages themselves. Web deploy works with IIS 7, IIS 7.5, IIS 8, and IIS 8.5. AppCmd.exe is the single command line tool for managing IIS 7 and above. It exposes all key server management functionality through a set of intuitive management objects that can be manipulated from the command line or from scripts.
-
-The task runs on the target machine(s) and it is important to have the pre-requisites, as described below, installed on the machine(s). The flow is that the automation agent when executing the task, connects to the target machine using the Windows Remote Management (WinRM), and then launches a bootstrap service, which in turn invokes the PowerShell scripts to locate the msdeploy.exe on the machine, and deploys the web application using the msdeploy.exe.
-
-## Contact Information
-
-Please contact the alias RM\_Customer\_Queries at microsoft dot com, if you are facing problems in making this task work. Also, if you would like to share feedback about the task and the new features that you would like to see in it, then do send an email to the alias.
-
-## Pre-requisites for the task
-
-The following pre-requisites need to be setup for the task to work properly.
-
-### Web Deploy
-
-Web Deploy (msdeploy.exe) is used to deploy the web application on the IIS server, and needs to be installed on the target machines, and can be easily done so using [Microsoft Web Platform Installer](https://www.microsoft.com/web/gallery/install.aspx?appid=wdeploynosmo). Note that the link will open Web PI with the Web Deploy showing-up ready to install. The WebDeploy 3.5 needs to be installed without the bundled SQL support and using the default settings. There is no need to choose any custom settings while installing web deploy. After installation the Web Deploy is available at C:\Program Files (x86)\IIS\Microsoft Web Deploy V3. The task [PowerShell on Target Machines](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/PowerShellOnTargetMachines) can be used to deploy Web Deploy to Azure virtual machines or domain-joined/workgroup machines.
-
-AppCmd.exe is an in-built command line tool of IIS and does not need to be separately installed. It is used to create or update websites and application pools.
-
-### IIS Web Server
-
-There should be a IIS web server already installed and configured on the pre-existing machines or virtual machines. The task creates or updates websites and application pools, and deploys IIS web applications but does not install or configure IIS web server on the machines.
-
-### Pre-existing Machine Groups
-
-If the web application is being deployed on pre-existing machines (physical or virtual machines) then a machine group has to be created in the Machines Hub. There is a manage link next to the Machine Group parameter of the task. Click on the link to navigate to the Machines Hub and create a machine group. Note that the IP Address or the FDQN of Azure virtual machines can be also added in the machine group. The difference between using the domain-joined/workgroup machines and the Azure virtual machines is that copying files to them uses separate tasks wiz. [Windows Machine File Copy](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/WindowsMachineFileCopy) for the domain-joined/workgroup machines and [Azure File Copy](https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/AzureFileCopy) for the Azure virtual machines. Note that the IIS Web Application Deployment task expects the web application's package zip files to be available on the machines or on a UNC path that is accessible by the machine administrator's login. Prior to using the IIS Web Application Deployment task ensure that the zip files are available for the deployment by copying them to the machines using the Windows Machine File Copy or the Azure File Copy tasks.
-
-### WinRM setup
-This task uses the [Windows Remote Management](https://msdn.microsoft.com/en-us/library/aa384426.aspx) (WinRM) to access domain-joined or workgroup, on-premises physical or virtual machines.
-
-#### Windows Remote Management (WinRM) Setup for On-premises Physical or Virtual Machines
-To easily **setup WinRM** on the **host machines** follow the directions for [domain-joined machines](https://www.visualstudio.com/en-us/docs/release/examples/other-servers/net-to-vm) or the [workgroup machines](https://www.visualstudio.com/en-us/docs/release/examples/other-servers/net-to-workgroup-vm).
-
-#### Windows Remote Management (WinRM) Setup for Azure Virtual Machines
-Azure virtual machines only work with the WinRM HTTPS protocol. With the WinRM protocol selected as HTTPS, you have an option to use the Test Certificate. Selecting the Test Certificate option means that the certificate is a self-signed certificate, and the automation agent will skip validating the authenticity of the machine's certificate from a trusted certification authority.
-
-- **Classic Virtual machines:** When creating [classic virtual machine](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial-classic-portal/) from the [new Azure portal](https://portal.azure.com/) or the [classic Azure portal](https://manage.windowsazure.com/), the virtual machine is already setup for WinRM HTTPS, with the default port 5986 already open in Firewall, and a self-signed certificate installed on the machine. These virtual machines can be directly added to the WinRM. The existing [classic virtual machine](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-tutorial-classic-portal/) can be also selected by using the [Azure Resource Group Deployment task](https://github.com/Microsoft/vso-agent-tasks/tree/master/Tasks/DeployAzureResourceGroup).
-
-- **• Azure Resource Group:** If an [Azure resource group](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-hero-tutorial/) has been created in the [new Azure portal](https://portal.azure.com/), then it needs to be setup for the WinRM HTTPS protocol (WinRM HTTPS, with the default port 5986 already open in Firewall, and a self-signed certificate installed on the machine). To dynamically deploy Azure resource groups with virtual machines in them use the [Azure Resource Group Deployment task](https://github.com/Microsoft/vso-agent-tasks/tree/master/Tasks/DeployAzureResourceGroup). The task has a checkbox titled - **Enable Deployment Pre-requisites**. Select this option to setup the WinRM HTTPS protocol on the virtual machines, and to open the 5986 port in the Firewall, and to install the test certificate. After this the virtual machines are ready for use in the deployment task.
-
-## Parameters of the task
-
-The task can be used to deploy a web application to an existing website in the IIS web server using web deploy, and it can be also used for creating new IIS website and application pools, or to update existing ones. The task has three sections and the parameters of the different sections are described in detail below. The parameters listed with a \* are required parameters for the task.
-
-The task first creates/updates the application pool, then creates/updates the websites, then applies the additional App.Cmd.exe commands, and then deploys the web application to the website using the web deploy. The application pool, website, and the additional AppCmd.exe sections are optional and if none of them are provided, then the task directly deploys the web application to the IIS website.
-
-### Deploy IIS Web Application
-This section of the task is used to deploy the web application to an existing IIS website and uses Web Deploy to do so.
-
- - **Machines**: Specify comma separated list of machine FQDNs/ip addresses along with port(optional). For example dbserver.fabrikam.com, dbserver_int.fabrikam.com:5986,192.168.34:5986. Port when not specified will be defaulted to WinRM defaults based on the specified protocol. i.e., (For *WinRM 2.0*): The default HTTP port is 5985, and the default HTTPS port is 5986. Machines field also accepts 'Machine Groups' defined under 'Test' hub, 'Machines' tab.
- - **Admin Login**: Domain/Local administrator of the target host. Format: <Domain or hostname>\ < Admin User>. Mandatory when used with list of machines, optional for Test Machine Group (will override test machine group value when specified).
- - **Password**: Password for the admin login. It can accept variable defined in Build/Release definitions as '$(passwordVariable)'. You may mark variable type as 'secret' to secure it. Mandatory when used with list of machines, optional for Test Machine Group (will override test machine group value when specified).
- - **Protocol**: Specify the protocol that will be used to connect to target host, either HTTP or HTTPS.
- - **Test Certificate**: Select the option to skip validating the authenticity of the machine's certificate by a trusted certification authority. The parameter is required for the WinRM HTTPS protocol.
- - **Web Deploy Package\*:** Location of the web deploy zip package file on the target machine or on a UNC path that is accessible to the administrator credentials of the machine like, \\\\BudgetIT\Web\Deploy\FabrikamWeb.zip. Environment variables are also supported like $env:windir, $env:systemroot etc. For example, $env:windir\FabrikamFibre\Web.
- - **Web Deploy Parameters File:** 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. The parameter takes in the location of the parameter file on the target machines or on a UNC path.
- - **Override Parameters:** Parameters specified here will override the parameters in the MSDeploy zip file and the Parameter file. The format followed here is same as that for [setParam](https://technet.microsoft.com/en-us/library/dd569084(v=ws.10).aspx) option of MsDeploy.exe. For example, name="IIS Web Application Name",value="Fabrikam/MyApplication"
-
-### Website
-The section of the task is used to create a new IIS website or to update an existing one by using the IIS Server's AppCmd.exe command line tool. For more information about the parameters see the [websites](https://technet.microsoft.com/library/hh831681.aspx#Add_Site) page on MSDN.
-
- - **Create or Update Website:** Select this option to create a new website or to update an existing one.
- - **Website Name\*:** The name of the IIS website that will be created if it does not exist, or it will be updated if it is already present on the IIS server. The name of the website should be same as that specified in the web deploy zip package file. If a Parameter file and override Parameters setting is also specified, then the name of the website should be same as that in the override Parameters setting.
- - **Physical Path\*:** Physical path where the website content is stored. The content can reside on the local computer or on a remote directory or share like, C:\Fabrikam or \\ContentShare\Fabrikam
- - **Physical Path Authentication\*:** Specify credentials to connect to the physical path. If credentials are not provided, the web server uses pass-through authentication. This means that content is accessed by using the application user's identity, and configuration files are accessed by using the application pool's identity. By default, Application user (pass-through authentication) is selected.
- - **Username:** If Windows authentication is selected in the physical path authentication, then provide the username for accessing the physical path.
- - **Password:** Password of the user to access the physical path.
- - **Add Binding:** Select the option to add bindings for the website.
- - **Assign Duplicate Binding:** Selecting this option will add the bindings specified here, even if there is another website with the same bindings. If there are binding conflicts, then only one of the website will start.
- - **Protocol:** Select HTTP for the website to have an HTTP binding, or select HTTPS for the website to have a Secure Sockets Layer (SSL) binding.
- - **IP Address:** Type an IP address that users can use to access this website. If All Unassigned is selected, the site will respond to requests for all IP addresses on the port and the optional host name that is specified for this site, unless there is another site on the server that has a binding on the same port but with a specific IP address. For example, the default website binding specifies All Unassigned for IP address, and 80 for Port, and no host name. If the server has a second site named Fabrikam with a binding that specifies 172.30.189.132 for IP address on port 80 and no host name, Contoso receives all HTTP requests to port 80 on IP address 172.30.189.132, and the default website continues to receive HTTP requests to port 80 on any IP address other than 172.30.189.132.
- - **Port:** Type the port on which Hypertext Transfer Protocol Stack (HTTP.sys) must listen for requests made to this website. The default port for HTTP is 80 and for HTTPS it is 443. If any other port is specified, apart from the default ports, clients must specify the port number in requests to the server or they will not be able to connect to the website.
- - **Host Name:** To assign one or more host names (aka domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified, then the clients must use the host name instead of the IP address to access the website.
- - **Server Name Indication Required:** Determines whether the website requires Server Name Indication (SNI). SNI extends the SSL and TLS protocols to indicate what host name the client is attempting to connect to. It allows multiple secure websites with different certificates to use the same IP address. The checkbox is displayed when the binding type is HTTPS. This parameter only works with IIS 8 and later versions of IIS. If SNI is selected, then host name should be also specified
- - **SSL Certificate Thumbprint:** Thumbprint of the Secure Socket Layer certificate that the website is going to use. The certificate should be already installed on the machine and present under the Local Computer, Personal store.
-
-### Application Pool
-The section is used to create a new IIS application pool or to update an existing one by using the IIS Server's AppCmd.exe command line tool. For more information about the parameters see the [application pools](https://technet.microsoft.com/library/hh831797.aspx) page on MSDN.
-
- - **Create or Update Application Pool:** Select this option to create a new application pool or to update an existing one.
- - **Name\*:** The name of the IIS application pool that will be created if it does not exist, or it will be updated if it is already present on the IIS server. The name of the application pool should be same as that specified in the web deploy zip package file. If a Parameter file and override Parameters setting is also specified, then the name of the application pool should be same as that in the override Parameters setting.
- - **.NET Version\*:** Version of the .NET Framework that is loaded by this application pool. If the applications assigned to this application pool do not contain managed code, select the No Managed Code option from the list.
- - **Managed Pipeline Mode\*:** Managed pipeline mode specifies how IIS processes requests for managed content. Use classic mode only when the applications in the application pool cannot run in the Integrated mode.
- - **Identity\*:** Configure the account under which an application pool's worker process runs. Select one of the predefined security accounts or configure a custom account.
-
-### Advanced
-The section provides for advanced options.
-
- - **Additional AppCmd.exe Commands:** Additional [AppCmd.exe](https://technet.microsoft.com/en-us/library/cc732107(v=ws.10).aspx) commands to set website or application pool properties. For more than one command use line separator. For example:
-
- ```c
- set config /section:applicationPools /[name='Fabrikam'].autoStart:false
- add site /name:fabrikam /bindings:http/\*:85: fabrikam.com.
- ```
-
- - **Deploy in Parallel:** Setting it to true will run the database deployment task in-parallel on the target machines.
-
-## Known Issues
-
- - The IIS Web Application Deployment task does not provide support for Web Deploy manifest files and has not been tested and verified for ASP.NET 5 and MVC 6 web application. Please send us feedback for the task and for the support for manifest files, ASP.NET 5/MVC 6 we applications at RM\_Customer\_Queries at microsoft dot com.
- - The Override Parameters can take only one parameter based on the [setParam](https://technet.microsoft.com/en-us/library/dd569084(v=ws.10).aspx) option of MsDeploy.exe
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/de-de/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/de-de/resources.resjson
deleted file mode 100644
index 6981ecc078e5..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/de-de/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[Veraltet] IIS-Web-App-Bereitstellung",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Bereitstellen durch MSDeploy, Erstellen/Aktualisieren der Website und App-Pools.",
- "loc.instanceNameFormat": "[Veraltet] IIS-App bereitstellen: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Bereitstellung",
- "loc.group.displayName.website": "Website",
- "loc.group.displayName.applicationPool": "Anwendungspool",
- "loc.group.displayName.advanced": "Erweitert",
- "loc.input.label.EnvironmentName": "Computer",
- "loc.input.help.EnvironmentName": "Stellen Sie eine durch Kommas getrennte Liste der IP-Computeradressen oder FQDNs zusammen mit den Ports bereit. Die Standardeinstellung für den Port basiert auf dem ausgewählten Protokoll. Beispiel: \"dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986\" Sie können auch die Ausgabevariable anderer Tasks angeben. Beispiel: \"$(variableName)\".",
- "loc.input.label.AdminUserName": "Administratoranmeldung",
- "loc.input.help.AdminUserName": "Die Administratoranmeldung für die Zielcomputer.",
- "loc.input.label.AdminPassword": "Kennwort",
- "loc.input.help.AdminPassword": "Das Administratorkennwort für die Zielcomputer. Es kann die Variable annehmen, die in Build-/Releasedefinitionen als\"$(passwordVariable)\" definiert wird. Sie können den Variablentyp als \"secret\" markieren, um die Variable zu sichern. ",
- "loc.input.label.WinRMProtocol": "Protokoll",
- "loc.input.help.WinRMProtocol": "Wählen Sie das Protokoll aus, das für die WinRM-Verbindung mit dem Computer bzw. den Computern verwendet werden soll. Der Standardwert ist HTTPS.",
- "loc.input.label.TestCertificate": "Testzertifikat",
- "loc.input.help.TestCertificate": "Wählen Sie die Option aus, um die Überprüfung der Authentizität des Zertifikats des Computers durch eine vertrauenswürdige Zertifizierungsstelle zu überspringen. Der Parameter ist für das WinRM HTTPS-Protokoll erforderlich.",
- "loc.input.label.WebDeployPackage": "Web Deploy-Paket",
- "loc.input.help.WebDeployPackage": "Der Speicherort der Web Deploy-ZIP-Datei (MSDeploy) auf den Zielcomputern oder in einem UNC-Pfad (z. B. \"\\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip\"). Auf den UNC-Pfad sollte über das Administratorkonto des Computers zugegriffen werden können. Umgebungsvariablen werden ebenfalls unterstützt. Beispiel: \"$env:windir\", \"$env:systemroot – \"$env:windir\\FabrikamFibre\\Web\".",
- "loc.input.label.WebDeployParamFile": "Web Deploy-Parameterdatei",
- "loc.input.help.WebDeployParamFile": "Der Speicherort der Parameterdatei auf dem Zielcomputer oder in einem UNC-Pfad. Die Parameterdatei wird zum Außerkraftsetzen der Konfigurationseinstellungen der Webanwendung (z. B. des Namens der IIS-Webanwendung oder der Datenbankverbindungszeichenfolge) verwendet.",
- "loc.input.label.OverRideParams": "Parameter außer Kraft setzen",
- "loc.input.help.OverRideParams": "Hier angegebenen Parameter überschreiben die Parameter in der MSDeploy-ZIP-Datei und in der Parameterdatei. Wenn mehrere Parameter überschrieben werden sollen, verwenden Sie Zeilentrennzeichen, z. B. \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Website erstellen oder aktualisieren",
- "loc.input.help.CreateWebSite": "Wählen Sie diese Option aus, um eine Website zu erstellen oder eine vorhandene Website zu aktualisieren.",
- "loc.input.label.WebSiteName": "Websitename",
- "loc.input.help.WebSiteName": "Der Name der IIS-Website, die erstellt werden soll, wenn sie nicht vorhanden ist, oder die aktualisiert wird, wenn sie auf dem IIS-Server bereits vorhanden ist. Der Name der Website sollte mit dem in der Web Deploy-ZIP-Paketdatei angegebenen Namen identisch sein. Wenn eine Parameterdatei und eine Einstellung zum Überschreiben von Parametern ebenfalls angegeben werden, sollte der Name der Website identisch mit der Einstellung zum Überschreiben von Parametern sein.",
- "loc.input.label.WebSitePhysicalPath": "Physischer Pfad",
- "loc.input.help.WebSitePhysicalPath": "Der physische Pfad, unter dem der Websiteinhalt gespeichert ist. Der Inhalt kann sich auf dem lokalen Computer, in einem Remoteverzeichnis oder auf einer Freigabe befinden. Beispiel: \"C:\\Fabrikam\" oder \"\\\\\\\\ContentShare\\Fabrikam\".",
- "loc.input.label.WebSitePhysicalPathAuth": "Authentifizierung des physischen Pfads",
- "loc.input.help.WebSitePhysicalPathAuth": "Der Authentifizierungsmechanismus für den Zugriff auf den physischen Pfad der Website.",
- "loc.input.label.WebSiteAuthUserName": "Benutzername",
- "loc.input.help.WebSiteAuthUserName": "Der Benutzername für den Zugriff auf den physischen Pfad der Website.",
- "loc.input.label.WebSiteAuthUserPassword": "Kennwort",
- "loc.input.help.WebSiteAuthUserPassword": "Das Kennwort für den Zugriff auf den physischen Pfad der Website. Wenn Sie gMSA verwenden, ist dieses nicht erforderlich.",
- "loc.input.label.AddBinding": "Bindung hinzufügen",
- "loc.input.help.AddBinding": "Wählen Sie diese Option aus, um eine Portbindung für die Website hinzuzufügen.",
- "loc.input.label.AssignDuplicateBinding": "Doppelte Bindung zuweisen",
- "loc.input.help.AssignDuplicateBinding": "Wählen Sie die Option aus, um die hier angegebenen Bindungen selbst dann hinzuzufügen, wenn eine andere Website mit den gleichen Bindungen vorhanden ist. Wenn Bindungskonflikte auftreten, wird nur eine der Websites gestartet.",
- "loc.input.label.Protocol": "Protokoll",
- "loc.input.help.Protocol": "Wählen Sie HTTP für die Website aus, um eine HTTP-Bindung zu verwenden, oder HTTPS, um eine HTTPS-Bindung (Secure Sockets Layer) zu verwenden.",
- "loc.input.label.IPAddress": "IP-Adresse",
- "loc.input.help.IPAddress": "Geben Sie eine IP-Adresse ein, die Benutzer für den Zugriff auf diese Website verwenden können. Wenn \"Alle nicht zugewiesen\" ausgewählt ist, antwortet die Website auf Anforderungen für alle IP-Adressen für den Port und den optionalen Hostnamen, der für diese Website angegeben wurde. Dies ist nur dann nicht der Fall, wenn eine andere Website auf dem Server eine Bindung am gleichen Port mit einer bestimmten IP-Adresse besitzt.",
- "loc.input.label.Port": "Port",
- "loc.input.help.Port": "Geben Sie den Port ein, an dem \"HTTP.sys\" (Hypertext Transfer Protocol Stack) auf Anforderungen dieser Website lauschen muss.",
- "loc.input.label.ServerNameIndication": "Die Angabe des Servernamens ist erforderlich.",
- "loc.input.help.ServerNameIndication": "Ermittelt, ob für die Website SNI (Server Name Indication, Servernamensanzeige) erforderlich ist. SNI erweitert die SSL- und TLS-Protokolle so, dass der Hostname angegeben wird, mit dem der Client versucht, eine Verbindung herzustellen. Mehrere sichere Websites mit verschiedenen Zertifikaten können die gleiche IP-Adresse verwenden.",
- "loc.input.label.HostNameWithOutSNI": "Hostname",
- "loc.input.help.HostNameWithOutSNI": "Wenn Sie einem Computer, der eine einzelne IP-Adresse verwendet, mindestens einen Hostnamen (oder Domänennamen) zuweisen möchten, geben Sie hier einen Hostnamen ein. Wenn ein Hostname angegeben wird, müssen Clients den Hostnamen anstelle der IP-Adresse für den Zugriff auf die Website verwenden.",
- "loc.input.label.HostNameWithHttp": "Hostname",
- "loc.input.help.HostNameWithHttp": "Wenn Sie einem Computer, der eine einzelne IP-Adresse verwendet, mindestens einen Hostnamen (oder Domänennamen) zuweisen möchten, geben Sie hier einen Hostnamen ein. Wenn ein Hostname angegeben wird, müssen Clients den Hostnamen anstelle der IP-Adresse für den Zugriff auf die Website verwenden.",
- "loc.input.label.HostNameWithSNI": "Hostname",
- "loc.input.help.HostNameWithSNI": "Wenn Sie einem Computer, der eine einzelne IP-Adresse verwendet, mindestens einen Hostnamen (oder Domänennamen) zuweisen möchten, geben Sie hier einen Hostnamen ein. Wenn ein Hostname angegeben wird, müssen Clients den Hostnamen anstelle der IP-Adresse für den Zugriff auf die Website verwenden.",
- "loc.input.label.SSLCertThumbPrint": "Fingerabdruck des SSL-Zertifikats",
- "loc.input.help.SSLCertThumbPrint": "Der Fingerabdruck des SSL-Zertifikats, das die Website verwenden wird. Das Zertifikat sollte bereits auf dem Computer installiert und im lokalen persönlichen Speicher des Computers vorhanden sein.",
- "loc.input.label.CreateAppPool": "Anwendungspool erstellen oder aktualisieren",
- "loc.input.help.CreateAppPool": "Wählen Sie die Option aus, um einen Anwendungspool zu erstellen oder einen vorhandenen Anwendungspool zu aktualisieren.",
- "loc.input.label.AppPoolName": "Name",
- "loc.input.help.AppPoolName": "Der Name des IIS-Anwendungspools, der erstellt oder aktualisiert werden soll. Ein vorhandener Anwendungspool wird mit den hier angegebenen Einstellungen aktualisiert.",
- "loc.input.label.DotNetVersion": ".NET-Version",
- "loc.input.help.DotNetVersion": "Die Version von .NET Framework, die von diesem Anwendungspool geladen wird. Wenn die Anwendung, die diesem Anwendungspool zugewiesen ist, keinen verwalteten Code enthält, wählen Sie die Option \"Kein verwalteter Code\" aus der Liste aus.",
- "loc.input.label.PipeLineMode": "Verwalteter Pipelinemodus",
- "loc.input.help.PipeLineMode": "Der verwaltete Pipelinemodus gibt an, wie IIS Anforderungen für verwalteten Inhalt verarbeitet. Verwenden Sie den klassischen Modus nur, wenn die Anwendung im Anwendungspool nicht im integrierten Modus ausgeführt werden kann.",
- "loc.input.label.AppPoolIdentity": "Identität",
- "loc.input.help.AppPoolIdentity": "Konfigurieren Sie das Konto, unter dem der Arbeitsprozess eines Anwendungspools ausgeführt wird. Wählen Sie eines der vordefinierten Sicherheitskonten aus, oder konfigurieren Sie ein benutzerdefiniertes Konto.",
- "loc.input.label.AppPoolUsername": "Benutzername",
- "loc.input.label.AppPoolPassword": "Kennwort",
- "loc.input.help.AppPoolPassword": "Wenn Sie gMSA verwenden, ist dies nicht erforderlich.",
- "loc.input.label.AppCmdCommands": "Weitere AppCmd.exe-Befehle",
- "loc.input.help.AppCmdCommands": "Zusätzliche AppCmd.exe-Befehle zum Festlegen von Website- oder Anwendungspooleigenschaften. Verwenden Sie für mehrere Befehle Zeilentrennzeichen. Beispiel: \"list apppools\" \"list sites\"",
- "loc.input.label.DeployInParallel": "Parallel bereitstellen",
- "loc.input.help.DeployInParallel": "Wenn diese Option auf \"true\" festgelegt wird, wird die Webanwendung parallel auf den Zielcomputern bereitgestellt.",
- "loc.input.label.ResourceFilteringMethod": "Computer auswählen nach",
- "loc.input.help.ResourceFilteringMethod": "Wählen Sie optional eine Teilmenge der Computer durch Angeben von Computernamen oder Tags aus.",
- "loc.input.label.MachineFilter": "Auf Computern bereitstellen",
- "loc.input.help.MachineFilter": "Diese Eingabe ist nur gültig für Computergruppen und wird noch nicht für flache Listen von Computern oder Ausgabevariablen unterstützt. Geben Sie eine Liste von Computern (z. B. \"dbserver.fabrikam.com\", \"webserver.fabrikam.com\", \"192.168.12.34\") oder Tags (z. B. \"Role:DB\", \"OS:Win8.1\") an. Wenn mehrere Tags angegeben werden, wird der Task auf allen Computern mit den angegebenen Tags ausgeführt. Geben Sie für Azure-Ressourcengruppen den Namen der virtuellen Maschine an, z. B. \"ffweb\" oder \"ffdb\". Standardmäßig wird der Task auf allen Computern ausgeführt."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson
deleted file mode 100644
index 886500a88b87..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/en-US/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[Deprecated] IIS Web App Deployment",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Deploy by MSDeploy, create/update website & app pools",
- "loc.instanceNameFormat": "[Deprecated] Deploy IIS App: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Deployment",
- "loc.group.displayName.website": "Website",
- "loc.group.displayName.applicationPool": "Application Pool",
- "loc.group.displayName.advanced": "Advanced",
- "loc.input.label.EnvironmentName": "Machines",
- "loc.input.help.EnvironmentName": "Provide a comma separated list of machine IP addresses or FQDNs along with ports. Port is defaulted based on the selected protocol. Eg: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 Or provide output variable of other tasks. Eg: $(variableName)",
- "loc.input.label.AdminUserName": "Admin Login",
- "loc.input.help.AdminUserName": "Administrator login for the target machines.",
- "loc.input.label.AdminPassword": "Password",
- "loc.input.help.AdminPassword": "Administrator password for the target machines. It can accept variable defined in Build/Release definitions as '$(passwordVariable)'. You may mark variable type as 'secret' to secure it. ",
- "loc.input.label.WinRMProtocol": "Protocol",
- "loc.input.help.WinRMProtocol": "Select the protocol to use for the WinRM connection with the machine(s). Default is HTTPS.",
- "loc.input.label.TestCertificate": "Test Certificate",
- "loc.input.help.TestCertificate": "Select the option to skip validating the authenticity of the machine's certificate by a trusted certification authority. The parameter is required for the WinRM HTTPS protocol.",
- "loc.input.label.WebDeployPackage": "Web Deploy Package",
- "loc.input.help.WebDeployPackage": "Location of the Web Deploy (MSDeploy) zip file on the target machines or on a UNC path like, \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. The UNC path should be accessible to the machine's administrator account. Environment variables are also supported like, $env:windir, $env:systemroot, like, $env:windir\\FabrikamFibre\\Web.",
- "loc.input.label.WebDeployParamFile": "Web Deploy Parameter File",
- "loc.input.help.WebDeployParamFile": "Location of the Parameter file on the target machines or on a UNC path. Parameter file is used to override Web application configuration settings like, IIS Web application name or database connection string.",
- "loc.input.label.OverRideParams": "Override Parameters",
- "loc.input.help.OverRideParams": "Parameters specified here will override the parameters in the MSDeploy zip file and the Parameter file. To override more than one parameter use line separator, e.g., \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Create or Update Website",
- "loc.input.help.CreateWebSite": "Select the option to create a website or to update an existing website.",
- "loc.input.label.WebSiteName": "Website Name",
- "loc.input.help.WebSiteName": "Name of the IIS website that will be created if it does not exist, or it will be updated if it is already present on the IIS server. The name of the website should be same as that specified in the web deploy zip package file. If a Parameter file and override Parameters setting is also specified, then the name of the website should be same as that in the override Parameters setting.",
- "loc.input.label.WebSitePhysicalPath": "Physical Path",
- "loc.input.help.WebSitePhysicalPath": "Physical path where the website content is stored. The content can reside on the local computer or on a remote directory or share like, C:\\Fabrikam or \\\\\\\\ContentShare\\Fabrikam.",
- "loc.input.label.WebSitePhysicalPathAuth": "Physical Path Authentication",
- "loc.input.help.WebSitePhysicalPathAuth": "Authentication mechanism for accessing the physical path of the website.",
- "loc.input.label.WebSiteAuthUserName": "User Name",
- "loc.input.help.WebSiteAuthUserName": "User name for accessing the website's physical path.",
- "loc.input.label.WebSiteAuthUserPassword": "Password",
- "loc.input.help.WebSiteAuthUserPassword": "Password for accessing the website's physical path. If you are using a gMSA, this is not required.",
- "loc.input.label.AddBinding": "Add Binding",
- "loc.input.help.AddBinding": "Select the option to add port binding for the website.",
- "loc.input.label.AssignDuplicateBinding": "Assign Duplicate Binding",
- "loc.input.help.AssignDuplicateBinding": "Select the option to add the bindings specified here, even if there is another website with the same bindings. If there are binding conflicts, then only one of the website will start.",
- "loc.input.label.Protocol": "Protocol",
- "loc.input.help.Protocol": "Select HTTP for the website to have an HTTP binding, or select HTTPS for the website to have a Secure Sockets Layer (SSL) binding.",
- "loc.input.label.IPAddress": "IP Address",
- "loc.input.help.IPAddress": "Type an IP address that users can use to access this website. If All Unassigned is selected, the site will respond to requests for all IP addresses on the port and the optional host name that is specified for this site, unless another site on the server has a binding on the same port but with a specific IP address.",
- "loc.input.label.Port": "Port",
- "loc.input.help.Port": "Type the port on which Hypertext Transfer Protocol Stack (HTTP.sys) must listen for requests made to this website.",
- "loc.input.label.ServerNameIndication": "Server Name Indication Required",
- "loc.input.help.ServerNameIndication": "Determines whether the website requires Server Name Indication (SNI). SNI extends the SSL and TLS protocols to indicate what host name the client is attempting to connect to. It allows multiple secure websites with different certificates to use the same IP address.",
- "loc.input.label.HostNameWithOutSNI": "Host Name",
- "loc.input.help.HostNameWithOutSNI": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website.",
- "loc.input.label.HostNameWithHttp": "Host Name",
- "loc.input.help.HostNameWithHttp": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website.",
- "loc.input.label.HostNameWithSNI": "Host Name",
- "loc.input.help.HostNameWithSNI": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website.",
- "loc.input.label.SSLCertThumbPrint": "SSL Certificate Thumb Print",
- "loc.input.help.SSLCertThumbPrint": "Thumb-print of the Secure Socket Layer certificate that the website is going to use. The certificate should be already installed on the machine and present under the Local Computer, Personal store.",
- "loc.input.label.CreateAppPool": "Create or Update Application Pool",
- "loc.input.help.CreateAppPool": "Select the option to create an application pool or to update an existing application pool.",
- "loc.input.label.AppPoolName": "Name",
- "loc.input.help.AppPoolName": "Name of the IIS application pool to create or update. Existing application pool will be updated with the settings specified here.",
- "loc.input.label.DotNetVersion": ".NET Version",
- "loc.input.help.DotNetVersion": "Version of the .NET Framework that is loaded by this application pool. If the applications assigned to this application pool do not contain managed code, select the No Managed Code option from the list.",
- "loc.input.label.PipeLineMode": "Managed Pipeline Mode",
- "loc.input.help.PipeLineMode": "Managed pipeline mode specifies how IIS processes requests for managed content. Use classic mode only when the applications in the application pool cannot run in the Integrated mode.",
- "loc.input.label.AppPoolIdentity": "Identity",
- "loc.input.help.AppPoolIdentity": "Configure the account under which an application pool's worker process runs. Select one of the predefined security accounts or configure a custom account.",
- "loc.input.label.AppPoolUsername": "Username",
- "loc.input.label.AppPoolPassword": "Password",
- "loc.input.help.AppPoolPassword": "If you are using a gMSA, this is not required.",
- "loc.input.label.AppCmdCommands": "Additional AppCmd.exe Commands",
- "loc.input.help.AppCmdCommands": "Additional AppCmd.exe commands to set website or application pool properties. For more than one command use line separator, e.g., list apppools list sites",
- "loc.input.label.DeployInParallel": "Deploy in Parallel",
- "loc.input.help.DeployInParallel": "Setting it to true will deploy the Web application in-parallel on the target machines.",
- "loc.input.label.ResourceFilteringMethod": "Select Machines By",
- "loc.input.help.ResourceFilteringMethod": "Optionally, select a subset of machines either by providing machine names or tags.",
- "loc.input.label.MachineFilter": "Deploy to Machines",
- "loc.input.help.MachineFilter": "This input is valid only for machine groups and is not supported for flat list of machines or output variables yet. Provide a list of machines like, dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34, or tags like, Role:DB; OS:Win8.1. If multiple tags are provided, then the task will run in all the machines with the specified tags. For Azure Resource Groups, provide the virtual machine's name like, ffweb, ffdb. The default is to run the task in all machines."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/es-es/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/es-es/resources.resjson
deleted file mode 100644
index 0ef82c67b924..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/es-es/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[En desuso] Implementación de la aplicación web de IIS",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Implementar con MSDeploy, crear o actualizar el sitio web y los grupos de aplicaciones",
- "loc.instanceNameFormat": "[En desuso] Implementar aplicación de IIS: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Implementación",
- "loc.group.displayName.website": "Sitio web",
- "loc.group.displayName.applicationPool": "Grupo de aplicaciones",
- "loc.group.displayName.advanced": "Avanzado",
- "loc.input.label.EnvironmentName": "Equipos",
- "loc.input.help.EnvironmentName": "Proporcione una lista separada por comas de direcciones IP de equipos o nombres de dominio completos junto con puertos. El puerto se establece de manera predeterminada en función del protocolo seleccionado. Ejemplo: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 O bien proporcione la variable de salida de otras tareas. Ejemplo: $(nombreDeVariable)",
- "loc.input.label.AdminUserName": "Inicio de sesión del administrador",
- "loc.input.help.AdminUserName": "Inicio de sesión del administrador para los equipos de destino.",
- "loc.input.label.AdminPassword": "Contraseña",
- "loc.input.help.AdminPassword": "Contraseña del administrador para las máquinas de destino. Admite la variable declarada en las definiciones de compilación o versión como \"$(passwordVariable)\". Para proteger la variable, puede marcar el tipo como \"secret\". ",
- "loc.input.label.WinRMProtocol": "Protocolo",
- "loc.input.help.WinRMProtocol": "Seleccione el protocolo que se usará para la conexión WinRM con los equipos. El valor predeterminado es HTTPS.",
- "loc.input.label.TestCertificate": "Certificado de prueba",
- "loc.input.help.TestCertificate": "Seleccione la opción para omitir la validación de la autenticidad del certificado del equipo por parte de una entidad de certificación de confianza. El parámetro es obligatorio para el protocolo HTTPS de WinRM.",
- "loc.input.label.WebDeployPackage": "Paquete de Web Deploy",
- "loc.input.help.WebDeployPackage": "Ubicación del archivo zip de Web Deploy (MSDeploy) en las máquinas de destino o en una ruta de acceso UNC, como \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. La ruta de acceso UNC debe ser accesible para la cuenta del administrador de la máquina. También se admiten variables de entorno, como $env:windir o $env:systemroot, por ejemplo, en $env:windir\\FabrikamFibre\\Web.",
- "loc.input.label.WebDeployParamFile": "Archivo de parámetros de Web Deploy",
- "loc.input.help.WebDeployParamFile": "Ubicación del archivo de parámetros en las máquinas de destino o en una ruta de acceso UNC. El archivo de parámetros se usa para reemplazar opciones de configuración de aplicaciones web tales como el nombre de aplicación web IIS o la cadena de conexión de base de datos.",
- "loc.input.label.OverRideParams": "Parámetros de reemplazo",
- "loc.input.help.OverRideParams": "Los parámetros que se especifiquen aquí reemplazarán a los parámetros del archivo zip de MSDeploy y del archivo de parámetros. Para reemplazar más de un parámetro, utilice el separador de líneas, por ejemplo, \"Nombre de aplicación web de IIS\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Crear o actualizar sitio web",
- "loc.input.help.CreateWebSite": "Seleccione la opción para crear un sitio web o actualizar un sitio web existente.",
- "loc.input.label.WebSiteName": "Nombre del sitio web",
- "loc.input.help.WebSiteName": "Nombre del sitio web que se va a crear si no existe, o que se actualizará si ya está presente en el servidor IIS. El nombre del sitio web debe ser el mismo que el que se especificó en el archivo del paquete zip de implementación web. Si también se especifica un archivo de parámetros y la configuración de los parámetros de reemplazo, el nombre del sitio web debe ser igual que en la configuración de parámetros de reemplazo.",
- "loc.input.label.WebSitePhysicalPath": "Ruta de acceso física",
- "loc.input.help.WebSitePhysicalPath": "Ruta de acceso física donde se almacena el contenido del sitio web. El contenido puede residir en el equipo local o en un directorio o recurso compartido remoto, como C:\\Fabrikam o \\\\\\\\ContentShare\\Fabrikam.",
- "loc.input.label.WebSitePhysicalPathAuth": "Autenticación de ruta de acceso física",
- "loc.input.help.WebSitePhysicalPathAuth": "Mecanismo de autenticación para acceder a la ruta de acceso física del sitio web.",
- "loc.input.label.WebSiteAuthUserName": "Nombre de usuario",
- "loc.input.help.WebSiteAuthUserName": "Nombre de usuario para acceder a la ruta de acceso física del sitio web.",
- "loc.input.label.WebSiteAuthUserPassword": "Contraseña",
- "loc.input.help.WebSiteAuthUserPassword": "Contraseña para acceder a la ruta de acceso física del sitio web. Si usa gMSA, esto no es necesario.",
- "loc.input.label.AddBinding": "Agregar enlace",
- "loc.input.help.AddBinding": "Seleccione la opción para agregar enlace de puerto al sitio web.",
- "loc.input.label.AssignDuplicateBinding": "Asignar enlace duplicado",
- "loc.input.help.AssignDuplicateBinding": "Seleccione la opción para agregar los enlaces especificados aquí, incluso si hay otro sitio web con los mismos enlaces. Si hay conflictos de enlace, solo se iniciará uno de los sitios web.",
- "loc.input.label.Protocol": "Protocolo",
- "loc.input.help.Protocol": "Seleccione HTTP para que el sitio web tenga un enlace HTTP o seleccione HTTPS para que el sitio web tenga un enlace SSL (Capa de sockets seguros).",
- "loc.input.label.IPAddress": "Dirección IP",
- "loc.input.help.IPAddress": "Escriba una dirección IP que los usuarios puedan usar para acceder al sitio web. Si se selecciona Todas las no asignadas, el sitio responderá a las solicitudes de todas las direcciones IP del puerto y el nombre de host opcional que se especifique para este sitio, a menos que otro sitio del servidor tenga un enlace al mismo puerto pero con una dirección IP específica.",
- "loc.input.label.Port": "Puerto",
- "loc.input.help.Port": "Escriba el puerto en el que la pila del Protocolo de transferencia de hipertexto (HTTP.sys) debe escuchar las solicitudes efectuadas a este sitio web.",
- "loc.input.label.ServerNameIndication": "Se requiere indicación de nombre de servidor",
- "loc.input.help.ServerNameIndication": "Determina si el sitio web requiere Indicación de nombre de servidor (SNI). SNI extiende los protocolos SSL y TLS para indicar el nombre de host al que el cliente intenta conectarse. Permite que sitios web seguros con certificados diferentes usen la misma dirección IP.",
- "loc.input.label.HostNameWithOutSNI": "Nombre de host",
- "loc.input.help.HostNameWithOutSNI": "Para asignar uno o más nombres de host (o nombres de dominio) a un equipo que usa una sola dirección IP, escriba aquí un nombre de host. Si se especifica un nombre de host, los clientes deben usar este nombre y no la dirección IP para acceder al sitio web.",
- "loc.input.label.HostNameWithHttp": "Nombre de host",
- "loc.input.help.HostNameWithHttp": "Para asignar uno o más nombres de host (o nombres de dominio) a un equipo que usa una sola dirección IP, escriba aquí un nombre de host. Si se especifica un nombre de host, los clientes deben usar este nombre y no la dirección IP para acceder al sitio web.",
- "loc.input.label.HostNameWithSNI": "Nombre de host",
- "loc.input.help.HostNameWithSNI": "Para asignar uno o más nombres de host (o nombres de dominio) a un equipo que usa una sola dirección IP, escriba aquí un nombre de host. Si se especifica un nombre de host, los clientes deben usar este nombre y no la dirección IP para acceder al sitio web.",
- "loc.input.label.SSLCertThumbPrint": "Huella digital del certificado SSL",
- "loc.input.help.SSLCertThumbPrint": "Huella digital del certificado de Capa de sockets seguros que el sitio web va a usar. El certificado debe estar ya instalado en la máquina y presente en el almacén personal del equipo local.",
- "loc.input.label.CreateAppPool": "Crear o actualizar grupo de aplicaciones",
- "loc.input.help.CreateAppPool": "Seleccione la opción para crear un grupo de aplicaciones o actualizar un grupo de aplicaciones existente.",
- "loc.input.label.AppPoolName": "Nombre",
- "loc.input.help.AppPoolName": "Nombre del grupo de aplicaciones de IIS que se quiere crear o actualizar. El grupo de aplicaciones existente se actualizará con la configuración que se establezca aquí.",
- "loc.input.label.DotNetVersion": "Versión de .NET",
- "loc.input.help.DotNetVersion": "Versión de .NET Framework que se carga con este grupo de aplicaciones. Si las aplicaciones asignadas al grupo no contienen código administrado, seleccione en la lista la opción Sin código administrado.",
- "loc.input.label.PipeLineMode": "Modo de canalización administrada",
- "loc.input.help.PipeLineMode": "El modo de canalización administrada especifica cómo procesa IIS las solicitudes de contenido administrado. Use el modo clásico solo cuando las aplicaciones del grupo de aplicaciones no se puedan ejecutar en el modo integrado.",
- "loc.input.label.AppPoolIdentity": "Identidad",
- "loc.input.help.AppPoolIdentity": "Configure la cuenta en la que se ejecuta el proceso de trabajo de un grupo de aplicaciones. Seleccione una de las cuentas de seguridad predefinidas o configure una cuenta personalizada.",
- "loc.input.label.AppPoolUsername": "Nombre de usuario",
- "loc.input.label.AppPoolPassword": "Contraseña",
- "loc.input.help.AppPoolPassword": "Si usa gMSA, esto no es necesario.",
- "loc.input.label.AppCmdCommands": "Comandos adicionales de AppCmd.exe",
- "loc.input.help.AppCmdCommands": "Comandos adicionales de AppCmd.exe para establecer propiedades de sitios web o grupos de aplicaciones. Para más de un comando, use separadores de líneas, p. ej., list apppools list sites",
- "loc.input.label.DeployInParallel": "Implementar en paralelo",
- "loc.input.help.DeployInParallel": "Si se establece en true, la aplicación web se implementará en paralelo en las máquinas de destino.",
- "loc.input.label.ResourceFilteringMethod": "Seleccionar máquinas por",
- "loc.input.help.ResourceFilteringMethod": "También puede seleccionar un subconjunto de máquinas especificando nombres de máquina o etiquetas.",
- "loc.input.label.MachineFilter": "Implementar en las máquinas",
- "loc.input.help.MachineFilter": "Esta entrada solo es válida para los grupos de máquinas y no se admite para una lista plana de máquinas o de variables de salida. Proporcione una lista de máquinas (como dbserver.fabrikam.com, webserver.fabrikam.com o 192.168.12.34) o etiquetas (como Role:DB; OS:Win8.1). Si se proporcionan varias etiquetas, la tarea se ejecutará en todas las máquinas que tengan las etiquetas especificadas. Para los grupos de recursos de Azure, proporcione el nombre de la máquina virtual, como ffweb o ffdb. La opción predeterminada es ejecutar la tarea en todas las máquinas."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/fr-fr/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/fr-fr/resources.resjson
deleted file mode 100644
index ef9ee6cc6700..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/fr-fr/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[Déconseillé] Déploiement d'applications web IIS",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Effectuer le déploiement avec MSDeploy, créer/mettre à jour un site web et un pool d'applications",
- "loc.instanceNameFormat": "[Déconseillé] Déployer une application IIS : $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Déploiement",
- "loc.group.displayName.website": "Site web",
- "loc.group.displayName.applicationPool": "Pool d'applications",
- "loc.group.displayName.advanced": "Avancé",
- "loc.input.label.EnvironmentName": "Ordinateurs",
- "loc.input.help.EnvironmentName": "Indiquez une liste séparée par des virgules d'adresses IP ou de noms de domaine complets d'ordinateurs ainsi que les ports. Le port par défaut dépend du protocole sélectionné. Exemple : dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 Ou indiquez une variable de sortie d'autres tâches. Exemple : $(variableName)",
- "loc.input.label.AdminUserName": "Informations de connexion d'administrateur",
- "loc.input.help.AdminUserName": "Informations de connexion d'administrateur pour les machines cibles.",
- "loc.input.label.AdminPassword": "Mot de passe",
- "loc.input.help.AdminPassword": "Mot de passe d'administrateur pour les machines cibles. Il peut accepter une variable définie dans les définitions Build/Release sous la forme '$(passwordVariable)'. Vous pouvez marquer le type de variable en tant que 'secret' pour renforcer sa sécurité. ",
- "loc.input.label.WinRMProtocol": "Protocole",
- "loc.input.help.WinRMProtocol": "Sélectionnez le protocole à utiliser pour la connexion WinRM avec les machines. La valeur par défaut est HTTPS.",
- "loc.input.label.TestCertificate": "Certificat de test",
- "loc.input.help.TestCertificate": "Sélectionnez l'option pour ignorer l'étape de validation de l'authenticité du certificat de l'ordinateur par une autorité de certification approuvée. Le paramètre est requis pour le protocole HTTPS WinRM.",
- "loc.input.label.WebDeployPackage": "Package Web Deploy",
- "loc.input.help.WebDeployPackage": "Emplacement du fichier zip Web Deploy (MSDeploy) sur les ordinateurs cibles ou dans un chemin d'accès UNC tel que \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. Le chemin d'accès UNC doit être accessible au compte Administrateur de l'ordinateur. Les variables d'environnement sont également prises en charge, par exemple, $env:windir, $env:systemroot ou $env:windir\\FabrikamFibre\\Web.",
- "loc.input.label.WebDeployParamFile": "Fichier de paramètres Web Deploy",
- "loc.input.help.WebDeployParamFile": "Emplacement du fichier de paramètres sur les ordinateurs cibles ou dans un chemin d'accès UNC. Utilisez le fichier de paramètres pour remplacer les paramètres de configuration d'une application web, tels que le nom de l'application web IIS ou la chaîne de connexion de base de données.",
- "loc.input.label.OverRideParams": "Remplacer les paramètres",
- "loc.input.help.OverRideParams": "Les paramètres spécifiés ici remplacent les paramètres définis dans le fichier zip MSDeploy et le fichier Parameter. Pour remplacer plusieurs paramètres, utilisez le séparateur de ligne. Exemple : \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Créer ou mettre à jour un site web",
- "loc.input.help.CreateWebSite": "Sélectionnez l'option pour créer un site web ou mettre à jour un site web existant.",
- "loc.input.label.WebSiteName": "Nom du site web",
- "loc.input.help.WebSiteName": "Nom du site web IIS qui sera créé s'il n'existe pas ou qui sera mis à jour s'il est déjà présent sur le serveur IIS. Le nom du site web doit être identique à celui spécifié dans le fichier de package zip de déploiement web. Si un fichier de paramètres et des valeurs de remplacement des paramètres sont également spécifiés, le nom du site web doit être identique à celui spécifié dans les valeurs de remplacement des paramètres.",
- "loc.input.label.WebSitePhysicalPath": "Chemin d'accès physique",
- "loc.input.help.WebSitePhysicalPath": "Chemin d'accès physique où est stocké le contenu du site web. Le contenu peut résider sur l'ordinateur local ou dans un répertoire ou partage distant, tel que C:\\Fabrikam ou \\\\\\\\ContentShare\\Fabrikam.",
- "loc.input.label.WebSitePhysicalPathAuth": "Authentification du chemin d'accès physique",
- "loc.input.help.WebSitePhysicalPathAuth": "Mécanisme d'authentification pour accéder au chemin d'accès physique du site web.",
- "loc.input.label.WebSiteAuthUserName": "Nom d'utilisateur",
- "loc.input.help.WebSiteAuthUserName": "Nom d'utilisateur permettant d'accéder au chemin d'accès physique du site web.",
- "loc.input.label.WebSiteAuthUserPassword": "Mot de passe",
- "loc.input.help.WebSiteAuthUserPassword": "Mot de passe permettant d'accéder au chemin physique du site web. Si vous utilisez un gMSA, ce n'est pas obligatoire.",
- "loc.input.label.AddBinding": "Ajouter une liaison",
- "loc.input.help.AddBinding": "Sélectionnez l'option permettant d'ajouter une liaison de port pour le site web.",
- "loc.input.label.AssignDuplicateBinding": "Assigner une liaison dupliquée",
- "loc.input.help.AssignDuplicateBinding": "Sélectionnez l'option pour ajouter les liaisons spécifiées ici, même si un autre site web contient les mêmes liaisons. En cas de conflit entre les liaisons, un seul site web démarre.",
- "loc.input.label.Protocol": "Protocole",
- "loc.input.help.Protocol": "Sélectionnez HTTP pour assigner une liaison HTTP au site web, ou HTTPS pour lui assigner une liaison SSL (Secure Sockets Layer).",
- "loc.input.label.IPAddress": "Adresse IP",
- "loc.input.help.IPAddress": "Tapez une adresse IP avec laquelle les utilisateurs peuvent accéder à ce site web. Si l'option \"Non assignée\" est sélectionnée, le site répond aux demandes pour toutes les adresses IP sur le port et pour le nom d'hôte facultatif spécifié pour ce site, sauf si un autre site sur le serveur a une liaison sur le même port, mais avec une adresse IP spécifique.",
- "loc.input.label.Port": "Port",
- "loc.input.help.Port": "Tapez le numéro du port sur lequel la pile HTTP (HTTP.sys) doit écouter les demandes effectuées à ce site web.",
- "loc.input.label.ServerNameIndication": "Indication du nom du serveur (SNI) requise",
- "loc.input.help.ServerNameIndication": "Détermine si le site web nécessite l'indication du nom du serveur (SNI). SNI étend les protocoles SSL et TLS pour indiquer le nom d'hôte auquel le client tente de se connecter. Cette fonctionnalité permet à plusieurs sites web sécurisés ayant des certificats différents d'utiliser la même adresse IP.",
- "loc.input.label.HostNameWithOutSNI": "Nom de l'hôte",
- "loc.input.help.HostNameWithOutSNI": "Pour assigner un ou plusieurs noms d'hôte (ou noms de domaine) à un ordinateur utilisant une seule adresse IP, tapez un nom d'hôte ici. Si un nom d'hôte est spécifié, les clients doivent utiliser ce nom à la place de l'adresse IP pour accéder au site web.",
- "loc.input.label.HostNameWithHttp": "Nom de l'hôte",
- "loc.input.help.HostNameWithHttp": "Pour assigner un ou plusieurs noms d'hôte (ou noms de domaine) à un ordinateur utilisant une seule adresse IP, tapez un nom d'hôte ici. Si un nom d'hôte est spécifié, les clients doivent utiliser ce nom à la place de l'adresse IP pour accéder au site web.",
- "loc.input.label.HostNameWithSNI": "Nom de l'hôte",
- "loc.input.help.HostNameWithSNI": "Pour assigner un ou plusieurs noms d'hôte (ou noms de domaine) à un ordinateur utilisant une seule adresse IP, tapez un nom d'hôte ici. Si un nom d'hôte est spécifié, les clients doivent utiliser ce nom à la place de l'adresse IP pour accéder au site web.",
- "loc.input.label.SSLCertThumbPrint": "Empreinte numérique du certificat SSL",
- "loc.input.help.SSLCertThumbPrint": "Empreinte numérique du certificat SSL (Secure Socket Layer) utilisé par le site web. Le certificat doit être déjà installé sur l'ordinateur et disponible dans le magasin personnel de l'ordinateur local.",
- "loc.input.label.CreateAppPool": "Créer ou mettre à jour un pool d'applications",
- "loc.input.help.CreateAppPool": "Sélectionnez l'option pour créer un pool d'applications ou mettre à jour un pool d'applications existant.",
- "loc.input.label.AppPoolName": "Nom",
- "loc.input.help.AppPoolName": "Nom du pool d'applications IIS à créer ou à mettre à jour. Le pool d'applications existant sera mis à jour avec les paramètres spécifiés ici.",
- "loc.input.label.DotNetVersion": "Version de .NET",
- "loc.input.help.DotNetVersion": "Version du .NET Framework qui est chargé par ce pool d'applications. Si les applications assignées à ce pool d'applications ne contiennent pas de code managé, sélectionnez l'option \"Aucun code managé\" dans la liste.",
- "loc.input.label.PipeLineMode": "Mode pipeline géré",
- "loc.input.help.PipeLineMode": "Le mode pipeline géré spécifie de quelle manière les processus IIS demandent le contenu géré. Utilisez le mode Classique uniquement quand les applications du pool d'applications ne peuvent pas s'exécuter en mode Intégré.",
- "loc.input.label.AppPoolIdentity": "Identité",
- "loc.input.help.AppPoolIdentity": "Configurez le compte sous lequel est exécuté le processus de travail d'un pool d'applications. Sélectionnez l'un des comptes de sécurité prédéfinis ou configurez un compte personnalisé.",
- "loc.input.label.AppPoolUsername": "Nom d'utilisateur",
- "loc.input.label.AppPoolPassword": "Mot de passe",
- "loc.input.help.AppPoolPassword": "Si vous utilisez un gMSA, ceci n'est pas obligatoire.",
- "loc.input.label.AppCmdCommands": "Commandes AppCmd.exe supplémentaires",
- "loc.input.help.AppCmdCommands": "Commandes AppCmd.exe supplémentaires pour définir les propriétés d'un site web ou d'un pool d'applications. Pour spécifier plusieurs commandes, utilisez un séparateur de ligne, par exemple, liste poolsapplications liste sites",
- "loc.input.label.DeployInParallel": "Déployer en parallèle",
- "loc.input.help.DeployInParallel": "Si la valeur est true, l'application web est déployée en parallèle sur les machines cibles.",
- "loc.input.label.ResourceFilteringMethod": "Sélectionner les machines par",
- "loc.input.help.ResourceFilteringMethod": "Vous pouvez également sélectionner un sous-ensemble de machines en spécifiant les noms des machines ou les balises associées.",
- "loc.input.label.MachineFilter": "Déployer sur les ordinateurs",
- "loc.input.help.MachineFilter": "Cette entrée est valide uniquement pour les groupes de machines. Elle n'est pas encore prise en charge pour une liste plate de machines ou de variables de sortie. Indiquez une liste de machines, par exemple dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34, ou utilisez des balises telles que Role:DB; OS:Win8.1. Si plusieurs balises sont indiquées, la tâche s'exécute sur toutes les machines correspondant aux balises spécifiées. Pour les groupes de ressources Azure, indiquez le nom de la machine virtuelle, par exemple ffweb, ffdb. Par défaut, la tâche s'exécute sur toutes les machines."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/it-IT/resources.resjson
deleted file mode 100644
index 3eadc1737b8d..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/it-IT/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[Deprecata] Distribuzione app Web IIS",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Consente di distribuire con MSDeploy e di creare/aggiornare il sito Web e i pool di applicazioni",
- "loc.instanceNameFormat": "[Deprecata] Distribuisci app IIS: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Distribuzione",
- "loc.group.displayName.website": "Sito Web",
- "loc.group.displayName.applicationPool": "Pool di applicazioni",
- "loc.group.displayName.advanced": "Avanzate",
- "loc.input.label.EnvironmentName": "Computer",
- "loc.input.help.EnvironmentName": "Consente di specificare un elenco di indirizzi IP o FQDN separati da virgola unitamente alle porte. Per impostazione predefinita, la porta è basata sul protocollo selezionato. Esempio: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 In alternativa, consente di specificare la variabile di output di altre attività. Esempio: $(variableName)",
- "loc.input.label.AdminUserName": "Account di accesso amministratore",
- "loc.input.help.AdminUserName": "Account di accesso dell'amministratore per i computer di destinazione.",
- "loc.input.label.AdminPassword": "Password",
- "loc.input.help.AdminPassword": "Password dell'amministratore per i computer di destinazione. Accetta la variabile definita nelle definizioni di compilazione/versione come '$(passwordVariable)'. Per proteggerla, è possibile contrassegnare il tipo di variabile come 'secret'. ",
- "loc.input.label.WinRMProtocol": "Protocollo",
- "loc.input.help.WinRMProtocol": "Consente di selezionare il protocollo da usare per la connessione WinRM con i computer. Il valore predefinito è HTTPS.",
- "loc.input.label.TestCertificate": "Certificato di test",
- "loc.input.help.TestCertificate": "Consente di selezionare l'opzione per ignorare la convalida dell'autenticità del certificato del computer da parte di un'Autorità di certificazione attendibile. Il parametro è obbligatorio per il protocollo HTTPS di WinRM.",
- "loc.input.label.WebDeployPackage": "Pacchetto Distribuzione Web",
- "loc.input.help.WebDeployPackage": "Percorso del file ZIP di Distribuzione Web (MSDeploy) nei computer di destinazione o in un percorso UNC, ad esempio \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. Il percorso UNC deve essere accessibile all'account Administrator del computer. Sono supportate anche variabili di ambiente come $env:windir, $env:systemroot, $env:windir\\FabrikamFibre\\Web.",
- "loc.input.label.WebDeployParamFile": "File di parametri Distribuzione Web",
- "loc.input.help.WebDeployParamFile": "Percorso del file dei parametri nei computer di destinazione o in un percorso UNC. Il file dei parametri viene usato per sostituire le impostazioni di configurazione dell'applicazione Web, ad esempio il nome dell'applicazione Web IIS o la stringa della connessione di database.",
- "loc.input.label.OverRideParams": "Parametri di sostituzione",
- "loc.input.help.OverRideParams": "I parametri specificati qui sostituiscono quelli nel file ZIP di MSDeploy e nel file dei parametri. Per eseguire l'override di più parametri, usare il separatore di riga, ad esempio \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Crea o aggiorna sito Web",
- "loc.input.help.CreateWebSite": "Consente di selezionare l'opzione per creare un sito Web o aggiornarne uno esistente.",
- "loc.input.label.WebSiteName": "Nome del sito Web",
- "loc.input.help.WebSiteName": "Nome del sito Web IIS che verrà creato se non esiste o verrà aggiornato se è già presente nel server IIS. Il nome del sito Web deve essere uguale a quello specificato nel file del pacchetto ZIP di Distribuzione Web. Se si specificano anche un file di parametri e un'impostazione per i parametri di sostituzione, il nome del sito Web deve essere uguale a quello dell'impostazione dei parametri di sostituzione.",
- "loc.input.label.WebSitePhysicalPath": "Percorso fisico",
- "loc.input.help.WebSitePhysicalPath": "Percorso fisico in cui è archiviato il contenuto del sito Web. Il contenuto può risiedere nel computer locale oppure in una directory o condivisione remota, ad esempio C:\\Fabrikam o \\\\\\\\ContentShare\\Fabrikam.",
- "loc.input.label.WebSitePhysicalPathAuth": "Autenticazione del percorso fisico",
- "loc.input.help.WebSitePhysicalPathAuth": "Meccanismo di autenticazione per accedere al percorso fisico del sito Web.",
- "loc.input.label.WebSiteAuthUserName": "Nome utente",
- "loc.input.help.WebSiteAuthUserName": "Nome utente per accedere al percorso fisico del sito Web.",
- "loc.input.label.WebSiteAuthUserPassword": "Password",
- "loc.input.help.WebSiteAuthUserPassword": "Password per accedere al percorso fisico del sito Web. Se si usa un account del servizio gestito del gruppo, non è necessario immettere questo valore.",
- "loc.input.label.AddBinding": "Aggiungi binding",
- "loc.input.help.AddBinding": "Selezionare l'opzione per aggiungere il binding delle porte per il sito Web.",
- "loc.input.label.AssignDuplicateBinding": "Assegna binding duplicato",
- "loc.input.help.AssignDuplicateBinding": "Consente di selezionare l'opzione per aggiungere i binding specificati qui, anche se è presente un altro sito Web con gli stessi binding. In presenza di conflitti di binding, verrà avviato solo quello del sito Web.",
- "loc.input.label.Protocol": "Protocollo",
- "loc.input.help.Protocol": "Selezionare HTTP o HTTPS per impostare rispettivamente un binding HTTP o SSL (Secure Sockets Layer) per il sito Web.",
- "loc.input.label.IPAddress": "Indirizzo IP",
- "loc.input.help.IPAddress": "Digitare un indirizzo IP che gli utenti possono usare per accedere a questo sito Web. Se è selezionato Tutti non assegnati, il sito risponderà alle richieste relative a tutti gli indirizzi IP sulla porta e al nome host facoltativo specificato per questo sito, a meno che nel server non sia presente un altro sito con un binding sulla stessa porta ma con un indirizzo IP specifico.",
- "loc.input.label.Port": "Porta",
- "loc.input.help.Port": "Digitare il numero della porta su cui Hypertext Transfer Protocol Stack (HTTP.sys) deve rimanere in ascolto delle richieste effettuate a questo sito Web.",
- "loc.input.label.ServerNameIndication": "Indicazione nome server obbligatoria",
- "loc.input.help.ServerNameIndication": "Determina se il sito Web richiede Indicazione nome server (SNI). Tale funzionalità estende i protocolli SSL e TLS per indicare il nome host a cui il client sta provando a connettersi. Consente di usare lo stesso indirizzo a più siti Web sicuri con certificati diversi.",
- "loc.input.label.HostNameWithOutSNI": "Nome host",
- "loc.input.help.HostNameWithOutSNI": "Per assegnare uno o più nomi host (o nomi di dominio) a un computer che usa un singolo indirizzo IP, digitare qui un nome host. Se si specifica un nome host, per accedere al sito Web, i client devono usare tale nome invece dell'indirizzo IP.",
- "loc.input.label.HostNameWithHttp": "Nome host",
- "loc.input.help.HostNameWithHttp": "Per assegnare uno o più nomi host (o nomi di dominio) a un computer che usa un singolo indirizzo IP, digitare qui un nome host. Se si specifica un nome host, per accedere al sito Web, i client devono usare tale nome invece dell'indirizzo IP.",
- "loc.input.label.HostNameWithSNI": "Nome host",
- "loc.input.help.HostNameWithSNI": "Per assegnare uno o più nomi host (o nomi di dominio) a un computer che usa un singolo indirizzo IP, digitare qui un nome host. Se si specifica un nome host, per accedere al sito Web, i client devono usare tale nome invece dell'indirizzo IP.",
- "loc.input.label.SSLCertThumbPrint": "Identificazione personale certificato SSL",
- "loc.input.help.SSLCertThumbPrint": "Identificazione personale del certificato SSL (Secure Socket Layer) che verrà usato dal sito Web. Il certificato deve essere già installato nel computer e presente nell'archivio personale del computer locale.",
- "loc.input.label.CreateAppPool": "Crea o aggiorna pool di applicazioni",
- "loc.input.help.CreateAppPool": "Consente di selezionare l'opzione per creare un pool di applicazioni o aggiornarne uno esistente.",
- "loc.input.label.AppPoolName": "Nome",
- "loc.input.help.AppPoolName": "Nome del pool di applicazioni IIS da creare o aggiornare. Il pool di applicazioni IIS verrà aggiornato con le impostazioni specificate qui.",
- "loc.input.label.DotNetVersion": "Versione di .NET",
- "loc.input.help.DotNetVersion": "Versione di .NET Framework caricata da questo pool di applicazioni. Se le applicazioni assegnate a questo pool di applicazioni non contengono codice gestito, selezionare l'opzione Nessun codice gestito nell'elenco.",
- "loc.input.label.PipeLineMode": "Modalità pipeline gestita",
- "loc.input.help.PipeLineMode": "La modalità pipeline gestita consente di specificare in che modo IIS elabora le richieste relative al contenuto gestito. Usare la modalità classica solo quando non è possibile eseguire le applicazioni del pool di applicazioni nella modalità integrata.",
- "loc.input.label.AppPoolIdentity": "Identità",
- "loc.input.help.AppPoolIdentity": "Consente di configurare l'account con cui verrà eseguito il processo di lavoro del pool di applicazioni. Selezionare uno degli account di sicurezza predefiniti o configurare un account personalizzato.",
- "loc.input.label.AppPoolUsername": "Nome utente",
- "loc.input.label.AppPoolPassword": "Password",
- "loc.input.help.AppPoolPassword": "Se si usa un account del servizio gestito del gruppo, non è necessario immettere questo valore.",
- "loc.input.label.AppCmdCommands": "Comandi aggiuntivi di AppCmd.exe",
- "loc.input.help.AppCmdCommands": "Comandi aggiuntivi di AppCmd.exe per impostare le proprietà del sito Web o del pool di applicazioni. Per più comandi, usare il separatore di riga, ad esempio list apppools list sites",
- "loc.input.label.DeployInParallel": "Distribuisci in parallelo",
- "loc.input.help.DeployInParallel": "Se è impostato su true, l'applicazione Web verrà distribuita in parallelo nei computer di destinazione.",
- "loc.input.label.ResourceFilteringMethod": "Seleziona computer per",
- "loc.input.help.ResourceFilteringMethod": "Selezionare, facoltativamente, un sottoinsieme di computer specificando nomi o tag dei computer.",
- "loc.input.label.MachineFilter": "Distribuisci in computer",
- "loc.input.help.MachineFilter": "Questo input è valido solo per gruppi di computer e non è ancora supportato per elenchi semplici di computer o variabili di output. Consente di specificare un elenco di computer come dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34 o tag come Role:DB; OS:Win8.1. Se vengono specificati più tag, l'attività verrà eseguita in tutti i computer con i tag specificati. Per Gruppo di risorse di Azure specificare il nome della macchina virtuale, ad esempio ffweb o ffdb. Per impostazione predefinita, l'attività viene eseguita in tutti i computer."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ja-jp/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/ja-jp/resources.resjson
deleted file mode 100644
index caa4ac6ed619..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ja-jp/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[非推奨] IIS Web アプリの展開",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "MSDeploy で展開し、Web サイトとアプリ プールを作成またはアップデートします",
- "loc.instanceNameFormat": "[非推奨] IIS アプリ: $(WebDeployPackage) の展開",
- "loc.group.displayName.deployment": "配置",
- "loc.group.displayName.website": "Web サイト",
- "loc.group.displayName.applicationPool": "アプリケーション プール",
- "loc.group.displayName.advanced": "詳細設定",
- "loc.input.label.EnvironmentName": "コンピューター",
- "loc.input.help.EnvironmentName": "コンピューターの IP アドレスまたは FQDN とポートのコンマ区切り一覧を指定します。ポートは選んだプロトコルに基づいて既定値に設定されます。 例: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 または他のタスクの出力変数を指定します。例: $(variableName)",
- "loc.input.label.AdminUserName": "管理者ログイン",
- "loc.input.help.AdminUserName": "ターゲット コンピューターの管理者ログイン。",
- "loc.input.label.AdminPassword": "パスワード",
- "loc.input.help.AdminPassword": "対象のコンピューターの管理者パスワード。 ビルド/リリース定義で '$(passwordVariable)' として定義された変数を受け入れることができます。 変数タイプを 'シークレット' とマークして保護することもできます。",
- "loc.input.label.WinRMProtocol": "プロトコル",
- "loc.input.help.WinRMProtocol": "コンピューターとの WinRM 接続に使用するプロトコルを選びます。既定は HTTPS です。",
- "loc.input.label.TestCertificate": "証明書のテスト",
- "loc.input.help.TestCertificate": "信頼された証明機関によるコンピューターの証明書の信頼性の検証をスキップするにはこのオプションを選びます。WinRM HTTPS プロトコルにはこのパラメーターが必要です。",
- "loc.input.label.WebDeployPackage": "Web 展開パッケージ",
- "loc.input.help.WebDeployPackage": "対象のコンピューターまたは UNC パス (\\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip など) 上の Web 展開 (MSDeploy) zip ファイルの場所。UNC パスはコンピューターの管理者アカウントからアクセスできる必要があります。$env:windir、$env:systemroot などの環境変数を使って $env:windir\\FabrikamFibre\\Web のように指定することもサポートされます。",
- "loc.input.label.WebDeployParamFile": "Web 展開パラメーター ファイル",
- "loc.input.help.WebDeployParamFile": "対象のコンピューターまたは UNC パスにあるパラメーター ファイルの場所。パラメーター ファイルは IIS Web アプリケーション名やデータベース接続文字列などの Web アプリケーション構成設定を上書きするために用いられます。",
- "loc.input.label.OverRideParams": "パラメーターの上書き",
- "loc.input.help.OverRideParams": "ここで指定されたパラメーターで MSDeploy zip ファイルおよびパラメーター ファイルのパラメーターが上書きされます。1 つ以上のパラメーターを上書きするには、行区切りを使用します。例: \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "Web サイトの作成または更新",
- "loc.input.help.CreateWebSite": "Web サイトを作成する、または既存の Web サイトを更新するオプションを選択します。",
- "loc.input.label.WebSiteName": "Web サイト名",
- "loc.input.help.WebSiteName": "IIS Web サイトの名前。存在しない場合は作成され、IIS サーバーに既に存在する場合は更新されます。Web サイトの名前は Web 展開 zip パッケージ ファイルで指定されたものと同じである必要があります。パラメーター ファイルとパラメーターの上書き設定も指定される場合、Web サイトの名前はパラメーターの上書き設定のものと同じである必要があります。",
- "loc.input.label.WebSitePhysicalPath": "物理パス",
- "loc.input.help.WebSitePhysicalPath": "Web サイトのコンテンツが保存されている物理パス。コンテンツはローカル コンピューター、リモート ディレクトリ、共有に置くことができます (C:\\Fabrikam、\\\\\\\\ContentShare\\Fabrikam など)。",
- "loc.input.label.WebSitePhysicalPathAuth": "物理パス認証",
- "loc.input.help.WebSitePhysicalPathAuth": "Web サイトの物理パスにアクセスする認証機構。",
- "loc.input.label.WebSiteAuthUserName": "ユーザー名",
- "loc.input.help.WebSiteAuthUserName": "Web サイトの物理パスにアクセスするユーザー名。",
- "loc.input.label.WebSiteAuthUserPassword": "パスワード",
- "loc.input.help.WebSiteAuthUserPassword": "Web サイトの物理パスにアクセスするためのパスワード。gMSA を使用している場合、これは必要ありません。",
- "loc.input.label.AddBinding": "バインドの追加",
- "loc.input.help.AddBinding": "このオプションを選択して Web サイトのポートのバインドを追加します。",
- "loc.input.label.AssignDuplicateBinding": "重複するバインドの割り当て",
- "loc.input.help.AssignDuplicateBinding": "同じバインドを持つ他の Web サイトがある場合でも、ここで指定されたバインドを追加するオプションを選択します。バインドの競合がある場合は、Web サイトのうちの 1 つのみが開始されます。",
- "loc.input.label.Protocol": "プロトコル",
- "loc.input.help.Protocol": "Web サイトに HTTP を選択して HTTP バインドとするか、Web サイトに HTTPS を選択して Secure Sockets Layer (SSL) バインドとします。",
- "loc.input.label.IPAddress": "IP アドレス",
- "loc.input.help.IPAddress": "ユーザーがこの Web サイトへのアクセスで用いることができる IP アドレスを入力します。[割り当てなし] が選択されると、同じサーバーの別サイトが同一ポートに特定の IP アドレスでバインドされていない限り、サイトはポート上すべての IP アドレスと、このサイトに指定されたオプションのホスト名に対する要求に応答します。",
- "loc.input.label.Port": "ポート",
- "loc.input.help.Port": "ハイパーテキスト転送プロトコル スタック (HTTP.sys) がこの Web サイトで作られた要求を待ち受けるポートを入力します。",
- "loc.input.label.ServerNameIndication": "サーバー名の通知が必要です",
- "loc.input.help.ServerNameIndication": "Web サイトで Server Name Indication (SNI) が要求されるかどうかを指定します。SNI は SSL と TLS プロトコルを拡張したもので、クライアントが接続を試みるホスト名を指定します。これによって異なる証明書を持つ複数の安全な Web サイトで同一 IP アドレスを使うことができるようになります。",
- "loc.input.label.HostNameWithOutSNI": "ホスト名",
- "loc.input.help.HostNameWithOutSNI": "1 つの IP アドレスを使用するコンピューターに 1 つか複数のホスト名 (ドメイン名) を割り当てるには、ここでホスト名を入力します。ホスト名が指定されると、クライアントが Web サイトにアクセスする際に IP アドレスではなくホスト名が使用されます。",
- "loc.input.label.HostNameWithHttp": "ホスト名",
- "loc.input.help.HostNameWithHttp": "1 つの IP アドレスを使用するコンピューターに 1 つか複数のホスト名 (ドメイン名) を割り当てるには、ここでホスト名を入力します。ホスト名が指定されると、クライアントが Web サイトにアクセスする際に IP アドレスではなくホスト名が使用されます。",
- "loc.input.label.HostNameWithSNI": "ホスト名",
- "loc.input.help.HostNameWithSNI": "1 つの IP アドレスを使用するコンピューターに 1 つか複数のホスト名 (ドメイン名) を割り当てるには、ここでホスト名を入力します。ホスト名が指定されると、クライアントが Web サイトにアクセスする際に IP アドレスではなくホスト名が使用されます。",
- "loc.input.label.SSLCertThumbPrint": "SSL 証明書の拇印",
- "loc.input.help.SSLCertThumbPrint": "Web サイトが使用する Secure Socket Layer 証明書の拇印。証明書はあらかじめインストールされ、コンピューターのローカル システムの個人用保存場所に置かれている必要があります。",
- "loc.input.label.CreateAppPool": "アプリケーション プールの作成または更新",
- "loc.input.help.CreateAppPool": "アプリケーション プールを作成するオプションか、既存のアプリケーション プールを更新するオプションを選択します。",
- "loc.input.label.AppPoolName": "名前",
- "loc.input.help.AppPoolName": "作成または更新する IIS アプリケーション プールの名前。既存のアプリケーション プールはここで指定した設定で更新されます。",
- "loc.input.label.DotNetVersion": ".NET バージョン",
- "loc.input.help.DotNetVersion": "このアプリケーション プールで読み込まれる .NET Framework のバージョン。このアプリケーション プールに割り当てられたアプリケーションにマネージ コードがない場合、リストから [マネージ コードなし] オプションを選択します。",
- "loc.input.label.PipeLineMode": "マネージ パイプライン モード",
- "loc.input.help.PipeLineMode": "マネージ パイプライン モードは、管理コンテンツの要求が IIS で処理される方法を指定します。アプリケーション プールのアプリケーションが統合モードで実行できない場合は、クラシック モードのみ使用します。",
- "loc.input.label.AppPoolIdentity": "ID",
- "loc.input.help.AppPoolIdentity": "アプリケーション プールのワーカー プロセスが実行されるアカウントを構成します。定義済みセキュリティ アカウントの 1 つを選択するか、カスタム アカウントを構成します。",
- "loc.input.label.AppPoolUsername": "ユーザー名",
- "loc.input.label.AppPoolPassword": "パスワード",
- "loc.input.help.AppPoolPassword": "gMSA を使用している場合、これは必要ありません。",
- "loc.input.label.AppCmdCommands": "Appcmd.exe 追加コマンド",
- "loc.input.help.AppCmdCommands": "Web サイトまたはアプリケーション プールのプロパティを設定する Appcmd.exe 追加コマンド。複数のコマンドを指定する場合は行区切りを使用します。例: list apppools list sites",
- "loc.input.label.DeployInParallel": "並列で展開",
- "loc.input.help.DeployInParallel": "この値を [True] に設定すると、対象のコンピューターで平行して Web アプリケーションが展開されます。",
- "loc.input.label.ResourceFilteringMethod": "以下の条件でコンピューターを選択",
- "loc.input.help.ResourceFilteringMethod": "必要に応じて、コンピューター名またはタグを指定してコンピューターのサブセットを選択します。",
- "loc.input.label.MachineFilter": "コンピューターに展開",
- "loc.input.help.MachineFilter": "この入力はコンピューター グループでのみ使用でき、コンピューターまたは出力変数の単純なリストではまだサポートされていません。コンピューターのリスト (dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34 など)、またはタグのリスト (Role:DB; OS:Win8.1) をご指定ください。複数のタグを指定した場合、指定されたタグを持つすべてのコンピューターでタスクが実行されます。Azure リソース グループの場合は、ffweb または ffdb のような仮想マシン名をご指定ください。既定値ではタスクがすべてのコンピューターで実行されます。"
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/ko-KR/resources.resjson
deleted file mode 100644
index e4a895e98fa4..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ko-KR/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[사용되지 않음] IIS 웹앱 배포",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "MSDeploy에 의한 배포, 웹 사이트 및 앱 풀 만들기/업데이트",
- "loc.instanceNameFormat": "[사용되지 않음] IIS 앱 배포: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "배포",
- "loc.group.displayName.website": "웹 사이트",
- "loc.group.displayName.applicationPool": "응용 프로그램 풀",
- "loc.group.displayName.advanced": "고급",
- "loc.input.label.EnvironmentName": "컴퓨터",
- "loc.input.help.EnvironmentName": "포트와 함께 쉼표로 구분된 컴퓨터 IP 주소 또는 FQDN 목록을 제공하세요. 포트의 기본값이 선택된 프로토콜을 기준으로 설정되었습니다. 예: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 또는 다른 작업의 출력 변수를 제공하세요. 예: $(variableName)",
- "loc.input.label.AdminUserName": "관리자 로그인",
- "loc.input.help.AdminUserName": "대상 컴퓨터에 대한 관리자 로그인입니다.",
- "loc.input.label.AdminPassword": "암호",
- "loc.input.help.AdminPassword": "대상 컴퓨터에 대한 관리자 암호입니다. 빌드/릴리스 정의에 '$(passwordVariable)'(으)로 정의된 변수를 사용할 수 있습니다. 보호하기 위해 변수 형식을 'secret'으로 표시할 수 있습니다.",
- "loc.input.label.WinRMProtocol": "프로토콜",
- "loc.input.help.WinRMProtocol": "컴퓨터와의 WinRM 연결에 사용할 프로토콜을 선택하세요. 기본값은 HTTPS입니다.",
- "loc.input.label.TestCertificate": "테스트 인증서",
- "loc.input.help.TestCertificate": "신뢰할 수 있는 인증 기관의 컴퓨터 인증서 신뢰성 확인을 건너뛰려면 이 옵션을 선택하세요. WinRM HTTPS 프로토콜에는 매개 변수가 필요합니다.",
- "loc.input.label.WebDeployPackage": "웹 배포 패키지",
- "loc.input.help.WebDeployPackage": "대상 컴퓨터나 UNC 경로에 있는 웹 배포(MSDeploy) zip 파일의 위치입니다(예: \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip). UNC 경로는 컴퓨터의 관리자 계정이 액세스할 수 있어야 합니다. 환경 변수도 지원됩니다(예: $env:windir, $env:systemroot, $env:windir\\FabrikamFibre\\Web).",
- "loc.input.label.WebDeployParamFile": "웹 배포 매개 변수 파일",
- "loc.input.help.WebDeployParamFile": "대상 컴퓨터나 UNC 경로에 있는 매개 변수 파일의 위치입니다. 매개 변수 파일은 IIS 웹 응용 프로그램 이름 또는 데이터베이스 연결 문자열과 같은 웹 응용 프로그램 구성 설정을 재정의하는 데 사용됩니다.",
- "loc.input.label.OverRideParams": "재정의 매개 변수",
- "loc.input.help.OverRideParams": "여기에서 지정된 매개 변수는 MSDeploy zip 파일 및 매개 변수 파일의 매개 변수를 재정의합니다. 하나 이상의 매개 변수를 재정의하려면 줄 구분선을 사용하세요. 예: \"IIS 웹 응용 프로그램 이름\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "웹 사이트 만들기 또는 업데이트",
- "loc.input.help.CreateWebSite": "웹 사이트를 만들거나 기존 웹 사이트를 업데이트하는 옵션을 선택합니다.",
- "loc.input.label.WebSiteName": "웹 사이트 이름",
- "loc.input.help.WebSiteName": "없는 경우 만들어지고 IIS 서버에 이미 있는 경우 업데이트될 IIS 웹 사이트의 이름입니다. 웹 사이트의 이름은 웹 배포 zip 패키지 파일에서 지정된 웹 사이트 이름과 같아야 합니다. 매개 변수 파일과 재정의 매개 변수 설정도 지정된 경우에는 웹 사이트의 이름이 재정의 매개 변수 설정의 웹 사이트 이름과 같아야 합니다.",
- "loc.input.label.WebSitePhysicalPath": "실제 경로",
- "loc.input.help.WebSitePhysicalPath": "웹 사이트 콘텐츠가 저장되는 실제 경로입니다. 콘텐츠는 로컬 컴퓨터나 원격 디렉터리 또는 공유에 있을 수 있습니다(예: C:\\Fabrikam 또는 \\\\\\\\ContentShare\\Fabrikam).",
- "loc.input.label.WebSitePhysicalPathAuth": "실제 경로 인증",
- "loc.input.help.WebSitePhysicalPathAuth": "웹 사이트의 실제 경로에 액세스하기 위한 인증 메커니즘입니다.",
- "loc.input.label.WebSiteAuthUserName": "사용자 이름",
- "loc.input.help.WebSiteAuthUserName": "웹 사이트의 실제 경로에 액세스하기 위한 사용자 이름입니다.",
- "loc.input.label.WebSiteAuthUserPassword": "암호",
- "loc.input.help.WebSiteAuthUserPassword": "웹 사이트의 실제 경로에 액세스하기 위한 암호입니다. gMSA를 사용 중인 경우 이 항목은 필수 항목이 아닙니다.",
- "loc.input.label.AddBinding": "바인딩 추가",
- "loc.input.help.AddBinding": "웹 사이트에 대한 포트 바인딩을 추가하는 옵션을 선택합니다.",
- "loc.input.label.AssignDuplicateBinding": "중복 바인딩 할당",
- "loc.input.help.AssignDuplicateBinding": "바인딩이 동일한 다른 웹 사이트가 있는 경우에도 여기에서 지정된 바인딩을 추가하는 옵션을 선택합니다. 바인딩 충돌이 있는 경우 웹 사이트 중 하나만 시작됩니다.",
- "loc.input.label.Protocol": "프로토콜",
- "loc.input.help.Protocol": "HTTP 바인딩을 사용할 웹 사이트의 경우 HTTP를 선택하고, SSL(Secure Sockets Layer) 바인딩을 사용할 웹 사이트의 경우에는 HTTPS를 선택합니다.",
- "loc.input.label.IPAddress": "IP 주소",
- "loc.input.help.IPAddress": "사용자가 이 웹 사이트에 액세스하는 데 사용할 수 있는 IP 주소를 입력합니다. [지정하지 않은 모든 IP]를 선택하는 경우 동일한 포트에 있지만 특정 IP 주소를 가진 바인딩이 서버의 다른 사이트에 없으면 이 사이트에 대해 지정된 포트와 선택적 호스트 이름의 모든 IP 주소에 대한 요청에 이 사이트가 응답합니다.",
- "loc.input.label.Port": "포트",
- "loc.input.help.Port": "HTTP(Hypertext Transfer Protocol) 스택(HTTP.sys)에서 이 웹 사이트에 실행된 요청을 수신 대기해야 하는 포트를 입력합니다.",
- "loc.input.label.ServerNameIndication": "서버 이름 표시 필요",
- "loc.input.help.ServerNameIndication": "웹 사이트에 SNI(서버 이름 표시)가 필요한지 여부를 확인합니다. SNI는 SSL 및 TLS 프로토콜을 확장하여 클라이언트가 연결하려고 하는 호스트 이름을 나타냅니다. SNI를 통해 서로 다른 인증서를 사용하는 여러 보안 웹 사이트에서 동일한 IP 주소를 사용할 수 있습니다.",
- "loc.input.label.HostNameWithOutSNI": "호스트 이름",
- "loc.input.help.HostNameWithOutSNI": "단일 IP 주소를 사용하는 컴퓨터에 호스트 이름(또는 도메인 이름)을 하나 이상 할당하려면 여기에 호스트 이름을 입력합니다. 호스트 이름이 지정된 경우 클라이언트는 IP 주소 대신 호스트 이름을 사용하여 웹 사이트에 액세스해야 합니다.",
- "loc.input.label.HostNameWithHttp": "호스트 이름",
- "loc.input.help.HostNameWithHttp": "단일 IP 주소를 사용하는 컴퓨터에 호스트 이름(또는 도메인 이름)을 하나 이상 할당하려면 여기에 호스트 이름을 입력합니다. 호스트 이름이 지정된 경우 클라이언트는 IP 주소 대신 호스트 이름을 사용하여 웹 사이트에 액세스해야 합니다.",
- "loc.input.label.HostNameWithSNI": "호스트 이름",
- "loc.input.help.HostNameWithSNI": "단일 IP 주소를 사용하는 컴퓨터에 호스트 이름(또는 도메인 이름)을 하나 이상 할당하려면 여기에 호스트 이름을 입력합니다. 호스트 이름이 지정된 경우 클라이언트는 IP 주소 대신 호스트 이름을 사용하여 웹 사이트에 액세스해야 합니다.",
- "loc.input.label.SSLCertThumbPrint": "SSL 인증서 지문",
- "loc.input.help.SSLCertThumbPrint": "웹 사이트에서 사용할 SSL(Secure Socket Layer) 인증서의 지문입니다. 인증서가 컴퓨터에 이미 설치되어 있고 로컬 컴퓨터, 개인 저장소에 있어야 합니다.",
- "loc.input.label.CreateAppPool": "응용 프로그램 풀 만들기 또는 업데이트",
- "loc.input.help.CreateAppPool": "응용 프로그램 풀을 만들거나 기존 응용 프로그램 풀을 업데이트하는 옵션을 선택합니다.",
- "loc.input.label.AppPoolName": "이름",
- "loc.input.help.AppPoolName": "만들거나 업데이트할 IIS 응용 프로그램 풀의 이름입니다. 기존 응용 프로그램 풀은 여기에서 지정된 설정으로 업데이트됩니다.",
- "loc.input.label.DotNetVersion": ".NET 버전",
- "loc.input.help.DotNetVersion": "이 응용 프로그램 풀에 의해 로드되는 .NET Framework의 버전입니다. 이 응용 프로그램 풀에 할당된 응용 프로그램에 관리 코드가 포함되지 않은 경우 목록에서 [관리 코드 없음] 옵션을 선택합니다.",
- "loc.input.label.PipeLineMode": "관리되는 파이프라인 모드",
- "loc.input.help.PipeLineMode": "관리되는 파이프라인 모드는 IIS에서 관리되는 콘텐츠에 대한 요청을 처리하는 방식을 지정합니다. 응용 프로그램 풀의 응용 프로그램이 통합 모드에서 실행될 수 없는 경우에만 클래식 모드를 사용하세요.",
- "loc.input.label.AppPoolIdentity": "ID",
- "loc.input.help.AppPoolIdentity": "응용 프로그램 풀의 작업자 프로세스가 실행되는 계정을 구성합니다. 미리 정의된 보안 계정 중 하나를 선택하거나 사용자 지정 계정을 구성합니다.",
- "loc.input.label.AppPoolUsername": "사용자 이름",
- "loc.input.label.AppPoolPassword": "암호",
- "loc.input.help.AppPoolPassword": "gMSA를 사용 중인 경우 이 항목은 필수 항목이 아닙니다.",
- "loc.input.label.AppCmdCommands": "추가 AppCmd.exe 명령",
- "loc.input.help.AppCmdCommands": "웹 사이트 또는 응용 프로그램 풀 속성을 설정할 추가 AppCmd.exe 명령입니다. 명령이 두 개 이상인 경우 줄 구분 기호를 사용하세요. 예: list apppools list sites",
- "loc.input.label.DeployInParallel": "동시 배포",
- "loc.input.help.DeployInParallel": "true로 설정하면 웹 응용 프로그램이 대상 컴퓨터에 동시에 배포됩니다.",
- "loc.input.label.ResourceFilteringMethod": "컴퓨터 선택 기준",
- "loc.input.help.ResourceFilteringMethod": "필요한 경우 컴퓨터 이름 또는 태그를 제공하여 컴퓨터의 하위 집합을 선택합니다.",
- "loc.input.label.MachineFilter": "컴퓨터에 배포",
- "loc.input.help.MachineFilter": "이 입력은 컴퓨터 그룹에만 유효하며 컴퓨터 또는 변수의 단순 목록에는 아직 지원되지 않습니다. dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34 등과 같은 컴퓨터나 Role:DB; OS:Win8.1 등과 같은 태그 목록을 지정하세요. 여러 태그를 지정하는 경우 지정된 태그가 포함된 모든 컴퓨터에서 작업이 실행됩니다. Azure 리소스 그룹의 경우 ffweb, ffdb 등과 같은 가상 컴퓨터 이름을 지정하세요. 기본값은 모든 컴퓨터에서 실행하는 것입니다."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/ru-RU/resources.resjson
deleted file mode 100644
index a3376cb2c694..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/ru-RU/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[Не рекомендуется] Развертывание веб-приложений IIS",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "Развертывание с помощью MSDeploy, создание и обновление пула веб-сайтов и приложений",
- "loc.instanceNameFormat": "[Не рекомендуется] Развертывание приложения IIS: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "Развертывание",
- "loc.group.displayName.website": "Веб-сайт",
- "loc.group.displayName.applicationPool": "Пул приложений",
- "loc.group.displayName.advanced": "Дополнительно",
- "loc.input.label.EnvironmentName": "Компьютеры",
- "loc.input.help.EnvironmentName": "Укажите разделенный запятыми список IP-адресов компьютеров или полных доменных имен вместе с портами. Порт по умолчанию выбирается исходя из используемого протокола. Например: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 Или укажите выходную переменную из других задач. Например: $(variableName)",
- "loc.input.label.AdminUserName": "Имя для входа администратора",
- "loc.input.help.AdminUserName": "Имя для входа администратора для целевых компьютеров.",
- "loc.input.label.AdminPassword": "Пароль",
- "loc.input.help.AdminPassword": "Пароль администратора для целевых компьютеров. Он может принять переменную, заданную в определениях сборки или выпуска в качестве \"$(passwordVariable)\". Вы можете отметить тип переменной как \"secret\", чтобы защитить ее. ",
- "loc.input.label.WinRMProtocol": "Протокол",
- "loc.input.help.WinRMProtocol": "Выберите протокол, используемый в WinRM-подключениях к компьютерам. Значение по умолчанию — HTTPS.",
- "loc.input.label.TestCertificate": "Тестовый сертификат",
- "loc.input.help.TestCertificate": "Выберите этот параметр, чтобы пропустить проверку достоверности сертификата компьютера доверенным центром сертификации. Параметр обязателен для протокола WinRM HTTPS.",
- "loc.input.label.WebDeployPackage": "Пакет веб-развертывания",
- "loc.input.help.WebDeployPackage": "Расположение ZIP-файла веб-развертывания (MSDeploy) на целевых компьютерах или UNC-путь, например \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. UNC-путь должен быть доступен для учетной записи администратора компьютера. Также поддерживаются переменные среды, такие как $env:windir, $env:systemroot, like, $env:windir\\FabrikamFibre\\Web.",
- "loc.input.label.WebDeployParamFile": "Файл параметров веб-развертывания",
- "loc.input.help.WebDeployParamFile": "Расположение файла параметров на целевых компьютерах или UNC-путь. С помощью файла параметров переопределяются параметры конфигурации веб-приложения, например имя веб-приложения IIS или строка подключения к базе данных.",
- "loc.input.label.OverRideParams": "Переопределить параметры",
- "loc.input.help.OverRideParams": "Указанные здесь параметры переопределяют параметры в ZIP-файле MSDeploy и файле параметров. Чтобы переопределить больше одного параметра, используйте разделитель строк, например IIS Web Application Name = Fabrikam ConnectionString = Server=localhost;Database=Fabrikam;",
- "loc.input.label.CreateWebSite": "Создать или обновить веб-сайт",
- "loc.input.help.CreateWebSite": "Параметр для создания нового веб-сайта или обновления существующего.",
- "loc.input.label.WebSiteName": "Имя веб-сайта",
- "loc.input.help.WebSiteName": "Имя веб-сайта IIS, который будет создан, если веб-сайт еще не существует, или который будет обновлен, если веб-сайт уже существует на сервере IIS. Имя веб-сайта должно совпадать с именем, указанным в ZIP-файле веб-развертывания. Если файл параметров и настройки параметров переопределения также указаны, то имя веб-сайта должно быть таким же, как в настройках параметров переопределения.",
- "loc.input.label.WebSitePhysicalPath": "Физический путь",
- "loc.input.help.WebSitePhysicalPath": "Физический путь к месту хранения содержимого веб-сайта. Содержимое может располагаться на локальном компьютере или в удаленном каталоге или общей папке, например C:\\Fabrikam или \\\\\\\\ContentShare\\Fabrikam.",
- "loc.input.label.WebSitePhysicalPathAuth": "Проверка подлинности физического пути",
- "loc.input.help.WebSitePhysicalPathAuth": "Механизм проверки подлинности для доступа к физическому пути веб-сайта.",
- "loc.input.label.WebSiteAuthUserName": "Имя пользователя",
- "loc.input.help.WebSiteAuthUserName": "Имя пользователя для доступа к физическому пути веб-сайта.",
- "loc.input.label.WebSiteAuthUserPassword": "Пароль",
- "loc.input.help.WebSiteAuthUserPassword": "Пароль для доступа к физическому пути веб-сайта. При использовании gMSA не требуется.",
- "loc.input.label.AddBinding": "Добавить привязку",
- "loc.input.help.AddBinding": "Выберите параметр для добавления привязки порта для веб-сайта.",
- "loc.input.label.AssignDuplicateBinding": "Назначить повторяющуюся привязку",
- "loc.input.help.AssignDuplicateBinding": "Выберите параметр для добавления привязок, указанных здесь, даже если существует другой веб-сайт с такими же привязками. Если возникнет конфликт привязок, то будет запущен только один веб-сайт.",
- "loc.input.label.Protocol": "Протокол",
- "loc.input.help.Protocol": "Выберите \"HTTP\", чтобы веб-сайт имел привязку HTTP, или выберите \"HTTPS\", чтобы веб-сайт имел привязку SSL.",
- "loc.input.label.IPAddress": "IP-адрес",
- "loc.input.help.IPAddress": "Введите IP-адрес для доступа пользователей к веб-сайту. Если выбрано \"Все неназначенные\", сайт будет отвечать на запросы со всех IP-адресов порта и необязательного имени узла, указанного для этого сайта, если только другой сайт на сервере не имеет привязки к тому же порту, но с указанным IP-адресом.",
- "loc.input.label.Port": "Порт",
- "loc.input.help.Port": "Введите порт, от которого стеку протокола HTTP (HTTP.sys) нужно ожидать передачи запросов, выполняемых к этому веб-сайту.",
- "loc.input.label.ServerNameIndication": "Требуется указать имя сервера",
- "loc.input.help.ServerNameIndication": "Определяет, требуется ли веб-сайту указание имени сервера (SNI). Указание имени сервера расширяет возможности протоколов SSL и TLS по указанию имени узла, к которому клиент пытается подключиться. Оно позволяет нескольким безопасным веб-сайтам с разными сертификатами использовать один IP-адрес.",
- "loc.input.label.HostNameWithOutSNI": "Имя узла",
- "loc.input.help.HostNameWithOutSNI": "Чтобы назначить одно или несколько имен узла (доменных имен) компьютеру, который использует один IP-адрес, введите имя узла здесь. Если указано имя узла, клиенты должны использовать его вместо IP-адреса для доступа к веб-сайту.",
- "loc.input.label.HostNameWithHttp": "Имя узла",
- "loc.input.help.HostNameWithHttp": "Чтобы назначить одно или несколько имен узла (доменных имен) компьютеру, который использует один IP-адрес, введите имя узла здесь. Если указано имя узла, клиенты должны использовать его вместо IP-адреса для доступа к веб-сайту.",
- "loc.input.label.HostNameWithSNI": "Имя узла",
- "loc.input.help.HostNameWithSNI": "Чтобы назначить одно или несколько имен узла (доменных имен) компьютеру, который использует один IP-адрес, введите имя узла здесь. Если указано имя узла, клиенты должны использовать его вместо IP-адреса для доступа к веб-сайту.",
- "loc.input.label.SSLCertThumbPrint": "Отпечаток SSL-сертификата",
- "loc.input.help.SSLCertThumbPrint": "Отпечаток SSL-сертификата, который будет использоваться веб-сайтом. Сертификат должен быть уже установлен на компьютере и присутствовать в личном хранилище сертификатов на локальном компьютере.",
- "loc.input.label.CreateAppPool": "Создать или обновить пул приложений",
- "loc.input.help.CreateAppPool": "Параметр для создания нового пула приложений или обновления существующего.",
- "loc.input.label.AppPoolName": "Имя",
- "loc.input.help.AppPoolName": "Имя пула приложений IIS для создания или обновления. Существующий пул приложений будет обновлен с использованием указанных здесь параметров.",
- "loc.input.label.DotNetVersion": "Версия .NET",
- "loc.input.help.DotNetVersion": "Версия платформы .NET Framework, загруженная этим пулом приложений. Если приложения, назначенные для этого пула приложений, не содержат управляемого кода, в списке выберите параметр \"Без управляемого кода\".",
- "loc.input.label.PipeLineMode": "Режим управляемого конвейера",
- "loc.input.help.PipeLineMode": "Режим управляемого конвейера указывает, как IIS обрабатывает запросы к управляемому содержимому. Используйте классический режим, только если приложение из пула приложений не может быть запущено в интегрированном режиме.",
- "loc.input.label.AppPoolIdentity": "Идентификатор",
- "loc.input.help.AppPoolIdentity": "Настройте учетную запись, с которой будет запущен рабочий процесс пула. Выберите одну из предопределенных учетных записей безопасности или настройте пользовательскую учетную запись.",
- "loc.input.label.AppPoolUsername": "Имя пользователя",
- "loc.input.label.AppPoolPassword": "Пароль",
- "loc.input.help.AppPoolPassword": "При использовании gMSA не требуется.",
- "loc.input.label.AppCmdCommands": "Дополнительные команды AppCmd.exe",
- "loc.input.help.AppCmdCommands": "Дополнительные команды AppCmd.exe для задания свойств веб-сайта или пула приложений. Если команд несколько, используйте строку-разделитель, например \" список пулов список сайтов\".",
- "loc.input.label.DeployInParallel": "Параллельное развертывание",
- "loc.input.help.DeployInParallel": "Если задать значение \"True\", будет выполнено одновременное развертывание веб-приложения на целевых машинах.",
- "loc.input.label.ResourceFilteringMethod": "Выбор компьютеров по",
- "loc.input.help.ResourceFilteringMethod": "Как вариант, выберите подмножество компьютеров, указав их имена или теги.",
- "loc.input.label.MachineFilter": "Развертывание на компьютерах",
- "loc.input.help.MachineFilter": "Входные данные допустимы только для групп компьютеров и пока не поддерживаются для плоского списка компьютеров или выходных переменных. Укажите список компьютеров, например, dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34 или теги, такие как Role:DB; OS:Win8.1. Если указано несколько тегов, задача будет выполняться на всех компьютерах с указанными тегами. Для групп ресурсов Azure укажите имя виртуальной машины (например, ffweb, ffdb). Поведение по умолчанию — запуск задачи на всех компьютерах."
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-CN/resources.resjson
deleted file mode 100644
index ec7afe10786d..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-CN/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[已弃用] IIS Web 应用部署",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "通过 MSDeploy 进行部署,创建/更新网站和应用池",
- "loc.instanceNameFormat": "[已弃用]部署 IIS App: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "部署",
- "loc.group.displayName.website": "网站",
- "loc.group.displayName.applicationPool": "应用程序池",
- "loc.group.displayName.advanced": "高级",
- "loc.input.label.EnvironmentName": "计算机",
- "loc.input.help.EnvironmentName": "提供以逗号分隔的计算机 IP 地址或 FQDN 以及端口列表。端口默认基于选定的协议。 例如: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 或者提供其他任务的输出变量。例如: $(variableName)",
- "loc.input.label.AdminUserName": "管理员登录名",
- "loc.input.help.AdminUserName": "目标计算机的管理员登录名。",
- "loc.input.label.AdminPassword": "密码",
- "loc.input.help.AdminPassword": "目标计算机的管理员密码。 可接受“生成/发布”定义中定义为 \"$(passwordVariable)\" 的变量。 你可将变量类型标记为“机密”来进行保护。",
- "loc.input.label.WinRMProtocol": "协议",
- "loc.input.help.WinRMProtocol": "选择与计算机进行 WinRM 连接时使用的协议。默认为 HTTPS.",
- "loc.input.label.TestCertificate": "测试证书",
- "loc.input.help.TestCertificate": "选择跳过验证计算机的证书是否真正由受信任的证书颁发机构签署的选项。WinRM HTTPS 协议需要该参数。",
- "loc.input.label.WebDeployPackage": "Web 部署包",
- "loc.input.help.WebDeployPackage": "目标计算机或 UNC 路径上 Web 部署(MSDeploy) zip 文件的位置,如,\\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip。计算机的管理员帐户应可访问该 UNC 路径。也支持环境变量,如 $env:windir、$env:systemroot、 $env:windir\\FabrikamFibre\\Web。",
- "loc.input.label.WebDeployParamFile": "Web 部署参数文件",
- "loc.input.help.WebDeployParamFile": "目标计算机或 UNC 路径上参数文件的位置。参数文件用于替代 Web 应用程序配置设置,如 IIS Web 应用程序名称或数据库连接字符串。",
- "loc.input.label.OverRideParams": "替代参数",
- "loc.input.help.OverRideParams": "此处指定的参数将替代 MSDeploy zip 文件和参数文件中的参数。要替代多个参数,请使用行分隔符,例如, \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\"",
- "loc.input.label.CreateWebSite": "创建或更新网站",
- "loc.input.help.CreateWebSite": "选择创建网站或更新现有网站的选项。",
- "loc.input.label.WebSiteName": "网站名",
- "loc.input.help.WebSiteName": "将创建的 IIS 网站(如果不存在)的名称,如果 IIS 服务器上已存在 IIS 网站,则将进行更新。网站的名称应与 Web 部署 zip 包文件中指定的名称相同。如果还指定了参数文件和 override 参数设置,则网站名称还应与 override 参数设置中的名称相同。",
- "loc.input.label.WebSitePhysicalPath": "物理路径",
- "loc.input.help.WebSitePhysicalPath": "存储网站内容的物理路径。该内容可位于本地计算机、远程目录或共享上。如,C:\\Fabrikam or \\\\\\\\ContentShare\\Fabrikam。",
- "loc.input.label.WebSitePhysicalPathAuth": "物理路径身份验证",
- "loc.input.help.WebSitePhysicalPathAuth": "应用访问网站的物理路径的身份验证机制。",
- "loc.input.label.WebSiteAuthUserName": "用户名",
- "loc.input.help.WebSiteAuthUserName": "用于访问网站的物理路径的用户名。",
- "loc.input.label.WebSiteAuthUserPassword": "密码",
- "loc.input.help.WebSiteAuthUserPassword": "用于访问网站的物理路径的密码。如果使用的是 gMSA,则不需要。",
- "loc.input.label.AddBinding": "添加绑定",
- "loc.input.help.AddBinding": "选择为网站添加端口绑定的选项。",
- "loc.input.label.AssignDuplicateBinding": "分配重复绑定",
- "loc.input.help.AssignDuplicateBinding": "选择添加此处指定的绑定(即使另一个网站具有相同的绑定)的选项。如果存在绑定冲突,则仅将启动其中一个网站。",
- "loc.input.label.Protocol": "协议",
- "loc.input.help.Protocol": "为将具有 HTTP 绑定的网站选择 HTTP,或为将具有安全套接字层(SSL)绑定的网站选择 HTTPS。",
- "loc.input.label.IPAddress": "IP 地址",
- "loc.input.help.IPAddress": "键入用户可用于访问此网站的 IP 地址。如果选择“全部取消分配”,则站点将响应针对为此站点指定的端口和可选主机名上所有 IP 地址的请求,除非服务器上的另一个站点在具有特定 IP 地址的同一端口上具有绑定。",
- "loc.input.label.Port": "端口",
- "loc.input.help.Port": "键入必须在其上侦听超文本传输协议堆栈(HTTP.sys)的端口,以对此网站发出请求。",
- "loc.input.label.ServerNameIndication": "需要服务器名称指示",
- "loc.input.help.ServerNameIndication": "确定网站是否需要服务器名称指示(SNI)。SNI 扩展 SSL 和 TLS 协议以指示客户端尝试连接到的主机名。它允许使用不同证书的多个安全网站使用相同的 IP 地址。",
- "loc.input.label.HostNameWithOutSNI": "主机名",
- "loc.input.help.HostNameWithOutSNI": "若要向使用单个 IP 地址的计算机分配一个或多个主机名(或域名),请在此处键入主机名。如果已指定主机名,则客户端必须使用主机名而非 IP 地址来访问网站。",
- "loc.input.label.HostNameWithHttp": "主机名",
- "loc.input.help.HostNameWithHttp": "若要向使用单个 IP 地址的计算机分配一个或多个主机名(或域名),请在此处键入主机名。如果已指定主机名,则客户端必须使用主机名而非 IP 地址来访问网站。",
- "loc.input.label.HostNameWithSNI": "主机名",
- "loc.input.help.HostNameWithSNI": "若要向使用单个 IP 地址的计算机分配一个或多个主机名(或域名),请在此处键入主机名。如果已指定主机名,则客户端必须使用主机名而非 IP 地址来访问网站。",
- "loc.input.label.SSLCertThumbPrint": "SSL 证书缩略图打印",
- "loc.input.help.SSLCertThumbPrint": "网站将使用的安全套接字层证书的缩略图打印。证书应已安装在计算机上,并位于本地计算机下的个人存储中。",
- "loc.input.label.CreateAppPool": "创建或更新应用程序池",
- "loc.input.help.CreateAppPool": "选择创建应用程序池或更新现有应用程序池的选项。",
- "loc.input.label.AppPoolName": "名称",
- "loc.input.help.AppPoolName": "要创建或更新的 IIS 应用程序池的名称。将使用此处指定的设置更新现有应用程序池。",
- "loc.input.label.DotNetVersion": ".NET 版本",
- "loc.input.help.DotNetVersion": "此应用程序池加载的 .NET Framework 的版本。如果分配给此应用程序池的应用程序不包含托管代码,则从列表中选择“无托管代码”选项。",
- "loc.input.label.PipeLineMode": "托管管道模式",
- "loc.input.help.PipeLineMode": "托管管道模式指定 IIS 进程如何请求托管内容。仅当应用程序池中的应用程序无法在集成模式下运行时使用经典模式。",
- "loc.input.label.AppPoolIdentity": "标识",
- "loc.input.help.AppPoolIdentity": "配置运行应用程序池的工作进程的帐户。选择一个预定义安全帐户或配置一个自定义帐户。",
- "loc.input.label.AppPoolUsername": "用户名",
- "loc.input.label.AppPoolPassword": "密码",
- "loc.input.help.AppPoolPassword": "如果你使用的是 gMSA,则不需要。",
- "loc.input.label.AppCmdCommands": "其他 AppCmd.exe 命令",
- "loc.input.help.AppCmdCommands": "用于设置网站或应用程序池属性的其他 AppCmd.exe 命令。对于多个命令,使用行分隔符,如 list apppools list sites",
- "loc.input.label.DeployInParallel": "并行部署",
- "loc.input.help.DeployInParallel": "将它设置为 true 会在目标计算机上并行部署 Web 应用程序。",
- "loc.input.label.ResourceFilteringMethod": "计算机选择依据",
- "loc.input.help.ResourceFilteringMethod": "(可选)通过提供计算机名或标记来选择计算机的子集。",
- "loc.input.label.MachineFilter": "部署到计算机",
- "loc.input.help.MachineFilter": "此输入仅对计算机组有效,且尚不支持计算机或输出变量的简单列表。提供计算机列表(如 dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34)或标记列表(如 Role:DB; OS:Win8.1)。如果提供了多个标记,则任务将在具有指定标记的所有计算机中运行。对于 Azure 资源组,提供虚拟机的名称,如 ffweb、ffdb。默认为在所有计算机中运行任务。"
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-TW/resources.resjson
deleted file mode 100644
index a9324281ef35..000000000000
--- a/Tasks/IISWebAppDeployment/Strings/resources.resjson/zh-TW/resources.resjson
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "loc.friendlyName": "[已取代] IIS Web 應用程式部署",
- "loc.helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "loc.description": "使用 MSDeploy 部署,建立/更新網站和 app 集區",
- "loc.instanceNameFormat": "[已取代] 部署 IIS 應用程式: $(WebDeployPackage)",
- "loc.group.displayName.deployment": "部署",
- "loc.group.displayName.website": "網站",
- "loc.group.displayName.applicationPool": "應用程式集區",
- "loc.group.displayName.advanced": "進階",
- "loc.input.label.EnvironmentName": "電腦",
- "loc.input.help.EnvironmentName": "提供以逗號分隔,包含電腦 IP 位址或 FQDN 與連接埠的清單。連接埠的預設值隨所選的通訊協定而定。 例如: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 或提供其他作業的輸出變數。例如: $(variableName)",
- "loc.input.label.AdminUserName": "系統管理員登入",
- "loc.input.help.AdminUserName": "目標電腦的系統管理員登入。",
- "loc.input.label.AdminPassword": "密碼",
- "loc.input.help.AdminPassword": "目標電腦的系統管理員密碼。 其可接受組建/發行定義中 '$(passwordVariable)' 這類形式的變數。 您可以將變數類型標示為 'secret' 加以保護。",
- "loc.input.label.WinRMProtocol": "通訊協定",
- "loc.input.help.WinRMProtocol": "選取 WinRM 與電腦連線時所囡使用的通訊協定。預設值為 HTTPS。",
- "loc.input.label.TestCertificate": "測試憑證",
- "loc.input.help.TestCertificate": "選取此選項可略過驗證電腦憑證是否確實經由信任的憑證授權單位簽署。WinRM HTTPS 通訊協定需要此參數。",
- "loc.input.label.WebDeployPackage": "Web Deploy 封裝",
- "loc.input.help.WebDeployPackage": "目標電腦或 UNC 路徑上的 Web Deploy (MSDeploy) 壓縮檔位置,例如 \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip。電腦的系統管理員帳戶必須可以存取 UNC 路徑。同時也支援環境變數,例如 $env:windir、$env:systemroot 像是 $env:windir\\FabrikamFibre\\Web。",
- "loc.input.label.WebDeployParamFile": "Web Deploy 參數檔",
- "loc.input.help.WebDeployParamFile": "目標電腦或 UNC 路徑上的參數檔位置。參數檔可用來覆寫 Web 應用程式的組態設定,如 IIS Web 應用程式名稱或資料庫連接字串。",
- "loc.input.label.OverRideParams": "覆寫參數",
- "loc.input.help.OverRideParams": "此處指定的參數會覆寫 MSDeploy zip 檔案及參數檔案中的參數。若要覆寫一個以上的參數,請使用行分隔符號,例如 \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\" ",
- "loc.input.label.CreateWebSite": "建立或更新網站",
- "loc.input.help.CreateWebSite": "選取選項以建立網站或更新現有網站。",
- "loc.input.label.WebSiteName": "網站名稱",
- "loc.input.help.WebSiteName": "若不存在則會加以建立,或是若已存在於 IIS 伺服器上則會加以更新的 IIS 網站名稱。網站名稱應與 Web Deploy ZIP 封裝檔中所指定的名稱相同。若同時指定了參數檔及覆寫參數設定,則網站名稱應與覆寫參數設定中的名稱相同。",
- "loc.input.label.WebSitePhysicalPath": "實體路徑",
- "loc.input.help.WebSitePhysicalPath": "儲存網站內容所在的實體路徑。內容可以存放在本機電腦上或遠端目錄或是共用上,如 C:\\Fabrikam 或 \\\\\\\\ContentShare\\Fabrikam。",
- "loc.input.label.WebSitePhysicalPathAuth": "實體路徑驗證",
- "loc.input.help.WebSitePhysicalPathAuth": "存取網站實體路徑時,所使用的驗證機制。",
- "loc.input.label.WebSiteAuthUserName": "使用者名稱",
- "loc.input.help.WebSiteAuthUserName": "用以存取網站實體路徑的使用者名稱。",
- "loc.input.label.WebSiteAuthUserPassword": "密碼",
- "loc.input.help.WebSiteAuthUserPassword": "用來存取網站實體路徑的密碼。如果您使用 gMSA,則不需要此項目。",
- "loc.input.label.AddBinding": "新增繫結",
- "loc.input.help.AddBinding": "選取選項以加入網站的連接埠繫結。",
- "loc.input.label.AssignDuplicateBinding": "指派重複的繫結",
- "loc.input.help.AssignDuplicateBinding": "選取選項,以加入在此處指定的繫結 (即使其他網站已具有相同繫結)。若有繫結衝突的情形,則只會啟動其中一個網站。",
- "loc.input.label.Protocol": "通訊協定",
- "loc.input.help.Protocol": "選取網站的 HTTP 以建立 HTTP 繫結,或者選取網站的 HTTPS 以建立 Secure Sockets Layer (SSL) 繫結。",
- "loc.input.label.IPAddress": "IP 位址",
- "loc.input.help.IPAddress": "輸入使用者可以用來存取這個網站的 IP 位址。如果選取 [全部未指派],則當任一 IP 位址位於連接埠上,或位於指定給此網站的選用主機名稱上,該網站便會為其回應所有要求,除非伺服器上的另一個網站在相同連接埠上具有繫結,卻使用特定的 IP 位址。",
- "loc.input.label.Port": "連接埠",
- "loc.input.help.Port": "輸入超文字傳輸通訊協定堆疊 (HTTP.sys) 務必接聽對此網站提出之要求時所使用的連接埠。",
- "loc.input.label.ServerNameIndication": "需要有伺服器名稱指示",
- "loc.input.help.ServerNameIndication": "判斷網站是否需要伺服器名稱指示 (SNI)。SNI 會擴充 SSL 和 TLS 通訊協定,以表示用戶端正在嘗試連接的主機名稱。其允許多個具有不同憑證的安全網站使用相同的 IP 位址。",
- "loc.input.label.HostNameWithOutSNI": "主機名稱",
- "loc.input.help.HostNameWithOutSNI": "若要將一或多個主機名稱 (或網域名稱) 指派給使用單一 IP 位址的電腦,請在這裡輸入主機名稱。如果指定了主機名稱,用戶端就必須使用主機名稱 (而非 IP 位址) 來存取網站。",
- "loc.input.label.HostNameWithHttp": "主機名稱",
- "loc.input.help.HostNameWithHttp": "若要將一或多個主機名稱 (或網域名稱) 指派給使用單一 IP 位址的電腦,請在這裡輸入主機名稱。如果指定了主機名稱,用戶端就必須使用主機名稱 (而非 IP 位址) 來存取網站。",
- "loc.input.label.HostNameWithSNI": "主機名稱",
- "loc.input.help.HostNameWithSNI": "若要將一或多個主機名稱 (或網域名稱) 指派給使用單一 IP 位址的電腦,請在這裡輸入主機名稱。如果指定了主機名稱,用戶端就必須使用主機名稱 (而非 IP 位址) 來存取網站。",
- "loc.input.label.SSLCertThumbPrint": "SSL 憑證指紋",
- "loc.input.help.SSLCertThumbPrint": "網站要使用的安全通訊端層憑證指紋。此憑證應該已安裝在電腦上,且存在於本機電腦的個人存放區之下。",
- "loc.input.label.CreateAppPool": "建立或更新應用程式集區",
- "loc.input.help.CreateAppPool": "選取選項以建立應用程式集區或更新現有應用程式集區。",
- "loc.input.label.AppPoolName": "名稱",
- "loc.input.help.AppPoolName": "要建立或更新之 IIS 應用程式集區的名稱。將以此處指定的設定來更新現有應用程式集區。",
- "loc.input.label.DotNetVersion": ".NET 版本",
- "loc.input.help.DotNetVersion": "此應用程式集區所載入的 .NET Framework 版本。如果指派至此應用程式集區的應用程式不包含 Managed 程式碼,請選取清單中的 [沒有 Managed 程式碼] 選項。",
- "loc.input.label.PipeLineMode": "Managed 管線模式",
- "loc.input.help.PipeLineMode": "Managed 管線模式會指定 IIS 如何處理受管理內容的要求。只有當應用程式集區中的應用程式無法在整合模式中執行時,才能使用傳統模式。",
- "loc.input.label.AppPoolIdentity": "身分識別",
- "loc.input.help.AppPoolIdentity": "設定應用程式集區執行所在的帳戶。選取其中一個預先定義的安全性帳戶或設定自訂帳戶。",
- "loc.input.label.AppPoolUsername": "使用者名稱",
- "loc.input.label.AppPoolPassword": "密碼",
- "loc.input.help.AppPoolPassword": "如果您使用 gMSA,則不需要此項目。",
- "loc.input.label.AppCmdCommands": "其他 AppCmd.exe 命令",
- "loc.input.help.AppCmdCommands": "其他用來設定網站或應用程式集區屬性的 AppCmd.exe 命令。使用一個以上的命令時,請利用行分隔符號,例如 list apppools list sites",
- "loc.input.label.DeployInParallel": "平行部署",
- "loc.input.help.DeployInParallel": "設定為 true 即會以平行方式在目標電腦上部署 Web 應用程式。",
- "loc.input.label.ResourceFilteringMethod": "選取電腦依據",
- "loc.input.help.ResourceFilteringMethod": "選擇性地提供電腦名稱或標記來選取電腦的子集。",
- "loc.input.label.MachineFilter": "部署至電腦",
- "loc.input.help.MachineFilter": "此輸入只對電腦群組有效,電腦的簡單列表或輸出變數目前尚無法支援。請以 dbserver.fabrikam.com、webserver.fabrikam.com、192.168.12.34 等形式提供電腦清單,或以 Role:DB; OS:Win8.1 等提供標記清單。若提供多個標記,工作會在所有具有指定標記的電腦上執行。若為 Azure 資源群組,請提供虛擬機器的名稱 (例如 ffweb、ffdb)。預設會在所有電腦上執行此工作。"
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/icon.png b/Tasks/IISWebAppDeployment/icon.png
deleted file mode 100644
index 8e866e9503ac..000000000000
Binary files a/Tasks/IISWebAppDeployment/icon.png and /dev/null differ
diff --git a/Tasks/IISWebAppDeployment/task.json b/Tasks/IISWebAppDeployment/task.json
deleted file mode 100644
index fcaae655e5df..000000000000
--- a/Tasks/IISWebAppDeployment/task.json
+++ /dev/null
@@ -1,416 +0,0 @@
-{
- "id": "89A3A82D-4B3E-4A09-8D40-A793849DC94F",
- "name": "IISWebAppDeployment",
- "friendlyName": "[Deprecated] IIS Web App Deployment",
- "description": "Deploy by MSDeploy, create/update website & app pools",
- "helpMarkDown": "[More Information](https://aka.ms/iiswebappdeployreadme)",
- "category": "Deploy",
- "visibility": [
- "Preview",
- "Build",
- "Release"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 20
- },
- "demands": [],
- "minimumAgentVersion": "1.91.0",
- "groups": [
- {
- "name": "deployment",
- "displayName": "Deployment",
- "isExpanded": true
- },
- {
- "name": "website",
- "displayName": "Website",
- "isExpanded": true
- },
- {
- "name": "applicationPool",
- "displayName": "Application Pool",
- "isExpanded": true
- },
- {
- "name": "advanced",
- "displayName": "Advanced",
- "isExpanded": false
- }
- ],
- "inputs": [
- {
- "name": "EnvironmentName",
- "type": "multiLine",
- "label": "Machines",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "Provide a comma separated list of machine IP addresses or FQDNs along with ports. Port is defaulted based on the selected protocol. Eg: dbserver.fabrikam.com,dbserver_int.fabrikam.com:5986,192.168.12.34:5986 Or provide output variable of other tasks. Eg: $(variableName)"
- },
- {
- "name": "AdminUserName",
- "type": "string",
- "label": "Admin Login",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "Administrator login for the target machines."
- },
- {
- "name": "AdminPassword",
- "type": "string",
- "label": "Password",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "Administrator password for the target machines. It can accept variable defined in Build/Release definitions as '$(passwordVariable)'. You may mark variable type as 'secret' to secure it. "
- },
- {
- "name": "WinRMProtocol",
- "type": "radio",
- "label": "Protocol",
- "required": false,
- "defaultValue": "",
- "options": {
- "Http": "HTTP",
- "Https": "HTTPS"
- },
- "helpMarkDown": "Select the protocol to use for the WinRM connection with the machine(s). Default is HTTPS."
- },
- {
- "name": "TestCertificate",
- "type": "boolean",
- "label": "Test Certificate",
- "defaultValue": "true",
- "visibleRule": "WinRMProtocol = Https",
- "required": false,
- "helpMarkDown": "Select the option to skip validating the authenticity of the machine's certificate by a trusted certification authority. The parameter is required for the WinRM HTTPS protocol."
- },
- {
- "name": "WebDeployPackage",
- "type": "string",
- "label": "Web Deploy Package",
- "required": true,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "Location of the Web Deploy (MSDeploy) zip file on the target machines or on a UNC path like, \\\\\\\\BudgetIT\\WebDeploy\\WebDeployPackage.zip. The UNC path should be accessible to the machine's administrator account. Environment variables are also supported like, $env:windir, $env:systemroot, like, $env:windir\\FabrikamFibre\\Web."
- },
- {
- "name": "WebDeployParamFile",
- "type": "string",
- "label": "Web Deploy Parameter File",
- "required": false,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "Location of the Parameter file on the target machines or on a UNC path. Parameter file is used to override Web application configuration settings like, IIS Web application name or database connection string."
- },
- {
- "name": "OverRideParams",
- "type": "multiLine",
- "label": "Override Parameters",
- "required": false,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "Parameters specified here will override the parameters in the MSDeploy zip file and the Parameter file. To override more than one parameter use line separator, e.g., \"IIS Web Application Name\"=\"Fabrikam\" \"ConnectionString\"=\"Server=localhost;Database=Fabrikam;\""
- },
- {
- "name": "CreateWebSite",
- "type": "boolean",
- "label": "Create or Update Website",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "helpMarkDown": "Select the option to create a website or to update an existing website."
- },
- {
- "name": "WebSiteName",
- "type": "string",
- "label": "Website Name",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "Name of the IIS website that will be created if it does not exist, or it will be updated if it is already present on the IIS server. The name of the website should be same as that specified in the web deploy zip package file. If a Parameter file and override Parameters setting is also specified, then the name of the website should be same as that in the override Parameters setting."
- },
- {
- "name": "WebSitePhysicalPath",
- "type": "string",
- "label": "Physical Path",
- "required": true,
- "groupName": "website",
- "defaultValue": "%SystemDrive%\\inetpub\\wwwroot",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "Physical path where the website content is stored. The content can reside on the local computer or on a remote directory or share like, C:\\Fabrikam or \\\\\\\\ContentShare\\Fabrikam."
- },
- {
- "name": "WebSitePhysicalPathAuth",
- "type": "pickList",
- "label": "Physical Path Authentication",
- "required": true,
- "groupName": "website",
- "defaultValue": "Application User (Pass-through)",
- "visibleRule": "CreateWebSite = true",
- "options": {
- "WebSiteUserPassThrough": "Application User (Pass-through)",
- "WebSiteWindowsAuth": "Windows Authentication"
- },
- "helpMarkDown": "Authentication mechanism for accessing the physical path of the website."
- },
- {
- "name": "WebSiteAuthUserName",
- "type": "string",
- "label": "User Name",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "WebSitePhysicalPathAuth = WebSiteWindowsAuth",
- "helpMarkDown": "User name for accessing the website's physical path."
- },
- {
- "name": "WebSiteAuthUserPassword",
- "type": "string",
- "label": "Password",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "WebSitePhysicalPathAuth = WebSiteWindowsAuth",
- "helpMarkDown": "Password for accessing the website's physical path. If you are using a gMSA, this is not required."
- },
- {
- "name": "AddBinding",
- "type": "boolean",
- "label": "Add Binding",
- "required": false,
- "groupName": "website",
- "defaultValue": "true",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "Select the option to add port binding for the website."
- },
- {
- "name": "AssignDuplicateBinding",
- "type": "boolean",
- "label": "Assign Duplicate Binding",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "Select the option to add the bindings specified here, even if there is another website with the same bindings. If there are binding conflicts, then only one of the website will start."
- },
- {
- "name": "Protocol",
- "type": "pickList",
- "label": "Protocol",
- "required": true,
- "groupName": "website",
- "defaultValue": "http",
- "options": {
- "https": "https",
- "http": "http"
- },
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "Select HTTP for the website to have an HTTP binding, or select HTTPS for the website to have a Secure Sockets Layer (SSL) binding."
- },
- {
- "name": "IPAddress",
- "type": "string",
- "label": "IP Address",
- "required": true,
- "groupName": "website",
- "defaultValue": "All Unassigned",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "Type an IP address that users can use to access this website. If All Unassigned is selected, the site will respond to requests for all IP addresses on the port and the optional host name that is specified for this site, unless another site on the server has a binding on the same port but with a specific IP address."
- },
- {
- "name": "Port",
- "type": "string",
- "label": "Port",
- "required": true,
- "groupName": "website",
- "defaultValue": "80",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "Type the port on which Hypertext Transfer Protocol Stack (HTTP.sys) must listen for requests made to this website."
- },
- {
- "name": "ServerNameIndication",
- "type": "boolean",
- "label": "Server Name Indication Required",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "visibleRule": "Protocol = https",
- "helpMarkDown": "Determines whether the website requires Server Name Indication (SNI). SNI extends the SSL and TLS protocols to indicate what host name the client is attempting to connect to. It allows multiple secure websites with different certificates to use the same IP address."
- },
- {
- "name": "HostNameWithOutSNI",
- "type": "string",
- "label": "Host Name",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "ServerNameIndication = false",
- "helpMarkDown": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website."
- },
- {
- "name": "HostNameWithHttp",
- "type": "string",
- "label": "Host Name",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "Protocol = http",
- "helpMarkDown": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website."
- },
- {
- "name": "HostNameWithSNI",
- "type": "string",
- "label": "Host Name",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "ServerNameIndication = true",
- "helpMarkDown": "To assign one or more host names (or domain names) to a computer that uses a single IP address, type a host name here. If a host name is specified then the clients must use the host name instead of the IP address to access the website."
- },
- {
- "name": "SSLCertThumbPrint",
- "type": "string",
- "label": "SSL Certificate Thumb Print",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "Protocol = https",
- "helpMarkDown": "Thumb-print of the Secure Socket Layer certificate that the website is going to use. The certificate should be already installed on the machine and present under the Local Computer, Personal store."
- },
- {
- "name": "CreateAppPool",
- "type": "boolean",
- "label": "Create or Update Application Pool",
- "required": false,
- "groupName": "applicationPool",
- "defaultValue": "false",
- "helpMarkDown": "Select the option to create an application pool or to update an existing application pool."
- },
- {
- "name": "AppPoolName",
- "type": "string",
- "label": "Name",
- "defaultValue": "",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "Name of the IIS application pool to create or update. Existing application pool will be updated with the settings specified here."
- },
- {
- "name": "DotNetVersion",
- "type": "pickList",
- "label": ".NET Version",
- "defaultValue": "v4.0",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "Version of the .NET Framework that is loaded by this application pool. If the applications assigned to this application pool do not contain managed code, select the No Managed Code option from the list.",
- "options": {
- "v4.0": "v4.0",
- "v2.0": "v2.0",
- "No Managed Code": "No Managed Code"
- }
- },
- {
- "name": "PipeLineMode",
- "type": "pickList",
- "label": "Managed Pipeline Mode",
- "defaultValue": "Integrated",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "Managed pipeline mode specifies how IIS processes requests for managed content. Use classic mode only when the applications in the application pool cannot run in the Integrated mode.",
- "options": {
- "Integrated": "Integrated",
- "Classic": "Classic"
- }
- },
- {
- "name": "AppPoolIdentity",
- "type": "pickList",
- "label": "Identity",
- "defaultValue": "ApplicationPoolIdentity",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "Configure the account under which an application pool's worker process runs. Select one of the predefined security accounts or configure a custom account.",
- "options": {
- "ApplicationPoolIdentity": "ApplicationPoolIdentity",
- "LocalService": "LocalService",
- "LocalSystem": "LocalSystem",
- "NetworkService": "NetworkService",
- "SpecificUser": "Custom Account"
- }
- },
- {
- "name": "AppPoolUsername",
- "type": "string",
- "label": "Username",
- "defaultValue": "",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "AppPoolIdentity = SpecificUser"
- },
- {
- "name": "AppPoolPassword",
- "type": "string",
- "label": "Password",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "If you are using a gMSA, this is not required.",
- "groupName": "applicationPool",
- "visibleRule": "AppPoolIdentity = SpecificUser"
- },
- {
- "name": "AppCmdCommands",
- "type": "multiLine",
- "label": "Additional AppCmd.exe Commands",
- "required": false,
- "groupName": "advanced",
- "defaultValue": "",
- "helpMarkDown": "Additional AppCmd.exe commands to set website or application pool properties. For more than one command use line separator, e.g., list apppools list sites"
- },
- {
- "name": "DeployInParallel",
- "type": "boolean",
- "label": "Deploy in Parallel",
- "defaultValue": "true",
- "required": false,
- "groupName": "advanced",
- "helpMarkDown": "Setting it to true will deploy the Web application in-parallel on the target machines."
- },
- {
- "name": "ResourceFilteringMethod",
- "type": "radio",
- "label": "Select Machines By",
- "required": false,
- "defaultValue": "machineNames",
- "options": {
- "machineNames": "Machine Names",
- "tags": "Tags"
- },
- "groupName": "advanced",
- "helpMarkDown": "Optionally, select a subset of machines either by providing machine names or tags."
- },
- {
- "name": "MachineFilter",
- "type": "string",
- "label": "Deploy to Machines",
- "required": false,
- "defaultValue": "",
- "groupName": "advanced",
- "helpMarkDown": "This input is valid only for machine groups and is not supported for flat list of machines or output variables yet. Provide a list of machines like, dbserver.fabrikam.com, webserver.fabrikam.com, 192.168.12.34, or tags like, Role:DB; OS:Win8.1. If multiple tags are provided, then the task will run in all the machines with the specified tags. For Azure Resource Groups, provide the virtual machine's name like, ffweb, ffdb. The default is to run the task in all machines."
- }
- ],
- "instanceNameFormat": "[Deprecated] Deploy IIS App: $(WebDeployPackage)",
- "execution": {
- "PowerShell": {
- "target": "$(currentDirectory)\\DeployIISWebApp.ps1",
- "argumentFormat": "",
- "workingDirectory": "$(currentDirectory)"
- }
- }
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeployment/task.loc.json b/Tasks/IISWebAppDeployment/task.loc.json
deleted file mode 100644
index 915719ded3c1..000000000000
--- a/Tasks/IISWebAppDeployment/task.loc.json
+++ /dev/null
@@ -1,416 +0,0 @@
-{
- "id": "89A3A82D-4B3E-4A09-8D40-A793849DC94F",
- "name": "IISWebAppDeployment",
- "friendlyName": "ms-resource:loc.friendlyName",
- "description": "ms-resource:loc.description",
- "helpMarkDown": "ms-resource:loc.helpMarkDown",
- "category": "Deploy",
- "visibility": [
- "Preview",
- "Build",
- "Release"
- ],
- "author": "Microsoft Corporation",
- "version": {
- "Major": 1,
- "Minor": 0,
- "Patch": 20
- },
- "demands": [],
- "minimumAgentVersion": "1.91.0",
- "groups": [
- {
- "name": "deployment",
- "displayName": "ms-resource:loc.group.displayName.deployment",
- "isExpanded": true
- },
- {
- "name": "website",
- "displayName": "ms-resource:loc.group.displayName.website",
- "isExpanded": true
- },
- {
- "name": "applicationPool",
- "displayName": "ms-resource:loc.group.displayName.applicationPool",
- "isExpanded": true
- },
- {
- "name": "advanced",
- "displayName": "ms-resource:loc.group.displayName.advanced",
- "isExpanded": false
- }
- ],
- "inputs": [
- {
- "name": "EnvironmentName",
- "type": "multiLine",
- "label": "ms-resource:loc.input.label.EnvironmentName",
- "defaultValue": "",
- "required": true,
- "helpMarkDown": "ms-resource:loc.input.help.EnvironmentName"
- },
- {
- "name": "AdminUserName",
- "type": "string",
- "label": "ms-resource:loc.input.label.AdminUserName",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.AdminUserName"
- },
- {
- "name": "AdminPassword",
- "type": "string",
- "label": "ms-resource:loc.input.label.AdminPassword",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.AdminPassword"
- },
- {
- "name": "WinRMProtocol",
- "type": "radio",
- "label": "ms-resource:loc.input.label.WinRMProtocol",
- "required": false,
- "defaultValue": "",
- "options": {
- "Http": "HTTP",
- "Https": "HTTPS"
- },
- "helpMarkDown": "ms-resource:loc.input.help.WinRMProtocol"
- },
- {
- "name": "TestCertificate",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.TestCertificate",
- "defaultValue": "true",
- "visibleRule": "WinRMProtocol = Https",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.TestCertificate"
- },
- {
- "name": "WebDeployPackage",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebDeployPackage",
- "required": true,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "ms-resource:loc.input.help.WebDeployPackage"
- },
- {
- "name": "WebDeployParamFile",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebDeployParamFile",
- "required": false,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "ms-resource:loc.input.help.WebDeployParamFile"
- },
- {
- "name": "OverRideParams",
- "type": "multiLine",
- "label": "ms-resource:loc.input.label.OverRideParams",
- "required": false,
- "groupName": "deployment",
- "defaultValue": "",
- "helpMarkDown": "ms-resource:loc.input.help.OverRideParams"
- },
- {
- "name": "CreateWebSite",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.CreateWebSite",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "helpMarkDown": "ms-resource:loc.input.help.CreateWebSite"
- },
- {
- "name": "WebSiteName",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebSiteName",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "ms-resource:loc.input.help.WebSiteName"
- },
- {
- "name": "WebSitePhysicalPath",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebSitePhysicalPath",
- "required": true,
- "groupName": "website",
- "defaultValue": "%SystemDrive%\\inetpub\\wwwroot",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "ms-resource:loc.input.help.WebSitePhysicalPath"
- },
- {
- "name": "WebSitePhysicalPathAuth",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.WebSitePhysicalPathAuth",
- "required": true,
- "groupName": "website",
- "defaultValue": "Application User (Pass-through)",
- "visibleRule": "CreateWebSite = true",
- "options": {
- "WebSiteUserPassThrough": "Application User (Pass-through)",
- "WebSiteWindowsAuth": "Windows Authentication"
- },
- "helpMarkDown": "ms-resource:loc.input.help.WebSitePhysicalPathAuth"
- },
- {
- "name": "WebSiteAuthUserName",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebSiteAuthUserName",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "WebSitePhysicalPathAuth = WebSiteWindowsAuth",
- "helpMarkDown": "ms-resource:loc.input.help.WebSiteAuthUserName"
- },
- {
- "name": "WebSiteAuthUserPassword",
- "type": "string",
- "label": "ms-resource:loc.input.label.WebSiteAuthUserPassword",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "WebSitePhysicalPathAuth = WebSiteWindowsAuth",
- "helpMarkDown": "ms-resource:loc.input.help.WebSiteAuthUserPassword"
- },
- {
- "name": "AddBinding",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.AddBinding",
- "required": false,
- "groupName": "website",
- "defaultValue": "true",
- "visibleRule": "CreateWebSite = true",
- "helpMarkDown": "ms-resource:loc.input.help.AddBinding"
- },
- {
- "name": "AssignDuplicateBinding",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.AssignDuplicateBinding",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "ms-resource:loc.input.help.AssignDuplicateBinding"
- },
- {
- "name": "Protocol",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.Protocol",
- "required": true,
- "groupName": "website",
- "defaultValue": "http",
- "options": {
- "https": "https",
- "http": "http"
- },
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "ms-resource:loc.input.help.Protocol"
- },
- {
- "name": "IPAddress",
- "type": "string",
- "label": "ms-resource:loc.input.label.IPAddress",
- "required": true,
- "groupName": "website",
- "defaultValue": "All Unassigned",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "ms-resource:loc.input.help.IPAddress"
- },
- {
- "name": "Port",
- "type": "string",
- "label": "ms-resource:loc.input.label.Port",
- "required": true,
- "groupName": "website",
- "defaultValue": "80",
- "visibleRule": "AddBinding = true",
- "helpMarkDown": "ms-resource:loc.input.help.Port"
- },
- {
- "name": "ServerNameIndication",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.ServerNameIndication",
- "required": false,
- "groupName": "website",
- "defaultValue": "false",
- "visibleRule": "Protocol = https",
- "helpMarkDown": "ms-resource:loc.input.help.ServerNameIndication"
- },
- {
- "name": "HostNameWithOutSNI",
- "type": "string",
- "label": "ms-resource:loc.input.label.HostNameWithOutSNI",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "ServerNameIndication = false",
- "helpMarkDown": "ms-resource:loc.input.help.HostNameWithOutSNI"
- },
- {
- "name": "HostNameWithHttp",
- "type": "string",
- "label": "ms-resource:loc.input.label.HostNameWithHttp",
- "required": false,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "Protocol = http",
- "helpMarkDown": "ms-resource:loc.input.help.HostNameWithHttp"
- },
- {
- "name": "HostNameWithSNI",
- "type": "string",
- "label": "ms-resource:loc.input.label.HostNameWithSNI",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "ServerNameIndication = true",
- "helpMarkDown": "ms-resource:loc.input.help.HostNameWithSNI"
- },
- {
- "name": "SSLCertThumbPrint",
- "type": "string",
- "label": "ms-resource:loc.input.label.SSLCertThumbPrint",
- "required": true,
- "groupName": "website",
- "defaultValue": "",
- "visibleRule": "Protocol = https",
- "helpMarkDown": "ms-resource:loc.input.help.SSLCertThumbPrint"
- },
- {
- "name": "CreateAppPool",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.CreateAppPool",
- "required": false,
- "groupName": "applicationPool",
- "defaultValue": "false",
- "helpMarkDown": "ms-resource:loc.input.help.CreateAppPool"
- },
- {
- "name": "AppPoolName",
- "type": "string",
- "label": "ms-resource:loc.input.label.AppPoolName",
- "defaultValue": "",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "ms-resource:loc.input.help.AppPoolName"
- },
- {
- "name": "DotNetVersion",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.DotNetVersion",
- "defaultValue": "v4.0",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "ms-resource:loc.input.help.DotNetVersion",
- "options": {
- "v4.0": "v4.0",
- "v2.0": "v2.0",
- "No Managed Code": "No Managed Code"
- }
- },
- {
- "name": "PipeLineMode",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.PipeLineMode",
- "defaultValue": "Integrated",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "ms-resource:loc.input.help.PipeLineMode",
- "options": {
- "Integrated": "Integrated",
- "Classic": "Classic"
- }
- },
- {
- "name": "AppPoolIdentity",
- "type": "pickList",
- "label": "ms-resource:loc.input.label.AppPoolIdentity",
- "defaultValue": "ApplicationPoolIdentity",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "CreateAppPool = true",
- "helpMarkDown": "ms-resource:loc.input.help.AppPoolIdentity",
- "options": {
- "ApplicationPoolIdentity": "ApplicationPoolIdentity",
- "LocalService": "LocalService",
- "LocalSystem": "LocalSystem",
- "NetworkService": "NetworkService",
- "SpecificUser": "Custom Account"
- }
- },
- {
- "name": "AppPoolUsername",
- "type": "string",
- "label": "ms-resource:loc.input.label.AppPoolUsername",
- "defaultValue": "",
- "required": true,
- "groupName": "applicationPool",
- "visibleRule": "AppPoolIdentity = SpecificUser"
- },
- {
- "name": "AppPoolPassword",
- "type": "string",
- "label": "ms-resource:loc.input.label.AppPoolPassword",
- "defaultValue": "",
- "required": false,
- "helpMarkDown": "ms-resource:loc.input.help.AppPoolPassword",
- "groupName": "applicationPool",
- "visibleRule": "AppPoolIdentity = SpecificUser"
- },
- {
- "name": "AppCmdCommands",
- "type": "multiLine",
- "label": "ms-resource:loc.input.label.AppCmdCommands",
- "required": false,
- "groupName": "advanced",
- "defaultValue": "",
- "helpMarkDown": "ms-resource:loc.input.help.AppCmdCommands"
- },
- {
- "name": "DeployInParallel",
- "type": "boolean",
- "label": "ms-resource:loc.input.label.DeployInParallel",
- "defaultValue": "true",
- "required": false,
- "groupName": "advanced",
- "helpMarkDown": "ms-resource:loc.input.help.DeployInParallel"
- },
- {
- "name": "ResourceFilteringMethod",
- "type": "radio",
- "label": "ms-resource:loc.input.label.ResourceFilteringMethod",
- "required": false,
- "defaultValue": "machineNames",
- "options": {
- "machineNames": "Machine Names",
- "tags": "Tags"
- },
- "groupName": "advanced",
- "helpMarkDown": "ms-resource:loc.input.help.ResourceFilteringMethod"
- },
- {
- "name": "MachineFilter",
- "type": "string",
- "label": "ms-resource:loc.input.label.MachineFilter",
- "required": false,
- "defaultValue": "",
- "groupName": "advanced",
- "helpMarkDown": "ms-resource:loc.input.help.MachineFilter"
- }
- ],
- "instanceNameFormat": "ms-resource:loc.instanceNameFormat",
- "execution": {
- "PowerShell": {
- "target": "$(currentDirectory)\\DeployIISWebApp.ps1",
- "argumentFormat": "",
- "workingDirectory": "$(currentDirectory)"
- }
- }
-}
\ No newline at end of file
diff --git a/Tasks/IISWebAppDeploymentOnMachineGroup/package.json b/Tasks/IISWebAppDeploymentOnMachineGroup/package.json
index 4fc23cbd07aa..0d11a311a1a3 100644
--- a/Tasks/IISWebAppDeploymentOnMachineGroup/package.json
+++ b/Tasks/IISWebAppDeploymentOnMachineGroup/package.json
@@ -18,7 +18,7 @@
"homepage": "https://github.com/Microsoft/vsts-tasks#readme",
"dependencies": {
- "q": "^1.4.1"
+ "q": "1.4.1"
},
"devDependencies": {
"mocha": "^3.1.2"
diff --git a/Tasks/IISWebAppDeploymentOnMachineGroup/task.json b/Tasks/IISWebAppDeploymentOnMachineGroup/task.json
index 6523f5b8c2ae..1f2c151dfe26 100644
--- a/Tasks/IISWebAppDeploymentOnMachineGroup/task.json
+++ b/Tasks/IISWebAppDeploymentOnMachineGroup/task.json
@@ -16,7 +16,7 @@
"version": {
"Major": 0,
"Minor": 0,
- "Patch": 2
+ "Patch": 3
},
"demands": [
],
diff --git a/Tasks/IISWebAppDeploymentOnMachineGroup/task.loc.json b/Tasks/IISWebAppDeploymentOnMachineGroup/task.loc.json
index 0c066d159f3a..cbd5d9966591 100644
--- a/Tasks/IISWebAppDeploymentOnMachineGroup/task.loc.json
+++ b/Tasks/IISWebAppDeploymentOnMachineGroup/task.loc.json
@@ -16,7 +16,7 @@
"version": {
"Major": 0,
"Minor": 0,
- "Patch": 2
+ "Patch": 3
},
"demands": [],
"minimumAgentVersion": "1.102.0",
diff --git a/Tasks/JenkinsDownloadArtifacts/task.json b/Tasks/JenkinsDownloadArtifacts/task.json
index af99dd6c6a33..2bd715f101de 100644
--- a/Tasks/JenkinsDownloadArtifacts/task.json
+++ b/Tasks/JenkinsDownloadArtifacts/task.json
@@ -8,13 +8,17 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft",
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 3
+ "Patch": 4
},
"groups": [
{
diff --git a/Tasks/JenkinsDownloadArtifacts/task.loc.json b/Tasks/JenkinsDownloadArtifacts/task.loc.json
index f66065f29ae2..4ead7e19c168 100644
--- a/Tasks/JenkinsDownloadArtifacts/task.loc.json
+++ b/Tasks/JenkinsDownloadArtifacts/task.loc.json
@@ -9,12 +9,16 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft",
"demands": [],
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 3
+ "Patch": 4
},
"groups": [
{
diff --git a/Tasks/JenkinsQueueJob/Strings/resources.resjson/en-US/resources.resjson b/Tasks/JenkinsQueueJob/Strings/resources.resjson/en-US/resources.resjson
index ddb795a95ea6..1844d5d873af 100644
--- a/Tasks/JenkinsQueueJob/Strings/resources.resjson/en-US/resources.resjson
+++ b/Tasks/JenkinsQueueJob/Strings/resources.resjson/en-US/resources.resjson
@@ -5,15 +5,15 @@
"loc.instanceNameFormat": "Queue Jenkins Job: $(jobName)",
"loc.group.displayName.advanced": "Advanced",
"loc.input.label.serverEndpoint": "Jenkins service endpoint",
- "loc.input.help.serverEndpoint": "Select the service endpoint for your Jenkins instance. To create one, click the Manage link and create a new Jenkins Service Endpoint.",
+ "loc.input.help.serverEndpoint": "Select the service endpoint for your Jenkins instance. To create one, click the Manage link and create a new Jenkins service endpoint.",
"loc.input.label.jobName": "Job name",
"loc.input.help.jobName": "The name of the Jenkins job to queue. This must exactly match the job name on the Jenkins server.",
"loc.input.label.captureConsole": "Capture console output and wait for completion",
"loc.input.help.captureConsole": "If selected, this step will capture the Jenkins build console output, wait for the Jenkins build to complete, and succeed/fail based on the Jenkins build result. Otherwise, once the Jenkins job is successfully queued, this step will successfully complete without waiting for the Jenkins build to run.",
"loc.input.label.capturePipeline": "Capture pipeline output and wait for pipeline completion",
- "loc.input.help.capturePipeline": "If selected, this step will capture the full Jenkins build pipeline console output, wait for the full Jenkins build pipeline to complete, and succeed/fail based on the Jenkins build pipeline result. Otherwise, once the Jenkins job is completes, this step will successfully complete without waiting for full Jenkins build pipeline to run.",
+ "loc.input.help.capturePipeline": "If selected, this step will capture the full Jenkins build pipeline console output, wait for the full Jenkins build pipeline to complete, and succeed/fail based on the Jenkins build pipeline result. Otherwise, once the first Jenkins job completes, this step will successfully complete without waiting for full Jenkins build pipeline to run.",
"loc.input.label.parameterizedJob": "Parameterized job",
- "loc.input.help.parameterizedJob": "Select if the Jenkins job accepts parameters. This should be selected even if all the default parameters are used and no parameters are actually specified.",
+ "loc.input.help.parameterizedJob": "Select if the Jenkins job accepts parameters. This should be selected even if all default parameter values are used and no parameters are actually specified.",
"loc.input.label.jobParameters": "Job parameters",
- "loc.input.help.jobParameters": "Specify job parameters, one per line, in the form `=`
To set a parameter to an empty value (useful for overriding a default value) leave off the paramter value, e.g. specify `=`
Variables are supported, e.g. to define the `commitId` paramter to be the `git commit ID` for the build, use: `commitId=$(Build.SourceVersion)`. See the [documentation on variables](https://www.visualstudio.com/docs/build/define/variables) for more details.
Supported Jenkins parameter types are:
`Boolean`
`String`
`Choice`
`Password`
"
+ "loc.input.help.jobParameters": "Specify job parameters, one per line, in the form `=`
To set a parameter to an empty value (useful for overriding a default value), leave off the parameter value. For example, specify `=`
Variables are supported. For example, to set a `commitId` parameter value to the Git commit ID of the build, use: `commitId=$(Build.SourceVersion)`. See the [documentation on variables](https://www.visualstudio.com/docs/build/define/variables) for more details.
Supported Jenkins parameter types are:
`Boolean`
`Choice`
`Password`
`String`
"
}
\ No newline at end of file
diff --git a/Tasks/JenkinsQueueJob/job.ts b/Tasks/JenkinsQueueJob/job.ts
index 44ec2fc7fafe..66eea27a1914 100644
--- a/Tasks/JenkinsQueueJob/job.ts
+++ b/Tasks/JenkinsQueueJob/job.ts
@@ -17,16 +17,25 @@ import unzip = require('./unzip');
import * as Util from './util';
+// Jobs transition between states as follows:
+// ------------------------------------------
+// BEGINNING STATE: New
+// New → Locating, Streaming, Joined, Cut
+// Locating → Streaming, Joined, Cut
+// Streaming → Finishing
+// Finishing → Downloading, Queued, Done
+// Downloading → Done
+// TERMINAL STATES: Done, Queued, Joined, Cut
export enum JobState {
- New, // 0
- Locating, // 1
- Streaming, // 2
- Finishing, // 3
- Done, // 4
- Joined, // 5
- Queued, // 6
- Cut, // 7
- Downloading// 8
+ New, // 0 - The job is yet to begin
+ Locating, // 1 - The job is being located
+ Streaming, // 2 - The job is running and its console output is streaming
+ Finishing, // 3 - The job has run and is "finishing"
+ Done, // 4 - The job has run and is done
+ Joined, // 5 - The job is considered complete because it has been joined to the execution of another matching job execution
+ Queued, // 6 - The job was queued and will not be tracked for completion (as specified by the "Capture..." task setting)
+ Cut, // 7 - The job was cut from execution by the pipeline
+ Downloading// 8 - The job has run and its results are being downloaded (occurs when the TFS Plugin for Jenkins is installed)
}
export class Job {
@@ -98,7 +107,7 @@ export class Job {
} else if (oldState == JobState.Streaming) {
validStateChange = (newState == JobState.Finishing);
} else if (oldState == JobState.Finishing) {
- validStateChange = (newState == JobState.Downloading || newState == JobState.Done);
+ validStateChange = (newState == JobState.Downloading || newState == JobState.Queued || newState == JobState.Done);
} else if (oldState == JobState.Downloading) {
validStateChange = (newState == JobState.Done);
} else if (oldState == JobState.Done || oldState == JobState.Joined || oldState == JobState.Cut) {
@@ -281,7 +290,7 @@ export class Job {
/**
* Checks the success of the job
*
- * JobState = Finishing, transition to Done or Queued possible
+ * JobState = Finishing, transition to Downloading, Done, or Queued possible
*/
finish(): void {
var thisJob: Job = this;
diff --git a/Tasks/JenkinsQueueJob/jobsearch.ts b/Tasks/JenkinsQueueJob/jobsearch.ts
index 1c42abd5ecb9..0e3a14c8f722 100644
--- a/Tasks/JenkinsQueueJob/jobsearch.ts
+++ b/Tasks/JenkinsQueueJob/jobsearch.ts
@@ -119,7 +119,11 @@ export class JobSearch {
for (var i in causes) {
var job = thisSearch.queue.findJob(causes[i].upstreamUrl, causes[i].upstreamBuild);
if (job) { // we know about it
- if (job.state == JobState.Streaming || job.state == JobState.Finishing || job.state == JobState.Done) {
+ if (job.state == JobState.Streaming ||
+ job.state == JobState.Finishing ||
+ job.state == JobState.Downloading ||
+ job.state == JobState.Queued ||
+ job.state == JobState.Done) {
causesThatRan.push(job);
} else if (job.state == JobState.New || job.state == JobState.Locating) {
causesThatMayRun.push(job);
@@ -264,7 +268,17 @@ export class JobSearch {
* So, for all jobs being tracked (within this code), one is consisdered the main job (which will be followed), and
* all others are considered joined and will not be tracked further.
*/
- var causes : any = parsedBody.actions[0].causes;
+ var findCauses = function(actions) {
+ for (var i in actions) {
+ if (actions[i].causes) {
+ return actions[i].causes;
+ }
+ }
+
+ return null;
+ };
+
+ var causes : any = findCauses(parsedBody.actions);
thisSearch.foundCauses[thisSearch.nextSearchBuildNumber] = causes;
thisSearch.determineMainJob(thisSearch.nextSearchBuildNumber, function (mainJob: Job, secondaryJobs: Job[]) {
if (mainJob != null) {
diff --git a/Tasks/JenkinsQueueJob/task.json b/Tasks/JenkinsQueueJob/task.json
index fae520ce8648..ff79f05a10c2 100644
--- a/Tasks/JenkinsQueueJob/task.json
+++ b/Tasks/JenkinsQueueJob/task.json
@@ -14,7 +14,7 @@
"version": {
"Major": 1,
"Minor": 1,
- "Patch": 3
+ "Patch": 5
},
"groups": [
{
@@ -31,7 +31,7 @@
"label": "Jenkins service endpoint",
"defaultValue": "",
"required": true,
- "helpMarkDown": "Select the service endpoint for your Jenkins instance. To create one, click the Manage link and create a new Jenkins Service Endpoint."
+ "helpMarkDown": "Select the service endpoint for your Jenkins instance. To create one, click the Manage link and create a new Jenkins service endpoint."
},
{
"name": "jobName",
@@ -55,7 +55,7 @@
"label": "Capture pipeline output and wait for pipeline completion",
"defaultValue": true,
"required": true,
- "helpMarkDown": "If selected, this step will capture the full Jenkins build pipeline console output, wait for the full Jenkins build pipeline to complete, and succeed/fail based on the Jenkins build pipeline result. Otherwise, once the Jenkins job is completes, this step will successfully complete without waiting for full Jenkins build pipeline to run.",
+ "helpMarkDown": "If selected, this step will capture the full Jenkins build pipeline console output, wait for the full Jenkins build pipeline to complete, and succeed/fail based on the Jenkins build pipeline result. Otherwise, once the first Jenkins job completes, this step will successfully complete without waiting for full Jenkins build pipeline to run.",
"visibleRule": "captureConsole = true"
},
{
@@ -64,7 +64,7 @@
"label": "Parameterized job",
"defaultValue": false,
"required": true,
- "helpMarkDown": "Select if the Jenkins job accepts parameters. This should be selected even if all the default parameters are used and no parameters are actually specified.",
+ "helpMarkDown": "Select if the Jenkins job accepts parameters. This should be selected even if all default parameter values are used and no parameters are actually specified.",
"groupName": "advanced"
},
{
@@ -73,7 +73,7 @@
"label": "Job parameters",
"defaultValue": "",
"required": false,
- "helpMarkDown": "Specify job parameters, one per line, in the form `=`
To set a parameter to an empty value (useful for overriding a default value) leave off the paramter value, e.g. specify `=`
Variables are supported, e.g. to define the `commitId` paramter to be the `git commit ID` for the build, use: `commitId=$(Build.SourceVersion)`. See the [documentation on variables](https://www.visualstudio.com/docs/build/define/variables) for more details.
Supported Jenkins parameter types are:
`Boolean`
`String`
`Choice`
`Password`
",
+ "helpMarkDown": "Specify job parameters, one per line, in the form `=`
To set a parameter to an empty value (useful for overriding a default value), leave off the parameter value. For example, specify `=`
Variables are supported. For example, to set a `commitId` parameter value to the Git commit ID of the build, use: `commitId=$(Build.SourceVersion)`. See the [documentation on variables](https://www.visualstudio.com/docs/build/define/variables) for more details.
Supported Jenkins parameter types are:
`Boolean`
`Choice`
`Password`
`String`
",
"groupName": "advanced",
"visibleRule": "parameterizedJob = true",
"properties": {
@@ -88,4 +88,4 @@
"argumentFormat": ""
}
}
-}
\ No newline at end of file
+}
diff --git a/Tasks/JenkinsQueueJob/task.loc.json b/Tasks/JenkinsQueueJob/task.loc.json
index 67d449866d56..1775cad115bf 100644
--- a/Tasks/JenkinsQueueJob/task.loc.json
+++ b/Tasks/JenkinsQueueJob/task.loc.json
@@ -14,7 +14,7 @@
"version": {
"Major": 1,
"Minor": 1,
- "Patch": 3
+ "Patch": 5
},
"groups": [
{
diff --git a/Tasks/Maven/README.md b/Tasks/Maven/README.md
index e0af3359e3fe..ee497548278b 100644
--- a/Tasks/Maven/README.md
+++ b/Tasks/Maven/README.md
@@ -37,10 +37,16 @@ Use the next options to manage your `JAVA_HOME` attribute by JDK Version and Pat
- **JDK Architecture :** Select the approriate JDK Architecture. By default it is set to `x86`
-####SonarQube Analysis
+####Code Analysis
- **Run SonarQube Analysis :** You can choose to run SonarQube analysis after executing the current goals. 'install' or 'package' goals should be executed first. To know more about this option [click here](https://blogs.msdn.com/b/visualstudioalm/archive/2015/10/08/the-maven-build-task-now-simplifies-sonarqube-analysis.aspx)
+- **Run Checkstyle :** You can choose to run the Checkstyle static code analysis tool, which checks the compliance of your source code with coding rules. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
+- **Run PMD :** You can choose to run the PMD static code analysis tool, which examines your source code for possible bugs. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
+- **Run FindBugs :** You can choose to run the FindBugs static code analysis tool, which examines the bytecode of your program for possible bugs. You will receive a code analysis report with the number of violations detected, as well as the original report files if there were any violations.
+
diff --git a/Tasks/Maven/task.json b/Tasks/Maven/task.json
index 16818377b75a..b0c4d4fd6c5d 100644
--- a/Tasks/Maven/task.json
+++ b/Tasks/Maven/task.json
@@ -8,6 +8,10 @@
"visibility": [
"Build",
"Release"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"demands": [
@@ -16,7 +20,7 @@
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 76
+ "Patch": 77
},
"minimumAgentVersion": "1.89.0",
"instanceNameFormat": "Maven $(mavenPOMFile)",
diff --git a/Tasks/Maven/task.loc.json b/Tasks/Maven/task.loc.json
index d43f5312cdf2..f557af7d8b51 100644
--- a/Tasks/Maven/task.loc.json
+++ b/Tasks/Maven/task.loc.json
@@ -9,6 +9,10 @@
"Build",
"Release"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"demands": [
"maven"
@@ -16,7 +20,7 @@
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 76
+ "Patch": 77
},
"minimumAgentVersion": "1.89.0",
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
diff --git a/Tasks/Npm/task.json b/Tasks/Npm/task.json
index 8b5d6d8cf9b7..1e260904b3ac 100644
--- a/Tasks/Npm/task.json
+++ b/Tasks/Npm/task.json
@@ -11,6 +11,10 @@
"Minor": 2,
"Patch": 20
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [
"npm"
],
diff --git a/Tasks/Npm/task.loc.json b/Tasks/Npm/task.loc.json
index 4f4ccf9218fa..d858a5130fbb 100644
--- a/Tasks/Npm/task.loc.json
+++ b/Tasks/Npm/task.loc.json
@@ -9,8 +9,12 @@
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 19
+ "Patch": 20
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [
"npm"
],
diff --git a/Tasks/NuGetInstaller/task.json b/Tasks/NuGetInstaller/task.json
index a219a4dcf9fc..5965db5b5dd6 100644
--- a/Tasks/NuGetInstaller/task.json
+++ b/Tasks/NuGetInstaller/task.json
@@ -9,8 +9,12 @@
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 24
+ "Patch": 25
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"minimumAgentVersion": "1.83.0",
"groups": [
{
diff --git a/Tasks/NuGetInstaller/task.loc.json b/Tasks/NuGetInstaller/task.loc.json
index ee813d5f9ea9..3ec1d98acc1f 100644
--- a/Tasks/NuGetInstaller/task.loc.json
+++ b/Tasks/NuGetInstaller/task.loc.json
@@ -9,8 +9,12 @@
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 24
+ "Patch": 25
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"minimumAgentVersion": "1.83.0",
"groups": [
{
diff --git a/Tasks/NuGetPublisher/task.json b/Tasks/NuGetPublisher/task.json
index 4a95f901387d..c156f1f8b83c 100644
--- a/Tasks/NuGetPublisher/task.json
+++ b/Tasks/NuGetPublisher/task.json
@@ -9,8 +9,12 @@
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 24
+ "Patch": 25
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [
"Cmd"
],
diff --git a/Tasks/NuGetPublisher/task.loc.json b/Tasks/NuGetPublisher/task.loc.json
index bdcf32a5090f..dfd110a91825 100644
--- a/Tasks/NuGetPublisher/task.loc.json
+++ b/Tasks/NuGetPublisher/task.loc.json
@@ -9,8 +9,12 @@
"version": {
"Major": 0,
"Minor": 2,
- "Patch": 24
+ "Patch": 25
},
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"demands": [
"Cmd"
],
diff --git a/Tasks/PublishCodeCoverageResults/task.json b/Tasks/PublishCodeCoverageResults/task.json
index 84e1a7621b99..0ef863a7c638 100644
--- a/Tasks/PublishCodeCoverageResults/task.json
+++ b/Tasks/PublishCodeCoverageResults/task.json
@@ -7,12 +7,16 @@
"category": "Test",
"visibility": [
"Build"
+ ],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 16
+ "Patch": 17
},
"demands": [],
"minimumAgentVersion": "1.90.0",
diff --git a/Tasks/PublishCodeCoverageResults/task.loc.json b/Tasks/PublishCodeCoverageResults/task.loc.json
index e80d1c93dcc2..8cb72aa126f5 100644
--- a/Tasks/PublishCodeCoverageResults/task.loc.json
+++ b/Tasks/PublishCodeCoverageResults/task.loc.json
@@ -8,11 +8,15 @@
"visibility": [
"Build"
],
+ "runsOn": [
+ "Agent",
+ "MachineGroup"
+ ],
"author": "Microsoft Corporation",
"version": {
"Major": 1,
"Minor": 0,
- "Patch": 16
+ "Patch": 17
},
"demands": [],
"minimumAgentVersion": "1.90.0",
diff --git a/Tasks/QuickPerfTest/CltTasksUtility.ps1 b/Tasks/QuickPerfTest/CltTasksUtility.ps1
index 1818ea42f172..7ce94246cf0c 100644
--- a/Tasks/QuickPerfTest/CltTasksUtility.ps1
+++ b/Tasks/QuickPerfTest/CltTasksUtility.ps1
@@ -1,9 +1,9 @@
function InvokeRestMethod($headers, $contentType, $uri , $method= "Get", $body)
{
- $ServicePoint = [System.Net.ServicePointManager]::FindServicePoint($uri)
- $result = Invoke-RestMethod -ContentType "application/json" -UserAgent $global:userAgent -TimeoutSec $global:RestTimeout -Uri $uri -Method $method -Headers $headers -Body $body
- $ServicePoint.CloseConnectionGroup("")
- return $result
+ $ServicePoint = [System.Net.ServicePointManager]::FindServicePoint($uri)
+ $result = Invoke-RestMethod -ContentType "application/json" -UserAgent $global:userAgent -TimeoutSec $global:RestTimeout -Uri $uri -Method $method -Headers $headers -Body $body
+ $ServicePoint.CloseConnectionGroup("")
+ return $result
}
function ComposeTestDropJson($name, $duration, $homepage, $vu, $geoLocation)
@@ -28,32 +28,32 @@ function ComposeTestDropJson($name, $duration, $homepage, $vu, $geoLocation)
}
"@
- return $tdjson
+ return $tdjson
}
function CreateTestDrop($headers, $dropJson, $CltAccountUrl)
{
- $uri = [String]::Format("{0}/_apis/clt/testdrops?api-version=1.0", $CltAccountUrl)
- $drop = InvokeRestMethod -contentType "application/json" -uri $uri -method Post -headers $headers -body $dropJson
+ $uri = [String]::Format("{0}/_apis/clt/testdrops?api-version=1.0", $CltAccountUrl)
+ $drop = InvokeRestMethod -contentType "application/json" -uri $uri -method Post -headers $headers -body $dropJson
- return $drop
+ return $drop
}
function GetTestDrop($headers, $drop, $CltAccountUrl)
{
- $uri = [String]::Format("{0}/_apis/clt/testdrops/{1}?api-version=1.0", $CltAccountUrl, $drop.id)
- $testdrop = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+ $uri = [String]::Format("{0}/_apis/clt/testdrops/{1}?api-version=1.0", $CltAccountUrl, $drop.id)
+ $testdrop = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
- return $testdrop
+ return $testdrop
}
function UploadTestDrop($testdrop)
{
- $uri = New-Object System.Uri($testdrop.accessData.dropContainerUrl)
- $sas = New-Object Microsoft.WindowsAzure.Storage.Auth.StorageCredentials($testdrop.accessData.sasKey)
- $container = New-Object Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer($uri, $sas)
+ $uri = New-Object System.Uri($testdrop.accessData.dropContainerUrl)
+ $sas = New-Object Microsoft.WindowsAzure.Storage.Auth.StorageCredentials($testdrop.accessData.sasKey)
+ $container = New-Object Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer($uri, $sas)
- return $container
+ return $container
}
#function GetTestRuns($headers, $CltAccountUrl)
@@ -66,59 +66,59 @@ function UploadTestDrop($testdrop)
function GetTestRunUri($testRunId, $headers, $CltAccountUrl)
{
- $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl,$testRunId)
- $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
-
- return $run.WebResultUrl
+ $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl,$testRunId)
+ $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+
+ return $run.WebResultUrl
}
function RunInProgress($run)
{
- return $run.state -eq "queued" -or $run.state -eq "inProgress"
+ return $run.state -eq "queued" -or $run.state -eq "inProgress"
}
function MonitorTestRun($headers, $run, $CltAccountUrl)
{
- $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl, $run.id)
- $prevState = $run.state
- $prevSubState = $run.subState
- Write-Output ("Load test '{0}' is in state '{1}|{2}'." -f $run.name, $run.state, $run.subState)
-
- do
- {
- Start-Sleep -s 15
- $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
- if ($prevState -ne $run.state -or $prevSubState -ne $run.subState)
- {
- $prevState = $run.state
- $prevSubState = $run.subState
- Write-Output ("Load test '{0}' is in state '{1}|{2}'." -f $run.name, $run.state, $run.subState)
- }
- }
- while (RunInProgress $run)
-
- $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
- Write-Output "------------------------------------"
- $uri = [String]::Format("{0}/_apis/clt/testruns/{1}/messages?api-version=1.0", $CltAccountUrl, $run.id)
- $messages = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
-
- if ($messages)
- {
- $timeSorted = $messages.value | Sort-Object loggedDate
- foreach ($message in $timeSorted)
- {
- switch ($message.messageType)
- {
- "info" { Write-Host -NoNewline ("[Message]{0}" -f $message.message) }
- "output" { Write-Host -NoNewline ("[Output]{0}" -f $message.message) }
- "warning" { Write-Warning $message.message }
- "error" { Write-Error $message.message }
- "critical" { Write-Error $message.message }
- }
- }
- }
-
- Write-Output "------------------------------------"
+ $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl, $run.id)
+ $prevState = $run.state
+ $prevSubState = $run.subState
+ Write-Output ("Load test '{0}' is in state '{1}|{2}'." -f $run.name, $run.state, $run.subState)
+
+ do
+ {
+ Start-Sleep -s 15
+ $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+ if ($prevState -ne $run.state -or $prevSubState -ne $run.subState)
+ {
+ $prevState = $run.state
+ $prevSubState = $run.subState
+ Write-Output ("Load test '{0}' is in state '{1}|{2}'." -f $run.name, $run.state, $run.subState)
+ }
+ }
+ while (RunInProgress $run)
+
+ $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+ Write-Output "------------------------------------"
+ $uri = [String]::Format("{0}/_apis/clt/testruns/{1}/messages?api-version=1.0", $CltAccountUrl, $run.id)
+ $messages = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+
+ if ($messages)
+ {
+ $timeSorted = $messages.value | Sort-Object loggedDate
+ foreach ($message in $timeSorted)
+ {
+ switch ($message.messageType)
+ {
+ "info" { Write-Host -NoNewline ("[Message]{0}" -f $message.message) }
+ "output" { Write-Host -NoNewline ("[Output]{0}" -f $message.message) }
+ "warning" { Write-Warning $message.message }
+ "error" { Write-Error $message.message }
+ "critical" { Write-Error $message.message }
+ }
+ }
+ }
+
+ Write-Output "------------------------------------"
}
function ComposeTestRunJson($name, $tdid, $machineType)
@@ -134,44 +134,44 @@ function ComposeTestRunJson($name, $tdid, $machineType)
}
"@
- return $trjson
+ return $trjson
}
function QueueTestRun($headers, $runJson, $CltAccountUrl)
{
- $uri = [String]::Format("{0}/_apis/clt/testruns?api-version=1.0", $CltAccountUrl)
- $run = InvokeRestMethod -contentType "application/json" -uri $uri -method Post -headers $headers -body $runJson
+ $uri = [String]::Format("{0}/_apis/clt/testruns?api-version=1.0", $CltAccountUrl)
+ $run = InvokeRestMethod -contentType "application/json" -uri $uri -method Post -headers $headers -body $runJson
$start = @"
{
- "state": "queued"
+ "state": "queued"
}
"@
- $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl, $run.id)
- InvokeRestMethod -contentType "application/json" -uri $uri -method Patch -headers $headers -body $start
- $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
+ $uri = [String]::Format("{0}/_apis/clt/testruns/{1}?api-version=1.0", $CltAccountUrl, $run.id)
+ InvokeRestMethod -contentType "application/json" -uri $uri -method Patch -headers $headers -body $start
+ $run = InvokeRestMethod -contentType "application/json" -uri $uri -headers $headers
- return $run
+ return $run
}
function ComposeAccountUrl($connectedServiceUrl, $headers)
{
#Load all dependent files for execution
- . $PSScriptRoot/VssConnectionHelper.ps1
+ . $PSScriptRoot/VssConnectionHelper.ps1
$connectedServiceUrl = $connectedServiceUrl.TrimEnd('/')
Write-Host "Getting Clt Endpoint:"
$elsUrl = Get-CltEndpoint $connectedServiceUrl $headers
- return $elsUrl
+ return $elsUrl
}
function ValidateInputs($websiteUrl, $tfsCollectionUrl, $connectedServiceName)
{
- if (![System.Uri]::IsWellFormedUriString($websiteUrl, [System.UriKind]::Absolute))
- {
- throw "Website Url is not well formed."
- }
+ if (![System.Uri]::IsWellFormedUriString($websiteUrl, [System.UriKind]::Absolute))
+ {
+ throw "Website Url is not well formed."
+ }
if([string]::IsNullOrWhiteSpace($connectedServiceName) -and $tfsCollectionUrl -notlike "*VISUALSTUDIO.COM*" -and $tfsCollectionUrl -notlike "*TFSALLIN.NET*")
{
@@ -189,3 +189,10 @@ function UploadSummaryMdReport($summaryMdPath)
}
}
+function IsNumericValue ($str) {
+ $numericValue = 0
+ $isNum = [System.Int32]::TryParse($str, [ref]$numericValue)
+ return $isNum
+}
+
+
diff --git a/Tasks/QuickPerfTest/CltThresholdValidationHelper.ps1 b/Tasks/QuickPerfTest/CltThresholdValidationHelper.ps1
new file mode 100644
index 000000000000..ea7e6c6971e4
--- /dev/null
+++ b/Tasks/QuickPerfTest/CltThresholdValidationHelper.ps1
@@ -0,0 +1,37 @@
+function GetResultsSummary($cltAccountUrl,$headers,$testRunId)
+{
+ $getResultsSummaryUri = [string]::Format("{0}/_apis/clt/testRuns/{1}/ResultSummary", $cltAccountUrl, $testRunId)
+ $resultsSummary = InvokeRestMethod -Uri $getResultsSummaryUri -contentType "application/json" -headers $headers -Method Get
+ if($resultsSummary -eq $null)
+ {
+ throw "Unable to fetch the result summary for the run"
+ }
+ return $resultsSummary
+}
+
+function ValidateAvgResponseTimeThresholdInput($avgResponseTimeThreshold)
+{
+ if ($avgResponseTimeThreshold -eq 0)
+ {
+ return $null
+ }
+
+ if(((IsNumericValue $avgResponseTimeThreshold) -ne $true) -or [System.Int32]$avgResponseTimeThreshold -lt 0)
+ {
+ throw "Avg. Response Time threshold should be a positive numeric value.Please specify a valid threshold value and try again "
+ }
+ return $avgResponseTimeThreshold
+}
+
+function ValidateAvgResponseTimeThreshold($cltAccountUrl,$headers,$testRunId,$avgResponseTimeThreshold)
+{
+ $resultsSummary = GetResultsSummary $cltAccountUrl $headers $testRunId
+ if($resultsSummary -and $resultsSummary.overallRequestSummary -and $resultsSummary.overallRequestSummary.averageResponseTime)
+ {
+ return ($resultsSummary.overallRequestSummary.averageResponseTime -lt ($avgResponseTimeThreshold/1000))
+ }
+ else
+ {
+ throw "Unable to fetch the result summary for the run"
+ }
+}
\ No newline at end of file
diff --git a/Tasks/QuickPerfTest/Invoke-QuickPerfTest.ps1 b/Tasks/QuickPerfTest/Invoke-QuickPerfTest.ps1
index 07e5ef655423..1e127f06d79f 100644
--- a/Tasks/QuickPerfTest/Invoke-QuickPerfTest.ps1
+++ b/Tasks/QuickPerfTest/Invoke-QuickPerfTest.ps1
@@ -1,53 +1,55 @@
[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
- [String]
- $env:SYSTEM_DEFINITIONID,
- [String]
- $env:BUILD_BUILDID,
-
- [String] [Parameter(Mandatory = $false)]
- $connectedServiceName,
-
- [String] [Parameter(Mandatory = $true)]
- $websiteUrl,
- [String] [Parameter(Mandatory = $true)]
- $testName,
- [String] [Parameter(Mandatory = $true)]
- $vuLoad,
- [String] [Parameter(Mandatory = $true)]
- $runDuration,
- [String] [Parameter(Mandatory = $true)]
- $geoLocation,
- [String] [Parameter(Mandatory = $true)]
- $machineType
+[String]
+$env:SYSTEM_DEFINITIONID,
+[String]
+$env:BUILD_BUILDID,
+
+[String] [Parameter(Mandatory = $false)]
+$connectedServiceName,
+
+[String] [Parameter(Mandatory = $true)]
+$websiteUrl,
+[String] [Parameter(Mandatory = $true)]
+$testName,
+[String] [Parameter(Mandatory = $true)]
+$vuLoad,
+[String] [Parameter(Mandatory = $true)]
+$runDuration,
+[String] [Parameter(Mandatory = $true)]
+$geoLocation,
+[String] [Parameter(Mandatory = $true)]
+$machineType,
+[String] [Parameter(Mandatory = $false)]
+$avgResponseTimeThreshold
)
function InitializeRestHeaders()
{
- $restHeaders = New-Object -TypeName "System.Collections.Generic.Dictionary[[String], [String]]"
+ $restHeaders = New-Object -TypeName "System.Collections.Generic.Dictionary[[String], [String]]"
if([string]::IsNullOrWhiteSpace($connectedServiceName))
{
- $patToken = Get-AccessToken $connectedServiceDetails
+ $patToken = GetAccessToken $connectedServiceDetails
ValidatePatToken $patToken
$restHeaders.Add("Authorization", [String]::Concat("Bearer ", $patToken))
-
- }
+
+ }
else
{
- $Username = $connectedServiceDetails.Authorization.Parameters.Username
- Write-Verbose "Username = $Username" -Verbose
- $Password = $connectedServiceDetails.Authorization.Parameters.Password
- $alternateCreds = [String]::Concat($Username, ":", $Password)
- $basicAuth = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($alternateCreds))
- $restHeaders.Add("Authorization", [String]::Concat("Basic ", $basicAuth))
+ $Username = $connectedServiceDetails.Authorization.Parameters.Username
+ Write-Verbose "Username = $Username" -Verbose
+ $Password = $connectedServiceDetails.Authorization.Parameters.Password
+ $alternateCreds = [String]::Concat($Username, ":", $Password)
+ $basicAuth = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($alternateCreds))
+ $restHeaders.Add("Authorization", [String]::Concat("Basic ", $basicAuth))
}
- return $restHeaders
+ return $restHeaders
}
-function Get-AccessToken($vssEndPoint)
+function GetAccessToken($vssEndPoint)
{
- return $vssEndpoint.Authorization.Parameters.AccessToken
+ return $vssEndpoint.Authorization.Parameters.AccessToken
}
function ValidatePatToken($token)
@@ -58,10 +60,11 @@ function ValidatePatToken($token)
}
}
- # Load all dependent files for execution
- . $PSScriptRoot/CltTasksUtility.ps1
- . $PSScriptRoot/VssConnectionHelper.ps1
-
+# Load all dependent files for execution
+. $PSScriptRoot/CltTasksUtility.ps1
+. $PSScriptRoot/VssConnectionHelper.ps1
+. $PSScriptRoot/CltThresholdValidationHelper
+
$userAgent = "QuickPerfTestBuildTask"
$global:RestTimeout = 60
@@ -85,13 +88,18 @@ Write-Output "Run source identifier = build/$env:SYSTEM_DEFINITIONID/$env:BUILD_
#Validate Input
ValidateInputs $websiteUrl $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI $connectedServiceName
+#Process Threshold Rules
+Write-Output "Initializing threshold rule for avg. response time with value(ms) : $avgResponseTimeThreshold "
+$avgResponseTimeThreshold = ValidateAvgResponseTimeThresholdInput $avgResponseTimeThreshold
+
+#Initialize Connected Service Details
if([string]::IsNullOrWhiteSpace($connectedServiceName))
{
$connectedServiceDetails = Get-ServiceEndpoint -Context $distributedTaskContext -Name SystemVssConnection
}
else
{
- $connectedServiceDetails = Get-ServiceEndpoint -Context $distributedTaskContext -Name $connectedServiceName
+ $connectedServiceDetails = Get-ServiceEndpoint -Context $distributedTaskContext -Name $connectedServiceName
}
$VSOAccountUrl = $connectedServiceDetails.Url.AbsoluteUri
@@ -109,30 +117,54 @@ $drop = CreateTestDrop $headers $dropjson $CltAccountUrl
if ($drop.dropType -eq "InPlaceDrop")
{
- $runJson = ComposeTestRunJson $testName $drop.id $MachineType
- $run = QueueTestRun $headers $runJson $CltAccountUrl
- MonitorTestRun $headers $run $CltAccountUrl
- $webResultsUrl = GetTestRunUri $run.id $headers $CltAccountUrl
+ $runJson = ComposeTestRunJson $testName $drop.id $MachineType
+ $run = QueueTestRun $headers $runJson $CltAccountUrl
+ MonitorTestRun $headers $run $CltAccountUrl
+ $webResultsUrl = GetTestRunUri $run.id $headers $CltAccountUrl
+
+ Write-Output ("Run-id for this load test is {0} and its name is '{1}'." -f $run.runNumber, $run.name)
+ Write-Output ("To view run details navigate to {0}" -f $webResultsUrl)
+ Write-Output "To view detailed results navigate to Load Test | Load Test Manager in Visual Studio IDE, and open this run."
+
+ $resultsMDFolder = New-Item -ItemType Directory -Force -Path "$env:Temp\LoadTestResultSummary"
+ $resultFilePattern = ("QuickPerfTestResults_{0}_{1}_*.md" -f $env:AGENT_ID, $env:SYSTEM_DEFINITIONID)
+ $excludeFilePattern = ("QuickPerfTestResults_{0}_{1}_{2}_*.md" -f $env:AGENT_ID, $env:SYSTEM_DEFINITIONID, $env:BUILD_BUILDID)
- Write-Output ("Run-id for this load test is {0} and its name is '{1}'." -f $run.runNumber, $run.name)
- Write-Output ("To view run details navigate to {0}" -f $webResultsUrl)
- Write-Output "To view detailed results navigate to Load Test | Load Test Manager in Visual Studio IDE, and open this run."
-
- $resultsMDFolder = New-Item -ItemType Directory -Force -Path "$env:Temp\LoadTestResultSummary"
- $resultFilePattern = ("QuickPerfTestResults_{0}_{1}_*.md" -f $env:AGENT_ID, $env:SYSTEM_DEFINITIONID)
- $excludeFilePattern = ("QuickPerfTestResults_{0}_{1}_{2}_*.md" -f $env:AGENT_ID, $env:SYSTEM_DEFINITIONID, $env:BUILD_BUILDID)
- Remove-Item $resultsMDFolder\$resultFilePattern -Exclude $excludeFilePattern -Force
- $summaryFile = ("{0}\QuickPerfTestResults_{1}_{2}_{3}_{4}.md" -f $resultsMDFolder, $env:AGENT_ID, $env:SYSTEM_DEFINITIONID, $env:BUILD_BUILDID, $run.id)
- $summary = ('[Test Run: {0}]({1}) using {2}. ' -f $run.runNumber, $webResultsUrl ,$run.name)
-
- ('
{0}
' -f $summary) >> $summaryFile
- UploadSummaryMdReport $summaryFile
+ if($avgResponseTimeThreshold)
+ {
+ $avgResponseTimeThresholdValidationResult = ValidateAvgResponseTimeThreshold $CltAccountUrl $headers $run.id $avgResponseTimeThreshold
+ if($avgResponseTimeThresholdValidationResult -eq $false)
+ {
+ Write-Output "The Avg.Response Time for the run is greater than the threshold value of $avgResponseTimeThreshold specified for the run "
+ Write-Output "To view detailed results navigate to Load Test | Load Test Manager in Visual Studio IDE, and open this run."
+ Write-Error "Load test task is marked as failed, as there were threshold violations for the Avg. Response Time"
+ }
+ }
+
+ Remove-Item $resultsMDFolder\$resultFilePattern -Exclude $excludeFilePattern -Force
+ $summaryFile = ("{0}\QuickPerfTestResults_{1}_{2}_{3}_{4}.md" -f $resultsMDFolder, $env:AGENT_ID, $env:SYSTEM_DEFINITIONID, $env:BUILD_BUILDID, $run.id)
+
+ if ($thresholdViolationsCount -gt 0)
+ {
+ $thresholdMessage=("{0} thresholds violated." -f $thresholdViolationsCount)
+ $thresholdImage="bowtie-status-error"
+ }
+ else
+ {
+ $thresholdMessage="No thresholds violated."
+ $thresholdImage="bowtie-status-success"
+ }
+ $summary = ('[Test Run: {0}]({1}) using {2}. ' -f $run.runNumber, $webResultsUrl ,$run.name)
+ $summary = (' {4} [Test Run: {0}]({1}) using {2}. ' -f $run.runNumber, $webResultsUri , $run.name, $thresholdImage, $thresholdMessage)
+
+ ('