ãããžã§ã¯ããæåã§å ¬éããŠããŸããïŒ ããããç§ãã¡ã¯ããªãã«è¡ããŸã

ã«ããã©ã€ã³ã®äžã§ã以äžãå«ã.NETãããžã§ã¯ãã®CIããŒãããå®è£ ããããã®ã¬ã€ãã©ã€ã³ïŒ
- æ¯æ¥ã®èªåãã«ã
- åé¡éç¥
- ãã°è¿œè·¡ã·ã¹ãã ããã³ããŒãžã§ã³ç®¡çã·ã¹ãã ãšã®çµ±å
- 補åã®ããŒãžã§ã³ç®¡ç
- ããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡ç
- èªåèšç®ãšããã¯ã¢ãã
ãŸãããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ããšã¯äœã§ããïŒ
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒEngãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒ-ããã¯ãœãããŠã§ã¢éçºã®ãã©ã¯ãã£ã¹ã§ããããããžã§ã¯ãã®é »ç¹ã«èªååãããã¢ã»ã³ããªãå®è£ ããŠãã€ã³ãã°ã¬ãŒã·ã§ã³ã®åé¡ãè¿ éã«ç¹å®ããŠè§£æ±ºããŸãã
å®çšçãªèŠ³ç¹ããã¯ãããã¯ããã€ã§ããã¹ããŸãã¯å®èšŒã§ããã補åã®çŸåšã®ææ°ããŒãžã§ã³ããå¿ èŠã§ããããšãæå³ããŸãã
ãããè¡ãã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- éçºè ãã³ãŒããå°ãªããšãæ¯æ¥VCSã«æäŸããããã«
- 補åã®çµã¿ç«ãŠã¯èªåçã«è¡ãããŸãã
- 補åã®è¡šç€ºïŒããŒã¿ããŒã¹ã®æŽæ°ãå«ãïŒãèªåçã«è¡ãããŸãã
- 補åãã¹ãã¯èªåã§è¡ãããŸããïŒå¯èœãªéãïŒ
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãšã¯ãã¢ãžã£ã€ã«ãã©ã¯ãã£ã¹ãæããŸãã ã¢ãžã£ã€ã«ã¯ãéçºããã¹ãã補åéçºã®ãµã€ã¯ã«ãç¹°ãè¿ãç¹°ãè¿ãå埩ããã»ã¹ã䌎ããŸãã ã«ãŒãã³ããã»ã¹ã®èªååã«ãããè€æ°ã®ã«ãŒãã³æäœãåé¿ãããŸãã
VCSã䜿çšãã
ãŸããã¢ããªã±ãŒã·ã§ã³ããã¹ãããããã®ãã¹ãç°å¢ãå¿ èŠã§ãã ãã¹ããµã€ã¯ã«ãååã«é·ããéçºãéãå Žåã¯ãéçºç°å¢ã匷調ããã®ãçã«ããªã£ãŠããŸãã VCSæ§é ã¯åšå²ãåæ ããŸãããã¹ãŠã®éçºè ã¯ã¡ã€ã³ã®éçºãã©ã³ãã§äœæ¥ããç¹å®ã®ããŒãžã§ã³ãä¿®æ£ãããŠãã¹ããã©ã³ãã«ããŒãžãããŸãã ãã¹ããã©ã³ãããããã¹ãç°å¢ã§èšç®ãè¡ãããŸãã ããŒãžã³ã®ãã¹ããä¿®æ£ãéããŒãžãå®è¡ãããŸãã ãã¹ããããããŒãžã§ã³ã¯ãªãªãŒã¹ãã©ã³ãã«éä¿¡ãããããããæ¬çªç°å¢ã«å ¬éãããŸãã ãããã¯ã·ã§ã³ã«ãã¹ãããå ŽåïŒæ®å¿µãªãããããçºçããŸãïŒããããã¯ã·ã§ã³ãã©ã³ãããç·æ¥ã¢ãŒãã§ä¿®æ£ããåã³DEVãã©ã³ãã«ä¿æããŸãã
å²åŠã§ã¯ãGITã¯å°ãç°ãªããŸããGITã§äœæ¥ããå Žåããã¹ã¿ãŒãéçºè ã«ã³ãããããããšã¯æ £ç¿çã§ã¯ãªãããã§ãã 代ããã«ãæ©èœãã©ã³ãã®ã¢ãããŒããå®è·µãããŠããŸãã gitã®ã¯ãŒã¯ãããŒã«ã€ããŠã¯ã habrahabr.ru / post / 60030ãã芧ãã ãã ã äžè¬ã«ãææ¡ãããŠãããã¹ãŠã®VCSæ§é ã«ã¯1ã€ã®ç®æšããããŸããéçºãã©ã³ããå®å®ããŠããªãç¶æ³ãåé¿ããããšã§ãã æ§é ãéžæãããšãã¯ãã1æ¥ã ãçç£ãç¶ããŠããã¹ãŠãå£ãããšã¯ã§ããŸãããïŒ çãããã¯ããã®å Žåãæ§é ã¯é©åã§ãã
å®çšŒåãšã©ãŒãèŠéããªãããã«ããã¹ãç°å¢ãã§ããã ãã¿ãŒã²ããã«è¿ã¥ããå¿ èŠããããŸãã éåžžãäž»ãªå°é£ã¯ããµãŒãããŒãã£ã®WebãµãŒãã¹ãŸãã¯ä»ã®ã³ã³ããŒãã³ããšå®éã®éèååŒã«é¢é£ããæäœãžã®äŸåã§ãã
æ§æ
ç°å¢ãã©ã®ããã«åäžã«ããããšããŠããæ§æãã¡ã€ã«ã¯ç°ãªããŸãããã¹ãã¢ã«ãŠã³ããšå®éã®ã¢ã«ãŠã³ããããŒã¯ã³ãIDãå€éšWebãµãŒãã¹ãªã©ã§ãã .NETã¯ãæ§æãææ°ã®ç¶æ ã«ä¿ã€ããã®åªããããŒã«ãæ§æå€æãæäŸããŸãã äœããã®çç±ã§ãããã«äœ¿çšã§ããããã«ãWebã¢ããªã±ãŒã·ã§ã³ã«ã®ã¿å«ãŸããŠããŸãã 幞ããªããšã«ãå€æã¯ä»ã®ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããã®ã«ååç°¡åã§ãã<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> <Target Name="AfterCompile" Condition="Exists('App.$(Configuration).config')"> <!--Generate transformed app config in the intermediate directory--> <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" /> <!--Force build process to use the transformed configuration file from now on.--> <ItemGroup> <AppConfigWithTargetPath Remove="App.config" /> <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config"> <TargetPath>$(TargetFileName).config</TargetPath> </AppConfigWithTargetPath> </ItemGroup> </Target>
åå¿è ã®éçºè ã¯ãããŒã«ã«ãã·ã³ã§Web.configã®å€æããããã°ãããšãã«ãã°ãã°æ··ä¹±ã«é¥ããŸããApp.configãšã¯ç°ãªããbinããã©ã«ããŒã§ã¯ãªãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ä¿åããããããããŒã«ã«ã¢ã»ã³ããªäžã«å€æã¯è¡ãããŸããã å€æã¯ããããžã§ã¯ããå ¬éãããšãã«é©çšãããŸãã ãã®å¶éãæ¬åœã«åé¿ããå¿ èŠãããå Žåã¯ãWeb.template.configãã¡ã€ã«ãäœæããPostBuildã¢ããªã±ãŒã·ã§ã³ã«å€æãè¿œå ã§ããŸãã ãããžã§ã¯ãããå€æã¿ã¹ã¯ãåé€ããããšãå¿ããªãã§ãã ãããåé€ããªããšãå€æã2åé©çšãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§ä»ã®ãã¯ãããžãŒã䜿çšãããŠããå Žåãåç §èšå®ãå€æŽããããã®äžè¬èšå®ãšè¿œå ã®èšå®ãã¡ã€ã«ãå«ã1ã€ã®ã¡ã€ã³èšå®ãã¡ã€ã«ãä¿æããããšããå§ãããŸãã ããã«ãããåãèšå®ã®ã³ããŒã¢ã³ãããŒã¹ãããä¿åãããŸãã
ãããžã§ã¯ãã«ãªããã¡ã€ã«ãèšç®ã«è¿œå ãã
<PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn); </CopyAllFilesToSingleFolderForPackageDependsOn> </PropertyGroup> <Target Name="CustomCollectFiles"> <!-- Copy JavaScript files --> <ItemGroup> <CompressedScripts Include="Sources\**\*.js" /> <FilesForPackagingFromProject Include="%(CompressedScripts.Identity)"> <DestinationRelativePath>Sources\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> <!-- Copy stylesheets --> <ItemGroup> <CompressedScripts Include="Sources\**\*.css" /> <FilesForPackagingFromProject Include="%(CompressedScripts.Identity)"> <DestinationRelativePath>Sources\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </FilesForPackagingFromProject> </ItemGroup> </Target>
補åã®ããŒãžã§ã³ç®¡ç
.NETã¯ãã¢ã»ã³ããªã®ããŒãžã§ã³ç®¡çã«2ã€ã®å±æ§ãæäŸ[ã¢ã»ã³ããªïŒAssemblyVersionïŒ "1.0.0.0"ïŒ]
[ã¢ã»ã³ããªïŒAssemblyFileVersionïŒ "1.0.0.0"ïŒ]
æåã®2æ¡ã¯ãã¡ãžã£ãŒããŒãžã§ã³çªå·ãšãã€ããŒããŒãžã§ã³çªå·ã§ãã ãããã®æ°å€ã¯ãæ©èœå€æŽã®å¢åã解éããŸãã 3æ¡ç®ã¯ãããããã¢ã»ã³ããªçªå·ã§ãã æ¯æ¥ãããŒãžã§ã³ã®éçºäžã«ããã®ããŒãžã§ã³ãå¢å ããŸãã ãããŠæåŸã®çªå·ã¯ãªããžã§ã³çªå·ã§ãã ãã®æ°ã¯ãæ¥äžã«ãã«ããµãŒããŒã§ããŒãžã§ã³ããã«ããããã³ã«å¢å ããŸãã .NETããŒãžã§ã³ç®¡çããªã·ãŒã®è©³çŽ°ã¯ãCïŒãä»ããRichterã®CLRã§èª¬æãããŠããŸãã
èªåããŒãžã§ã³ç®¡çã¯ããŸããŸãªæ¹æ³ã§æ§æã§ããŸãã ãã®ãããã¯ã®è©³çŽ°ã«ã€ããŠã¯ã stackoverflow.com / questions / 1126880 / how-can-i-auto-increment-the-c-sharp-assembly-version-via-our-ci-platform-hudsoã§èª¬æããŸãã
äž»ãªã¢ãããŒã
- ããŒãžã§ã³1.0ã®ããŒãžã§ã³ã䜿çšãã*ã*ïŒãã«ããµãŒããŒã§ã¯ããŸãæ©èœããŸããïŒ
- åäžã®ãã¡ã€ã«SharedAssemblyInfoã䜿çšããŠããã®å Žæãããã¹ãŠã®ã¢ã»ã³ããªã®ããŒãžã§ã³ã管çããŸãïŒããŒãžã§ã³çªå·ãæã€1ã€ã®ãã¡ã€ã«ãäœæãããããªã³ã¯ãšããŠãããã¹ãŠã®ãããžã§ã¯ãã«è¿œå ãããŸãïŒ
- AssemblyInfoãã¡ã€ã«ã®ä»£ããã«msbuildã䜿çšãã
- TFSã®å ŽåãWWF-Activityã䜿çšã§ããŸã
ç§ã®æèŠã§ã¯ãmsbuildã䜿çšããCIãµãŒããŒã䜿çšããŠå€ãèšé²ããã®ãæã䟿å©ã§ãã
<Major>1</Major> <Minor>0</Minor> <Build>$(BUILD_NUMBER)</Build>
ææ°ã®CIãœãªã¥ãŒã·ã§ã³ã¯ãã¹ãŠããã«ãæã«ãã®ãããªå€æ°ãæäŸããŸãã ãã®ã¢ãããŒããæ©èœãããã«ã¯ã msbuildtasks.tigris.orgããmsbuildã¿ã¹ã¯ã®ã€ã³ããŒããè¿œå ãããããžã§ã¯ãã®æåŸã«è¿œå ããå¿ èŠããããŸãã
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" /> <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')"> <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" /> <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " /> </Target>
ããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡ç
ããŒã¿ããŒã¹ãå€æŽããå¿ èŠã®ãªãåäžã®ãããžã§ã¯ããç¥ããŸããã .NETã¯æ¬¡ã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŸããSSDTãããžã§ã¯ãmsdn.microsoft.com/en-us/data/tools.aspx
é·æïŒããŒã¿ããŒã¹ãäœæããã³ç·šéããããã»ã¹ã¯ãManagement Studioã§è¡ãæ¹æ³ã«äŒŒãŠããŸããçæïŒç§»è¡ã¹ã¯ãªãããæžãã®ãé£ããã ãªããªã å¢åå€æŽã¯ãããžã§ã¯ãèªäœã«ãã£ãŠæ§ç¯ãããããŒã¿ã®ã»ãã¥ãªãã£ã¯å±éåããã³å±éåŸã®ã¹ã¯ãªããã«ãã£ãŠä¿èšŒãããŸãã ããŒã¿ããŒã¹å ã®ãã£ãŒã«ãã®æç¡ã«äŸåãããã移è¡ãšã³ãžã³ã«æ¢ã«å®è£ ãããŠããã¹ããŒãããŒãžã§ã³ããŒãã«ããäœæãããå¿ èŠããããŸãã
ECM7移è¡ã³ãŒãcode.google.com/p/ecm7migrator
ãªãŒãã³ãœãŒã¹ã®ç§»è¡ãšã³ãžã³ã ãã®ãããžã§ã¯ãã¯ã dima117 habrayuzerã«ãã£ãŠãµããŒããããŠããŸããé·æïŒããŸããŸãªDBMSããµããŒããããŠããŸããäœããããªãã«åããªãå Žåãã³ãŒãã¯ãªãŒãã³ã§ãã migratorã¯ãµããŒããããŠãããæ°ããæ©èœã§å€§ãããªããããŠããŸãã ãããŠãããããæãéèŠãªããšã¯ã1ã€ã®ããŒã¿ããŒã¹ã§è€æ°ã®ç§»è¡ããŒããµããŒãããããšã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãã¢ãžã¥ãŒã«åŒã§ãããäœããã®åœ¢ã§ãã©ã°ã€ã³ããµããŒãããŠããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã åãã©ã°ã€ã³ã¯ãç¬èªã®ç§»è¡ãå®è¡ããåæã«1ã€ã®ããŒã¿ããŒã¹ã䜿çšã§ããŸãã
çæïŒ Entity Framework Migrationsã®å©ç¹ã¯ãããŸããã
Entity Framework Migrations blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
é·æïŒããã«äœ¿çšã§ããDbã³ã³ããã¹ãã§èªåçã«ç§»è¡ãäœæããVisual Studioã³ã³ãœãŒã«ããã³ãã³ããç解ãã移è¡ã¯æšæºã®Visual Studioããçºè¡ã䜿çšããŠçºè¡ãããŸããçæïŒ Entity Frameworkã«äŸåããŸãã
3ã€ã®ãœãªã¥ãŒã·ã§ã³ãã¹ãŠãè©Šãããšãã§ããŸããã EFã䜿çšããå Žåãéžæã¯ééããªãEF移è¡ã§ãã.NHibernateã®å Žåã¯ECM7 Migratorã䜿çšã§ããŸãã SSDTãããžã§ã¯ãã¯ããŠã£ã¶ãŒããšãŠã£ã³ããŠã奜ããªäººã«é©ããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®å ¬éãèªååãã
2012幎ã«ã¯ãWebãããžã§ã¯ãã®ã¹ã¿ãžãªå ¬éã·ã¹ãã ãå€§å¹ ã«æ¹åãããŸããã ããã¯äž»ã«åºçç©ãããã¡ã€ã«ã«é¢ä¿ããŸãã Azureã§ã¢ããªã±ãŒã·ã§ã³ãå ¬éããå Žåããããã¡ã€ã«ã¯ããŒã¿ã«ããç°¡åã«ããŠã³ããŒãã§ããŸãã ãã以å€ã®å Žåã¯ãäœæããå¿ èŠããããŸãã

ã¹ã¯ãªãŒã³ã·ã§ããã«èŠãããããã«ãWebDeployã®ææ°ããŒãžã§ã³ã§ã¯ã1ã€ã®ãã§ãã¯ããŒã¯ã ãã§EF移è¡ãå®è¡ã§ããŸãã ããã«ãã¹ã¿ãžãªããã®ãããªã±ãŒã·ã§ã³ã¯ãå€æã䜿çšããã«æ¥ç¶æååã眮ãæããããšãã§ããŸãã
å€æãšå ¬éã®è©³çŽ°ã¯ãTroy Huntã®èšäºïŒ www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity.htmlïŒã«èšèŒãããŠããŸãã ããã§ã圌ã®ã¬ã€ãã©ã€ã³ã®5çªç®ã®ã¹ããããã€ãŸããã«ããµãŒããŒã䜿çšããèªåå ¬éã«æ³šç®ããŠããŸãïŒ www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_26.html ç§ã¯TeamCityã®å€§ãã¡ã³ãªã®ã§ããã®ç¹å®ã®CIãèŠãŠã¿ãŸãããã
WindowsãµãŒãã¹ã®å ¬éãèªååãã
WindowsãµãŒãã¹ãèªåçã«äœæããæãç°¡åãªæ¹æ³ã¯ãscã³ãã³ãã䜿çšããããšã§ãã sc [<ServerName>] create|stop|start <ServiceName> binpath= <BinPath> start= demand
å¯äžã®åŸ®åŠãªç¹ã¯ããã€ããªã<BinPath>ã«é ä¿¡ããæ¹æ³ã§ãã ããã¯ããŸããŸãªæ¹æ³ã§è¡ãããšãã§ããŸããFTPçµç±ã§ã¢ããããŒããããPowerShellã䜿çšããããµãŒããŒã®å ±æãã©ã«ããŒã§xcopy / robocopyãŸãã¯rsyncã䜿çšããã éžæã¯ããããã¯ãŒã¯ç°å¢ãšã»ãã¥ãªãã£èŠä»¶ã«ãã£ãŠç°ãªããŸãã
Teamcity
äžèšã®ããŒã«ã䜿çšãããšãæéãç¯çŽã§ããŸãã ãã«ããµãŒããŒãã€ã³ã¹ããŒã«ããŠã¿ãŸãããã TeamCityïŒ www.jetbrains.com/teamcityãããŠã³ããŒãããŠã€ã³ã¹ããŒã©ãŒãå®è¡ããã©ãã§ã[OK]ãã¯ãªãã¯ããŸããTeamCityã®2ã€ã®äž»èŠãªæŠå¿µã¯ãããããžã§ã¯ãããšããã«ããã§ãã ããããžã§ã¯ããã¯ãœãªã¥ãŒã·ã§ã³ã«å¯Ÿå¿ãããã«ãã¯ãããžã§ã¯ãã®æå³ã®ããäžé£ã®ã¢ã¯ã·ã§ã³ïŒã¢ã»ã³ããªããã¹ãã®å®è¡ããµãŒããŒãžã®ã¢ããããŒããããã¯ã¢ããã®äœæãªã©ïŒãæããŸãã
èªåã¬ã€ã¢ãŠã
æåã®ã¹ãããã¯ãVisual Studioãã€ã³ã¹ããŒã«ãããŠããªããããã¯ã®æ°ããããŒãžã§ã³ãã¢ããããŒãããæ©äŒãäžããããšã§ããäž»ãªã¢ã€ãã¢ã¯ãè¿œå ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠmsbuildã¹ããããå®è¡ããæ°ãããã«ãå®çŸ©ãäœæããŠãæåã®Msbuildã¹ããããéžæããããšã§ãã ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ã§æž¡ãå¿ èŠããããŸãïŒ
/P:Configuration=%env.Configuration% /P:DeployOnBuild=True /P:DeployTarget=MSDeployPublish /P:MsDeployServiceUrl=https://%env.TargetServer%/MsDeploy.axd /P:AllowUntrustedCertificate=True /P:MSDeployPublishMethod=WMSvc /P:CreatePackageOnPublish=True /P:UserName=AutoDeploy\Administrator /P:Password=Passw0rd
ãããã®ãªãã·ã§ã³ã¯ãå ¬éããå Žæã瀺ããŸãã
移è¡ãå ¬éããã«ã¯ãè¿œå ã®ã³ãã³ãã©ã€ã³ã¹ããããå¿ èŠã§ãã
SET AssemblyName=MyMvc4App SET StartUpDirectory=MyMvc4App\bin\ SET ConnectionString=Server=tcp:XXXX.database.windows.net,1433;Database=XXXX;User ID=XXXX;Password=XXXX;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;MultipleActiveResultSets=True SET ConnectionStringProvider=System.Data.SqlClient SET ConfigFilePath=%CD%\MyMvc4App\web.config SET MigrateExe=packages\EntityFramework.5.0.0\tools\migrate.exe %MigrateExe% %AssemblyName%.dll /startUpDirectory:%StartUpDirectory% /startUpConfigurationFile:"%ConfigFilePath%" /connectionProviderName:"%ConnectionStringProvider%" /connectionString:"%ConnectionString%" /verbose
ãã«ããä¿åããŸãã ããã§ã誰ã§ãVCSããææ°ããŒãžã§ã³ãæçš¿ã§ããŸãã å¶æ¥æ¥ã®éå§åã«æ¯æ¥ãããããããŒã¹ã¿ã³ãã§å ¬éããããšããå§ãããŸãã ãããã£ãŠãçµ±åã®åé¡ãã§ããã ãæ©ããã£ãââãã§ããŸãã
ããŒãªã³ã°ãã«ã
å¥ã®è¯ãç¿æ £ã¯ãããªã¬ãŒãæ§æããŠãã«ãããã«ãããããšã§ããããã«ãããå€ãã®éçºè ãåæã«ãããžã§ã¯ãã«åãçµãã§ããå Žåãã¬ããŸãã¯ã¿ã€ããŒïŒããšãã°10åããšïŒãå€æŽããããã³ã«ãœãªã¥ãŒã·ã§ã³ã®ãã«ããéå§ãããŸãã éç¥ã¯ãã®ãã«ãã«æ¥ç¶ããå¿ èŠããããŸãã TeamCityã¯ãVisualStudioããã³Tray-applicationã®ãã©ã°ã€ã³ã䜿çšããŠãã¡ãŒã«ãjabberã«ããéç¥ããµããŒãããŠããŸãã å³ãããªãã·ã§ã³ãéžæããŠãã ããã ãã¬ã€å ã®ã¢ããªã±ãŒã·ã§ã³ã奜ãã§ãã ãã«ããå£ããŠããå Žåã¯ãæ©æ¥ã«ä¿®æ£ããå¿ èŠããããŸãããã«ããå£ããªãæ¹æ³
ã©ã®ãããªæ¹æ³ãå°å ¥ããŠããéçºè ãåéãããããŠããªãã³ãŒããVCSã«æäŸããªãããšã100ïŒ ä¿èšŒããæ¹æ³ã¯ãããŸããã ãã®åé¡ã¯ã管çæ段ã®å©ããåããŠè§£æ±ºããå¿ èŠããããŸããå€æŽåŸã«ãã«ããã¢ã»ã³ãã«ãããããšã確èªããã«äœæ¥ãäžæããªãã§ãã ããã ç§ãåããŠããããäŒç€Ÿã§ã¯ãå£ãããã«ãã®åé¡ã¯ãããã«ããå£ãã-ã±ãŒããæã£ãŠããŠããšããã«ãŒã«ã«ãã£ãŠé »ç¹ã«è§£æ±ºãããŸããã æåã«ã圌ãã¯æ¯æ¥ã±ãŒããé£ã¹ãŠããããã圌ãã¯æ¢ãŸããŸããããã¹ããèªåçã«å®è¡ãã
ãã®ã¹ãããã¯ããŠããããã¹ããšçµ±åãã¹ããšåãå ¥ããã¹ãã«åããããŸãã åäœãã¹ãã¯ã©ã®ç°å¢ã§ãæ©èœãããããããã¯éèŠã§ãã ãã¹ãŠã®å€éšäŸåé¢ä¿ã¯åœç©ã«çœ®ãæããããŸããåäœãã¹ãã®å®è¡
ããã§ã¯ãã¹ãŠãç°¡åã§ãã ãã«ãã¹ããããNunitããŸãã¯ãMsTestããéžæãããã¿ãŒã³**ãTest * .dllãå ¥åããŸãããã¹ããããžã§ã¯ãã®ååã§.Testsãã¿ãŒã³ã䜿çšããå ŽåãTeamCityãæ®ããè¡ããŸããçµ±åããã³åãå ¥ããã¹ããå®è¡ãã
ãããã®ãã¹ãã¯å€ãã®èŠå ã«äŸåããå¯èœæ§ãããããããã®èµ·åã«ã¯ããŒãªã³ã°ããã¯ã¢ãããŸãã¯åæåã¹ã¯ãªãããå«ãŸããå ŽåããããŸãã ãã®ãããªãã¹ãã®éå§æã«è¿œå ã®ã¬ããŒããäœæããããšãã§ããŸãã ãããžã§ã¯ãã«èšç®ãæ£ããããªãã§ããããã®ããã®ç¹å¥ãªãã«ããäœæããæ¹ãè¯ãã§ãã TeamCityã§ã¯ãäžé£ã®ãã«ããäœæã§ããŸãã åãå ¥ã/çµ±åãã¹ãã䜿çšãããã«ãã®ãã«ãããªã¬ãŒã§ã¯ãèšç®ãå«ããã«ããæ£åžžã«å®äºãããšãã«æ©èœããããªã¬ãŒãè¿œå ã§ããŸãã åãå ¥ããã¹ããå®è¡ããããã®ãã®ãããªãã«ãã®äœæïŒãããã¯ã§èª¬æããhabrahabr.ru/post/182032ããã¯ã¢ãã
èšç®äžã«ããã¯ã¢ãããäœæããããšãèªååã§ããŸãã ãã¡ã€ã«ã·ã¹ãã ã®ããã¯ã¢ããã«ã€ããŠã¯ãå人çã«ã¯nnbackupãããè¯ããã®ã¯èŠã€ãããŸããã§ããïŒ www.nncron.ru/index_ru.shtml nnbackup -n 10 verz -i <Src> -o <Destination> -s -e âv
ãã®ã³ãã³ãã¯ãzipå ã«ãœãŒã¹ãã©ã«ããŒãäœæããã¢ãŒã«ã€ããå®å ã«ã³ããŒããŸãã ã¿ãŒã²ãããã·ã³ã«nnbackupãã€ã³ã¹ããŒã«ãããããã«ããµãŒããŒããåŒã³åºããŸããèšå®ããã«ããµãŒããŒã®å Žæããããã¯ãŒã¯ãªãŒããŒããããã»ãã¥ãªãã£ã«é¢ãã質åã§ãã
T-SQLã䜿çšããŠSQLãµãŒããŒãããã¯ã¢ããã§ããŸã
BACKUP DATABASE AdventureWorks2012 TO DISK='X:\SQLServerBackups\AdventureWorks1.bak', DISK='Y:\SQLServerBackups\AdventureWorks2.bak', DISK='Z:\SQLServerBackups\AdventureWorks3.bak' WITH FORMAT, MEDIANAME = 'AdventureWorksStripedSet0', MEDIADESCRIPTION = 'Striped media set for AdventureWorks2012 database; GO RESTORE DATABASE AdventureWorks FROM DISK='$(Backup)'
ã€ãŸã èªåããã¯ã¢ãããè¡ãã«ã¯ãå¥ã®ã³ãã³ãã©ã€ã³ã¹ããããè¿œå ããå¿ èŠããããŸãã ãŸãã¯ãåãã³ãã¥ããã£ããã±ãŒãžããmsbuildã¿ã¹ã¯ã䜿çšããŠãnnbackupã«msbuildã¿ã¹ã¯ãèšè¿°ã§ããŸãã
ããã«é²ãã§ãåãå ¥ããã¹ãã倱æããå Žåã«ããã¯ã¢ããããã®èªåããŒã«ããã¯ãéå§ããããªã¬ãŒãèšå®ã§ããŸãã ãã®åŸãäžé£ã®ãã«ãããããŸããã¬ã€ã¢ãŠã»åãå ¥ããã¹ã»ããã¯ã¢ããããã®ããŒã«ããã¯ã
ãããžã§ã¯ã管çã·ã¹ãã ããã³ãã°ãã©ãã«ãŒãšã®çµ±å
ãããŸã§ã¯ããã§ã«å€ãã®äŸ¿å©ãªããšãè¡ã£ãŠããŸããã äžå¿«ãªæ©èœã1ã€æ®ã£ãŠããŸãã ãã«ããµãŒããŒã¯ããŸã éçºããã»ã¹ã«æ¥ç¶ãããŠããŸããã 圌ã¯çŸåšã®éçºã€ãã¬ãŒã·ã§ã³ã®ã¿ã¹ã¯ã«ã€ããŠäœãç¥ããŸãããTeamCityã¯ãYouTrackãJiraãBugzillaãšã®çµ±åããµããŒãããŠããŸãã çµ±åã¯ãæåéã2ã¯ãªãã¯ã§å®è¡ãããŸãã ãã®åŸãã³ããããžã®ã³ã¡ã³ãã§ã¿ã¹ã¯çªå·ã瀺ããšããã«ãæ å ±ã«å¯Ÿå¿ããã¿ã¹ã¯ãžã®ãªã³ã¯ã衚瀺ãããŸãã
YouTrackã¯éçµ±åããµããŒãããŠããŸãã äž»ãªå©ç¹ïŒYouTrackã¯ããã°ãŸãã¯æ©èœãéãããããã«ãã®çªå·ãèªåçã«ç€ºããŸãã
ã¢ãŒãã£ãã¡ã¯ãã®æ§ç¯
ã¢ããªã±ãŒã·ã§ã³ãããã¯ã¹åãããŠããå Žåã¯ãããããã€ã³ã¹ããŒã©ãŒãäœæããããã¯ã©ã€ã¢ã³ãã«åºè·ããããã±ãŒãžããããã€ããå¿ èŠããããŸãã ã€ã³ã¹ããŒã©ãŒã®äœæã¯å¥ã®ãããã¯ã§ãããã®ãããã¯ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯èæ ®ããŸããã ç®±å ¥ã補åã®å Žåãã€ã³ã¹ããŒã©ãŒãŸãã¯ãããªã±ãŒã·ã§ã³ããã±ãŒãžããªãªãŒã¹ã®æãéèŠãªéšåã§ããããšãéèŠã§ãã ãã®ããã«ããã«ãã¢ãŒãã£ãã¡ã¯ããçºæãããŸãããã¢ãŒãã£ãã¡ã¯ãã¯ããã«ãã®éèŠãªçµæã§ãããã¡ã€ã«ã§ãã ã€ã³ã¹ããŒã©ãŒã䜿çšãããã«ãã®å Žåããã«ãã¢ãŒãã£ãã¡ã¯ãã®ãã¹ã¯ãšããŠmy-installer.exeãŸãã¯my-package.zipãæå®ã§ããŸããTeamCityã¯ãããã察å¿ããã¿ãã«è¡šç€ºããŸãã
ããã¯ã課é¡ãã©ãã«ãŒãšã®çµ±åã圹ç«ã€å Žæã§ãã ãã¹ã¿ãŒãŸãã¯ãããŒãžã£ãŒã¯ãéããããã¿ã¹ã¯ã確èªãããã«ãã®ãªã³ã¯ããã©ãããã«ãã¢ãŒãã£ãã¡ã¯ãããä¿®æ£ãããããŒãžã§ã³ãéžæã§ããŸãã
çµè«ãšããŠãéçºããã»ã¹ã¯ããŒã ããšã«çŽç²ã«åå¥ã§ãããšä»ãå ããŸãã ãããã®ãã©ã¯ãã£ã¹ãåºæ¬ã§ãã ããŒã«ãããã®ãããªãéçºã¯ã補åã®éçºãšãšãã«è¡ãããå¿ èŠããããŸãã ç§ãã¡ã¯ãä»ã®äººã ã®ç掻ãæ¹åããããã®ãœãããŠã§ã¢ãéçºããŠããŸãã ç§ãã¡ãä»äºãããããããããã«ããœãããŠã§ã¢ã䜿çšããã®ãè³¢æã§ãã