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
    }
}

Reply via email to