I've had a quick look at this - it is not a problem in your code. There appears to be a very nasty bug in the dynamics value code for labellers. Somewhere the values are being wiped :-(
I tried to figure out what is happening here, but I wasn't able to (at least in the time I had spare.) I might try again later on as this problem will affect all labellers! Craig -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Badcop666 Sent: Friday, 13 May 2011 12:00 a.m. To: ccnet-user Subject: [ccnet-user] Custom Labeller - Parameters not working, dynamicValues problem? 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 } }
