29

Is there an API I can use with Cruise Control .NET (ccnet) to query the server, for example to get the status of various builds?

I have noticed that there are a few options in the ccnet tray application for connecting but I cannot find any documentation of the service API or examples of how to consume it.

John
  • 29,788
  • 18
  • 89
  • 130
REA_ANDREW
  • 10,666
  • 8
  • 48
  • 71

3 Answers3

34

There's certainly an API as the Tray application uses it. I've downloaded the code from their SVN repository previously (NOTE: as per the URL below, it's now hosted on github.com) to fix a bug (the way the "Last Build Time" column works - which was fixed, but regressed in the 1.5 release), and that'd probably be a good place to start.

The repository url is https://github.com/ccnet/CruiseControl.NET.

I've just updated my local copy and had a mooch through and a likely candidate for what you want is the CruiseServerHttpClient class in the Remote project.

Using the Remote assembly to obtain the status of each project / force a build

  • Compile the source from git
  • Create a new console application
  • Add a reference to Thoughtworks.CruiseControl.Remote and NetReflector (both will be in the \bin directory for the Remote project)
  • Add the following code to your console application

Console application code:

using System;
using ThoughtWorks.CruiseControl.Core;
using ThoughtWorks.CruiseControl.Remote;
using ThoughtWorks.CruiseControl.Remote.Messages;

namespace CruiseControlInterface
{
    class Program
    {
        static void Main(string[] args)
        {
            var ipAddressOrHostNameOfCCServer = ""; // Complete this value
            var client = new CruiseServerHttpClient(
                string.Format("http://{0}/ccnet/",ipAddressOrHostNameOfCCServer));

            foreach (var projectStatus in client.GetProjectStatus())
            {
                Console.WriteLine("{0} - {1}", projectStatus.Name, projectStatus.BuildStatus);
            }
        }
    }
}

For each project you'll get output similar to:

ProjectName - Success

To force a build, you'd make the following call:

client.Request("PROJECT_NAME", new IntegrationRequest(BuildCondition.ForceBuild, "YOUR_MACHINE_NAME", "YOUR_USER_NAME"));

Under the hood this results in a HTTP request being made that consists of:

POST http://CC_SERVER_NAME/ccnet/ViewFarmReport.aspx HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 192.168.100.180
Content-Length: 64
Expect: 100-continue

ForceBuild=true&projectName=PROJECT_NAME&serverName=local

Rob
  • 45,296
  • 24
  • 122
  • 150
  • Spot on answer that cheeers!! :-) – REA_ANDREW Aug 12 '10 at 21:46
  • The assemblies Thoughtworks.CruiseControl.Remote.dll and NetReflector.dll are also located in the cctray program files directory. – John Apr 05 '11 at 08:42
  • In your example Forcing a build requires machine name and user. Is this just for logging since it is not sent down in the post? – Luke Mcneice Apr 14 '11 at 07:12
  • @Luke - no idea, I suspect that as it isn't sent over the wire it's either entirely redundant or used, as you suggest, for logging only. – Rob Apr 14 '11 at 08:25
  • I can print out the list of projects, but trying to force a build does nothing. Was anyone able to get that to work? – zalpha314 Jul 09 '12 at 20:51
10

Add the Nuget package CruiseControl.Net to your project. http://www.nuget.org/packages/CruiseControl.Net/

This will add the references to ThoughtWorks.CruiseControl.Core, ThoughtWorks.CruiseControl.Remote and NetReflector to your project(s) and give you an easy way to keep it up to date.

Larry Dukek
  • 2,179
  • 15
  • 16
8

You can also query directly over HTTP, by loading the page http://CC_SERVER_NAME/ccnet/XmlStatusReport.aspx. This will return an XML document giving the statuses of all your build projects, as is rendered on the page http://CC_SERVER_NAME/ccnet/ViewFarmReport.aspx.

It would be nice if you could drill down into that to get at a build project's history - maybe you can, I haven't tried!

David Keaveny
  • 3,904
  • 2
  • 38
  • 52