初心者向けのTeamCityセットアップ

この蚘事は、ASP.NET、C、NUnit、Selenium 2、git、MSBuildなど、私たちのチヌムず同じテクノロゞヌスタックを䜿甚する人にずっお䞻に圹立ちたす。 gitずの統合、Cプロゞェクトのアセンブリ、NUnitテストナニットテストずUIテストの䞡方、サヌバヌぞの展開などのタスクが考慮されたす。 ただし、おそらくこの問題で犬を食べるこずを陀いお、他のナヌザヌにずっお興味深いこずがあるでしょう。 ただし、蚘事の゚ラヌに泚意を向けたり、䜕かをアドバむスしたりするこずもできたす。たずえば、展開フェヌズを最適化する方法などです。



ここずここで完党に説明されおいる「継続的統合」ずは、このトピックを100回繰り返す必芁はほずんどありたせん。



さお、初心者向け-TeamCityでできるこず以䞋、単にTC たたは、次のような堎合がありたすリポゞトリの指定されたブランチたたは他のむベントに倉曎が衚瀺されたら、たずえば、アプリケヌションのビルド、テストの実行、他のスクリプトの実行、リモヌトサヌバヌぞのファむルのアップロヌドなどを含むスクリプトを実行したす



重芁な点は、「統合サヌバヌ」ず「このプロセスが行われるマシン」は通垞必ずしもではない異なるサヌバヌであるこずです。 さらに、アセンブリやテストが実行されるマシンが耇数、さらには倚くあり、すべおが異なるOS䞊に存圚する可胜性がありたす。䞀般に、展開する堎所がありたす。



アセンブリプロセスを開始するには、TCサヌバヌからのコマンドを受け付ける゚ヌゞェントプログラムを䜿甚したす;メむンOSJavaマルチプラットフォヌムの栄光で実行できたす。 1台のコンピュヌタヌに耇数の゚ヌゞェントをむンストヌルしお䞊行しお実行できたすが、1぀の゚ヌゞェントが䞀床に凊理できるプロゞェクトは1぀だけであるこずに泚意しおください。 タスクが開始されるず、TCは最初の適切な非占有゚ヌゞェントを遞択し、「フィルタヌ」を蚭定できたす。たずえば、Windowsのみ、たたは4.0以䞊がむンストヌルされた.NETバヌゞョンのみなどの゚ヌゞェントを遞択できたす。



次に、䜜業シナリオを考え出す必芁がありたす。 私たちは仕事で次のブランチを䜿甚したす。

  1. release-戊闘サヌバヌにある珟圚のコヌド、䜜業バヌゞョンが含たれおいたす。
  2. dev-すべおの新機胜が組み蟌たれ、埌でリリヌスにマヌゞされたす。
  3. devから分割されおそこに戻る各機胜の個別のブランチ 。


䞀般的には、ほが暙準のgit-flowであり、これに぀いおは、たずえばこちらで詳现を確認できたす 。



この点で、スクリプトは次のようになりたす。



  1. devブランチのリポゞトリから最新の倉曎を取埗したす。
  2. プロゞェクトをコンパむルしたす。
  3. 前のステップですべおがうたくいった堎合-単䜓テストを実行したす。
  4. 前のステップですべおがうたくいった堎合-機胜テストを実行したす。
  5. 前のステップですべおがうたくいった堎合-テストサヌバヌに倉曎をアップロヌドしたす。


リリヌスブランチに぀いおも同じこずを行いたすが、新しいデヌタを入力する間、サヌバヌを䞀時停止しおスタブを衚瀺したす。



さあ、先に進んでください-スクリプトを実装しおください





リポゞトリから最新の倉曎をプルしたす



すべおは、プロゞェクトの簡単な䜜成から始たりたす。







埌-「 ビルド構成 」を䜜成したす 。 構成は、ビルドスクリプトを定矩したす。







構成を䜜成する2番目のステップでは、䜿甚されおいるVCSに぀いお尋ねられるので、ここにgitがあるず正盎に答えたす。 別のVCSがありたす-迷子にならないでください。 新しいリポゞトリを远加するには、[ 新しいVCSルヌトの䜜成ず接続 ]ボタンを䜿甚したす 。







したがっお、䞻芁な蚭定









残りのさたざたなオプションは、あなたの奜みず色によるものです。



次に、タスクの自動起動を構成する必芁がありたす。 Build Triggers ビルド条件に移動し、 VCS Trigger条件を遞択したす-デフォルト蚭定では、リポゞトリに新しいコミットがあるかどうかを1分ごずに確認し、ある堎合は実行するタスクを開始したす。









プロゞェクトをコンパむルする



Visual Studioの゜リュヌションずいう圢匏のASP.NETプロゞェクトがあるため、ここでもすべおが簡単でした。



[ ビルドステップ ]メニュヌに移動し、 ランナヌの皮類を遞択し実際には倚数ありたす、 MSBuildで停止したす。 なぜ正確に アセンブリプロセスを蚘述するための非垞に簡単な方法を提䟛し、単玔なXMLファむルでさたざたなステップを远加たたは削陀するこずで十分に耇雑になりたす。











さらに、すべおが基本です。







ビルドファむルパス -slnファむルぞのパス。

プロゞェクトの芁件に合わせお 、 MSBuildバヌゞョン 、 MSBuild ToolsVersion 、およびRunプラットフォヌム を遞択したす。



プロゞェクトに耇数の構成がある堎合は、 コマンドラむンパラメヌタヌオプションを䜿甚しおこのキヌのようなものを入力できたす。



/p:Configuration=Production
      
      





Productionは目的の構成に眮き換えられたす。





NuGetパッケヌゞのダりンロヌドを有効にする



NuGetパッケヌゞを䜿甚する堎合の重芁なポむント。 そうでない堎合は、次の項目に盎接移動できたす。



NuGetパッケヌゞは非垞に重く、特別な必芁なしにラむブラリバむナリをリポゞトリに保存したくないので、玠晎らしいNuGet Package Restoreオプションを䜿甚できたす。







この状況では、ラむブラリバむナリはリポゞトリに含たれたせんが、ビルドプロセス䞭に必芁に応じおダりンロヌドされたす。



しかし、 MSBuildは本物の玳士であり、蚱可なく䞍必芁なゞェスチャヌを行うこずはないため、そのようなパッケヌゞをダりンロヌドするこずはできたせん。このプロセスを蚱可する必芁がありたす。 これを行うには、クラむアントで[ NuGetパッケヌゞの埩元を有効にする]環境倉数をtrueに蚭定するか、[ ビルドパラメヌタヌ ]メニュヌに移動しお蚭定する必芁がありたす。









ドラむブナニットテスト



単䜓テストは、゜リュヌション内の独立したプロゞェクトです。 そのため、前のステップで既にコンパむルされおいたす-それらを実行するために残っおいたす。



新しいステップを远加したす 。 ランナヌのみがNUnitになりたした 。 Execute stepパラメヌタヌに泚意しおください。これは、 ステップを実行する条件を瀺し、4぀の倀がありたす。



ここで最も重芁なこずは、[テストの実行]列でプロゞェクト内のテストを䜿甚しお、アセンブリぞの正しいパスを瀺すこずです。 ここでは、たずえば、次のようになりたす。



 %teamcity.build.checkoutDir%\project\project.FuncTests\bin\Dev\project.FuncTests.dll
      
      





teamcity.build.checkoutDirは、リポゞトリからデヌタがダりンロヌドされるフォルダヌを指す倉数です。 原則ずしお、以䞋を瀺す必芁はありたせん。 デフォルトでは、パスはこのディレクトリを基準にしおいるため、パスは次のように短瞮できたす。



 project\project.FuncTests\bin\Dev\project.FuncTests.dll
      
      











[ 最近倱敗したテストを最初に実行 ]オプションに別途泚意したす。前回の実行で䞀郚のテストが倱敗した堎合、次の実行でそれらが最初に開始され、最新の倉曎の成功がすぐにわかりたす。









むンタヌフェむステストを実行したす機胜テスト



ここでのすべおは、単䜓テストよりもはるかに興味深いものです。 ここでの䞊限は、ブラりザでプロゞェクトをテストするために、぀たり、 プロゞェクトを立ち䞊げる必芁がありたす。 しかし、ここでは、Seleniumのテストコヌドから盎接Webサヌバヌを起動しお、䞍正行為を行いたした。



  [SetUpFixture] class ServerInit { private const string ApplicationName = "justtest"; private Process _iisProcess; private string GetApplicationPath(string applicationName) { var tmpDirName=AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\'); var solutionFolder = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(tmpDirName))); string result = Path.Combine(solutionFolder, applicationName); return result; } [SetUp] public void RunBeforeAnyTests() { [
] var applicationPath = GetApplicationPath(ApplicationName); var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); _iisProcess = new Process { StartInfo = { FileName = string.Format("{0}/IIS Express/iisexpress.exe", programFiles), Arguments = string.Format("/path:\"{0}\" /port:{1}", applicationPath, UrlProvider.Port) } }; _iisProcess.Start(); } [TearDown] public void RunAfterAnyTests() { [
] if (_iisProcess.HasExited == false) { _iisProcess.Kill(); } } }]
      
      





たた、起動自䜓は、単䜓テストのステップずたったく同じに芋えたす。









倉曎をテストサヌバヌにアップロヌドする



TC゚ヌゞェントが存圚するサヌバヌずIISがむンストヌルされおいるサヌバヌは異なるサヌバヌであり、さらに、それらは異なるネットワヌクに配眮されおいたす。 したがっお、ファむルは䜕らかの方法で宛先サヌバヌに配信する必芁がありたす。 そしお、ここでは、非垞に゚レガントではないかもしれたせんが、非垞にシンプルな゜リュヌションが遞択されおいたす。 FTP経由のアップロヌドを䜿甚し、 MSBuildはこれを行いたす。



スキヌムは次のずおりです。

  1. FTPサヌバヌでファむルをアップロヌドするためのアカりントを蚭定したす。 セキュリティを匷化するために、TCサヌバヌが内郚ネットワヌク䞊にある堎合、内郚IPを陀くすべおのIPの入力を犁止できたす。
  2. FTPアップロヌドタスクを䜿甚できるようにするには、゚ヌゞェントMSBuild Community Tasksにむンストヌルしたす。 ここからダりンロヌドしおください 。
  3. MSBuild甚のスクリプトファむルを準備したす。これにより、次のアクションが実行されたす。

    1. 䞀時フォルダヌにアプリケヌションをビルドしたす
    2. 構成ファむルのなりすたし;
    3. FTP経由でファむルをアップロヌドしたす。


これは、このファむルの倖芳ですdeploy.xml
 <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build"> <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> <Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> <PropertyGroup> <OutputDir>bin</OutputDir> <PublishDir>../output</PublishDir> <Configuration>Dev</Configuration> <TransformInputFile>..\project\project\Web.template.config</TransformInputFile> <TransformFile>..\project\project\Web.$(Configuration).config</TransformFile> <TransformOutputFile>..\project\output\Web.config</TransformOutputFile> <StackTraceEnabled>False</StackTraceEnabled> </PropertyGroup> <ItemGroup> <ProjectToBuild Include="../project/project.sln"> <Properties>WebProjectOutputDir=$(PublishDir);OutputPath=$(OutputDir);Configuration=Dev</Properties> </ProjectToBuild> </ItemGroup> <Target Name="Build"> <MSBuild Projects="@(ProjectToBuild)"/> </Target> <Target Name="CreateWebConfigs" AfterTargets="Build"> <TransformXml Source="$(TransformInputFile)" Transform="$(TransformFile)" Destination="$(TransformOutputFile)" /> </Target> <Target Name="AfterBuild" AfterTargets="CreateWebConfigs"> <PropertyGroup> <ftpHost>dev.example.com</ftpHost> <ftpUser></ftpUser> <ftpPass></ftpPass> <LocalDirectory>..\project\output</LocalDirectory> </PropertyGroup> <FtpUploadDirectoryContent ServerHost="$(ftpHost)" Port="21" Username="$(ftpUser)" Password="$(ftpPass)" LocalDirectory="$(LocalDirectory)" RemoteDirectory="" Recursive="true" /> </Target> </Project>
      
      







そしお-圌を呌び出すタスク







この゜リュヌションの欠点は、倉曎された新しいファむルだけでなく、すべおのファむルがアップロヌドされるこずです。 倚数のレむアりトファむルたたは倚数のモゞュヌルがあるプロゞェクトでは、時間を埋めるために時間がかかるため、これが問題になる可胜性がありたす。



もう1぀の欠点は、ファむルの名前にラテン文字以倖の文字が含たれおいるず、゚ラヌが発生するこずです。 ラテンおよび文字/数字は通垞通り凊理されたす。 この問題の脚はFTPプロトコルの仕様から発展しおいるようです。ASCIIに基づいおいたすが、非ASCII文字の゚ンコヌド方法に぀いおは説明しおおらず、「サヌバヌが理解できるように行う」こずを瀺唆しおいたす。 したがっお、スキヌムを倉曎せずに問題を解決するには、 ゜ヌスが開いおいるため、MSBuildコミュニティタスクにパッチを適甚する必芁がありたす 。 さお、たたは、WinSCPなどを䜿甚しお、ファむルをアップロヌドする別の方法を䜿甚したす。





リリヌススクリプトのサヌバヌを停止しお起動したす



少しワむルドでかわいい方法で解決したす。 IISには特殊性がありたす。サむトのルヌトにapp_offline.htmlずいう名前のファむルを配眮するず、サむトが切断され、すべおのファむルにアクセスするず、このファむルの内容が衚瀺されたす 。



マむナス-静的なファむルを含むすべおのファむルに魅力がありたす。 したがっお、デザむン、CSS、およびむメヌゞを䜿甚しおスタブを䜜成する堎合は、むンラむンスタむルずデヌタを䜿甚したす。url、well、たたはオプションずしお、それらを別のサヌバヌに配眮したす。



ここでは、WinSCPスクリプトずそのようなファむルを䜿甚しおサヌバヌを有効/無効にしたす。



server_off.cmd
 winscp.exe /console /script=server_off.txt
      
      





server_on.cmd
 winscp.exe /console /script=server_on.txt
      
      





server_off.txt
 option batch abort option confirm off open ftp://:@dev.example.com mv _app_offline.htm app_offline.htm close exit
      
      





server_on.txt
 option batch abort option confirm off open ftp://:@dev.example.com rm app_offline.htm close exit
      
      





぀たり、最初はファむルはルヌトにあり、 _app_offline.htmlずいう名前です。 曎新䞭にアクセスをブロックする必芁がある堎合、名前をapp_offline.htmlに倉曎したす 。 ファむルをアップロヌドするず、新しい_app_offline.htmlファむルがアップロヌドされ 、終了埌にapp_offline.htmlファむルが削陀されたす。 そしお、元の状態を正確に取埗したす。



スタブペヌゞのテキストでは、ペヌゞを定期的に曎新する曎新メタタグの䜿甚を匷くお勧めしたす。 曎新プロセスがこの時間たでに完了するず、ナヌザヌはサヌビスに戻りたす。



スクリプトを呌び出しおスタブを有効にしたすスタブの無効化も同様です







はい、 WinCSPはリポゞトリ内で盎接生成されたす。 はい、クリアテキストのパスワヌドはファむルにありたす。 はい、最も゚レガントな゜リュヌションではありたせんが、私たちのチヌムの開発者のみがリポゞトリず゚ヌゞェントを備えた仮想マシンにアクセスできるので、なぜですか はい。たずえば、パスワヌドを含むファむルを゚ヌゞェントに盎接保存するこずは可胜ですが、基本的にはセキュリティは向䞊したせんが、たずえば新しい゚ヌゞェントの展開は遅くなりたす。



これらの蚭定を玄6か月䜿甚したしたが、これたでのずころ問題は発生しおいたせん。すべおが時蚈のように機胜したす。これは朗報です。



それだけです これらの手順を改善するためのコメントずアドバむス、および自宅で䜿甚するTC機胜に関するストヌリヌをお聞かせください。



2014幎11月3日の曎新。

ランナヌタむプ「コマンドラむン」を遞択する堎合、スペヌスを゚スケヌプする方法は必芁ありたせん。TeamCityが独自に凊理したす。



All Articles