Step 1 - Publish all your workflowsBefore you begin fixing your workflows, publish all your workflows to avoid duplicate work (between the draft and corresponding published workflow) Step 2 - Backup the Server instanceUsing JIRA's XML backup utility backup your entire JIRA Server instance. Step 3 - Manually edit the XMLExtract the backup and open the entities.xml file with any text editor (one that can open large files) Edit the XML file to replace the Hide transition and Field is required validator with their equivalents Hide transition Search for <arg name="class.name">com.innovalog.jmwe.plugins.conditions.NonInteractiveCondition</arg> You should see XML for the condition similar to this Replace with <arg name="class.name">com.atlassian.jira.workflow.condition.RemoteOnlyCondition</arg> throughout the file using ReplaceAll. The replaced validator should look similar to this:
Field is required validator Search for <arg name="class.name">com.innovalog.jmwe.plugins.validators.FieldRequiredValidator</arg> You should see XML for the validator similar to this Edit the <validator>...</validator> element: Remove the <arg name="hidFieldsList"></arg > line, if it exists Add this line: <arg name="contextHandling">no</arg> On the <arg name="fieldKey">...</arg> line replace, fieldKey with hidFieldsList On the same line, replace commas separating the fields with "@@" Add @@ after the last field Replace <arg name="class.name">com.innovalog.jmwe.plugins.validators.FieldRequiredValidator</arg> with <arg name="class.name">com.atlassian.jira.workflow.validator.FieldRequiredValidator</arg> The replaced validator should look similar to this:
Find the next instance of the search. Repeat step iii until you reach the end of the file.
By now, you will have completed the XML fixes for workflow conditions, validators and unavailable workflow post-functions. The remaining fixes must be done by recreating/modifying the post-function and deleting the existing ones. Step 4 - Identify workflows and transitions using JMWE post-functions that need to be recreatedAt the end of this step, you will create a table with the workflow name and the transition names of all the workflows containing JMWE post-functions that need to be recreated Transition Names Workflow Name Unlink Issues post-function
Search for the text - <arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg> Work your way up on the file from the line that contains <arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Transition NameWorkflow NameDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name Transition NameWorkflow NameDoneSFVFUP Find the next instance of <arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg> Repeat steps b to g until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name. List of transitionsWorkflow NameStart Progress, DoneSFVFUPStart Progress, RejectTPI
Link issues to the current issue post-function Search for the text <arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg> Work your way up on the file from the line that contains <arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Transition NameWorkflow NameDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Transition NameWorkflow NameDoneSFVFUP Find the next instance of <arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg> Repeat steps b to g until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name. List of transitionsWorkflow NameStart Progress, DoneSFVFUPStart Progress, RejectTPI
Email issue post-function Search for the text <arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg> Work your way up on the file from the line that contains <arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Transition NameWorkflow NameDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Transition NameWorkflow NameDoneSFVFUP Find the next instance of <arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg> Repeat steps b to g until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name. List of transitionsWorkflow NameStart Progress, DoneSFVFUPStart Progress, RejectTPI
Create issue post-function Find for the text <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg> Work your way up on the file from the line that contains <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Transition NameWorkflow NameDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Transition NameWorkflow NameDoneSFVFUP Find the next instance of <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg> Repeat steps b to g until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name. List of transitionsWorkflow NameStart Progress, DoneSFVFUPStart Progress, RejectTPI
Now you will have three tables with List ot transitions, Workflow name that contain post-functions to be recreated. Sort the table by Workflow name Workflow NameList of transitionsSFVFUPStart Progress, DoneTPIStart Progress, RejectTLIDone, Reopen
Step 5 - Identify workflows and transitions using JMWE post-functions that need reworkIn this step identify workflows and transitions using JMWE post-functions that need rework. At the end of this step you will have three tables with workflows, transitions and post-functions that have: Groovy scripts in the Conditional execution section Groovy expressions or Groovy templates to set a field of an issue or comment an issue a specific user in the Run as section
Identify post-functions with Conditional execution scriptSearch for the text <arg name="useGroovyCondition">yes</arg> Work your way up and look at <arg name="class.name"> to identify the name of the post-function (look at the end of the line). Ignore and find the next instance of the search if it is either of the following: <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg>
If not write down the name of the post-function looking at the class name. Post-function nameTransition nameWorkflow nameTransition Linked issues Work your way up on the file from the line that contains <arg name="useGroovyCondition">yes</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Post-function NameTransition NameWorkflow NameTransition Parent issueDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Post-function NameTransition NameWorkflow NameTransition Parent issueDoneSFVFUP Find the next instance of the search Repeat steps 2 to 10 until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name for post-functions that have a conditional execution script. Workflow NameList of transitionsPost-functions with Conditional scriptSFVFUPStart ProgressTransition linked issues, Set field valueDoneSet field value of linked issues,TPIStart ProgressSet field value of linked issuesRejectComment issue
Identify post-functions with Groovy template to set a field value or comment an issueIdentify post-functions with Groovy template as the Value type Search for the text <arg name="valueType">template</arg> Work your way up and look at <arg name="class.name"> to identify the name of the post-function (look at the end of the line). Ignore and find the next instance of the search if it is either of the following:
<arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg>
If not, write down the name of the post-function looking at the class name Post-function NameTransition NameWorkflow NameComment linked issues Work your way up on the file from the line that contains <arg name="valueType">template</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Post-function NameTransition NameWorkflow NameComment linked issuesCreate Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Post-function NameTransition NameWorkflow NameComment linked issuesCreateCash inflow Find the next instance of the search Repeat steps b to j until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name with post-functions that have a Groovy template. Workflow NameList of transitionsPost-functions with Conditional scriptCash InflowCreateComment linked issuesDoneSet field value of linked issuesEmployee salary cycleRejectComment issueApproveComment issue
Identify post-functions with Groovy expression as the Value type Search for the text <arg name="valueType">expression</arg> Work your way up and look at <arg name="class.name"> to identify the name of the post-function (look at the end of the line). Ignore and find the next instance of the search if it is either of the following: <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg>
If not, write down the name of the post-function looking at the class name Post-function nameTransition nameWorkflow NameSet field value Work your way up on the file from the line that contains <arg name="valueType">expression</arg> to find the name of the transition on which the post-function is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Post-function nameTransition NameWorkflow NameSet field valueTo Do Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Post-function nameTransition NameWorkflow NameSet field valueTo Do PKP flow Find the next instance of the search Repeat steps b to j until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name with post-functions that have a Groovy expression. Workflow NameList of transitionsPost-function nameSFVFUPTPI To DoSet field valueDoneSet field value
Identify post-functions with Run as specific userSearch for the text - <arg name="runAsUser"> Proceed to the next step if the argument has a value, similar to this: <arg name="runAsUser">djohn</arg>. If not find the next instance of the search. Work your way up and look at <arg name="class.name"> . Identify the name of the post-function looking at the class name under the same function element. Ignore and find the next instance of the search if it is either of the following: <arg name="class.name">com.innovalog.jmwe.plugins.functions.CreateIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.EmailIssueFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.LinkIssuesFunction</arg>
<arg name="class.name">com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction</arg>
If not write down the name of the post-function looking at the class name Post-function nameTransition NameWorkflow NameTransition linked issues work your way up on the file from the line that contains <arg name="runAsUser"> to find the name of the transition on which the validator is configured. You can identify it under the <actions> tag. Write down the transition name in the table. Post-function nameTransition NameWorkflow NameTransition linked issuesDone Work your way up further on the file from the line you have found the transition, to find the name of the workflow. You can identify it under the <Workflow> tag. Write down the workflow name. Post-function nameTransition NameWorkflow NameTransition linked issuesDoneSFVFUP Find the next instance of the search Repeat steps 2 to 10 until you reach the end of the file. Now you will have a list of transitions and their corresponding workflow name with post-functions that are run as a specific user. Workflow NameList of transitionsPost-function nameSFVFUPDoneTransition linked issuesStart Progress, Reject Comment issue
Now prepare a single table sorting it based on the Workflow name, Transition name. Add the count if a transition has a post-function more than once, as shown in the table Workflow NameTransition namePost-function nameFixSFVFUPStart ProgressTransition linked issues, Set field valueConditional executionStart ProgressComment issueGroovy templateDoneTransition linked issuesRun AsCash InflowCreateComment linked issues(2)Conditional executionCreateComment linked issuesGroovy expressionDoneSet field value of linked issuesGroovy expression Step 6 - Import the backup into your JIRA Cloud instanceRe-zip the extracted files. In Windows: Select all the extracted files and re-zip them using any tool, say 7z or In Linux: Navigate to the directory where the files are that you want to zip. Then type: zip newbackup file1 file2 file3 In Mac: Navigate to the directory where the files are that you want to zip. Then type: zip -r backup.zip newbackup.zip
Log in to JIRA Cloud as an administrator. Import the backup into your JIRA Cloud instance using Jira Import Wizard in Import and Export section.
Step 7 - Install the JMWE add-onSee here to know how to install the JMWE add-on Step 8 - Fix your workflowsIn this step you will do the remaining fixes: Recreate the workflow extensions in Jira CloudRefer to the table prepared in Step 4 For each affected workflow listed in the table, open the workflow in an edit mode in the Cloud and Server. For each affected transition listed of the workflow, go to that transition in the editor and then to the Post-functions tab. Locate the post-function in JIRA Cloud. You can easily identify JMWE post-functions imported from Server because they appear strange with the Class: com.innovalog.jmwe.plugins.functions.UnlinkIssuesFunction similar to this: Identify the name of the post-function looking at the class name (look at the end of the line). Locate the same post-function in JIRA Server by its position in the list and edit it to see its full configuration. Recreate the post-function: Click on Add post-function in JIRA Cloud. Recreate the post-function looking at its equivalent configuration in JIRA Server.
Move the post-function right before the existing post-function Delete the existing post-function in JIRA Cloud.
Once all the transitions in a workflow are fixed, publish the workflow.
Modify the workflow extensions in Jira CloudRefer to the table prepared in Step 5 For each affected workflow listed in the table, open the workflow in an edit mode in the Cloud and Server. For each affected transition listed for the workflow, go to that transition in the editor and then to the Post-functions tab. For each post-function listed in the table locate the Post-function in JIRA Cloud looking at the same post-function in JIRA Server by its position in the list. Edit the post-function. If the fix is for A Conditional execution/Groovy expression/Groovy template, look at the script in the Server and write a Nunjucks template that is equivalent to the existing one. Save the post-function. The Run as specific user, look at the selected user in the Server and select the same in the Cloud. Save the post-function.
Once all the transitions in a workflow are fixed, publish the workflow.
|