Un semplice esempio
In questo post andremo ad esaminare un esempio di come possiamo sfruttare Scriptrunner per JIRA, già presentato in questo blog, per realizzare delle funzioni opportune.
Ringraziamenti
Un grazie al lavoro che svolge MrAddons con il suo blog, che ha ispirato questo articolo, in cui spiega come sfruttare la potenza di questo ed altri addon.
Di cosa parliamo oggi?
Voglio citare un semplice esempio di come possiamo automatizzare alcune azioni che normalmente ci prenderebbero delle giornate. Vediamo come chiudere un task, in automatico, che è stato collegato con un altro come linked issue.
Scenario
Abbiamo un task in cui sono presenti delle issue collegate. Vogliamo che, nell’istante in cui andiamo a chiudere la issue principale, le issue collegate siano a loro volta chiuse.
Come possiamo ottenere questo risultato che, normalmente, le funzioni standard o out-of-the-box di JIRA non ci mettono a disposizione? Risposta: Con Scriptrunner. vediamo come.
Pochi semplici passi
Quello che dobbiamo fare e andare ad agire a livello di Workflow, in particolare a livello di Postfunction di una transazione del Workflow (nel nostro caso si tratta di un workflow usato in un progetto di esempio).
e li andiamo a generare la nostra Postfunction personalizzata, come script:
dove inseriamo questa azione. Il concetto è di sfruttare groovy e di andare a dire a JIRA: Quando esegui questa operazione, se si tratta di una issue che presenta delle issue collegate, allora … riesegui la stessa transazione per chiuderla.
Il codice da inserire è il seguente:
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessordef issueLinkManager = ComponentAccessor.getIssueLinkManager()
import org.apache.log4j.Category
import com.opensymphony.workflow.WorkflowContext
import com.atlassian.jira.workflow.WorkflowTransitionUtil;
import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl;
import com.atlassian.jira.util.JiraUtils;
import com.atlassian.jira.issue.comments.CommentManager;
import com.atlassian.jira.issue.link.IssueLink;
import com.atlassian.jira.issue.MutableIssue
def Category log = Category.getInstance(“com.onresolve.jira.groovy.PostFunction”)
log.setLevel(org.apache.log4j.Level.DEBUG)
log.debug “debug statements”
String currentUser = ((WorkflowContext) transientVars.get(“context”)).getCaller();
WorkflowTransitionUtil workflowTransitionUtil = ( WorkflowTransitionUtil ) JiraUtils.loadComponent( WorkflowTransitionUtilImpl.class );
log.debug “Original: ${issue.getId()}, ${issue.getKey()}. DETECTED ” + issue.getStatusObject().getName();List<IssueLink> allInIssueLink = issueLinkManager.getOutwardLinks(issue.getId());
for (Iterator<IssueLink> inIterator = allInIssueLink.iterator(); inIterator.hasNext();) {
IssueLink issueLink = (IssueLink) inIterator.next();
def linkedIssue = issueLink.getDestinationObject();
log.debug “linked: ${linkedIssue.getId()}, ${linkedIssue.getKey()}. DETECTED ” + linkedIssue.getStatusObject().getName();
if (linkedIssue.getStatusObject().getName().equals(“To Do”)) { // STATO della issue collegata
log.debug “linked Content: ${linkedIssue.getId()}, ${linkedIssue.getKey()}.”//We can transition the parent ticket
log.debug “start transition”workflowTransitionUtil.setIssue((MutableIssue) linkedIssue);
workflowTransitionUtil.setUserkey(currentUser);
workflowTransitionUtil.setAction (21); //Transition ID — TRANSAZIONE CHE VIENE ESEGUITA
workflowTransitionUtil.validate();
workflowTransitionUtil.progress();log.debug “end transition”
}}
Nel seguente GIF, viene mostrato quello che succede quando attiviamo questa postfunction:
Conclusione
Un piccolo passo e poco poco codice per un grande risultato :-). Nei prossimi post cercheremo di esaminare altri script e scopriremo come sfruttare Scriptrunner.