kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

TFS Power Toolsに含まれるPowerShellコマンドレット

この記事はTFS Advent Calendarの12/24分です*1
前回の担当日ではTFS Best Practices Analyzerを紹介しました。今日は同じくTFS Power Toolsに含まれるPowerShellコマンドレットを紹介します。おそらくクライアントで使うことが多いと思いますので、クライアントにインストールします。

注意点として、現時点のPowerToolsではPowerShellコマンドレットはデフォルトではインストールされないようです。明示的にインストール許可を設定します。

PowerShellのデフォルト状態は「電子署名されているスクリプト以外実行しない」です。TFS Power Toolsに含まれるコマンドレットは署名されていないようなので、このダイアログでYesを選択しないと使用することができません。現実問題、ほとんどの人は署名していないでしょうから、すでにやってる人ならこのダイアログはおそらく表示されないでしょう。
ちなみに「管理者として実行」したPowerShellから以下のコマンドレットを実行する必要があります。64bit OSを使用している場合、32bit版のPowerShellと64bit版のPowerShellの二つそれぞれで実行する必要があります。

PS>Set-ExecutionPolicy RemoteSigned

はっきり言って面倒な作業なので、可能であればActive Directoryのグループポリシーで一括設定したいところですね。Windows Server 2008 R2付属のサーバー管理系のコマンドレットもこれやっておかないと動かないし…。
それはともかく、インストールするとメニューにPowerShell Consoleが追加されています。

起動しますと普通のコンソール。どんなコマンドレットが追加されているかは以下のコマンドレットを実行してください。

PS>get-command | Select-String -pattern "tfs"
Add-TfsPendingChange
Get-TfsChangeset
Get-TfsChildItem
Get-TfsItemHistory
Get-TfsItemProperty
Get-TfsPendingChange
Get-TfsServer
Get-TfsShelveset
Get-TfsWorkspace
New-TfsChangeset
New-TfsShelveset
Remove-TfsPendingChange
Remove-TfsShelveset
Restore-TfsShelveset
Select-TfsItem
Set-TfsChangeset
tfselect
tfserver
tfshelve
tfshelvesets
tfstatus
Update-TfsWorkspace

各コマンドレットがどんなものかは名前からなんとなくわかるかと思います。PowerShellのコマンドレットは「動詞-名詞」という規則で作ることを推奨されているので、Get-TfsWorkSpaceであれば、TFSのワークスペース取得であるだろうと想像できます。このルールにのっとっていない、たとえばtfsselectはGet-TfsServerのalias(別名)です。コマンドレットには基本的にヘルプがついているので、わからなければ「help コマンドレット名 -detailed」でヘルプが表示されます。
ヘルプの日本語化はされていませんが、PowerShellではパラメーターが割と共通なので、ほかの日本語化されているPowerShell標準のコマンドレットのヘルプを見れば参考になります。たとえばGet-TfsWorkSpaceであればこうなります…英語のヘルプもあまりないですね(^^;。

PS>Help get-tfsworkspace -detailed

名前
    Get-TfsWorkspace

概要

構文
    Get-TfsWorkspace [-Path] <String> [<CommonParameters>]

    Get-TfsWorkspace -Server <TeamFoundationServer> [-Computer <String>] [-Name
     <String>] [-Owner <String>] [<CommonParameters>]

説明


パラメーター
    -Path <String>
        The local path

    -Server <TeamFoundationServer>
        TeamFoundationServer object or server name.

    -Computer <String>
        The name of the host computer.

    -Name <String>
        The name of the workspace.

    -Owner <String>
        The username of the owner. Use * for all users. If not provided, the current user is used by default. User is an alias for this parameter.

    <CommonParameters>
        このコマンドレットは、次の共通パラメーターをサポートします: Verbose、
        Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、
        OutBuffer、および OutVariable。詳細については、
        「get-help about_commonparameters」と入力してヘルプを参照してください。

説明とか概要とかあまりないですね。とりあえず実験してみましょう。ワークスペースを取得するGet-TfsWorkspaceを実行します。

PS>get-tfsworkspace -path ワークスペースのパス
Name                       Computer                   OwnerName
----                       --------                   ---------
AUGE                       AUGE                       アカウント名

こんな感じで出てきます。同様にGet-TfsChildItemを実行してみましょう。まず、カレントフォルダをワークスペースに移動します。

PS>cd 対象ワークスペース
PS>get-tfschilditem -folders -item *.* -recurse
  • foldersはフォルダ表示のみ。-itemはすべてのアイテム、-recurseは再帰的に取得です。実行結果はこうなります。
Changes CheckinDat Content ServerItem
   etId          e  Length
------- ---------- ------- ----------
      5 2010/06/20   <DIR> $/原稿/AtmarkIT
      3 2010/06/20   <DIR> $/原稿/BuildProcessTemplates
     32 2010/12/19   <DIR> $/原稿/MyProject
     19 2010/10/30   <DIR> $/原稿/MyTools
     13 2010/07/25   <DIR> $/原稿/評価
      5 2010/06/20   <DIR> $/原稿/AtmarkIT/VisualStudioDebugging
     41 2011/03/06   <DIR> $/原稿/AtmarkIT/VisualStudioPerfomance
      5 2010/06/20   <DIR> $/原稿/AtmarkIT/VisualStudioDebugging/2nd
     14 2010/08/06   <DIR> $/原稿/AtmarkIT/VisualStudioDebugging/3rd
      6 2010/06/30   <DIR> $/原稿/AtmarkIT/VisualStudio.../2nd/IntellitraceS...
     10 2010/07/04   <DIR> $/原稿/AtmarkIT/VisualStudio...ing/2nd/WcfAzureSa...
      6 2010/06/30   <DIR> $/原稿/AtmarkIT/VisualStudio...ellitraceSample/sa...
      9 2010/07/03   <DIR> $/原稿/AtmarkIT/VisualStudio...ellitraceSample/Sa...
      9 2010/07/03   <DIR> $/原稿/AtmarkIT/VisualStudio...aceSample/SampleAd...
      6 2010/06/30   <DIR> $/原稿/AtmarkIT/VisualStudio...mple/sample1/Prope...
(略)

もちろん-foldersオプションを外せばファイル名も取得します。tfコマンドよりも操作と出力結果はわかりやすいと思います。パイプラインでうまくやれば特定の日付でチェックインしたファイルの一覧なんてものも簡単に表示することができます。たとえば、以下のようなコマンドを実行すれば、2010/8/1から2010/8/31までにチェックインしたファイルの一覧が簡単に表示できます。

PS> Get-TfsChildItem -item *.* -recurse | Where-Object {$_.checkindate -gt "2010/8/1" -and $_.checkindate -lt "2010/8/31"}

ただ、これはサーバー上のファイル表記になっているので、すぐにローカルをとってもうまくいきません。取得したい場合は明示的にDownloadFileメソッドを呼び出す必要があるでしょう。Get-TfsChildItemで取得したオブジェクトにはこんなメンバがあります。PowerShellでオブジェクトにどんなメンバ変数やメソッドが含まれているかはGet-Memberコマンドレットで調べることができます。
たとえば、先ほどのGet-TfsChildItemの実行結果はこうなります。

PS>$tfsChildItem = Get-TfsChildItem (略)...
PS>$tfsChildItem | Get-Member

   TypeName: Microsoft.TeamFoundation.VersionControl.Client.Item

Name                         MemberType Definition
----                         ---------- ----------
DownloadFile                 Method     System.IO.Stream DownloadFile(), Sys...
Equals                       Method     bool Equals(System.Object obj)
GetHashCode                  Method     int GetHashCode()
GetType                      Method     type GetType()
ToString                     Method     string ToString()
ArtifactUri                  Property   System.Uri ArtifactUri {get;}
ArtifactUriLatestItemVersion Property   System.Uri ArtifactUriLatestItemVers...
ChangesetId                  Property   System.Int32 ChangesetId {get;}
CheckinDate                  Property   System.DateTime CheckinDate {get;}
ContentLength                Property   System.Int64 ContentLength {get;}
DeletionId                   Property   System.Int32 DeletionId {get;}
Encoding                     Property   System.Int32 Encoding {get;}
HashValue                    Property   System.Byte[] HashValue {get;}
IsBranch                     Property   System.Boolean IsBranch {get;}
IsContentDestroyed           Property   System.Boolean IsContentDestroyed {g...
ItemId                       Property   System.Int32 ItemId {get;}
ItemType                     Property   Microsoft.TeamFoundation.VersionCont...
Properties                   Property   System.Collections.ObjectModel.ReadO...
ServerItem                   Property   System.String ServerItem {get;}
VersionControlServer         Property   Microsoft.TeamFoundation.VersionCont...

私も初めて触った&詳細な解説を見かけないので、さわりだけですが、便利だと思います。今後もう少し活用できればいいですね!今日はTFSよりもPowerShell成分多目でお届けました。

*1:PowerShell成分大目なんでPowerShell Advent Calendarかも…

TFS Best Practices Analyzer

この記事はTFS Advent Calendarの12/17分です。
TFS Advent Calendar : ATND
ちょっとネタに困っていたのですが、素晴らしいタイミングでTFS Power Tools December 2011が公開されました。今回の新機能はこんな感じだそうです。

A diagnostic tool with a graphical user interface that you can use to perform the following actions:

  • Verify that the deployment for Team Foundation Server is configured according to recommended best practices
  • Identify the source of problems in an unhealthy deployment.
  • Take a snapshot of the configuration of a deployment.
  • Obtain usage data about the volume of data stored or accessed in the past 14 days. Includes specific information about database tables that have a tendency to grow and that may need to be reduced in size.

TFS Power Toolsをインストールするとこんなうれしいことがあります。

  • バックアップ/リストアを簡略化してくれる。
  • クライアントにインストールするとPowerShellコマンドレットが追加される。
  • クライアントにインストールするとSVNのクライアントのようにExplorerと統合化される(ただしUIは英語で、一度VSなどでTFSにつながないとフォルダーへの描画がうまくいかないこともある)

TFSを使う場合はぜひサーバー、クライアント共にインストールしましょう。

さて、今回はTFS Power ToolsにあるBest Practices Analyzerを紹介します。Windows Server 2008 R2の標準機能としてもおなじみBest Practices Analyzerですが、TFS用ということで、単独ツールになっています。Visual Studio拡張機能メニューもしくは、Visual Studio Galleryからダウンロードしてください。

TFSへのインストール時はこの三つだけ。以前のバージョンをインストールしていても自動的にアップグレードしてくれます。

サーバーにBest Practices Analyzerが追加されていますので、クリックして起動します。

こんなGUI画面が起動します。Select Options for a new scanをクリックすると、スキャン対象の機能および、TFSサーバーを選択する画面に移動します。

Scan typeでチェックしたい項目をえらびます。Team Foundation Server Complete Health Checkで全体的なチェックを行うようです。今回はこれを選びます。ほかにもビルドサーバーのみ、データウェアハウスのみ、SharePoint、Lab Management、Project Server、クライアントなどなど選択することができます。

すべてのスキャンが完了したところ。結構時間がかかります。私の環境では10分くらいでした。

結果はこのような形で表示されます。リスト形式ですが、ツリーやほかの形式も選べます。ここでのエラーはローカルのadministratorアカウントがTFSのAdministratorに所属していないよというエラーですね。警告はSCVMMにアクセスできない(インストールしているんだけどなー)、SharePointをインストールしていない、SQL Serverのレポーティング、Analysisがインストールされていない(Basicだから入れていません)、テストコントローラーからWMIアクセスができないといったもので、いずれも意図しているので私の環境ではこれで問題ありません。
このようにBest Practices Analyzerを使用すればインストールしたTFSの環境チェックを簡単に行うことができます。インストールしたときや、何らかのトラブルが起きた時などに使ってみてください。MSDNでのBest Practices Analyzerはこちらで解説されていますが、執筆時点では残念ながら英語のままです。
Best Practices Analyzer Tool for Team Foundation Server

TFSにおけるSQL Serverの扱い

本記事はTFS Advent Calendarの12/13分の記事です。
TFS Advent Calendar : ATND
りばてぃさんがTFS PowerToolsを利用したバックアップについて詳細に書かれています。
寝ても覚めても.NET(?) : TFS Advent Calendar Day 10~TFS 2010のバックアップとリストア~
バックアップというよりもSQL Serverのメンテナンスについてもうちょっと見てみましょう。TFSのリポジトリはすべてSQL Sereverに格納しているので、SQL Serverがどういう設定になっているか理解していないと思わぬトラブルに巻き込まれます。
Team Foundation Server データベース
典型的な例としてはSQL ServerにおけるTFSのデータベースはすべて「完全」で構築されています。完全で構築されている場合、SQL Serverのバックアップを取らないとトランザクションログは切り捨てられません。切り捨てられないということは、バックアップを行わないと、いつかはディスクがあふれることになります。バックアップはTFS Powertoolsでとれますが、もうちょっと細かくやる場合、SQL Server側でメンテナンスプランを作ります。私の手元ではこんな感じで作っています。TFS以外もあるので、結構いろいろ入れていますが、整合性確認、履歴のクリーンアップ、メンテナンスクリーンアップ、フルバックアップは毎日。ほかの処理は適宜…という感じでしょうか?

メンテナンスのログや履歴のクリーンアップ間隔はもっと短くても(2,3日くらいで)問題ないでしょう。これはデータベースの完全バックアップですが、これだと大きな規模のリポジトリだと夜中にやらないと重くなります。また、突然死んだときなくに泣けないので、たとえばお昼ごろとか夕方に差分バックアップを取っておけばより安心です。上の図の「データベースのバックアップ」のところで、SQL Serverの「トランザクションログをバックアップ」にするだけになります。
トランザクション ログのバックアップ (SQL Server)
過去の履歴はフルバックアップのジョブで削除することになるので気にする必要はないでしょう。

TFSのチームコレクションを分割する

本記事はTFS Advent Calendarの12/8分です。
TFSに登録しているチームプロジェクトの規模が大きくなったり、組織再編などで同一のサーバーにアクセスできなくなるような場合、チームコレクションを分割することができます。チームコレクションがTFS 2010からサポートされた機能なので、TFS 2005/2008では使用できません*1。チームコレクションに関してはMSDN Magazineのこの記事が参考になります。
MSDN マガジン: Team Foundation Server - Visual Studio TFS のチーム プロジェクトとコレクションのガイド
さて、分割といっても、UIなどで簡単楽ちん!ではなく、ひたすらexport→import→不要なデータを削除するというしちめんどくさい手順を踏むことになります。たぶん練習しないと失敗します。
Split a Team Project Collection
デモ、スクリーンキャプチャ付きで動画表示できたらよかったのですがさすがにこれは大作になりそうなので、ごめんなさい(__)。URLにも手順が書かれているのですが、大まかにはこうなります。

  1. Lab Management リソースを削除する(※)
  2. コレクションを停止する
  3. コレクション データベースをバックアップする
  4. コレクション データベースを別の名前で復元する
  5. 元のコレクション データベースをアタッチする
  6. 名前を変更したコレクション データベースをアタッチする
  7. SharePoint Web アプリケーションのリソースに再接続する(※)
  8. 分割したコレクションからプロジェクトを削除する
  9. レポートを分割する(※)
  10. コレクションを開始する
  11. データ ウェアハウスと Analysis Services をビルドし直す(※)
  12. チーム プロジェクト ポータルを再構成する(※)
  13. Lab Management リソースを構成する(※)
  14. 分割したチーム プロジェクト コレクションに対してユーザーとグループを構成する
  15. プロジェクトに対してユーザーとグループを構成する
  16. 分割したチーム プロジェクト コレクションをサポートするために元のサイト コレクションを分割する
  17. Microsoft Project Server と統合を同期する(※)

(※)がついた項目はソース管理しかしていないTFS Basic構成の場合、省略することができるそうです。

まさに、バックアップ→リストアを手順を守って行うだけという手順ですね。バックアップはTFS PowerToolsを使えばまだ簡単かと思います。

*1:教えていただきました。ありがとうございます