Sunday, February 27, 2011

Setting up MVC 3 for Azure with a scripted build


I just spent a little time setting up an Azure project using ASP.Net MVC 3 and a scripted build. I thought I would share the solution. Be warned, I'm not an expert in this stuff -- let me know if you have any ideas on how to improve this.

Step 1: Set up the directory structure.

I like to follow a relatively simple directory structure for my projects. Of course you can use your own structure; I like this one.

\ProjectName\src     <-- source code, project files, etc.
\ProjectName\lib     <-- 3rd party libraries
\ProjectName\tools   <-- tools (FxCop, 3rd party build tool components, etc)

For this post, I will be using the project name "Gamma".

Step 2: Create the VS2010 solution

Start Visual Studio 2010 and create a new solution. I like to start with a blank solution and add projects as needed. Save as "\Gamma\src\Gamma.sln"

Add a new Windows Azure project. When you are prompted to add roles to the Azure project, skip this step. At the time of this post, the VS templates do not include an Azure MVC 3 project. To get around that problem. Add the empty Azure project to the solution. Then add a new project to the solution and select an MVC 3 project. Then, in the Azure project, add a "web role project in solution..." and select the MVC 3 project.

So, now you should have \ProjectName\src\ directory with one solution file, a directory for the Azure project, a directory for the MVC project and possibly a directory for the unit test project if you elected to add one.

Step 3: Create command line build scripts

I like to have a command line builds, especially for automating your build with a tool like Hudson or Jenkins. I found a post a while back about automating .Net builds and I really liked the approach. I will try to search for a link later to give credit. You create 3 files:

  1. a simple MS Build project file that builds your solution,

  2. a script file to kick off the build from the command line and

  3. a batch file that allows you to double-click on a file in windows explorer to produce a build.

Here are the file's I use:

build.ps1 -- powershell script for command line builds

if ($args)
& $env:systemroot\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe build.proj /t:$args /verbosity:minimal
& $env:systemroot\Microsoft.Net\Framework\v4.0.30319\MSBuild.exe build.proj /verbosity:minimal

ClickToBuild.bat -- batch file for kicking off a build from windows explorer

PowerShell -Command ".\build.ps1"

build.proj -- MSBuild file for building your solution.

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="">


<Target Name="Package" DependsOnTargets="Clean;DebugBuild">
<Message Text="Creating Package for $(ProjectName)" Importance="High" />
<MSBuild Projects="$(ProjectName).sln" Targets="Publish" Properties="Configuration=Debug" />

<Target Name="DebugBuild">
<Message Text="Building $(ProjectName)" Importance="High" />
<MSBuild Projects="$(ProjectName).sln" Targets="Build" Properties="Configuration=Debug" />

<Target Name="Clean">
<Message Text="Cleaning $(ProjectName)" Importance="High" />
<MSBuild Projects="$(ProjectName).sln" Targets="Clean" Properties="Configuration=Debug" />

These are relatively simple. I save them the root of the "src" directory. In Visual Studio, I add a solution folder named "build" and add these 3 files to that solution folder.

The important thing to note is the Targets="Publish" in the package target of the MSBuild file. The "publish" target is what creates the Azure package files that you need for deployment. By default they will be in the \bin\Debug\Publish\ directory of the Azure project.

Note: Azure does not have the MVC binaries by default. You will need to get these to your Azure instance. There are a couple ways to accomplish this. You can either include all the DLLs in your project and set them to "copy local", or you can install MVC3 as part of the Azure startup script. Links to come later.

Let me know if this helped. If I find some time I will add some screen shots.

No comments: