MSBuild deployment sample for web applications
Check out the code sample
Download the Deployment Code Sample from github and select to download the zip archive of the source
Overview of the code
VERSION.xml
build.bat
build.proj
lib/
MSBuildCommunityTasks/
extensionpack/
migratordotnet/
sdc/
teambuild/
scripts/
build.tasks
db/
create.sql
domainuser-for-db.sql
drop.sql
user-for-db.sql
db-setup.tasks
deploy.proj
directorybrowsing.xml
install.tasks
migrations.tasks
package.tasks
version.tasks
src/
Infrastructure/
Database/
Migrations/
Migr_001_CreateBanner_Table.cs
Sql/
migration-latest.sql
Sample.sln
UI/
tools/
[these are needed to be installed on machines]
Explanation/Overview of files and folders
VERSION.XML- This holds the major, minor and revision number for the product. This is effectively the marketing name of the product and is changed rarely. This “version” combined with the revision number from the source control is what is used to version DLLs.
build.batandbuild.projBuild.batis the merely a GUI-based, double-click runner for invoking msbuild filebuild.proj.Build.projis a manifest file allowing access to the real worker tasks in thescripts/folder.lib/- As you would expect holds all the dependent libraries. I always bundle up my script files ensuring that they are available in every environment. This project demonstrates the use of three msbuild libraries. Each have there strengths so I just use as needed and don’t get too hung up about which one. I often also bundle up the Visual Studio teambuild targets because this allows me to avoid having to install the correct version of Visual Studio on the build server (this problem has got better over time and haven’t reviewed problems here in a whiles).
scripts/- This is the focus of the sample. I keep my build scripts in their own folder as to not clutter up root and I keep them out of
src/so that I get better reuse and a cleaner folder. I also keep my initial database creation scripts here too. These are the first-time creation scripts rather than the migration scripts which are insrc/Infrastructure/Database/ src/- Here’s the home of the application code. A couple of conventions, the demo is using a domain-driven-design naming conventions (UI, infrastructure) and java too (src cf Source). Importantly, I see that database work such as schema changes and data transformations are tightly coupled with the application code. Hence they are part of the application code base. I think this type of versioning is far simpler. There is a good blog entry that I can’t find that compares the “migration approach” versus the database compare. Both work compared with the free for all I see – I just prefer migrations and have never found its simplicity to cause problems. Plus it allows me to go up and down in migrations. The UI code is there just for illustrative purposes so that there is something to deploy.
tools/- All this binary packages that need to be installed on the target machine to make the system work but can’t be (or shouldn’t be bundled). If my packaging strategy is to “download-and-deploy” my source code strategy is to “checkout-and-compile”. So I want as much as possible available with source so that in two year’s time I don’t have to go looking. It is surprising how this pushes some people’s buttons.
MSBuild files: proj vs tasks vs xml
My assumption is that you know how msbuild works and the structure of the xml files. I use three extensions to mark out different types. Yet, they all follow the xml schema definition for msbuild.
- proj:
- a file to be run by msbuild – hopefully the only one in the folder so that you don’t have to specify it
- tasks:
- a specific set of tasks that is included/imported into a proj file and allows for clarity of purpose and reuse
- xml:
- a set of properties that are imported into a task or project file