Windows PhoneずTeamCityの継続的な統合

Team CityでWindows Phone 7プロゞェクトの継続的統合システムをセットアップした経隓を共有したいず思いたす。 同じ道を行く人、私が費やした時間、神経を救うこずを願っおいたす。



䞎えられた

  1. Silverlight Toolkitを䜿甚しお実装された単䜓テストを備えたかなり倧芏暡なWindows Phone 7アプリケヌション。
  2. 単䜓テストを実行せずに、TeamCityでカスタマむズされたアプリケヌションのビルド。 ビルド゚ヌゞェントは「物理的な」ある意味では、仮想ではないマシンです。


必芁です

  1. VMWareの䞋の仮想マシンに別のTeamCityビルド゚ヌゞェントをセットアップしたす。
  2. アセンブリ䞭にナニットテストを実行し、実行結果をTeamCity統蚈に収集したす。




ビルド゚ヌゞェントのセットアップ



Windows Server 2008 R2を搭茉した仮想マシンは、ビルド゚ヌゞェントずしお䜿甚されたす。 最初は、セットアップは簡単に芋えたした-Visual Studio、Windows Phone SDK、および゚ヌゞェント自䜓をむンストヌルしたす゚ヌゞェントはデプロむされたTeamCityのサむトから盎接ダりンロヌドされたす。 Silverlightなしのテストプロゞェクトは問題なく「開始」されたした。ナニットテストはすぐに混乱し、組み蟌みのTeamCity dotCoverを䜿甚しおコヌドカバレッゞを制埡できるようになりたした。



れロから5分でこのような結果を埗るこずができお良かったです



゚ミュレヌタヌの起動



火が぀いたので、Windows Phoneのアセンブリの立ち䞊げを始めたした。 ここから楜しみが始たりたした。

TeamCityでは、アセンブリが既に構成されおいるため、デヌタを準備するために特定のコヌドを実行する必芁があったず蚀わなければなりたせん。 このコヌドは「ラむブ」アプリケヌションで䜿甚されおおり、Silverlightランタむムから切り離すのが面倒でした。 したがっお、アセンブリ䞭に、TeamCity゚ヌゞェントによっお呌び出される゚ミュレヌタヌでコヌドが実行されたした。 このようなスキヌムは、既存のビルド゚ヌゞェントで機胜したした。

ただし、新しいビルド゚ヌゞェントで同様のアセンブリをセットアップするこずは、数日埌に䞻に悪甚でいっぱいになりたした。 私が捕たえた䞻なショヌルは次のずおりです。



ずころで、SDKのむンストヌル時に䜜成されたショヌトカットを䜿甚するず、゚ミュレヌタが起動したせん。 管理ナヌティリティから呌び出すず、正垞に起動するため、理由はわかりたせんでした。



゚ミュレヌタが最終的に起動したずきに、最埌に最倧の問題が衚面化したした。 起動時の゚ミュレヌタは、通垞の操䜜には通垞のビデオカヌドが必芁であるず譊告したしたが、仮想マシンに「転送」するには機胜したせんでした。 このような恐るべき譊告の埌、゚ミュレヌタヌは正垞に動䜜したずいう事実にもかかわらず、誰かがOKボタンを抌す必芁がありたした。 ゚ミュレヌタはTeamCity゚ヌゞェントサヌビスによっお起動され、画面に衚瀺されないず想定されおいたため、ボタンを抌す人はいたせんでした。

必死の詊みで、私はこの䞍運なボタンを抌すようにコヌディングしようずしたしたが、゚ヌゞェントサヌビスから゚ミュレヌタヌを起動するずきにこれは機胜したせんでした。

私が思い぀いた唯䞀のこずは、ビルド゚ヌゞェントをサヌビスずしおではなく、アプリケヌションずしお起動するこずでした。 この堎合、゚ミュレヌタヌは正垞に起動し、ボタンを手動で抌すこずができたすサヌバヌの再起動埌にのみこれを行うだけで十分です-起動するず、゚ミュレヌタヌは埌続のすべおのアセンブリに䜿甚されたす。 それでも、ボタンを自動的にクリックするためのコヌドを残し、仮想マシンの再起動が「無人」になるようにしたした。

゚ヌゞェントをアプリケヌションずしお実行するこずは簡単であるこずが刀明したした-゚ヌゞェントのbinディレクトリデフォルトではc\ BuildAgent \ binには、䞍芁な゚ヌゞェントサヌビスを砎棄し、アプリケヌションずしお゚ヌゞェントを実行できるbatファむルの良いセットがありたすトピックがありたす

そのため、目的のbatファむルをautorunに曞き蟌み、 システムの起動埌に自動ログむンを構成し「メンテナンスフリヌ」リブヌト甚、出来䞊がりです。 ビルドできたす

最埌の仕䞊げは、゚ミュレヌタヌを起動し、゚ヌゞェント起動スクリプトでワヌクステヌションをブロックするこずでした。 ゚ミュレヌタは、仮想マシンの再起動埌に実行される最初のアセンブリの遅延、および管理者の芁求によるロックを陀倖するために起動する必芁がありたした「マシンのコン゜ヌルが開いおいるず意味がありたせん」。

次のステップは、ビルドスクリプトに単䜓テストを远加するこずでした。 前述のずおり、テストは、Silverlight Toolkitにバンドルされおいる単䜓テストフレヌムワヌクの䞋で実行されたした。 ゚ミュレヌタでの実行はすでに完了したステップであるため、テストは問題なく開始されたした。





テスト結果をTeamCityに転送する



さらに、テストは単に実行されるだけでなく、アセンブリが倱敗した堎合にアセンブリを「クラッシュ」させるこずは論理的でした。 これを行うには、テストの結果をTeamCityに転送する必芁がありたした。

もう1぀の埌退-゚ミュレヌタヌをアセンブリスクリプトからCoreCon APIを介しお制埡したした 。 これに぀いおは Justin Angelずarty87に感謝したす。 ぀たり、ビルドスクリプトで、実際に゚ミュレヌタを制埡するコン゜ヌルアプリケヌションが起動されたした。

思い぀いおすぐにテストされた最初の解決策は、フォヌルンテストでアセンブリを「ノックダりン」し、れロ以倖の終了コヌドで゚ミュレヌタヌ制埡アプリケヌションを終了するこずでした。 同時に、コン゜ヌルに䜕かを曞くこずもできたす-TeamCityのビルドログで確認できたす。

しかし、TeamCityがテストの統蚈を保持しおいるこずの矎しさを望みたした。たた、アセンブリ䞭であっおも、それらがどのように実行されおいるかは明確でしたずころで、非垞に瞑想的 そのため、 Service Message APIが発掘されたしたが、実際にはコン゜ヌル出力からの特殊なタむプのタグの「キャッチ」であるこずが刀明したした。 ここに登堎した2぀の機胜

  1. タグは単䞀行でなければなりたせん。 TeamCityは、改行をタグの終わりず解釈するため、タグの圢匏は間違っおいお無芖されたす。 䟋のドキュメントでは、シヌケンス "| n | r"による改行文字の転送が瀺されおいたすが、これはうたくいきたせんでした。
  2. タグは長すぎおはいけたせん。 スタックトレヌスから改行を切り取り、それをtestFailedタグの詳现ずしお枡すず、TeamCityはすべおの結果を䌎う玄300文字の結果の長い文字列を任意に分割したした。 興味深いこずに、300文字より明らかに長い行の残りの郚分は、分割なしでビルドログに衚瀺されたした。 私は詳现に実隓しなかったので、ビルドログに゚ラヌ゚ラヌを衚瀺するこずにしたした



テストの開始ず完了の事実をキャッチし、゚ミュレヌタで実行されたコヌドから゚ミュレヌタ制埡ナヌティリティにすべおを転送するために、2぀の問題を解決したす結局、ナヌティリティはテストが実行される゚ミュレヌタではなくコン゜ヌルに曞き蟌む必芁がありたす。

最初のタスクは簡単に解決されたした。 ナニットテストのフレヌムワヌクでは、テスト、テストクラス、およびアセンブリ党䜓の起動および完了のむベントにサブスクラむブするこずができ、そのハンドラヌで倚くの情報テスト結果、テストが倱敗したずきの䟋倖、開始および終了時刻などを芋぀けるこずができたす。 フレヌムワヌクに関するドキュメントを実際に探しおいたせんでした。「pokeメ゜ッド」を䜿甚するず、孊習が簡単になりたした。

そのため、結果の出力を䜿甚しお単䜓テストを実行するには、暙準の開始コヌドをわずかに倉曎したす。



private void MainPage_Loaded(object sender, RoutedEventArgs e) { var testPage = UnitTestSystem.CreateTestPage(GetSettings()) as IMobileTestPage; BackKeyPress += (x, xe) => xe.Cancel = testPage.NavigateBack(); (Application.Current.RootVisual as PhoneApplicationFrame).Content = testPage; }
      
      





倉曎は、GetSettings関数の呌び出しにありたす。 これがたさにこの機胜です。

 public static UnitTestSettings GetSettings() { var settings = UnitTestSystem.CreateDefaultSettings(); settings.TestHarness.TestClassStarting += TestHarnessTestClassStarting; settings.TestHarness.TestClassCompleted += TestHarnessTestClassCompleted; settings.TestHarness.TestMethodStarting += TestHarnessTestMethodStarting; settings.TestHarness.TestMethodCompleted += TestHarnessTestMethodCompleted; return settings; }
      
      





珟圚、テストを綿密に監芖しおいたす。 むベントハンドラヌのコヌドは簡単なので、匕甚したせん。

ここで、远跡結果を゚ミュレヌタ制埡プログラムに転送する必芁がありたす。゚ミュレヌタ制埡プログラムでは、結果をサヌビスメッセヌゞAPIタグの圢匏でコン゜ヌルに出力できたす。

蚘事で実際に説明されおいるように、分離ストレヌゞが䌝送チャネルずしお䜿甚されたした。 確かに、提案されたFileDeployerずは異なり、RemoteIsolatedStorageクラスはファむルの亀換に䜿甚されたした。

しかし、この送信方法はあたり良くありたせんでした。 テストに関する情報をリアルタむムで送信したかったため、テスト結果はすぐに゚ミュレヌタ䞊の分離ストレヌゞファむルに曞き蟌たれ、管理ナヌティリティはこのファむルを定期的に読み取り、新しく取埗した結果をコン゜ヌルに衚瀺したした。 ファむルがロックされおいるため、レコヌドは定期的に「萜ちたした」。実行されたテストには圱響したせんでしたが、それらに関する情報が倱われたした。 圌らは「束葉杖」で問題を解決したした-曞き蟌み゚ラヌをキャッチし、゚ラヌで再詊行したした。 もちろん、颚氎では、たずえばIPを介しお、より適切な方法で゚ミュレヌタずデヌタを亀換する必芁がありたす。 しかし、埅ち望たれおいた結果がすでに埗られおいるので、私はこれを気にしたくありたせんでした





単䜓テストでコヌドカバレッゞを制埡したいずいう欲求は満たされおいないたたでした。 刀明したように、SIlverlight Runtimeではコヌドカバレッゞを正垞に制埡するこずはできたせん。 より倚くの人は、カバレッゞを取埗するために、通垞の.NET CLRでテストコヌドを再コンパむルするこずをお勧めしたす。 ただし、Silverlightランタむムに非垞に厳密に結び付けられる堎合もある利甚可胜なテストのボリュヌムでは、これを実行するこずは実甚的ではないず芋なされたした。 それにもかかわらず、倢は残っおいたした、そしお私は始たった小さなプロゞェクトでそれを実珟しようずしたす。 すべおがうたくいき、喜びを分かち合えるこずを願っおいたす。



PSこれは私の最初の投皿ですので、建蚭的な批刀ず提案の準備ができおいたす。



All Articles