Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Table of Contents
stylenone

...

Which Work Items are Updated

Identical to the Validate Work Items Gate, the Update Work Items Step offers 3 options or selectors for choosing which Work Items should be updated. Please refer to the Gate documentation for an in-depth look at how each Selector works and when to use one vs another.

Adding Attachments

Attachments can be added to each Work Item by selecting the type of attachments that should be added via the Attachments field. The field supports two attachment types:

  • Plugin Logs - This will attach all plugin logs from the Workflow Execution that was associated to the Work Item. Note that a Work Item may have no executions or more than 1.

    • Attachment name pattern = [workflowExecutionId]-[pluginOperationName]-[pluginExecId]-[endpointId].log

  • Reports - If the associated Work Item executions generated any reports, those can be attached with this option.

    • Attachment name pattern = [workflowExecutionId]-[reportNameWithExt]. Note that if multiple reports have the same name then the full report filepath will be used.

Info

Attachments in comments

If the step is both adding attachments and comments to the Work Items, then the attachments will be included in the comment itself. Note that not all Issue Tracking Systems support attachments in comments (see table at the bottom), in which case they will still be attached directly to the Work Item.

Zipping Attachments

Since each Work Item may have multiple executions with multiple plugin steps and reports, you can optionally zip all attachments for the Work Item and only upload the single zip file.

Updating the Status

The status of each Work Item can be changed by specifying a status in the Status field. There are 3 options for specifying a status:

  1. Literal Text - The default, each Work Item will attempt to have its status changed to the text value provided here. This is the easiest and simplest approach if all of your Work Items allow the same statuses.

  2. Groovy Expression (String/Text) - A Groovy expression can be used for more dynamic behavior. When using a Groovy Expression you can return a simple string or text that will be used for each Work Item.

  3. Groovy Expression (Map) - The most advanced option but also the most dynamic. The Groovy script should return a map of [workItemNumber: new_status]. This is most useful if you need to assign different statuses based on the Work Item. There is an exposed variable WorkItems that contains all Work Items considered for update. The below script is an example that assigns different statuses depending upon the prefix of the Work Item Number.

Code Block
languagegroovy
def result = [:]
for (def workItem: WorkItems)
{
  if (workItem.getKey().startsWith("GLORY"))
  {
    result.put(workItem.getKey(), "In Progress")
  }
  else if (workItem.getKey().startsWith("Natours"))
  {
    result.put(workItem.getKey(), "Doing")
  }
  else
  {
    result.put(workItem.getKey(), "DESIGN")
  }
}
return result
Info

The workItem object has a multitude of attributes and fields such as assignee, status, labels etc that can be leveraged to help determine the correct status.

Adding Comments

Finally, comments can also be added to each Work Item. The options and approaches for adding comments align directly with the Updating the Status section above. Below is an example of the 3rd option of using a Groovy script and returning a map to assign a different comment to each Work Item.

Code Block
def result = [:]
for (def workItem: WorkItems)
{
  def execs = workItem.getExecutions()
  if (execs != null && !execs.isEmpty())
  {
    def exec = execs.get(0)
    def message = "Work Item deployed to ${stgexec.getEnvironmentCode()} from Release ${stgexec.getReleaseName()} and Project ${exec.getProject().getProjectName()}. [View execution](${exec.getExecutionLink()})".toString()
    result.put(workItem.getKey(), message)
  }
  else
  {
    def message = "Work Item deployed to ${stgexec.getEnvironmentCode()} from Release ${stgexec.getReleaseName()}.".toString()
    result.put(workItem.getKey(), message)
  }
}
return result
Info

Work Item Executions

You will notice the comment script leveraging workItem.getExecutions. This is a helper function that returns the relevant executions for the Work Item. In the above example this information is used to add a link back to the execution in the comment.

Due note that a Work Item may not have any executions or may have more than 1 - your script should handle these scenarios.

Rich Comment Features

In the above script we are creating the comment text using markdown. This allows more rich text to be used such as bold, headings, links etc. Whether or not markdown, or other formatting can be used is ultimately at the discretion of the Issue Tracking System where the comment is being added. The following table highlights the feature disparity between the Issue Tracking Systems supported in FlexDeploy.

Issue Tracking System

Supports Comments

Supports Markdown Comments

Supports Attachments

Support Attachments in Comments

Flex ITS

(tick)

(tick)

(tick)

(tick)

Jira

(tick)

(tick)

(tick)

(tick)

Azure Boards

(tick)

(blue star)

(tick)

(blue star)

GitLab

(tick)

(tick)

(tick)

(tick)

GitHub

(tick)

(blue star)

(blue star)

(blue star)

FAQ and Common Issues

class org.codehaus.groovy.runtime.GStringImpl cannot be cast to class java.lang.String

This can occur if you are using Groovy’s GString feature but not calling toString at the end of it. For example:

Code Block
languagegroovy
// using ${variable} inside a quoted "" string is what is known as GString in groovy
def message = "Work Item deployed to ${stgexec.getEnvironmentCode()}"
// the following line will produce a GStringImpl cannot be cast error
result.put(workItem.getKey(), message)

// alter it to the following
result.put(workItem.getKey(), message.toString())