This article helps to synchronize issue components and create a new component if it does not exist on the destination side.
Components field is one of the standard fields of an issue. You can synchronize them as any other issue field. Component issue field reference.
Source Instance
Outgoing sync
Send issue components to the destination side:
replica.components = issue.components
Destination Instance
Exalate uses CreateComponent nodeHelper to create a new component and add it to the Components field. Add the code below into the Incoming sync to create components on your side. To update components use the same code in the Incoming sync(change processor).
Jira on-premise
If you sync components with Jira Cloud there're several ways to create components, depending on the information you know about the remote side.
-
map the remote component lead email to the local component lead email
Incoming sync
issue.components = replica.components.collect { component -> def remoteComponentLeadEmail = component.lead?.email def localComponentLeadName = nodeHelper.getUserByEmail(remoteComponentLeadEmail) nodeHelper.createComponent( issue, component.name, component.description, // can also be null localComponentLeadName?.key, // can also be null component.assigneeType?.name() ?: "UNASSIGNED" // set a default as unassigned if there's no assignee type for the component ) }
-
set default component lead if the remote component lead email is not found
Incoming sync
def defaultUser = nodeHelper.getUserByEmail("default@email.com") issue.components = replica.components.collect { component -> def remoteComponentLeadEmail = component.lead?.email def localComponentLeadName = nodeHelper.getUserByEmail(remoteComponentLeadEmail)?.key nodeHelper.createComponent( issue, component.name, component.description, // can also be null localComponentLeadName ?: defaultUser.key, // can also be null component.assigneeType?.name() ?: "UNASSIGNED" // set a default as unassigned if there's no assignee type for the component ) }
-
Do not create a new component but try to look for the same one by name
Incoming sync
issue.components = replica.components .collect { remoteComponent -> nodeHelper.getComponent( remoteComponent.name, nodeHelper.getProject(issue.projectKey) ) }.findAll()
If you sync components between Jira Server instances and the usernames match, add the code below to the Incoming sync.
issue.components = replica.components.collect{ nodeHelper.createComponent( issue, it.name, it.description, it.leadKey, it.assigneeType.name() ) } ...
How to assign a Synced Issue to an Existing Component?
The receiving side is looking for an existing component and assigns the issue to the lead of this component.
Incoming sync
def component = nodeHelper.getProject(issue.project?.key ?: issue.projectKey).components.find {c-> c.name == "eITs"} issue.assignee = component.lead issue.components += component
Another possible way is using getComponent nodeHelper.
def project = issue.project ?: nodeHelper.getProject(issue.projectKey) def component = nodeHelper.getComponent("eITs", project) issue.assignee = component.lead issue.components += component