多くのプロジェクトでは、アプリケーションのサーバー側を更新するインストールスクリプトまたはパッケージが必要です。 その必要性は主に、開発者から本番サーバーへの直接アクセスの欠如によるものです。
スクリプト形式のインストーラーは、サーバー(RDP)に明示的にログインせずにインストールするのに最適です。 また、スクリプトは単一のブートローダーとして実行でき、残りは実行されます。 現在のプロジェクトでは、内部ビルドサーバーのみにPsGet
[1]のようなものを実装しました。
アプリケーションは大きく、いくつかのコンポーネントで構成されています。そのうちの1つは、
SSRSに基づいて作成されたレポートモジュールです。
レポートサーバーを管理するために、Microsoftは開発者にReportingService2005.asmx Webサービスを提供しました
[2] 。
プリセット
レポートサーバーの初期インストールと構成は、開発者の責任ではなく、特定の責任を持つチームによって実行されます。 また、データソースを作成しません。 機密情報(接続パスワードなど)が含まれている場合があります。
その結果、上記の設定、およびスクリプトへのアクセスの配布を行う必要はありません。 レポート自体を追加および更新するだけです。
サービスへの接続
PowerShell 2.0は、New-WebServiceProxyコマンド
[3]を使用して、Webサービスを操作するためのプロキシを作成する機能を提供します。
WSDL上のサービスの説明へのパスを示すだけで十分です
[4] 。 Windows認証を使用しているため、接続ではキー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 )が含まれます。
レポートを追加する
レポートを作成または更新するために、CreateReportメソッド
[5]があります。
パラメーターとして、レポートの名前、親フォルダーの名前(フォルダーを使用してレポートをグループ化し、さまざまなセキュリティポリシーを設定できます)、上書きのフラグ、レポートファイルのバイナリコンテンツ、および追加のプロパティ(通常は使用せず、$ nullを渡すことができます)を取ります。
このメソッドは、エラーメッセージと警告のコレクションを返します。
これらのうち、データソースに関するレポートは無視します。
呼び出しは次のようになります。
(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を介したWebサービスの呼び出しは簡単な作業です。
SSRSのWebサービス自体は、たとえばCreateDataSourceメソッド
[6]を使用してデータソースを追加/変更するなど、はるかに多くの機能を提供します。
できる拡張機能
現在のプロジェクトでは、膨大な拡張モジュールを実装しています。
そのため、たとえば、最後のファイル変更の時間に基づいて、条件ごとにレポートを更新することもできます
[7] :
# () $deployedReports = (Connect-ReportingService $config).ListChildren($ssrsFolder, 1) [hashtable]$deployedReportsMap = @{} $deployedReports | % { $deployedReportsMap[$_.Name + '.rdl'] = $_ } ls ) ` | ? { ( -not $deployedReportsMap.ContainsKey($_.Name)) -or $deployedReportsMap[$_.Name].ModifiedDate -lt $_.LastWriteTime } ` | % { $_.Name.Replace(, ) } ` | % { Deploy-Report $ssrsHost $reportDir $report $ssrsFolder }
SetItemDataSourcesメソッドが使用されるレポートのデータソースを更新する必要がある場合があります。
多くの場合、レポートからキャッシュをフラッシュする必要があります(FlushCacheメソッド)。
一般に、すべてがシンプルで拡張可能です。
- psget.net
- msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.aspx
- technet.microsoft.com/en-us/library/dd315258.aspx
- www.w3.org/TR/wsdl
- msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createreport.aspx
- msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createdatasource.aspx
- ListChildrenメソッド: msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.listchildren.aspx