{"id":91233,"date":"2017-09-29T14:45:29","date_gmt":"2017-09-29T12:45:29","guid":{"rendered":"http:\/\/artigianodelsoftware.it\/blog\/?p=91233"},"modified":"2017-09-29T14:45:29","modified_gmt":"2017-09-29T12:45:29","slug":"usiamo-scriptrunner-vediamo-alcuni-esempi","status":"publish","type":"post","link":"https:\/\/artigianodelsoftware.it\/blog\/2017\/09\/29\/usiamo-scriptrunner-vediamo-alcuni-esempi\/","title":{"rendered":"Usiamo ScriptRunner &#8211; Vediamo alcuni esempi"},"content":{"rendered":"<div class=\"pdfprnt-buttons pdfprnt-buttons-post pdfprnt-top-right\"><a href=\"javascript: imageToPdf()\" class=\"pdfprnt-button pdfprnt-button-pdf\" target=\"_self\"><img src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/plugins\/pdf-print\/images\/pdf.png\" alt=\"image_pdf\" title=\"Visualizza PDF\" \/><\/a><a href=\"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/posts\/91233?print=print\" class=\"pdfprnt-button pdfprnt-button-print\" target=\"_blank\"><\/a><\/div><blockquote>\n<h1>Un semplice esempio<\/h1>\n<\/blockquote>\n<p>In questo post andremo ad esaminare un esempio di come possiamo sfruttare <a title=\"\" href=\"https:\/\/marketplace.atlassian.com\/plugins\/com.onresolve.jira.groovy.groovyrunner\/server\/overview\" target=\"_blank\" rel=\"noopener\">Scriptrunner per JIRA<\/a>, gi\u00e0 presentato in questo blog, per realizzare delle funzioni opportune.<\/p>\n<p><a href=\"http:\/\/www.govtnaukri.org\/wp-content\/uploads\/2016\/05\/EAMCET-Tips-and-tricks.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter\" src=\"http:\/\/www.govtnaukri.org\/wp-content\/uploads\/2016\/05\/EAMCET-Tips-and-tricks.jpg\" width=\"400\" height=\"210\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<h1>Ringraziamenti<\/h1>\n<\/blockquote>\n<p><em><strong>Un grazie al lavoro che svolge <a title=\"\" href=\"https:\/\/mraddon.blog\/2017\/05\/20\/new-groovy-postfunction-transition-linked-issue-in-status-x\/\" target=\"_blank\" rel=\"noopener\">MrAddons<\/a> con il suo blog, che ha ispirato questo articolo, in cui spiega come sfruttare la potenza di questo ed altri addon.\u00a0<\/strong><\/em><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" src=\"https:\/\/jirasupport.files.wordpress.com\/2016\/09\/mraddonlogobcn.png\" alt=\"\" width=\"1235\" height=\"194\" \/><\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/t4.ftcdn.net\/jpg\/00\/77\/95\/93\/240_F_77959308_rorMhj3qaP2ci07JypHmNLbrBTgBypJf.jpg\" \/><\/p>\n<blockquote>\n<h1>Di cosa parliamo oggi?<\/h1>\n<\/blockquote>\n<p>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 \u00e8 stato collegato con un altro come linked issue.<\/p>\n<h3>Scenario<\/h3>\n<p>Abbiamo un task in cui sono presenti delle issue collegate. Vogliamo che, nell&#8217;istante in cui andiamo a chiudere la issue principale, le issue collegate siano a loro volta chiuse.<\/p>\n<p>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.<a href=\"https:\/\/principiodeuncomienzo.files.wordpress.com\/2013\/09\/making_decision.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter\" src=\"https:\/\/principiodeuncomienzo.files.wordpress.com\/2013\/09\/making_decision.jpg\" alt=\"\" width=\"599\" height=\"360\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<h1>Pochi semplici passi<\/h1>\n<\/blockquote>\n<p>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).<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-91277\" src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01.png\" alt=\"\" width=\"1292\" height=\"522\" srcset=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01.png 1292w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01-300x121.png 300w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01-768x310.png 768w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01-1024x414.png 1024w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-01-619x250.png 619w\" sizes=\"(max-width: 1292px) 100vw, 1292px\" \/><\/p>\n<p>e li andiamo a generare la nostra Postfunction personalizzata, come script:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-91276\" src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02.png\" alt=\"\" width=\"1142\" height=\"478\" srcset=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02.png 1142w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02-300x126.png 300w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02-768x321.png 768w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02-1024x429.png 1024w, https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-02-619x259.png 619w\" sizes=\"(max-width: 1142px) 100vw, 1142px\" \/><\/p>\n<p>dove inseriamo questa azione. Il concetto \u00e8 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 &#8230; riesegui la stessa transazione per chiuderla.<\/p>\n<p>Il codice da inserire \u00e8 il seguente:<\/p>\n<blockquote><p><em><strong>import com.atlassian.jira.ComponentManager<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.component.ComponentAccessor<\/strong><\/em><\/p>\n<p><em><strong>def issueLinkManager = ComponentAccessor.getIssueLinkManager()<\/strong><\/em><br \/>\n<em><strong> import org.apache.log4j.Category<\/strong><\/em><br \/>\n<em><strong> import com.opensymphony.workflow.WorkflowContext<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.workflow.WorkflowTransitionUtil;<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl;<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.util.JiraUtils;<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.issue.comments.CommentManager;<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.issue.link.IssueLink;<\/strong><\/em><br \/>\n<em><strong> import com.atlassian.jira.issue.MutableIssue<\/strong><\/em><br \/>\n<em><strong> def Category log = Category.getInstance(&#8220;com.onresolve.jira.groovy.PostFunction&#8221;)<\/strong><\/em><br \/>\n<em><strong> log.setLevel(org.apache.log4j.Level.DEBUG)<\/strong><\/em><br \/>\n<em><strong> log.debug &#8220;debug statements&#8221;<\/strong><\/em><br \/>\n<em><strong> String currentUser = ((WorkflowContext) transientVars.get(&#8220;context&#8221;)).getCaller();<\/strong><\/em><br \/>\n<em><strong> WorkflowTransitionUtil workflowTransitionUtil = ( WorkflowTransitionUtil ) JiraUtils.loadComponent( WorkflowTransitionUtilImpl.class );<\/strong><\/em><br \/>\n<em><strong> log.debug &#8220;Original: ${issue.getId()}, ${issue.getKey()}. DETECTED &#8221; + issue.getStatusObject().getName();<\/strong><\/em><\/p>\n<p><em><strong>List&lt;IssueLink&gt; allInIssueLink = issueLinkManager.getOutwardLinks(issue.getId());<\/strong><\/em><br \/>\n<em><strong> for (Iterator&lt;IssueLink&gt; inIterator = allInIssueLink.iterator(); inIterator.hasNext();) {<\/strong><\/em><br \/>\n<em><strong> IssueLink issueLink = (IssueLink) inIterator.next();<\/strong><\/em><br \/>\n<em><strong> def linkedIssue = issueLink.getDestinationObject();<\/strong><\/em><br \/>\n<em><strong> log.debug &#8220;linked: ${linkedIssue.getId()}, ${linkedIssue.getKey()}. DETECTED &#8221; + linkedIssue.getStatusObject().getName();<\/strong><\/em><br \/>\n<em><strong> if (linkedIssue.getStatusObject().getName().equals(&#8220;To Do&#8221;)) { \/\/ STATO della issue collegata<\/strong><\/em><br \/>\n<em><strong> log.debug &#8220;linked Content: ${linkedIssue.getId()}, ${linkedIssue.getKey()}.&#8221;<\/strong><\/em><\/p>\n<p><em><strong>\/\/We can transition the parent ticket<\/strong><\/em><br \/>\n<em><strong> log.debug &#8220;start transition&#8221;<\/strong><\/em><\/p>\n<p><em><strong>workflowTransitionUtil.setIssue((MutableIssue) linkedIssue);<\/strong><\/em><br \/>\n<em><strong> workflowTransitionUtil.setUserkey(currentUser);<\/strong><\/em><br \/>\n<em><strong> workflowTransitionUtil.setAction (21); \/\/Transition ID &#8212; TRANSAZIONE CHE VIENE ESEGUITA<\/strong><\/em><br \/>\n<em><strong> workflowTransitionUtil.validate();<\/strong><\/em><br \/>\n<em><strong> workflowTransitionUtil.progress();<\/strong><\/em><\/p>\n<p><em><strong>log.debug &#8220;end transition&#8221;<\/strong><\/em><br \/>\n<em><strong> }<\/strong><\/em><\/p>\n<p><em><strong>}<\/strong><\/em><\/p><\/blockquote>\n<p>Nel seguente GIF, viene mostrato quello che succede quando attiviamo questa postfunction:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-91278\" src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/uploads\/2017\/09\/Script-status-03.gif\" alt=\"\" width=\"1041\" height=\"616\" \/><\/p>\n<blockquote>\n<h1>Conclusione<\/h1>\n<\/blockquote>\n<p>Un piccolo passo e poco poco codice per un grande risultato :-). Nei prossimi post cercheremo di esaminare altri script e scopriremo come sfruttare Scriptrunner.<\/p>\n<div class=\"clearfix\"><span class='ldc-ul_cont' onclick=\"alter_ul_post_values(this,'91233','like')\" >Likes<img src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/plugins\/like-dislike-counter-for-posts-pages-and-comments\/images\/up.png\" \/>(<span>2<\/span>)<\/span><span class='ldc-ul_cont' onclick=\"alter_ul_post_values(this,'91233','dislike')\" >Dislikes<img src=\"https:\/\/artigianodelsoftware.it\/blog\/wp-content\/plugins\/like-dislike-counter-for-posts-pages-and-comments\/images\/down.png\" \/>(<span>0<\/span>)<\/span><\/div>","protected":false},"excerpt":{"rendered":"<p>Un semplice esempio In questo post andremo ad esaminare un esempio di come possiamo sfruttare Scriptrunner per JIRA, gi\u00e0 presentato in questo blog, per realizzare delle funzioni opportune. &nbsp; Ringraziamenti Un grazie al lavoro che svolge MrAddons con il suo<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","footnotes":""},"categories":[3,4,14,15,16,17,119],"tags":[30,34,35,70,71,74,75,82,89,131],"_links":{"self":[{"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/posts\/91233"}],"collection":[{"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/comments?post=91233"}],"version-history":[{"count":5,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/posts\/91233\/revisions"}],"predecessor-version":[{"id":91286,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/posts\/91233\/revisions\/91286"}],"wp:attachment":[{"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/media?parent=91233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/categories?post=91233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/artigianodelsoftware.it\/blog\/wp-json\/wp\/v2\/tags?post=91233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}