Hi, I am storing and incrementing the buildnumber in TFS workitems.
Frustratingly close. When I force the build from the web, the
parameter WorkitemNumber comes through as empty string "" even though
I enter an existing workitem id.
When I run a console harness it works fine - but the problem clearly
lies in the CCNET interface to this code.
I've inherited from LabellerBase as various comments have suggested -
hence I understood runtime parameters would be sorted for me. It
appears not so.
Any help appreciated. CCNET starts OK and the build runs. I get a TFS
exception due to attempting to retrieve workitem with ID zero.
This is my labeller block currently:-
<labeller type="workitemlabeller">
<TFSServer>http://tfs:8080</TFSServer>
<WorkitemID>$[WorkitemNumber]</WorkitemID>
<WorkitemFieldName>PackageBuildNumber</WorkitemFieldName>
<BuildType>Package</BuildType>
</labeller>
and parameter:-
<parameters>
<textParameter name="WorkitemNumber">
<display>Release Parent Workitem ID</display>
<required>true</required>
</textParameter>
</parameters>
Why a text parameter for an int field? I was having trouble with ccnet
throwing conversion exception - so reverted to this less ideal method.
This is my ccnet.workitemlabeller.plugin.dll code:-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Exortech.NetReflector;
using ThoughtWorks.CruiseControl.Core;
using ThoughtWorks.CruiseControl.Remote;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using ThoughtWorks.CruiseControl.Core.Label;
namespace CCNetWorkitemLabeller
{
[ReflectorType("workitemlabeller")]
public class WorkitemLabeller : LabellerBase
{
private TeamFoundationServer tfs;
private WorkItemStore store;
private WorkItem workitem;
#region Constructors...
public WorkitemLabeller()
{
//WorkitemFieldName = "PackageBuildNumber";
//TFSServer = "http://tfs:8080";
//WorkitemID = xxxxx;
//Test();
}
#endregion
#region Plugin Properties...
[ReflectorProperty("TFSServer", Required = true)]
public string TFSServer{ get; set; }
[ReflectorProperty("WorkitemFieldName", Required = true)]
public string WorkitemFieldName{ get; set; }
[ReflectorProperty("WorkitemID", Required = true)]
// this arrives as a string due to conversion issues...
public string WorkitemID{ get; set; }
[ReflectorProperty("BuildType", Required = true)]
public string BuildType{ get; set; }
#endregion
//private int WorkitemID;
#region ILabeller Members
public override string Generate(IIntegrationResult result)
{
int WorkitemFieldValue = 0;
int WorkitemID = 0;
try
{
WorkitemID = Convert.ToInt32(this.WorkitemID);
}
catch (Exception E)
{
// action?
}
// Connect to TFSServer
// Attempt to login to the TFS server.
tfs = TeamFoundationServerFactory.GetServer(TFSServer);
// Get the work item service
store =
(WorkItemStore)tfs.GetService(typeof(WorkItemStore));
// attempt to retrieve workitem
workitem = store.GetWorkItem(WorkitemID);
workitem.Open();
WorkitemFieldValue = IncrementField(WorkitemFieldName);
workitem.History = String.Format("Build Initiated" );
workitem.Save();
return WorkitemFieldValue.ToString();
}
public string Test()
{
// Connect to TFSServer
// Attempt to login to the TFS server.
tfs = TeamFoundationServerFactory.GetServer(TFSServer);
// Get the work item service
store =
(WorkItemStore)tfs.GetService(typeof(WorkItemStore));
// attempt to retrieve workitem
workitem = store.GetWorkItem(Convert.ToInt32(WorkitemID));
workitem.Open();
// check for WorkitemFieldName
IncrementField("PackageBuildNumber");
IncrementField("ReleaseNoteBuildNumber");
workitem.Save();
// mark Workitem as locked for update
// get current value of WorkitemFieldName
// increment, save workitem, return value
return "1";
}
public int IncrementField(string WorkitemFieldName)
{
int WorkitemFieldValue = 0;
if (workitem.Fields.Contains( WorkitemFieldName ))
{
if (workitem.Fields[WorkitemFieldName].Value == null)
{
workitem.Fields[WorkitemFieldName].Value = 0;
}
WorkitemFieldValue =
(int)workitem.Fields[WorkitemFieldName].Value;
WorkitemFieldValue++;
workitem.Fields[WorkitemFieldName].Value =
WorkitemFieldValue;
}
return WorkitemFieldValue;
}
#endregion
#region ITask Members
public void Run(IIntegrationResult result)
{
result.Label = Generate(result);
}
#endregion
}
}