For example, if you need, during a transition, to first create a new issue (using the Create Issue(s) post-function) and then send a notification email mentioning the new issue (using the Email Issue post-function), you need to make sure that the first post-function has finished running before starting the second one, which is something that Jira Cloud doesn't guarantee if you don't use a Sequence.
To add the 'Sequence of Post-functions' post-function to a transition:
Click Edit for the workflow that has the transition, you wish to add the post-function on.
In the Workflow Designer, select the transition.
Click on
Post Functions
in the properties panel.Click on
Add post function
.Select
Sequence of post-functions
from the list of post-functions.Click on
Add
to add the post-function on the transition.Click on "Add post function"
Add the required post-functions
Click on
Add
to add the post-function to the transition.
See here for a use case of this post-function.
Common to all post-functions:
JMWE shows an error message on the issue view if any error occurs during the execution of the post-function. This message is only displayed if the current user is a Jira administrator.
When you add this post-function to a transition and trigger it, each post-function defined in the sequence is run, one after the other on the target issues.
Issue(s) to operate on
Select the issues on which the sequence of post-functions should be run. They can be:
Current issue: Select this option to run the sequence of post-functions on the current issue. This is the default option.
Sub-tasks of the current issue: Select this option to run the sequence of post-functions on the sub-tasks of the current issue
Parent issue of the current sub-task: Select this option to run the sequence of post-functions on the parent of the current issue
Issues that belong to the current issue (Epic): Select this option to run the sequence of post-functions on the issues that belong to the current Epic
Epic of the current issue: Select this option to run the sequence of post-functions on the Epic of the current issue
Child issues of the current issue in the Portfolio hierarchy: Select this option to run the sequence of post-functions on the child issues of the current issue in the Portfolio hierarchy
Parent issue of the current issue in the Portfolio hierarchy: Select this option to run the sequence of post-functions on the parent issue of the current issue in the Portfolio hierarchy
Issues linked to the current issue through any link type: Select this option to run the sequence of post-functions on all issues linked to the current issue
Issues linked to the current issue through the following link type: Select this option to run the sequence of post-functions on the linked issues of a specific link type. Select the specific link type under “Issue link”
Issues returned by the following Nunjucks template: Select this option to run the sequence of post-functions on issues returned by the result of a Nunjucks template. Input a Nunjucks template which is a comma-separated list of valid issue keys. For example:
"TEST-1"
"TEST-1","TEST-2"
{{ targetIssue.fields.parent.key }}
{{ targetIssue.fields.subtasks | join(",", "key") }}
Issues returned by a JQL search: Select this option to run the sequence of post-functions on issues returned by a JQL search. Input a JQL search expression. For example:
project = TEST
returns issues of the project with the key TESTproject = {{ targetIssue.fields.project.key }} and assignee = {{currentUser._accountId}}
returns issues of a project that belong to the project with key TEST and the assignee is the current user{% if targetIssue.fields.assignee %} assignee = {{targetIssue.fields.assignee._accountId}} {% else %} issuekey=INVALID-1 {% endif %}
Note that the {% if %} block is necessary to avoid an invalid JQL query when the issue is unassigned. In that case, the template will return a valid JQL query that returns no issue (
issuekey=INVALID-1
).
Passing variables within a sequence
Using the {% setContextVar %}
Nunjucks tag you can pass data from one post-function to a subsequent post-function.
context
: Holds all the context variables added in the current post-function. For example, if you create a context variable myVar
in the first post-function of the sequence:
{% setContextVar myVar = "a value" %}
This variable will then be available to subsequent post-functions as:
{{ context.myVar }}
Note that this variable will not be available in the Nunjucks tester.
Variables specific to the Create Issue post-function
newIssueKey:
Stores the issue key of the last issue created by a Create Issue(s) post-function in the sequence. You can access it as:
{{ context.newIssueKey }}
newIssueKeys:
Stores an array of the keys of all the issues created by any Create Issue(s) post-function in the sequence. You can access the created issues from
{{ context.newIssueKeys }}
For example: to add a comment on the current issue with the keys of the issue created
Issues created are: {{ context.newIssueKeys | join(",") }}
You can access the information of a specific issue using the issue filter. For example: To get the assignee of the issue created by the Create issue post-function:
{{ context.newIssueKey | issue("assignee") | field("fields.assignee.displayName") }}
Error handling
If one of the post-functions fails with an error, the remaining post-functions in the sequence are run anyway. To stop the execution of subsequent post-functions after an error occurs, select the option “Skip subsequent post-functions if a post-function encounters an error”.
Conditional execution
To execute this post-function based on the result of a Nunjucks template see Conditional execution.
Delayed execution
Post functions are provided with an option to delay their execution. You need to select the number of seconds to wait until the post-function is run, a default of 1 sec to a maximum of 20 seconds.
Workflows that depend on post functions being executed in a specific order fail due to the asynchronous nature of the Connect post-functions in Jira Cloud. One of the workarounds is to delay the execution of the post-functions and thereby create a more predictable execution order. For example, on the approval of a Story you want to create sub-tasks and immediately transition them; in this case, you will have to delay the execution of the Transition Linked Issues post-function, so that the sub-tasks are created before they are transitioned. See the use case below.
It is recommended to use the Sequence of post-functions post-function or Shared Action post-function post-function to run a list of post-functions in a sequence instead of applying a delay.
Sample use cases for Delayed execution
On the creation of a Bug, assign it to a member of the QA team and then add the Assignee to the Watchers.
On the approval of a Story, create subtasks for Development and QA, and transition them to In Progress status.
Use case
A typical use of this workflow post-function is to run a list of post-functions in sequence considering the asynchronous nature of post-functions. Consider a use case where you want to clone an issue and its subtasks to another project, then:
Add the "Sequence of post-functions" post-function to the transition
Select the “Target issues” as “Current issue”
In the sequence add the "Create issue" post-function.
Select the destination project in "Project"
Select the "Issue type" as "Calculated" and input:
{{ issue.fields.issuetype.name }}
Select the "Link to new issue" as "clones"
Configure the fields
Click on Save
Add another "Create issue" post-function to clone the sub-tasks
Select the destination project in "Project"
Select the "Issue type" as "Subtask"
Under the "Parent issue" input the following template:
{{ transition.context.newIssueKey }}
Select "Multiple issue creation" option and input the following template:
{{ issue | subtasks | length }}
Save the post-function.
Click on "Save"
Publish the workflow.
Refer here for more use cases.