Craig, I'll try refactoring this as a Task and see what happens (inside the task block), if you can design a fix for this, I'd appreciate it if you could sketch it out also for our 1.5.7385.9 copy.
thx Andy On May 13, 9:59 am, "Craig & Sammi Sutherland" <[email protected]> wrote: > 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 > } > }
