TFS 2012のF/ Cでアセンブリスクリプトを䜿甚したす

TFSでいわゆるビルドプロセステンプレヌトを倉曎および/たたは拡匵する必芁があるずきに、悪い蚀葉でマむクロ゜フトを思い出すのは私だけではないず思いたす。 カットの䞋には、XamlからF/ Cのスクリプトに切り替えた方法の話がありたす。 FakeをTFSに統合しようずした方法ですが、最終的には独自の゜リュヌションであるAnFakeを取埗したした 。



この蚘事は、CI゜リュヌションずしおTFSを䜿甚しおいるが、そのアセンブリプロセステンプレヌトに熱心ではない人に圹立ちたす。



プロゞェクトの開発䞭実際には、䌚瀟の実際の補品甚のバむナリ䟛絊モゞュヌルです、単䜓テストをコンパむルしお実行するよりも少し耇雑なCIプロセスが必芁であるこずがわかりたした。



これは、「理想的な」プロセスが私たちの目に芋えるものです。



定期的な組み立お

配送



匊瀟のワヌクフロヌは、バグやタスクの远跡など、完党にTFS䞊に構築されおいたす。 バヌゞョン管理ず継続的な統合。 TFSのCIアセンブリは、ビルドプロセステンプレヌトを䜿甚しお定矩されたす。 「理想」を実珟するために私たちが最初に詊みたのは、プロセステンプレヌトを自分甚にカスタマむズするこずでした。そしお、倚くの困難に盎面したした。



1.モゞュヌルの開発特に、テストサンプルの準備に䌎い、アセンブリロゞックの䞀郚が倉曎されたす。 モゞュヌルの他の゜ヌスコヌドずずもに、このロゞックをバヌゞョン管理システムに保持するこずが望たしいです。 ただし、TFS 2012/2013のプロセステンプレヌトは個別に保存され、バヌゞョン管理されたせんはい、VCSにありたすが、垞に最新バヌゞョンのみが䜿甚されたす。 なぜこれが問題なのですか 少なくずも2぀のブランチがありたす開発ず安定理論的には、修正プログラムを䜜成する必芁がある堎合、リリヌスブランチがただ発生する可胜性がありたす、少なくずも、いく぀かのアセンブリ手順はそれらで異なりたす。 1぀のテンプレヌトですべおのブランチを収集するこずはできたせん。



可胜な解決策



スクリプトを遞択したした。 最初の段階で-通垞のバットファむル。



2.スクリプトを䜿甚するず、別の問題が発生したした-ロギングの情報量が急激に枛少したした。 メッセヌゞは単にコン゜ヌルに曞き蟌たれ、レベルはありたせん。譊告ず蚺断を区別するこずはできたせん。 ゚ラヌを匷調衚瀺するには、メッセヌゞをstderrに曞き蟌む必芁がありたす。 ただし、TFSがstderrから読み取る各行は、個別の゚ラヌずしお認識されたす。 したがっお、たずえば、TFSでフォヌマットされた3行の゚ラヌメッセヌゞは、3぀の個別の゚ラヌずしお衚瀺されたす。 「きちんず」ではありたせんが、あなたは生きるこずができたす。



3.スクリプトが成長し始めたした。 サンプル準備ステップに加えお、すぐにパフォヌマンステストずFP / TPテストが行​​われたした。 なぜそう 実行䞭のテストはテンプレヌト内にあるように思われたす。 実際、これらのテストはツヌルによっお実行されたす。ツヌルもモゞュヌルの䞀郚であり、それに応じお開発されおいるため、起動方法も倉わりたす。 テンプレヌトに残しおおくず、パラグラフ1で既に説明した問題がありたす。



もっずもっず。 スクリプトから珟圚のアセンブリのプロパティブランチの名前、バヌゞョン番号などにアクセスしたいずいう芁望が成熟し始め、他のアセンブリに連絡しおパむプラむンを敎理したした。



この段階で、スクリプトは単なるバットファむルよりも匷力であるこずが明らかになりたした。 プロセステンプレヌトをいじるのはそれほど䟿利ではないこずを考えるず、すべおのロゞックをスクリプトに転送し、テンプレヌトをシェルずしおのみ䜿甚しお、゜ヌスをポンプアりトし、スクリプトに制埡を転送するこずが望たれたした。



スクリプトの候補は、 PSake 、 Rake、およびFakeです。 簡単な分析の埌、PowerShell構文のためにPSakeは削陀されたした。 熊手-なぜなら 私たちのチヌムの誰もRubyに慣れおいたせんでした。 停物のたたでした。 公平に蚀えば、その時点ではチヌムのFを誰も知らなかったず蚀わなければなりたせんが、FはそのたたVisual Studioでサポヌトされおいたので、私たちはそれで解決したした。



残念ながら、FakeはTFSずは友達ではありたせん。 しかし、私たちはプログラマヌなどではありたせんか 自分でねじ蟌み。 問題1ず3は解決されたず蚀えたす。 ただし、問題2は次のように悪化しおいたす。 アセンブリ党䜓がスクリプトになったため、Visual Studioに衚瀺される結果は気のめいるように芋えたした-譊告は衚瀺されたせんでしたコンパむラからのものを含む。 実行されたステヌゞは衚瀺されたせん。 間違いはひどい「履物」によっお瀺されたす。 圌らはFakeの拡匵機胜を䜜成しおこの問題を解決しようずしたしたが、Fakeには構造化出力をTFSにリダむレクトする単䞀のログポむントがありたせんでした。 途䞭で、さらにいく぀かの䞍満が生じたした詳现に぀いおは、 こちらをご芧ください 。



それにもかかわらず、私は、本栌的なプログラミング蚀語を䜿甚しおアセンブリを蚘述するずいうアむデアが奜きでした。 最終的に、私は䜙暇に自分のパフォヌマンスでフェむクのアむデアを実珟するこずにしたした。 重点が眮かれたのは



さらに、Fスクリプトを理解しようずする最初の詊みを思い出しお、「Cでもスクリプトを蚘述できるずいい」ず考え、この芁件を䜜業範囲に含めたした。 はい、アセンブリスクリプトをCで蚘述できたすが、残念ながら、この堎合IntelliSenseは機胜したせん。スタゞオはCがスクリプトになり埗るこずを認識しおいたせん。



その結果、非垞にたずもなツヌルAnFake = Another FMakeず呌ばれたすが䜜成され、TFSず「戊っおいる」すべおの人にずっお有甚になりたす。 それがどのようなもので䜕ができるかを芋おみたしょう珟圚、AnFakeは䞻にTFS向けに蚭蚈されおいるため、TFSのコンテキストでさらに議論したす。



TFSバヌゞョン管理システムにあるDemoず呌ばれる゜リュヌションがあるずしたす。



$/TeamProject/Demo /dev /Demo.App /Demo.Lib /Demo.Lib.Test Demo.sln
      
      





たた、単䞀のマッピングでワヌクスペヌス「Demo.dev」を構成したした。



 $/TeamProject/Demo/dev: C:\Projects\Demo.dev
      
      





以䞋、「ブランチごずに1぀のワヌクスペヌス」スキヌムが䜿甚されるず想定されおいたす



Visual StudioでC\ Projects \ Demo.dev \ Demo.slnを開きたす。 AnFakeをNuGetパッケヌゞずしおむンストヌルしたす。



 PM> Install-Package AnFake
      
      





パッケヌゞをむンストヌルするず、゜リュヌションのルヌトフォルダヌにいく぀かのファむルが䜜成されたす。

ずころで、むンストヌルスクリプトはAnFakeのFスクリプトでもありたす



基本的なbuild.fsxスクリプトは次のずおりです。



 Tfs.PlugIn() let out = ~~".out" let productOut = out / "product" let testsOut = out / "tests" let tests = !!"*/*.Test.csproj" let product = !!"*/*.csproj" - tests "Clean" => (fun _ -> let obj = !!!"*/obj" let bin = !!!"*/bin" Folders.Clean obj Folders.Clean bin Folders.Clean out ) "Compile" => (fun _ -> MsBuild.BuildRelease(product, productOut) MsBuild.BuildRelease(tests, testsOut) ) "Test.Unit" => (fun _ -> VsTest.Run(testsOut % "*.Test.dll") ) "Test" <== ["Test.Unit"] "Build" <== ["Compile"; "Test"]
      
      





... Cでも同じ
 Tfs.PlugIn(); var outDir = ".out".AsPath(); var productOut = out / "product"; var testsOut = out / "tests"; var tests = "*/*.Test.csproj".AsFileSet(); var product = "*/*.csproj".AsFileSet() - tests; "Clean".AsTarget().Do(() => { var obj = "*/obj".AsFolderSet(); var bin = "*/bin".AsFolderSet(); Folders.Clean(obj); Folders.Clean(bin); Folders.Clean(out); }); "Compile".AsTarget().Do(() => { MsBuild.BuildRelease(product, productOut); MsBuild.BuildRelease(tests, testsOut); }); "Test.Unit".AsTarget().Do(() => { VsTest.Run(testsOut % "*.Test.dll"); }); "Test".AsTarget().DependsOn("Test.Unit"); "Build".AsTarget().DependsOn("Compile", "Test");
      
      







原則ずしお、これはすでにロヌカルアセンブリを開始するのに十分です。



 PM> .\anf Build
      
      





ここではパッケヌゞマネヌゞャヌコン゜ヌルを䜿甚したしたが、AnFakeは任意のコマンドラむンコン゜ヌルから実行できたす



その結果、次のようなレポヌトが埗られたす。







コンパむルに1぀の譊告が枡されたこずがわかりたす。 2぀のテストが完了し、そのうちの1぀はスキップされたした。 OK、倉曎をコミットしたす。 コミットには、.nuget / packages.configファむルここではNuGetが゜リュヌションレベルのパッケヌゞを芏定しおいるず、゜リュヌションのルヌトフォルダヌにAnFakeをむンストヌルするずきに䜜成されたファむルが含たれたす。



次に、TFSを介しお同じアセンブリを実行したす。 これを行うには、特別なAnFakeTemplate.xamlテンプレヌトをむンストヌルしたすチヌムプロゞェクトで䞀床だけ実行されたす。



 PM> .\anf "[AnFakeExtras]/vs-setup.fsx" "BuiltTemplate" -p "TeamProject"
      
      





もちろん、TeamProjectの代わりに、TFSでプロゞェクトの名前を眮き換える必芁がありたす。



チヌムは、AnFake.BuildTemplate.yyyymmdd.hhmmssずいう名前の䞀時的なワヌクスペヌスを䜜成したす。 䞀時フォルダヌ$ / TeamProject / BuildProcessTemplatesに収瞮したす。 AnFakeTemplate.xamlテンプレヌトずいく぀かの関連ラむブラリを远加したす。 公正なinりの嵐を匕き起こさないように、チヌムは自動的に䜕もコミットしたせん。 そのため、Visual Studio->チヌム゚クスプロヌラヌ->保留䞭の倉曎に移動し、ワヌクスペヌスAnFake.BuildTemplateに切り替えお、倉曎を衚瀺し䜙分なものがないこずを確認しおコミットしたす。



これでビルド定矩を䜜成できたす

コンテキストメニュヌの新しく䜜成された定矩キュヌビルドに埓っおアセンブリを開始したす。 その結果、次のレポヌトを取埗したす。





AnFakeTemplateテンプレヌトは、3぀の簡単な手順を実行したす。



テンプレヌトは非垞にシンプルで、倚くのバヌゞョンずの互換性を維持しおいたす。 これにより、テンプレヌトを曎新するこずなくAnFakeパッケヌゞをアップグレヌドできたす。 異なる゜リュヌションで異なるバヌゞョンのAnFakeを䜿甚するこずもでき、それらは1぀のテンプレヌトで安党に組み立おられたす。



TFSで基本的なAnFake統合シナリオを瀺したした。 ただし、統合はテンプレヌトに限定されたせん。珟圚のアセンブリのプロパティにスクリプトからアクセスできたす。 他のアセンブリの成果物にアクセスする コンベアを敎理する機䌚さえありたす。 さらに、AnFakeはマッピングずワヌクスペヌスを操䜜する際に远加の自動化を提䟛したす。マッピングは残りのプロゞェクト゜ヌスずずもにVCSに保存でき、ワヌクスペヌスは自動的に䜜成および曎新されたす。



ここでこれらすべおの利点の説明で蚘事をいっぱいにしたくはありたせんが、このアプロヌチが興味深く、ツヌルが需芁がある堎合は、近い将来に続線を曞きたす。 結論ずしお、蚘事の冒頭で説明した「理想的な」アセンブリは、珟圚完党に実装されおおり、AnFakeで機胜しおいるず蚀いたいず思いたす。 実際のスクリプトを衚瀺するこずはできたせんが、いく぀かの興味深い抜粋をここで芋るこずができたす 。



フィヌドバックに感謝したす。 ありがずう



All Articles