{"id":627,"date":"2009-01-08T14:31:40","date_gmt":"2009-01-08T13:31:40","guid":{"rendered":"http:\/\/www.navision-blog.de\/2009\/01\/08\/how-i-do-continuous-integration-with-my-c-sharp-or-f-sharp-projects-part-i-setting-up-source-control\/"},"modified":"2009-01-13T09:00:59","modified_gmt":"2009-01-13T08:00:59","slug":"how-i-do-continuous-integration-part-i-setting-up-source-control","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2009\/01\/08\/how-i-do-continuous-integration-part-i-setting-up-source-control\/","title":{"rendered":"How I do Continuous Integration with my C# \/ F# projects &#8211; part I: Setting up Source Control"},"content":{"rendered":"<p>In this post series I will show how one can easily set up a <a href=\"http:\/\/martinfowler.com\/articles\/continuousIntegration.html\">Continuous Integration<\/a> scenario for F# or C# projects with completely free products.<\/p>\n<blockquote><p>\u201cContinuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.\u201d<\/p>\n<p align=\"right\">[<a href=\"http:\/\/martinfowler.com\/articles\/continuousIntegration.html\">Martin Fowler<\/a>]<\/p>\n<\/blockquote>\n<p>The first step for Continuous Integration is to set up a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Revision_control\">Source Control<\/a> environment. For many good reasons I choose Subversion &#8211; some of them are:<\/p>\n<ul>\n<li>Atomic commits<\/li>\n<li>Rename\/Move\/Copy actions preserve the revision history<\/li>\n<li>Directories are versioned<\/li>\n<li>Multiple repository access protocols including HTTP and HTTPS<\/li>\n<li>There is a nice Visual Studio integration (see below)<\/li>\n<li>Last but not least: it is completely free \ud83d\ude42<\/li>\n<\/ul>\n<h5>Source code version control with Subversion<\/h5>\n<p>All you need for setting up a complete Subversion environment is to download and install VisualSVN Server from <a title=\"http:\/\/www.visualsvn.com\/\" href=\"http:\/\/www.visualsvn.com\/\">http:\/\/www.visualsvn.com\/<\/a>.<\/p>\n<blockquote><p>\u201cVisualSVN Server is a package that contains everything you need to install, configure and manage <strong>Subversion server<\/strong> for your team on <strong>Windows platform.<\/strong> It includes Subversion, Apache and a management console.\u201d<\/p>\n<p align=\"right\">[<a href=\"http:\/\/www.visualsvn.com\/server\/\">product homepage<\/a>]<\/p>\n<\/blockquote>\n<p>Now you can create user accounts and a repository \u201dCITest\u201d in the VisualSVN Server management console.<\/p>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Create a repository\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image.png\" alt=\"Create a repository\" width=\"404\" height=\"220\" \/><\/p>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"VisualSVN Server management console\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_3.png\" alt=\"VisualSVN Server management console\" width=\"500\" height=\"340\" \/><\/p>\n<h5>Subversion integration in Visual Studio 2008<\/h5>\n<p>Download and install AnkhSVN 2.0.x from <a title=\"http:\/\/ankhsvn.open.collab.net\/\" href=\"http:\/\/ankhsvn.open.collab.net\/\">http:\/\/ankhsvn.open.collab.net\/<\/a>.<\/p>\n<blockquote><p>\u201cAnkhSVN is a Subversion SourceControl Provider for Visual Studio. The software allows you to perform the most common version control operations directly from inside the Microsoft Visual Studio IDE. With AnkhSVN you no longer need to leave your IDE to perform tasks like viewing the status of your source code, updating your Subversion working copy and committing changes. You can even browse your repository and you can plug-in your favorite diff tool.\u201d<\/p>\n<p align=\"right\">[<a href=\"http:\/\/ankhsvn.open.collab.net\/\">product homepage<\/a>]<\/p>\n<\/blockquote>\n<p>Now you can add your C#\/F#-solution to your CITest-repository:<\/p>\n<ul>\n<li>Open the solution in Visual Studio 2008<\/li>\n<li>Open \u201cView\/Repository Explorer\u201d and add your repository to AnkhSVN\n<ul>\n<li>You can copy the URL from the VisualSVN Server management console (In my case this is <a title=\"https:\/\/omega:8443\/svn\/CITest\/\" href=\"https:\/\/omega:8443\/svn\/CITest\/\">https:\/\/omega:8443\/svn\/CITest\/<\/a>)<\/li>\n<li>You also have to give AnkhSVN your Subversion login<\/li>\n<\/ul>\n<\/li>\n<li>Now click the right mouse button on your solution in the Solution Explorer and choose \u201cAdd Solution to Subversion\u201d<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Add Solution to Subversion\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_4.png\" alt=\"Add Solution to Subversion\" width=\"342\" height=\"368\" \/><\/p>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Don't forget to specify a Log Message\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_5.png\" alt=\"Don't forget to specify a Log Message\" width=\"342\" height=\"203\" \/><\/p>\n<p>Now we can modify our solution and commit our changes via \u201cCommit solution changes\u201d in the Solution Explorer:<\/p>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Commit Solution Changes\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_6.png\" alt=\"Commit Solution Changes\" width=\"500\" height=\"390\" \/><\/p>\n<p>We can easily control our changes via AnkhSVN\u2019s \u201cRepository Explorer\u201d and \u201cHistory Viewer\u201d in Visual Studio 2008:<\/p>\n<p><a href=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_7.png\"><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Repository Explorer and History Viewer\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_thumb.png\" alt=\"Repository Explorer and History Viewer\" width=\"500\" height=\"283\" \/><\/a><\/p>\n<p>If we do any changes in the Program.fs file, we can see a diff via the \u201cShow changes\u201d functionality:<\/p>\n<p><img loading=\"lazy\" class=\"bordered\" style=\"display: inline\" title=\"Diff with AnkhSVN\" src=\"http:\/\/www.navision-blog.de\/images\/ContinuousIntegration_8D99\/image_8.png\" alt=\"Diff with AnkhSVN\" width=\"500\" height=\"246\" \/><\/p>\n<p>If you don\u2019t like the default Diff tool you might try <a href=\"http:\/\/winmerge.org\/\">WinMerge<\/a>.<\/p>\n<p><a href=\"http:\/\/www.navision-blog.de\/2009\/01\/08\/how-i-do-continuous-integration-part-ii-continuous-integration-server\/\">Next time<\/a> I will show how to set up a Continuous Integration server.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post series I will show how one can easily set up a Continuous Integration scenario for F# or C# projects with completely free products. \u201cContinuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,23,448,29,3],"tags":[495,492,664,494,190,174,496,497],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/627"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=627"}],"version-history":[{"count":4,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/627\/revisions"}],"predecessor-version":[{"id":659,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/627\/revisions\/659"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=627"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}