Alexander Beletsky's development blog

My profession is engineering

Re-thinking Candidate application

I’ve released 0.0.1 version of Candidate pretty long time ago. I was actually quite happy how the things went, before I collected some initial feedback. Even, if I can see the application useful, almost all responders had a different opinion. Let’s briefly see the major concerns.

IIS hosting

Original idea of Candidate was that it works as usual ASP.NET application, hosted under IIS. That worked really bad, though. Candidate is performing a some operations that requires extended permissions (for git, msbuild, file system operations etc.). That means that IIS web site has to be configured to run under under your personal account (or any other administrative account, with set-up SSH keys, access to msbuild etc).

All of that created a bit of overhead. First of all, Candidate has to be installed and configured on IIS. Even, it is possible to create kind of installer to automate this job, it does not sound good. In other hand, some people might have very strict policies on their machines, so it is not even possible to change any kind of IIS settings under it.

So, it turned out to be bad idea for this particular application.

Deployment scenarios

The primary deployment scenario that implemented in Candidate is local one. It means, it’s able to build and test the site and deploy it to local IIS. I did so, since I use the same scenario for deployment of, which is hosted on VPS and deployed by Jenkins running on the same server.

But many people are not using VPS, but rather sharing hosting there they are not even able to install any kind of other software. So, they are more interested in remote deployment, not local one. With the re-invention of Azure, you might consider scenarios of deployment existing web application to it seamlessly.

Local deployments was a good for prototype, but not good at all for product.

Technical stuff

I stick to framework named Bounce. It’s very powerful product, that basically allows to write a deployment scripts in .NET languages. Then I originally saw it, I thought it’s great since it does everything I need, including git operations, msbuild and IIS sites deployment. Even more, Bounce is the one of the best .NET code I ever seen, so respect to refractalize.

But.. Bounce, is not that good for long perspective. It required to create a lot of configuration code, hard to change logging options and further extension.

For a long running product I need more lightweight and robust approach.

Starting it over again

Considering all things above, I decided to re-start the project, almost from the scratch.

It would be based on 3 different technologies, that in my opinion are agile enough to allow me to build what I want.

  • NancyFX - will be used as application host. Currently Nancy is 0.11 version, that has a lot of improvements comparing to 0.9 that I used. The main reason to choose that, is Nancy allows to create self-hosted application. It’s basically .exe application, that you can run and it starts the HTTP server. I plan to have all-in-one executable, that do not require any installations and will prepare all required infrastructure and first run. That would solve both installation and IIS limitations problem.
  • RavenDB - as application document storage. In previous version I didn’t use any kind of database at all, being happy with simple SettingsManager to store .NET objects into JSON files. The reason is that I didn’t have any dependencies on any software (as SQL Express). With Raven it is possible to use Embedded mode, so it does not require any service running, just the assemblies.
  • PowerShell - as deployment scripts. No more VCS, build, test and deploy code in C#. I plan to have a generic PowerShell scripts that would be easy to run and maintain. With a PowerShell I hope to extend the deployment scenarios to support Local, FTP, MS Deploy, Azure deployments.

Unfortunately, I’m not yet proficient with any of these technologies. It makes me very exited to learn something new. I’ve already created a branch where some basic infrastructure is prepared. My goal would be create first prototype in 2 - 3 weeks.

And I want to appreciate everyone who provided feedback and useful technical suggestions. I hope it would turn in something good.