- PVSM.RU - https://www.pvsm.ru -

PowerShell / Скрипт для развертывания SSRS отчетов

Во многих проектах требуется инсталляционный скрипт либо пакет, который выполняет обновление серверной части приложения. Необходимость, в первую очередь, обусловлена отсутствием прямого доступа к производственному серверу у разработчиков.
Инсталлятор в виде скрипта лучше всего подходит для установки без явного входа на сервер (RDP). Также скрипт может быть выполнен в виде одного загрузчика, который и выполнит все остальное. В текущих проектах мы реализовали что-то наподобие PsGet[1] [1], только для внутреннего билд-сервера.
Приложение большое и состоит из ряда компонентов, одним из которых является модуль отчетности, построенный на базе [2] [2].

Предварительные установки

Начальная установка и настройка сервера отчетности не входит в ответственность разработчиков и выполняется командами с определенной ответственностью. Также мы не создаем Data Sources, т.к. они могут содержать конфиденциальную информацию (такую как пароли для подключения).
В результате, упомянутые выше настройки, а также распределение доступа скрипту делать не нужно. Остается только добавлять и обновлять сами отчеты.

Подключение к сервису

PowerShell 2.0 предоставляет возможность создание прокси для работы с вэб-сервисом через команду New-WebServiceProxy[3] [3].
Достаточно указать путь к описанию сервиса на [4] [4]. У нас используется Windows Authentication, поэтому в подключении укажем ключ UseDefaultCredential. В самом прокси сервиса также необходимо указать способ аутентификации.

 function Connect-ReportingService([string]$ssrsHost) { 	$reportingServiceUrl = $ssrsHost + "ReportService2005.asmx?wsdl" 	$reportingService= New-WebServiceProxy $reportingServiceUrl -UseDefaultCredential -namespace ReportingWebService 	$reportingService.UseDefaultCredentials = $true 	$reportingService } 

Параметр $ssrsHost содержит полный путь, на который настроен наш сервис (обычно, servername/ReportServer/ [5]).

Добавление отчета

Для того чтобы создать либо обновить отчет, существует метод CreateReport[5] [6].
В качестве параметров он принимает имя отчета, имя родительской папки (папки позволяют группировать отчеты и задавать к ним различные политики безопасности), флаг необходимости перезаписи, бинарный контент файла отчета и доболнительные свойства (обычно не используются, можно передать $null).
Метод возвращает коллекцию сообщений об ошибках и предупреждениях.
Из них мы будем игнорировать сообщения о Data Sources.
Вызов будет выглядеть как:

 (Connect-ReportingService $ssrsHost).CreateReport($report, $ssrsFolder, $true, $reportBits, $null) 

Таким образом добавление отчета можно обернуть в функцию:

 function Deploy-Report([string]$ssrsHost, [string]$reportDir, [string]$report, [string]$ssrsFolder) { 	<# 		здесь указан относительный путь, по которому 		находится отчет (специфично для конкретного проекта) 	#> 	$relativeReportLocation = "..RS$($report).rdl"  	# проверяем наличие файла 	if (-not (Test-Path $reportFile)) 	{ 		$message = "Report file '{0}' was not found!" -f $reportFile 		Write-Warning $message 		return 	}  	# считываем файл отчета 	[byte[]]$reportBits = [System.IO.File]::ReadAllBytes($reportFile)  	# собственно, добавление отчета и получение результата 	$warnings = (Connect-ReportingService $ssrsHost).CreateReport($report, $ssrsFolder, $true, $reportBits, $null) 	# очищаем сообщения от "лишних" 	$cleanedWarnings = $warnings | ? { -not $_.Message.Contains("data source") }  	# вывод результата на экран (в зависимости от количества ошибок) 	if(!$cleanedWarnings) 	{ 		$result = "Report '{0}' published successfully with no warnings" -f $report 		Write-Host $result 		Write-Host "" 	} 	else 	{ 		$warningHeader = "Report '{0}' published with warnings: " -f $report 		Write-Host $warningHeader  		$cleanedWarnings | % {  				Write-Warning $_.Message  		}                          Write-Host "" 	} } 

Выводы

Представленная реализация решает задачу добавления и обновления одного отчета и может быть использована в подобном коде:

 	ls  "..RS*.rdl") | % { $_.Name.Replace(".rdl", "") } | % { Deploy-Report $ssrsHost $reportDir $report $ssrsFolder } 

Вызов вэб-сервисов через PowerShell является тривиальной задачей.
Сам вэб-сервис для SSRS предоставляет гораздо больше возможностей, например, добавление/изменение Data Source посредством метода CreateDataSource[6] [7].

Расширения, которые можно сделать

В текущем проекте у нас реализован объемный модуль расширений.

Так, обновлять отчеты можно также по условию, например, на основе времени последней модификации файлов[7] [8]:

 	# получаем существующий список отчетов (рекурсивно) 	$deployedReports = (Connect-ReportingService $config).ListChildren($ssrsFolder, 1)  	[hashtable]$deployedReportsMap = @{} 	$deployedReports | % {	$deployedReportsMap[$_.Name + '.rdl'] = $_ 	}  	ls  "..RS*.rdl") ` 		| ? {  			( -not $deployedReportsMap.ContainsKey($_.Name)) -or  				$deployedReportsMap[$_.Name].ModifiedDate -lt $_.LastWriteTime 		} ` 		| % { $_.Name.Replace(".rdl", "") } ` 		| % { Deploy-Report $ssrsHost $reportDir $report $ssrsFolder } 

Иногда необходимо обновлять Data Source у отчета, для чего используется метод SetItemDataSources.
Часто требуется сбрасывать кэш у отчета (метод FlushCache).

В общем, все просто и расширяемо.


  1. psget.net/ [9]
  2. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.aspx [10]
  3. technet.microsoft.com/en-us/library/dd315258.aspx [11]
  4. www.w3.org/TR/wsdl [12]
  5. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createreport.aspx [13]
  6. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createdatasource.aspx [14]
  7. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.listchildren.aspx [15]

Автор: mihasic


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/powershell/2653

Ссылки в тексте:

[1] [1]: #note1

[2] [2]: #note2

[3] [3]: #note3

[4] [4]: #note4

[5] servername/ReportServer/: http://servername/ReportServer/

[6] [5]: #note5

[7] [6]: #note6

[8] [7]: #note7

[9] psget.net/: http://psget.net/

[10] msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.aspx: http://msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.aspx

[11] technet.microsoft.com/en-us/library/dd315258.aspx: http://technet.microsoft.com/en-us/library/dd315258.aspx

[12] www.w3.org/TR/wsdl: http://www.w3.org/TR/wsdl

[13] msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createreport.aspx: http://msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createreport.aspx

[14] msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createdatasource.aspx: http://msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createdatasource.aspx

[15] msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.listchildren.aspx: http://msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.listchildren.aspx