TFSカスタムアクティビティを使ったビルド結果へのドキュメントリンク その2

最後に、FindBugsの実行結果をリンク先として指定してみます。

TFSでのJavaビルド環境作成:FindBugsの実行」 で、FindBugsの実行結果をビルド出力フォルダに出力するように指定していますので、同じパスを指定すれば問題ないと思ってましたが、なぜかフォルダ指定を変えないと正しく参照してくれません。
(おそらく、ビルドプロセス実行中に変数内容が適宜変更されていると思われます)

またまたビルドワークフローを開き、WriteExternalLinkのリンク先として「BuildDetail.DropLocation + "\findbugs-result.html"」を指定します。



Act047_2

AntのBuild.xmlで指定したのは「${DropLocation}/${BuildNumber}」でしたので、「${BuildNumber}」が不要になっています。

修正を保存/チェックインして、再度ビルドを実行します。

Act048


Act049

FindBugsの実行結果がエディタで開かれました^ ^;

Eclipseではこうなります。

Act050


Act051

おまけですが、html形式で出力するとVS IDEではうまく参照できない(エディタが起動され、状態によってはソースが表示される)ので、Eclipseの兼用となるとtxt形式しか選択肢がないように思われます。

これでビルド結果画面でFindBugsの実行結果が参照できるようになりました。
いろんなものと連携させる際には使えるネタかと思います。

TFSカスタムアクティビティを使ったビルド結果へのドキュメントリンク その1

まずは、ビルドサーバに適当なファイルを作成します。
クライアントから参照できないと意味がないので、ビルドサーバの共有フォルダ直下(ここでは「E:\JavaBuildWork」→「\\build2008r2\JavaBuildWork」)に作成します。

Act041

VS IDEでビルドワークフローを開き、先ほど登録したアクティビティを追加します。

Act042

修正を保存/チェックインし、ビルドを実行してみます。
ビルド結果に「ファイルへのリンク」が表示され、リンクをクリックするとリンク先が表示されます。





Act043_3


Act044

Eclipseからでも同じように参照できます。



Act045_2


Act046

たぶん次が最後ですが、FindBugsの実行結果をリンク先にしてみたいと思います。

TFSカスタムアクティビティの展開:VS IDEへの登録

ビルドワークフローを編集する端末でビルドプロセステンプレートファイルを開きます。ツールボックスの「全般」タブで右クリックし、「アイテムの選択」を選択します。

Act033

アイテムの選択画面で、「System.Activitiesコンポーネント」タブにある「参照」ボタンを押します。

Act036

インストールしたアセンブリ(dll)を選択するのですが、「C:\Windows\Microsoft.NET\assembly\GAC_MSIL」に、「CustomActivities」フォルダがあり、その中にあるわけのわからない名前(バージョン番号+公開キートークン)になっているフォルダ内のdllファイルを選択します。すると、ツールボックスに「WriteExternalLink」が表示されます。

Act037


Act038


Act039


Act040

次に、これを使って、適用なファイルへのリンクを出力するようにワークフローを変更します。

TFSカスタムアクティビティの展開:厳密名の付与

カスタムアクティビティのプロジェクトのプロパティを開き、「署名」タブを選択します。

Act029

「アセンブリの署名」をONにし、キーファイルの選択から「<新規作成…>」を選択します。

Act030

作成画面で「キーファイル」にファイル名を指定します。ここでは「キーファイルをパスワードで保護する」をOFFにしておきます。(他にも展開するのであれば、ちゃんとパスワード指定した方がよいかと思います)

Act031

この状態で、カスタムアクティビティのプロジェクトを一旦ビルドし、次にセットアッププロジェクトのビルドを行うとセットアッププログラムが正常に作成できます。

このセットアッププログラムを使って、ビルドワークフローを編集する端末とビルドサーバにアクティビティをインストールします。
なお、インストール後にビルドサービスの再起動を行わないとちゃんと認識してくれません。

次は、インストールしたアクティビティをVS IDEに登録します。

TFSカスタムアクティビティの展開:セットアッププロジェクトの作成

作成したアクティビティを使うためには、
 ・VS/TFSが参照するフォルダにdllが格納されていること
 ・グローバルアセンブリキャッシュ(GAC)に登録されていること
が条件になります。(詳細については「Customize Team Build 2010 – Part 7: How is the custom assembly found?」)

参考にさせて頂いた「C#.NETでいく? TFS2010ビルド テンプレートのカスタマイズ(3)」とか「Ewald Hofman Customize Team Build 2010 – Part 7: How is the custom assembly found?」では、ビルドコントローラーに対してカスタムアセンブリを参照させる方法で解決していますが、複数のカスタムアセンブリを使いたくなった時にややこしくなるのが嫌だったので、ここではセットアップを作成して登録する方法をとります。

ソリューションに対して、セットアッププロジェクトを追加します。

Act022


Act023

自動的にエディタが起動されますので、「対象コンピュータのファイルシステム」を右クリックし、「特別なフォルダーの追加」-「グローバルアセンブリキャッシュフォルダ」を選択します。

Act024

GACに登録するファイルとして、プロジェクトでビルドされたファイルを指定します。

Act025


Act026

次は、セットアップ時の動作を少しだけ変更します。
通常、セットアップ実行時に「このユーザーのみ」と「すべてのユーザー」という選択肢が表示されますが、アクティビティはユーザ単位で使う/使わないというコントロールはしない(はず)ので、必ず「すべてのユーザー」でインストールするように変更します。
セットアッププロジェクトを右クリックし、「表示」-「ユーザーインターフェイス」を選択します。ユーザーインターフェイスのエディタ画面で、「インストール」-「開始」-「インストールフォルダー」のプロパティにある「InstallAllUsersVisible」をTrueに変更します。

Act034


Act035

ここで、セットアッププロジェクトをビルドすると、こんなエラーになってしまいました。

Act028

すっかり忘れていましたが、GACに登録するアセンブリは、厳密名を持っていないと登録できない仕組みになっています。(いわゆる「DLL Hell」の解決)

これはちゃんと対応しないといけないので、厳密名をアセンブリに付与します。

TFS カスタムアクティビティの作成

自分で機能拡張できるのもTFSのいいところということで、カスタムアクティビティを作成してみます。
主要なところ(というか、ほぼ^ ^;)は、「C#.NETでいく? TFS2010ビルド テンプレートのカスタマイズ(1)」以降と「Ewald Hofman Customize Team Build 2010 – Part 1: Introduction」以降を参考にさせて頂きました。

VSで新規プロジェクトを作成します。テンプレートから「アクティビティ ライブラリ」を選択します。

Act012

プロジェクト作成後、TFSのライブラリ(Microsoft.TeamFoundation.Build.Client)を追加します。

Act013


Act015

次に、プロジェクトにWorkflowテンプレートからコードアクティビティのクラスを追加します。

Act016


Act017

詳細は割愛させて頂いて、以下のようなソースに変更します。

Act018

変更概要としては
 ・Microsoft.TeamFoundation.Build.Clientを参照追加
 ・クラス属性として「[BuildActivity(HostEnvironmentOption.All)]」を追加
  →これを指定しないと実行時にエラーになります
 ・ワークフローで指定してもらうプロパティを追加する
  最初の「BuildDetail」は、ビルド結果が格納されているオブジェクトになります
 ・BuildDetailに対して、リンク形式の出力結果を追加する
  AddExternalLinkについての詳細はこちら
という感じです。

一旦ビルドを実行し、エラーがなければワークフローにおいてみます。
プロジェクトにある「Activity1.xaml」を開き、ツールボックスの「CustomActivities」タブに「WriteExternalLink」があるはずです。これをワークフローエディタにドロップし、プロパティで3つの引数が指定できる状態であればOKです。

Act020


Act021

次は、作成したアクティビティを展開する方法についてです。

TFS2010のBuildProcessTemplate編集 その2

さて、WriteBuildMessageでビルド実行結果にメッセージを出力してみます。ツールボックスから、WriteBuildMessageをメッセージ出力したい場所にドラッグします。
今回は、「エージェントで実行」の中の、ビルド実行後に入れてみます。

Act006_4

プロパティで、「Message」に出力したいメッセージを"ダブルクォーテーション付き"で指定します。変更したら、保存→チェックインします。
チェックインまで完了したら、ビルドを実行してみます。
実行結果を確認してみると・・・・・・メッセージが出力されていません><



Act008_2

いろいろネットを検索してみると、メッセージの重要度(Importance)を変更しないと出力されないようですので、設定内容を変更します。

Act009

初期値は「Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.Normal」なのですが、これを「Normal」から「High」に変更します。
(ここでもインテリセンスがきくのは流石です)

Act010

保存・チェックインしたあと、再度ビルドを実行して、結果を確認してみます。

Act011

ちゃんと出力されました。

単純なメッセージはこれで出力できるのですが、当初の目的であったリンク形式でのメッセージ出力はこれではできません。(他のアクティビティでもリンク先のURLを指定する項目はありません)

さて、どうしたものかと悩みましたが、ネットでいろいろ検索してみると、リンク形式でのメッセージ出力ができるカスタムアクティビティを作成している人がいました。
それをそのまま使わせていただこうかと思いましたが、せっかくなのでカスタムアクティビティの作成も行ってみようかと思います。

TFS2010のBuildProcessTemplate編集 その1

FindBugsの実行結果をビルド実行結果から参照するためには、ビルド結果メッセージを出力しないといけないはずです。

となると、「ビルドが終わったら」とか「FindBugsが終わったら」といったタイミングで出力することになりそうですが、どこでどうやったら可能なんでしょうか??

TFSの場合、いろんな処理のフロー(ビルドプロセス)については、ビルド定義で指定されているビルドプロセステンプレートに定義します。
個別に処理を変更した場合には、テンプレートファイルを編集します。
編集例はMSDNのチュートリアル: カスタム ワークフローの定義と Team Foundation ビルドからのデータベースの配置にあります。

TFSのビルドプロセスは、ビルド定義にある「プロセス」で指定されています。

Act001

実体は、Windows Workflow Foundation(WF)用のXAMLファイルになっています。
XAMLファイルなので、テキストエディタでペシペシ編集すると想像してしまいますが、
なんと、WF用のエディタ画面があります!
ビルド定義画面で「バージョンコントロールパス」をクリックし、ソース管理エクスプローラーから、ビルドプロセスファイルに指定されているファイル(今回はUpgradeTemplate.xaml)をダブルクリックします。

Act003

なんということでしょう、ワークフローエディタ画面になるではありませんか。
ツールボックスにもたくさん入っています。

Act004

ビルド結果にメッセージを出力するための部品(アクティビティ)としては、
 ・WriteBuildError
 ・WriteBuildInformation<T>
 ・WriteBuildMessage
 ・WriteBuildWarning
の4つになります。

Act005

次は、ためしにWriteBuildMessageで単純なメッセージを出力してみます。