From c1edf639c5f34ea8f9fabe6b150d6b3f0ba26cb9 Mon Sep 17 00:00:00 2001 From: avdbrink Date: Thu, 28 Feb 2019 12:27:48 +0100 Subject: [PATCH] Initial commit of VSTS-SSRS-Extention --- .gitignore | 333 ++++++++++++ DeploySSRSTask/DeploySSRSTask.ps1 | 267 +++++++++ DeploySSRSTask/icon.png | Bin 0 -> 1136 bytes .../ps_modules/VstsTaskSdk/FindFunctions.ps1 | 292 ++++++++++ .../ps_modules/VstsTaskSdk/InputFunctions.ps1 | 305 +++++++++++ .../VstsTaskSdk/LocalizationFunctions.ps1 | 150 ++++++ .../VstsTaskSdk/LoggingCommandFunctions.ps1 | 506 ++++++++++++++++++ .../VstsTaskSdk/LongPathFunctions.ps1 | 365 +++++++++++++ .../ps_modules/VstsTaskSdk/OutFunctions.ps1 | 79 +++ .../VstsTaskSdk/ServerOMFunctions.ps1 | 57 ++ .../resources.resjson/de-de/resources.resjson | 17 + .../resources.resjson/en-US/resources.resjson | 17 + .../resources.resjson/es-es/resources.resjson | 17 + .../resources.resjson/fr-fr/resources.resjson | 17 + .../resources.resjson/it-IT/resources.resjson | 17 + .../resources.resjson/ja-jp/resources.resjson | 17 + .../resources.resjson/ko-KR/resources.resjson | 17 + .../resources.resjson/ru-RU/resources.resjson | 17 + .../resources.resjson/zh-CN/resources.resjson | 17 + .../resources.resjson/zh-TW/resources.resjson | 17 + .../ps_modules/VstsTaskSdk/ToolFunctions.ps1 | 99 ++++ .../ps_modules/VstsTaskSdk/TraceFunctions.ps1 | 136 +++++ .../ps_modules/VstsTaskSdk/VstsTaskSdk.psd1 | Bin 0 -> 1736 bytes .../ps_modules/VstsTaskSdk/VstsTaskSdk.psm1 | 151 ++++++ .../ps_modules/VstsTaskSdk/lib.json | 19 + DeploySSRSTask/task.json | 126 +++++ README.md | 25 + [Content_Types].xml | 15 + images/logo.png | Bin 0 -> 7751 bytes images/ssrs.png | Bin 0 -> 7751 bytes package.json | 30 ++ readme.txt | 14 + vss-extension.json | 74 +++ 33 files changed, 3213 insertions(+) create mode 100644 .gitignore create mode 100644 DeploySSRSTask/DeploySSRSTask.ps1 create mode 100644 DeploySSRSTask/icon.png create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/FindFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/InputFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/LocalizationFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/LoggingCommandFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/LongPathFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/OutFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/ServerOMFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/de-de/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/en-US/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/es-es/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/fr-fr/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/ja-jp/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/ToolFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/TraceFunctions.ps1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/VstsTaskSdk.psd1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/VstsTaskSdk.psm1 create mode 100644 DeploySSRSTask/ps_modules/VstsTaskSdk/lib.json create mode 100644 DeploySSRSTask/task.json create mode 100644 README.md create mode 100644 [Content_Types].xml create mode 100644 images/logo.png create mode 100644 images/ssrs.png create mode 100644 package.json create mode 100644 readme.txt create mode 100644 vss-extension.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b2aca41 --- /dev/null +++ b/.gitignore @@ -0,0 +1,333 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# Visual Studio Extension files +*.vsix + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +.vscode/ +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ \ No newline at end of file diff --git a/DeploySSRSTask/DeploySSRSTask.ps1 b/DeploySSRSTask/DeploySSRSTask.ps1 new file mode 100644 index 0000000..0bdd72e --- /dev/null +++ b/DeploySSRSTask/DeploySSRSTask.ps1 @@ -0,0 +1,267 @@ +# +# DeploySSRSTask.ps1 +# +[CmdletBinding(DefaultParameterSetName = 'None')] +param () +Trace-VstsEnteringInvocation $MyInvocation + +function EscapeSpecialChars { + param( + [string]$str + ) + + return $str.Replace('`', '``').Replace('"', '`"').Replace('$', '`$') +} + + +function DeploySsrsProject { + param( + [string]$projpath + ) + + $Folder = Split-Path -Path $projPath + $ProjFile= Split-Path -leaf $projPath + Write-Host ("Deploying project") + if ( (test-path("$($Folder)\OutputLog.txt")) ) {Remove-Item "$($Folder)\OutputLog.txt"} + if ( (test-path("$($Folder)\ErrorLog.txt")) ) {Remove-Item "$($Folder)\ErrorLog.txt"} + $ArgumentList = " ""$($projpath)"" /deploy """" /out ""$($Folder)\ErrorLog.txt""" + try { + + Write-host "start $devenv $ArgumentList" + Start-Process $devenv $ArgumentList -NoNewWindow -PassThru -Wait -Verbose -RedirectStandardOutput "$($Folder)\OutputLog.txt" + + #Lees standard output logfile uit # + $Logfile = Get-Content "$($Folder)\OutputLog.txt" + $MatchCriteria = "Create|avoid|Consolidate|Define|Exception|Does not have|do not exist|Missing|Could not find|Failed to|are not supported|Cannot|Invalid" + + + #Print de gehele standard output inclusief de warnings - Het parsen van de file is uitgecommentarieerd# + $Logfile | ForEach-Object { + + if ($_ -match $MatchCriteria ) { + + write-host "##vso[task.logissue type=warning;] $_" + $teller += 1 + } + Else {write-host $_} + } + if ($teller -eq 1) { + write-host "A warning is identified by reading the logfile and to look for the following keywords ""$($MatchCriteria)""" + write-host "##vso[task.logissue type=warning;] $($teller) warning occurred while deploying $($ProjFile), see the Build step log for an overview of all the warnings" + } + elseif($teller -ge 1) { + write-host "A warning is identified by reading the logfile and to look for the following keywords ""$($MatchCriteria)""" + write-host "##vso[task.logissue type=warning;] $($teller) warnings occurred while deploying $($ProjFile), see the Build step log for an overview of all the warnings" + } + + #Controleren of er errors zijn in de logfile# + + #Controleren of er errors zijn in de logfile# + $ErrorLogfile = Get-Content "$($Folder)\ErrorLog.txt" + $Errorlogfile | ForEach-Object { + if ( ($_ -notmatch "failed|skipped|succeeded or up-to-date")) { + write-host "$_" + } + elseif ( ($_ -notmatch "0 failed, 0 skipped")) { + write-host "##vso[task.logissue type=error;] $($ProjFile):$($_)" + $CompleteResultStatus = "##vso[task.complete result=Failed;]" + + } + else { + Write-Host $_ + } + + } + $CompleteResultStatus + + + + } + catch { + Write-Host ("##vso[task.logissue type=error;]Task_InternalError " + $_.Exception.Message) + } +} + +function TrimInputs([ref]$Project) { + Write-Verbose "Triming inputs for excess spaces, double quotes" + + #$sqlUsername.Value = $sqlUsername.Value.Trim() + + $Project.Value = $Project.Value.Trim('"', ' ') +} + +function SetProjectConfig { + param( + [string]$projpath, + [string]$TargetServerVersion = "SSRS2016", + [bool]$CreateSubfolders = $false + ) + + if ($CreateSubfolders) { + # Count the number of reports in the report project + # If there's more than 1 .rdl file the project will be deployed to a sub-folder + $countReports = 0 + Get-ChildItem -Path (Split-Path -Path $projpath) -Filter *.rdl -Recurse -File -Name| ForEach-Object { + if ($_ -inotmatch "bin\\") { $countReports ++ } + } + if ($countReports -gt 1) { + $TargetFolder = $TargetFolder + "/" + ([System.IO.Path]::GetFileNameWithoutExtension($projpath)) + } + } + + [XML]$AppConfig = (Get-Content -path ($projpath)) + IF ($AppConfig.project.PropertyGroup) { + Foreach ($item in $AppConfig.project.PropertyGroup) { + + if (![string]::IsNullOrEmpty($item.TargetReportFolder)) {$item.TargetReportFolder = $TargetFolder} + if (![string]::IsNullOrEmpty($item.TargetServerVersion)) {$item.TargetServerVersion = $TargetServerVersion} + if (![string]::IsNullOrEmpty($item.TargetDatasetFolder)) {$item.TargetDatasetFolder = $DataSetFolder} + if (![string]::IsNullOrEmpty($item.TargetDataSourceFolder)) {$item.TargetDataSourceFolder = $DataSourceFolder} + if (![string]::IsNullOrEmpty($item.TargetServerURL)) {$item.TargetServerURL = $TargetServerURL} + if (![string]::IsNullOrEmpty($item.OverwriteDatasets)) {$item.OverwriteDatasets = $OverwriteDatasets} + if (![string]::IsNullOrEmpty($item.OverwriteDataSources)) {$item.OverwriteDataSources = $OverwriteDataSources} + } + } + Else { + Foreach ($item in $AppConfig.Project.Configurations.Configuration) { + if (![string]::IsNullOrEmpty($item.Options.TargetFolder)) {$item.Options.TargetFolder = $TargetFolder} + if (![string]::IsNullOrEmpty($item.Options.TargetServerVersion)) {$item.Options.TargetServerVersion = $TargetServerVersion} + if (![string]::IsNullOrEmpty($item.Options.TargetDatasetFolder)) {$item.Options.TargetDatasetFolder = $DataSetFolder} + if (![string]::IsNullOrEmpty($item.Options.TargetDataSourceFolder)) {$item.Options.TargetDataSourceFolder = $DataSourceFolder} + if (![string]::IsNullOrEmpty($item.Options.TargetServerURL)) {$item.Options.TargetServerURL = $TargetServerURL} + if (![string]::IsNullOrEmpty($item.Options.OverwriteDatasets)) {$item.Options.OverwriteDatasets = $OverwriteDatasets} + if (![string]::IsNullOrEmpty($item.Options.OverwriteDataSources)) {$item.Options.OverwriteDataSources = $OverwriteDataSources} + } + } + + $AppConfig.OuterXml | Out-File -filepath ($projpath) -Force -Encoding UTF8 +} + +## Main routine start +try { + # Import the localized strings. + Import-VstsLocStrings "$PSScriptRoot\Task.json" + + Write-host ("==============================================================================") + Write-Host (Get-VstsLocString -Key StartingTask) + + # Read VSTS input parameters and clean + $Project = EscapeSpecialChars -str (Get-VstsInput -Name Project -Require) + $Configuration = EscapeSpecialChars -str (Get-VstsInput -Name Configuration -Require) + $OverwriteProjectConfiguration = Get-VstsInput -Name OverwriteProjectConfiguration -Require -AsBool + $TargetServerURL = EscapeSpecialChars -str (Get-VstsInput -Name TargetServerURL -Require) + $TargetFolder = EscapeSpecialChars -str (Get-VstsInput -Name TargetFolder -Require) + $DataSourceFolder = EscapeSpecialChars -str (Get-VstsInput -Name DataSourceFolder -Require) + $DataSetFolder = EscapeSpecialChars -str (Get-VstsInput -Name DataSetFolder -Require) + $OverwriteDataSources = EscapeSpecialChars -str (Get-VstsInput -Name OverwriteDataSources -Require) + $OverwriteDatasets = EscapeSpecialChars -str (Get-VstsInput -Name OverwriteDatasets -Require) + $CreateSubfolders = Get-VstsInput -Name CreateSubfolders -Require -AsBool + + Write-Host "Entering script SSRSDeploy.ps1" + Write-Host "Project = $Project" + Write-Host "Configuration = $Configuration" + Write-Host "OverwriteProjectConfiguration = $OverwriteProjectConfiguration" + Write-Host "TargetServerURL = $TargetServerURL" + Write-Host "TargetFolder = $TargetFolder" + Write-Host "DataSourceFolder = $DataSourceFolder" + Write-Host "DataSetFolder = $DataSetFolder" + Write-Host "OverwriteDataSources = $OverwriteDataSources" + Write-Host "OverwriteDatasets = $OverwriteDatasets" + Write-Host "CreateSubfolders = $CreateSubfolders" + + #Username ook nog aan toevoegen als deze wordt meegegeven + #TrimInputs -Project ([ref]$Project) + + # Test if the project file exists + if (!(Test-Path $Project)) { + Write-Error (Get-VstsLocString -Key Project0AccessDenied -ArgumentList $Project) + } else { + Write-Host (Get-VstsLocString -Key ProjectFile0 -ArgumentList $Project) + } + + # Determine location of devenv.com + # Default to the standard, if not available search will be started (takes more time) + $devenv = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.com" + if (!(Test-Path($devenv))) { + # Determine location of devenv.com + $devenv = (Get-ChildItem D:\ -Filter "devenv.com" -Recurse -Name) + if ([string]::IsNullOrEmpty($devenv)) { + $devenv = (Get-ChildItem C:\ -Filter "devenv.com" -Recurse -Name) + $devenv = "C:\$devenv" + } + else { + $devenv = "D:\$devenv" + } + } + Write-Debug $devenv + + if (!(Test-Path($devenv))) { + Write-Host (Get-VstsLocString -Key Devenv0NotFound -ArgumentList $devenv) + } + else { + Write-Host (Get-VstsLocString -Key Devenv0Used -ArgumentList $devenv) + } + + if([System.Convert]::ToBoolean($ConfigurationSettingsDeployment)) { + $ConfigurationSettingsDeployment = "Retain" + } else { + $ConfigurationSettingsDeployment = "Deploy" + } + if([System.Convert]::ToBoolean($OptimizationSettingsDeployment)) { + $OptimizationSettingsDeployment = "Retain" + } else { + $OptimizationSettingsDeployment = "Deploy" + } + + # Opgegeven rptproject aanvullen met gewenste properties + if ($Project.EndsWith(".rptproj") ) { + Write-host "==================================================================" + Write-host "Initiate $Project" + Write-host "==================================================================" + Write-host "Set config for $($Project)" + SetProjectConfig -projpath ($Project) -CreateSubfolders $CreateSubfolders + Write-host "Deploy $($Project)" + DeploySsrsProject($Project) + + } + # rptprojecten van de opgegeven solution aanvullen met gewenste properties + elseif ($Project.EndsWith(".sln")) { + $Solution = ($Project | Resolve-Path).ProviderPath + $SolutionRoot = $Solution | Split-Path + Get-ChildItem -Path $SolutionRoot -Filter *.rptproj -Recurse | ForEach-Object { + Write-host "==================================================================" + Write-host "Initiate $($_.FullName)" + Write-host "==================================================================" + Write-host "Set config for $($_.FullName)" + SetProjectConfig -projpath ($_.FullName) -CreateSubfolders $CreateSubfolders + Write-host "Deploy $($_.FullName)" + DeploySsrsProject($_.FullName) + } + } + # rptproject zoeken en aanvullen met gewenste properties + Else { + Write-host "Find all RptProjects in $Project" + Get-ChildItem -Path $Project -Filter *.rptproj -Recurse | ForEach-Object { + Write-host "==================================================================" + Write-host "Initiate $($_.FullName)" + Write-host "==================================================================" + Write-host "Set config for $($_.FullName)" + SetProjectConfig -projpath ($_.FullName) -CreateSubfolders $CreateSubfolders + + Write-host "Deploy $($_.FullName)" + DeploySsrsProject($_.FullName) + + + } + + } + + +} catch { + Write-Error (Get-VstsLocString -Key InternalError0 -ArgumentList $_.Exception.Message) +} finally { + Trace-VstsLeavingInvocation $MyInvocation +} + +Write-Host (Get-VstsLocString -Key EndingTask) + diff --git a/DeploySSRSTask/icon.png b/DeploySSRSTask/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8efe52a12c8383af68eec9528382eea4b0452f74 GIT binary patch literal 1136 zcmV-$1dscPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1O-V%K~zXf?Uh|< z6jv0-*H8386hQ<*d?}F?aed~`9&OP_s^PhXp z-FrRRcZ^#BUDq9}OiBo(QfUmslY+={yyGg9hT}@QuCM- zv@E5Y%r>{sAASUeGB~VF{3#7QW_y29dGw~UYy4Dg=x&c4R*cdDCPH%OZK>fB^WHYG z{z6vO`0K6wgMRAQN7(&eo;Q6l{Ml*rI^skx!G!>P`>h+=&=bu+p>*9OSFdI&KenfW zjn{1B<;_ksGi%$6a3R34V$CPY58ugM-=?oMWF=7^_VKsxygqX-{_}%iyLb9-5AGXf zUi|GWSV(CBx%-ZE>1?|7x`AQp;{o~mUj9lGd9|7SeMlw~PEc`52LIIp07ZesC!(ol4BNUC(v@FY_D8_M|AVDz?A3dRImgNu@!{0>b5K3aPIOIi1A(P1@DB1~i z$6^6pH`=^iV9ZA6;d?=2Y{Kt<9-!dx7=~$@xQnCtHU&x~N>cl+Zr`|{gEzo51C!P- z2p)!boCt=(&;vWnC54*|MCY;Ta3mHdc$6d)6x0Wt@bcKR?kOtpU$LYIkw_+YU~J%e zFy`hQJ03TpQ3x>KdfMQrusp@EKA4>KqxwS(zfBW2z7PwTwZ$!|B3bMg^L%# zkXlWNIv533?cjO2xBe!fpH8n8Q0s+k90af~Z1x|79|&ghW#&o%0000