Introduction
We are using Rallydev for some time now as our agile project management platform. It helps us manage our Releases, Iterations, Stories and Defects. I developed this tool for adding repetitive tasks for each of the stories based on predefined templates. One can also add or edit the tasks once loaded in the tool. This tool helped us save some time in sprint planning meetings.
Background
There are different ways to automate or improve adding multiple task for userstories:
- Use the template story for creating the Story and tasks
- Use excel import for creating tasks
- Use Rally REST API Toolkit and write your own code to create these tasks.
After trying all the three ways, my personal preference is Option 3.
Features
Following are the features of this tool:
- Create tasks for the given User Story ID
- Tasks can be added with Owners and Planned Estimates
- Modify an existing tasks template
- Add new tasks template
- Add, Edit and Remove tasks before saving to Rallydev
Modifying existing tasks template
List of tasks for any of the pre-defined or existing templates can be modified from the app config file.
Step 1: Open the configuration files and find DefectTemplate
setting usder settings.
Step 2: You can add or remove the string entries in this list,
Step 3: Save the config file and restart the application.
<applicationSettings>
<Vivek.Rallydev.Helper.Properties.Settings>
<setting name="DefectTemplate" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>Design Discussion</string>
<string>Unit Testcase Documentation</string>
<string>Unit Testcase Review</string>
<string>Coding</string>
<string>Unit Testing</string>
<string>Code Review Level</string>
<string>Verification</string>
</ArrayOfString>
</value>
</setting>
Adding new task template
Step 1: Add string entry for the new templates in the Templates section as below:
<setting name="Templates" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>DefectTemplate</string>
<string>New Template</string>
</ArrayOfString>
</value>
</setting>
Step 2 :Add new settings with the name as "New Template". Below is the sample for adding 3 tasks.
<setting name="New Template" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>Task 1</string>
<string>Task 2</string>
<string>Task 3</string>
</ArrayOfString>
</value>
</setting>
Step 3 : The "New Template" will be now available in the Template dropdown
Using Rally REST API
Rally REST API allows us to perform queries and CRUD operations. For generating tasks in rally for a given userstory follow the steps below:
Step 1 : User Credentials to login to Rallydev
While creating the Rally REST API use the username and password that is used for logging into Rallydev.
RestApi = new RallyRestApi(user, password, "https://rally1.rallydev.com", "v2.0");
Step 2 : Workspace Reference
Next step is to generate the reference to the default workspace under which you intend to create all the tasks for the userstory. For all the subsequent create requests, we need to use the workspace references.
Request workspactRequest = new Request("Workspace");
workspactRequest.Query = new Query("");
QueryResult workspaceResults = RestApi.Query(workspactRequest);
var workspace = workspaceResults.Results.FirstOrDefault();
WorksspaceRef = workspace._ref;
return WorksspaceRef;
Step 3 : Retrieve users in the Workspace
As part of creating the tasks, one of the obvious step is to set owners for each tasks. We need the list of users assigned to the current workspace. It's important to keep track of the user ref. which will be sent as part of the request marking the user as owner of the task.
List<RallyUser> users = new List<RallyUser>();
Request userRequest = new Request("user");
userRequest.Query = new Query("");
userRequest.Limit = 10000;
QueryResult userResults = RestApi.Query(userRequest);
foreach (var item in userResults.Results)
{
if (!item.Disabled)
users.Add(new RallyUser() { UserName = item.UserName, UserRef = item._ref });
}
users.Sort(
delegate(RallyUser first, RallyUser second)
{
return first.UserName.CompareTo(second.UserName);
});
return users;
Step 4 : Userstory Reference
To create the tasks under a user story it's important to mark the task with the corresponding userstory reference. Here is how you get userstory ref based on the exact match of User Story ID.
string storyRef = string.Empty;
Request storyRequest = new Request("HierarchicalRequirement");
storyRequest.Query = new Query("FormattedID", Query.Operator.Equals, req.StoryId);
QueryResult result = RestApi.Query(storyRequest);
foreach (var item in result.Results)
{
storyRef = item["_ref"].ToString();
}
return storyRef;
Step 5 : Create Task
Finally create the tasks with the required fields initialized. If you have custom fields created at task level, you can initialize them as well. The reference fields are initialized with the value from _ref
property of the corresponding object. As an example the Owner
field is initialized with reference from the user object. Similarly WorkProduct
is initialized with reference of the user story.
DynamicJsonObject toCreate = new DynamicJsonObject();
toCreate["Name"] = item.Name;
toCreate["Estimate"] = item.Estimate;
toCreate["Owner"] = item.RallyUser.UserRef;
if (req.shouldUpdateActuals)
{
toCreate["Actuals"] = item.Estimate;
}
toCreate["ToDo"] = item.Estimate;
toCreate["WorkProduct"] = storyRef;
CreateResult createResult = RestApi.Create(workspaceRef, "task", toCreate);
return createResult;
Points of Interest
Creating tasks and/or userstories using the above mentioned fields may fail in case you have any mandatory custom fields added in the configuration. It's not difficult to add additional details to the request.
toCreate["CustomField1"] = value;
For further help on Rally REST API refer to https://help.rallydev.com/for-developers
Further enhancements
- Provide lookup for the stories in the current iteration..
- Support for custom fields for tasks.
History
This is the initial version of the article.