Building a .NET application with Jenkins
Building a .NET project using Jenkins CI is a true breeze…
Jenkins configuration
The first thing is to install the MsBuild Jenkins plugin. After that, it is a quick pointing to the msbuild executable and we’re off to a good start…
Project configuration
Next, configure the project to use the MsBuild version we setup. Point it to your build file and we are ready to build…
The fairy tale
In theory, of course, that is how simple it should have been. At least, that’s how the fairy tale goes. Having a look at the console output and bam, back to the cruel world where I find myself with a couple of challenges:
- warning MSB3644: The reference assemblies for framework “.NETFramework,Version=v4.0″ were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend.
- error MSB4019: The imported project “C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets” was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
- error CS0234: The type or namespace name ‘Mvc’ does not exist in the namespace ‘System.Web’ (are you missing an assembly reference?)
The fixing
The first issue is relatively simple to fix. It requires that you download and install the small (~500MB) Windows SDK for Windows 7 and .NET Framework 4. You don’t need all of it. Only select the .NET Development components in the installation options. Install this on the server and the warnings be gone!
The second, yeah, the second issue is where the Caption Hook catches something unmentionable. To fix this; you’ll feel the hook… Two choices; either create the folders and copy the missing file from your development machine or install Visual Studio on the build server. The purist rants and raves. Go with the lesser of the two evils, create the folder structure and copy the file. That wasn’t that painful; I feel dirty.
The third issue is that ASP.NET MVC 3 is not found anywhere on the server. Easy fix, download and install ASP.NET MVC 3.
Finally, the project builds and all is well. For now.
Jenkins and Git
The road split for Hudson and Jenkins. It happens.
Getting the source code…
I don’t have Cygwin or MSysGit installed on the server for my own perverse reasons. In order for Jenkins to get hold of the source code from a git repository is usually straight forward. Well, now comes the time to get the source code from git. I can clone repository into a local directory using GitSharp. GitSharp is the .net version of git and very cool, but not quite finished yet. The alternative is a Java application called JGit. GitSharp, by the way, is a derived work of JGit.
Setting up Jenkins…
Download the shell script of JGit which, by the way, is a self-contained command line executable. With that, I am able to test the cloning of a repository into a new folder with the following command line:
C:\JGit>java -cp org.eclipse.jgit.pgm-0.10.1.sh org.eclipse.jgit.pgm.Main clone
http://dev/git/myproject.git c:\projects\myproject
After executing the above command line, I have the source files in the c:\projects\myproject directory. To use this in Jenkins, I need to make use of the batch command execution since the git plugin makes use of git.exe and all the other things I didn't setup.
After running a build, I have the following console output in Jenkins and the source code in the build factory directory:Started by user anonymous [MyProject] $ cmd /c call C:\Windows\TEMP\hudson12048252217381411.bat d:\builds\factory\MyProject>"C:\Program Files\Java\jre6\bin\java.exe" -cp c:\jgit\org.eclipse.jgit.pgm-0.10.1.sh org.eclipse.jgit.pgm.Main clone http://dev/git/myproject.git d:\Builds\Factory\MyProject Initialized empty Git repository in d:\Builds\Factory\MyProject\.git remote: Counting objects: 342, done From {0} * [new branch] master -> origin/master d:\builds\factory\MyProject>exit 0 Finished: SUCCESS
by Sydney du Plooy
Git and Hudson Brothers
For a while now, I’ve been thinking about creating a source control and build server for a couple of projects that I’m working on. I’ll admit, I moonlight. Anyway, a great analysis ensued. Starting with the OS; what will it be, what does it need to be? Considering that I’m building .NET projects and they’re Windows based; well that kind of settles that. Next up, which source control system? Oh boy, this took a while…
Source Control
Since everyone, OK, almost everyone, raves about Git, I suppose I’ll have to succumb. But, this is where the fun starts. I want Git, I want Windows. Pushing, cloning and so on is what really I want. What a painful story… This requires the installation of MSysGit or Cygwin and some SSH server, blah blah, whatever. It was simply too much.
I decided to run VisualSVN on the server and then use git-svn to bridge that little dilemma. Well, that kinda sucked. After formatting and configuring and formatting and configuring, I finally found this post by Jeremy Skinner. It explains how to setup Git on Windows using IIS 7.0, without any other fancy installations and configurations. He calls it git-dot-aspx (GitAspx). To my surprise, this worked elegantly, the first time. Push, pull and clone without any issues. Great.
Continuous Integration
What a mental battle this turned out to be! What should I use, what do I need to use? There is from CruiseControl.NET to Hudson. A colleague mentioned Hudson and, being quite popular, I decided to investigate. This turned out to be a fantastic piece of software. It is a Java application, but I decided that it is well worth it. One click and it installs as a Windows service. One command line and it uninstalls cleanly. Unbelievable! Such a polished product. Also, it has many plugins from MsBuild to Git to Twitter. Talk about pressure, having your build status published to Twitter!
For a good Windows alternative, these two products turned out to be highly effective and user friendly.
AutoMocking with RhinoMocks and StructureMap
Auto mocking is the process whereby mock objects are created and injected into an object. By using this technique we relieve ourselves from the burden of creating and injecting mocks manually. Consider the following test class that requires two dependencies; namely, IPropertyDependency and IConstructorDependency:
public class ClassToBeAutoMocked
{
private IConstructorDependency _ConstructorInjectedDependency;
public ClassToBeAutoMocked(IConstructorDependency dep)
{
_ConstructorInjectedDependency = dep;
}
private IPropertyDependency PropertyDependency
{
get;
set;
}
public string PrintConstructorDependency()
{
return _ConstructorInjectedDependency.Print();
}
public string PrintPropertyDependency()
{
return PropertyDependency.Print();
}
}
The one dependency is provided in the constructor and the other is injected via the private property. Out-of-the-box, StructureMap AutoMocker provides the ability to mock and inject the constructor dependency. Private properties, however, are not supported. This can be solved by means of an extension method applied to the RhinoAutoMocker type, for example:
public static class RhinoAutoMockerExtensions
{
public static void RegisterPropertyDependency<TARGETCLASS>(this RhinoAutoMocker autoMocker, string propertyName) where TARGETCLASS : class
{
var propertyInfo = typeof(TARGETCLASS).GetProperty(propertyName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (propertyInfo == null)
{
throw new ArgumentException(string.Format("Property {0} was not found on the type {1}",
propertyName, typeof(TARGETCLASS).Name));
}
var propertyType = propertyInfo.PropertyType;
var mockDependency = MockRepository.GenerateMock(propertyType, null);
autoMocker.Inject(propertyType, mockDependency);
propertyInfo.SetValue(autoMocker.ClassUnderTest, mockDependency, null);
}
}
We now have the necessary pieces to get an auto mocked instance of ClassToBeAutoMocked.
Next, create an instance of the RhinoAutoMocker class with the concrete type, which will then create the constructor dependency mock and inject it. Because the private property dependency injection is not supported we have to tell the AutoMocker that we want the private property mocked and injected as well. We accomplish this by calling the extension method RegisterPropertyDependency with the name of the property that must be mocked. To obtain a reference to the generated mock we can call the Get method with the dependency type which will return the mock instance. We are then free to stub or set expectations on that dependency as required by our unit tests.
For example:
static void Main(string[] args)
{
var mocks = new RhinoAutoMocker(MockMode.AAA);
mocks.RegisterPropertyDependency("PropertyDependency");
mocks.Get<IConstructorDependency>().Stub(x => x.Print()).Return("On fire with the constructor dependency!");
mocks.Get<IPropertyDependency>().Stub(x => x.Print()).Return("On fire with the property dependency!");
Console.WriteLine("Constructor dependency output: {0}", mocks.ClassUnderTest.PrintConstructorDependency());
Console.WriteLine("Property dependency output: {0}", mocks.ClassUnderTest.PrintPropertyDependency());
Console.ReadLine();
}
IConstructorDependency
Resizing a virtual hard disk
Recently, I had to resize a VHD (virtual hard disk) that I installed Windows Server 2008 on. I soon found out that the size of 10GB is not such a hot idea when installing Team Foundation Server 2010 and SQL Server 2008 on the same instance. Hence, I decided to resize the disk instead of re-installing all of the software.
Below is the recipe to resize the virtual hard disk:
Part 1:
The first part is to resize the container of the partition, which is done by means of a sector copy. After the resize completed, the container will have increased but the partition will not be fully extended yet.
- Download VHD Resizer from VMToolkit.
- Install and run VHD Resizer.
- In the file open dialog select the VHD that you want to resize.
- Type in the new filename to use for the extended VHD.
- Type in the size of the new container to create.
- Click on Resize. The process takes a few minutes…
Part 2:
Now that the container is resized, we must now extend the partition to make use of the full container size.
- Attach the new extended VHD as a non-primary drive to another virtual machine. Do not extend the partition using the virtual machine that will make use of it.
- Start the virtual machine to which the extended VHD was attached as the non-primary drive and open a command prompt.
- Type in diskpart and press Enter.
- Type in list disk.
- Ensure that disk 1 or greater is the extended disk.
- Type in select disk 1.
- Type in list partition.

- Ensure that the partition sizes matches the old size.
- Type in extend.
- Wait for the process to complete and type exit.
Remember to change the disk on the original virtual machine to now use the extended disk. The disk is now resized and ready to be used from the original virtual machine.
Sinking your interview before it starts
During a series of interviews I discovered some things about reading CV’s that downright irritate me. I share them here with you just in case your interviewer is anything like me :).
- Keep it short and to the point. CV’s that span more than four pages is too long. I had the displeasure of reading a CV of seventeen pages. That makes me unhappy. Your interviewer simply does not have the time to read your entire life story.
- Observe the DRY (Don’t repeat yourself) principle in your CV. Do not repeat the fact that you have a degree three times.
- Keep the details relevant. I want a programmer. I’m not interested in the fact that you are a landlord or that you are the chairperson of your body corporate.
- If you have been between jobs frequently and they have been contract based, make sure you state it clearly.
- Check and check again for spelling mistakes. There is nothing more annoying than spelling mistakes in a CV.
If you are working through a recruitment agency, insist on reviewing your CV before they send it out. Often the candidate will send the recruitment agency a two page CV and then they will apply power word magic and out comes a CV of seventeen pages. Recruitment agents also tend to embellish CV’s. This is the worst mistake they can make as it will paint this picture-perfect image of you that might not match up to the reality when you are interviewed.
Skills matrices are my absolute favorite. Rating yourself an expert in C# will make me raise an eyebrow if your name is not Anders Hejlsberg or Eric Lippert. Call yourself an expert if you can almost recite the ECMA specifications off by heart.
How to sink yourself in the interview
Sinking your interview isn’t all that hard. When answering questions in an interview, remember that there is a time to shut up. Ten minutes to answer a question is too long. Lookout for the interviewers glazed stare. That is a sign that you have crossed the shut-up-already limit a couple of miles ago.
Remember that you don’t know the people that are interviewing you. They have their opinions and stances and you can offend them in no time. Always keep this in mind.
Programming pragmatically
Don’t program if… you have not yet read The Pragmatic Programmer: From Journeyman to Master by Andy Hunt and David Thomas. I never understood what all the fuss was about and here I am making a fuss about it.
pragmatic 1540s, from M.Fr. pragmatique , from L. pragmaticus ”skilled in business or law,” from Gk. pragmatikos ”versed in business,” from pragma (gen. pragmatos ) “civil business, deed, act,” from prassein ”to do, act, perform.” (1)
Pragmatic programmer
So, what makes a pragmatic programmer? A pragmatic programmer is someone who exhibits certain attitudes and practices when thinking, writing, testing and deploying software. This includes being an early adopter or fast adapter, being inquisitive and thinking critically. It also means being realistic and being anything-ready. And to be anything -ready one must learn continuously.
One of the major philosophies is to always place the problem and the solution in a larger context. This means to always think beyond the immediate problem and see the bigger picture. Why? Simply, so that you can make informed decisions such as deciding where to comprise and where to apply the Pareto principle.
A pragmatic programmer takes responsibility for everything they do. They don’t just sit there and watch the code rot. A pragmatic programmer will always endeavor to keep the code pristine.
Instigating change is another important skill that a pragmatic programmer must learn to apply. People are naturally opposed to change and in order to be a pragmatic in a software project, it is sometimes necessary to break the “we have always done it like this” mentality.
Skills and Tools
Using the appropriate tools is one of the best ways to amplify your productivity. Try various tools and pick the ones that work for you. Then, learn them extremely well. Mold them to the shape of your hand. Consider the following categories of tools:
- Source control
- Text manipulation
- Debugging
Another important tool is to be able to touch type. This is a worthwhile skill to learn, so be prepared to put in a lot of time.
Life as a pragmatic programmer
Being a pragmatic programmer does not make you write perfect programs. Accept it. Things will go wrong and when they do, we should ensure that the data always remain consistent. As the book says “dead programs tell no lies” and sometimes it is best to just simply kill it.
As long as there are people, software will change, continuously. That’s life. Pragmatic programmers guard themselves against the impact of these changes by observing the Law of Demeter (it’s not a dot counting exercise) and decoupling dependencies. Keep separate concepts separate.
Coding is not just a matter of transcribing requirements into source code. It is a continuous process of making decisions. Decisions that will either pave your way or cause you grief later on. The choice is yours. Think critically about every line of code and remember to refactor continuously. Test, test and test some more.
While building software, there are two important principles that a pragmatic programmer always observes. These are avoiding duplication at all costs and avoid splitting a piece of knowledge across multiple components. Failing to observe these two principles will invariably bring you headaches in the future as the source code spirals out of control.
This is the way of the pragmatic programmer.
By the way, there are loads of tips in the book that will not only benefit you now, but for as long you write code.
(1) Dictionary.com, “pragmatic,” in Online Etymology Dictionary. Source location: Douglas Harper, Historian. http://dictionary.reference.com/browse/pragmatic. Available: http://dictionary.reference.com. Accessed: June 13, 2010.
Mocking multiple interfaces using Rhino Mocks
A while back on StackOverflow I asked a question on how to create a mock object with Rhino Mocks that implements multiple interfaces. In other words, I want to generate a mock that implements more than one interface. This baffled me for a while and I was shown the light by one of my colleagues.
A multi-mock is created like so:
var mocker = new MockRepository(); var mock = mocker.CreateMultiMock<IPrimaryInterface>(typeof(IFoo), typeof(IBar)); mock.Expect(x => x.AnswerToUniverse()).Return(42); mocker.ReplayAll();
Note the call to ReplayAll. Without this call the mock will not be setup with the intended values.
Unit test deployment issue when file is untrusted
Recently, I decided to use NHibernate in a project so that I could achieve database affinity. That provided me with another benefit and that was the ability to create a database in-memory for testing purposes. Sounded great, but while trying to run the unit tests using MsTest and SQLite, I received the following error: “Test Run deployment issue: The location of the file or directory ‘C:\projects\myproject\SQLite\sqlite3.dll’ is not trusted.“.
That problem was easily solved by simply unblocking the file. Below are the steps on how to unblock the file:
- Right-click the blocked file (sqlite3.dll), and then click Properties.
- This will open the properties dialog:
- In the General tab, click Unblock.
- Click on OK.
That’s it, the file is now trusted and the runtime should be able to load the file successfully.
Kindle review
I finally took the plunge and purchased the Kindle 6″ Global Wireless edition from Amazon. I simply couldn’t wait for it to arrive. Something akin to a 7 year old getting his first bicycle. Finally, the day arrived!
Packaging
The packaging was so impressive it is almost worth its own blog post – the attention to detail was outstanding.
For example, how much attention do you pay to bar codes? Well, Amazon didn’t slip on bar code detail. Have a closer look and you’ll see that little man sitting under the tree reading his book…
The next interesting part is the “Certified frustration-free packaging” seal. That seal lives up to the promise. Opening the box is done with a peel-off strip. What a neat way to open the box. Again, Amazon had the detail going – the opening strip read “Once upon a time…”. Mission accomplished: frustration-free packaging.
Cover
I decided to get the well-worth-it leather cover for the additional $31.99. At the bottom right there is a metal branding insert. Nice idea, although, I was a little disappointed with the top right hand corner as the leather wasn’t properly fitted around the plate. The stitching around the edges is very neat and the feel of the cover is luxurious.
Inside, it has a soft padded inner; front and back; that is essential to protect the screen from accidental bumps. Before I bought the cover, I was perplexed about how the device attaches to the cover. Maybe with elastic bands around each corner, I thought?! The website wasn’t too detailed about it and for the price of $31.99 I would expect it to be a decent cover with a proper attachment mechanism. And so it was. The attaching mechanism of the cover just simply blew me away.
With only two ingenious hinges the cover and the device will have a hard time separating by itself. The bottom hinge slides into the device at an angle and the top hinge slides into the device. It has a spring action and releases when pulled downwards. So, the device attaches by sliding in the bottom hinge at an angle and secured by the top hinge. Ingenious.
Power adapter
B
attery powered devices have this tendency to run down from time to time and needs to be charged every so often. Luckily the Kindle ships with more than one way to get this much needed charge. Firstly, there is charging by USB and secondly, charging by plugging into the mains. The latter is done with an American style two pin plug. Having ordered the global edition, it is a little unusual to find an American style plug in the packaging. With this in mind Amazon realized that this is not quite optimal and included another adapter that converts the American style to an European two pin style plug. Great, I live in South Africa where we have huge three pin plugs. Nothing that another adapter can’t fix. A downside is that the battery is not easily replaced, except by sending it in to Amazon. I suspect that this is by design. Annuity income?
The device
When taking the device out of the packaging, I was surprised that instructions were printed on the screen. How amazing to realize that E-Ink doesn’t consume any power to display static text or images. As can be seen in the photo, a random image is rendered on the display every time it is switched off.
I was pleasantly surprised at the quality of the display. It renders fonts with a very nice smooth precise anti alias effect. The display can be read from almost any angle. The downside is that it doesn’t have a back light and I hope that it will make an appearance in future editions. Although I can easily justify it by saying “you can’t read a book in the dark, can you?”. Another little annoying thing with the display is the “clearing” effect when paging. With e-ink, the reader first has to black the current page, clear the page and then render the text or image. However, this process is fairly quick on the Kindle and one gets used to the effect quickly.
In South Africa I was also surprised to find the 3G connection worked first time round without any hassles and automatically registered the Kindle at Amazon when the first connection was established.It seems to be making use of the Vodacom network. Using the 3G connection is weighs down on the battery and I would recommend using it only when necessary.
The buttons are perfectly placed on the device – when you are not using the cover. Using the left-hand buttons with the cover on is not user friendly. It is rather silly that the previous page-button is only on the left. Not a problem if you use the device without the cover. The five-way scroll button is perhaps a little on the small side but quite functional. Don’t expect to use the keyboard like an ordinary one. The buttons are tiny. Why is there a keyboard on Kindle?
When reading a book on the Kindle, you’ll be surprised to know that it comes with a dictionary that is automatically invoked when you scroll to a word and hover. Brilliant. You can do manual searches in the dictionary, make annotations on pages. Setting a bookmark on a page makes a little dog-ear shape appear in the top right-hand corner.
Another surprise was the back of the device. It has a very neat brushed metal finish and makes it feel expensive. The serial number is printed at the bottom, in case you are wondering. Beside that the Kindle has built-in text-to-speech functionality which works brilliantly.
Loading your own PDF documents to the Kindle is a cinch. It mounts the same as a flash drive in Windows and books and PDF documents are copied to the documents folder. One thing that I found is that when plugging it into the USB port the device becomes “unusable” until you eject it from Windows. I have tried to eject it to get it usable while plugged in but with no success. Maybe it’s just me?
Being able to load PDF documents (from version 2.3) is great. Not being able to zoom them is not so great. I hope to see a zoom feature added to the PDF documents reader. The display can be rotated but the reader just doesn’t feel right being read in a rotated manner.
Shopping on the Kindle is great experience with custom layouts specially formatted for the Kindle. Beware that the quickest way to being broke is to enable the Buy now with 1-Click facility. It’s ease of use is addictive.
When reading a book the Kindle disappears once you get into the book. It’s a great reading device and at the price of $259 I strongly recommend it.






2 comments