Update: I just noticed there was already a wix package! It doesn't quite do the same things as mine - it doesn't generate a wxi or components for web project content.
I find that my love for MSIs is inversely proportional to the amount of time I spend messing with them. Using WIX to build MSIs usually involves some up front work, but once you've gotten that out of the way, it's pretty hands off.
I needed to get CI Factory building MSIs for some ASP.NET web projects. While in the process, I got really frustrated, but once I'd gotten the CI Factory package more or less in order...now I think everything should be an MSI.
The big problem is getting all the content (for one of my projects, this includes two sets of flags for every country in the world, plus about 150 other misc. files) into wix components. My package has a nant <script> task to generate wix xml for this. There is a separate shell wxs script that pulls these components in and gets them installed in the right place. Depending on where you are installing your web app in the IIS virtual directory structure, you may need to change this shell wxs script.
Anyway, here is my rough package. I am considering asking Jay Flowers if they would accept this for CI Factory. It would be some work to get it into shape to be part of CI Factory, and the build person (CI Factory user) may still need to create a top level wxs script. Feedback?
If instead, someone just wants to drop this in there CI Factory Build/Packages folder, all you need to do is:
1. Add a bunch of properties to your Properties.build.xml:
<property name="Wix.ProductName" value="My Company - ${ProjectName}"/>
<property name="Wix.Manufacturer" value="My Company"/>
<property name="Wix.Version" value="${CCNetLabel}"/>
<property name="Wix.ProductID" value="DEADBEEF-DEAD-BEEF-DEAD-DEADBEEF"/>
<property name="Wix.UpgradeCode" value="DEADBEEF-DEAD-BEEF-DEAD-DEADBEEF"/>
<property name="Wix.ServiceAccount" value="SomeServiceAccount@MyCompany.com"/>
<property name="Wix.InstallDirectory" value="${ProjectName}"/>
<property name="Wix.AppPool" value="SomeAppPool"/>
<property name="Wix.IIsWithAppPoolSettingsComponentId" value="DEADBEEF-DEAD-BEEF-DEAD-DEADBEEF"/>
<property name="Wix.IIsWithoutAppPoolSettingsComponentId" value="DEADBEEF-DEAD-BEEF-DEAD-DEADBEEF"/>
2. Add an include for the Wix package (in your Main.build.xml, or Scratch.build.xml, or whatever):
<description>Begin Package Includes</description>
...
<include buildfile="${PackagesDirectory}\Deployment\Deployment.Target.xml" />
<include buildfile="${PackagesDirectory}\Wix\Wix.Target.xml" />
<description>End Package Includes</description>
3. Call Wix.CreateInstaller and Wix.DeployMsi at the end of your build (Main.build.xml):
<description>Begin Post Build Actions</description>
...
<call target="Wix.CreateInstaller"/>
<call target="Wix.DeployMsi"/>
<description>End Post Build Actions</description>
4. Call Wix.SetUp and .TearDown in your tear down and setups (Main.build.xml):
<target name="SetUps">
<call target="Common.SetUp" />
<description>Begin SetUps</description>
...
<call target="Wix.SetUp" />
<description>End SetUps</description>
</target>
<target name="TearDowns">
<description>Begin TearDowns</description>
...
<call target="Wix.TearDown" />
<description>End TearDowns</description>
</target>
Now you will end up with an MSI in your artifacts directory. It will show up on the deployment files section of your build report, which is kind of nice. We could send good build reports to testers, and they can just grab the msi from the link.
Please shoot me any feedback or questions. Thanks!