I built the below script to be run as a workflow post function with the following goals:
- Retrieve a number of custom fields (all number fields)
- Sum groups of the field values
- Take the sums to put into another customer (number) field so it can be seen in filters
When I run the query, the logs are capturing and adding the fields correctly, but I'm receiving this exception. When I try to put as a map, double, or int I do receive different exceptions, but none are successful. I have also tried limiting my put to a single field, and still receive the exception.
Exception:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: com.adaptavist.sr.cloud.output.ScriptExecutionOutput["result"]->io.github.openunirest.request.body.RequestBodyEntity["httpRequest"]->io.github.openunirest.request.HttpRequestWithBody["httpRequest"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:722) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeWithType(BeanSerializerBase.java:655) at com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514) at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215) at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1085)
Script:
// Specify the issue key to update
//def issueKey = issue.getKey()
import org.apache.log4j.Logger;
def issueKey = 'HWI-30'
def issue = get("/rest/api/2/issue/${issueKey}")
.header('Content-Type', 'application/json')
.asObject(Map)
.body
def fields = issue.fields as Map
def inputAccInitialEstimate = 'customfield_10134'
def inputNCInitialEstimate = 'customfield_10135'
def inputOthInitialEstimate = 'customfield_10136'
def inputHTACNInitial = 'customfield_10311'
def inputOth2InitialEstimate = 'customfield_10317'
def inputACNInitialTestEstimate = 'customfield_10331'
def valueAccInitialEstimate = issue.fields[inputAccInitialEstimate]['value'] as int
def valueNCInitialEstimate = issue.fields[inputNCInitialEstimate]['value'] as int
def valueothInitialEstimate = issue.fields[inputOthInitialEstimate]['value'] as int
def valueHTACNInitialEstimate = issue.fields[inputHTACNInitial]['value'] as int
def valueOth2InitialEstimate = issue.fields[inputOth2InitialEstimate]['value'] as int
def valueACNInitialTestEstimate = issue.fields[inputACNInitialTestEstimate]['value'] as int
def sumInitialEstimate = valueAccInitialEstimate + valueNCInitialEstimate + valueothInitialEstimate + valueHTACNInitialEstimate + valueOth2InitialEstimate + valueACNInitialTestEstimate
def sumInitialTestingEstimate = valueACNInitialTestEstimate
def sumInitialDevEstimte = valueAccInitialEstimate + valueNCInitialEstimate + valueothInitialEstimate + valueHTACNInitialEstimate + valueOth2InitialEstimate
def inputAccDetailEstimate = 'customfield_10152'
def inputNCDetailEstimate = 'customfield_10154'
def inputOthDetailEstimate = 'customfield_10155'
def inputNCDetailTestEstimate = 'customfield_10334'
def inputHTACNDetailTestEstimate = 'customfield_10332'
def inputHTACNDetailedEstimate = 'customfield_10312'
def inputOth2DetailedEstimate = 'customfield_10318'
def valueAccDetailEstimate = issue.fields[inputAccDetailEstimate]['value'] as int
def valueNCDetailEstimate = issue.fields[inputNCDetailEstimate]['value'] as int
def valueothDetailEstimate = issue.fields[inputOthDetailEstimate]['value'] as int
def valueNCDetailTestEstimate = issue.fields[inputNCDetailTestEstimate]['value'] as int
def valueHTACNDetailTestEstimate = issue.fields[inputHTACNDetailTestEstimate]['value'] as int
def valueHTACNDetailedEstimate = issue.fields[inputHTACNDetailedEstimate]['value'] as int
def valueOth2DetailedEstimate = issue.fields[inputOth2DetailedEstimate]['value'] as int
def sumDetailEstimate = valueAccDetailEstimate + valueNCDetailEstimate + valueothDetailEstimate + valueNCDetailTestEstimate + valueHTACNDetailTestEstimate + valueHTACNDetailedEstimate + valueOth2DetailedEstimate
def sumDetailTestEstimate = valueNCDetailTestEstimate + valueHTACNDetailTestEstimate
def sumDetailDevEstimate = valueAccDetailEstimate + valueNCDetailEstimate + valueothDetailEstimate + valueHTACNDetailedEstimate + valueOth2DetailedEstimate
def log = Logger.getLogger("com.onresolve.jira.groovy");
log.info ("Acc Intial Estimate: "+valueAccInitialEstimate);
log.info ("NC Initial Estimate: "+valueNCInitialEstimate);
log.info ("Oth Initial Estimate: "+valueothInitialEstimate);
log.info ("HTACN Initial Estimate: "+valueHTACNInitialEstimate);
log.info ("Oth2 Initial Estimate: "+valueOth2InitialEstimate);
log.info ("HTACN Initial Test Estimate: "+valueACNInitialTestEstimate);
log.info ("Total Initial: "+sumInitialEstimate);
log.info ("Total Initial Testing: "+sumInitialTestingEstimate);
log.info ("Total Initial Dev: "+sumInitialDevEstimte);log.info ("Acc Detail Estimate: "+valueAccDetailEstimate);
log.info ("NC Detail Estimate: "+valueNCDetailEstimate);
log.info ("NC Detail Test Estimate: "+valueNCDetailTestEstimate);
log.info ("Oth Detail Estimate: "+valueothDetailEstimate);
log.info ("HTACN Detail Test Estimate: "+valueHTACNDetailTestEstimate);
log.info ("HTACN Detail Estimate: "+valueHTACNDetailedEstimate);
log.info ("Oth2 Detail Estimate: "+valueOth2DetailedEstimate);
log.info ("Total Detail: "+sumDetailEstimate);
log.info ("Total Detail Test: "+sumDetailTestEstimate);
log.info ("Total Detail Dev: "+sumDetailDevEstimate);
put("/rest/api/2/issue/${issueKey}")
.queryString("overrideScreenSecurity", Boolean.TRUE)
.header('Content-Type', 'application/json')
.body([
fields:[
Customfield_10336:[name:+sumInitialDevEstimte] as Map,
Customfield_10337:[name:+sumInitialTestingEstimate] as Map,
Customfield_10320:[name:+sumInitialEstimate] as Map,
Customfield_10339:[name:+sumDetailTestEstimate] as Map,
Customfield_10338:[name:+sumDetailDevEstimate] as Map,
Customfield_10321:[name:+sumDetailEstimate] as Map
]
])