We recently converted to JIRA and apart of our process allows engineerings to accept Ad-Hoc requests from the business owners. So I wanted to the ability for a developer to quickly be able to grab a new ticket and add it to the current sprint. The only solution I could find was to write a script using the JIRA Script Runner plugin.
The following is the script that I wrote. It does the following:
- automatically assigns members of the "jira-product" group as watchers of the issue
- adds the issues to the current sprint. The algorithm is to find the lowest number sprint ID that is not closed.
- sets our custom field "Ad Hoc Requests" (id=10305) to 1. This way we can run reports on these requests.
importPackage(java.lang);
run();
function run() {
var componentManager = com.atlassian.jira.ComponentManager.getInstance();
var user = componentManager.getJiraAuthenticationContext().getUser();
var watcherManager = componentManager.getWatcherManager();
var userManager = componentManager.getComponentInstanceOfType( com.atlassian.jira.user.util.UserManager );
var groupManager = componentManager.getComponentInstanceOfType( com.atlassian.jira.security.groups.GroupManager );
if ( ! userManager ) {
log("User Manager not found");
return 0;
}
if ( ! groupManager ) {
log("Group Manager not found");
return 0;
}
var admin = userManager.getUserByName("admin");
log("JIRA="+admin);
var productGroup = groupManager.getGroup("jira-product");
if ( productGroup ) {
var users = com.atlassian.jira.user.ApplicationUsers.from(groupManager.getUsersInGroup(productGroup)).iterator();
while ( users.hasNext() ) {
var usr = users.next();
log("Adding Watcher : " + usr.getClass() );
watcherManager.startWatching( usr , issue );
}
}
// finish adding watchers
log("JS : " + user + " " + issue + " " + issue.getClass() );
var commentManager = componentManager.getComponentInstanceOfType( com.atlassian.jira.issue.comments.CommentManager );
var customFieldManager = componentManager.getComponentInstanceOfType( com.atlassian.jira.issue.CustomFieldManager );
if ( ! customFieldManager ) {
log("Null Custom Field Manager");
return 0;
}
var sprintFld = customFieldManager.getCustomFieldObject( 10000 );
var adhocFld = customFieldManager.getCustomFieldObject( 10305 );
if ( ! sprintFld ) {
log("Sprint field not found");
return 0;
}
if ( ! adhocFld ) {
log("Ad Hock Field Not Found");
}
var sprintManager = getSprintManager();
if ( ! sprintManager ) {
log("SprintManager not found");
return 0;
} else {
log("Found SprintManager");
}
if ( commentManager && issue ) {
if ( sprintManager ) {
var sprintId = null;
var sprint = null;
var value = issue.getCustomFieldValue(sprintFld);
log("Sprint = " + value );
var soutcome = sprintManager.getAllSprints();
if ( soutcome.isValid() ) {
var allSprints = soutcome.getValue();
if ( allSprints ) {
var itt = allSprints.iterator();
while( itt.hasNext() ) {
var next = itt.next();
if ( next.isClosed() ) continue;
if ( ! sprintId || sprintId.longValue() > next.getId().longValue() ) {
sprintId = next.getId();
sprint = next;
}
}
}
}
if ( sprint ) {
var newValue = new java.util.ArrayList();
newValue.add( sprint );
sprintFld.updateValue(null, issue, new com.atlassian.jira.issue.ModifiedValue(value,newValue), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder());
adhocFld.updateValue(null,issue,new com.atlassian.jira.issue.ModifiedValue(issue.getCustomFieldValue(adhocFld),1), new com.atlassian.jira.issue.util.DefaultIssueChangeHolder());
}
}
var msg = user + " accepted story as ad-hoc request";
if ( sprint ) {
msg = msg + " and assigned to sprint: " + sprint.getName();
}
commentManager.create(issue, admin , msg , true);
issue.store();
}
}
function getSprintManager() {
var appCtx = getGreenHopperAppCtx();
if ( appCtx ) {
log("Found AppCtx");
return appCtx.getBean( "sprintManagerImpl" );
}
return null;
}
function getGreenHopperAppCtx() {
var componentManager = com.atlassian.jira.ComponentManager.getInstance();
var osgi = componentManager.getComponentInstanceOfType (com.atlassian.plugin.osgi.container.OsgiContainerManager);
if ( ! osgi ) {
java.lang.System.out.println("OSGI Not Found");
return null;
}
var bundles = osgi.getBundles();
var sprintManager;
for(var i=0;i<bundles.length;i++) {
var bundle = bundles[i];
if ( "com.pyxis.greenhopper.jira".equals( bundle.getSymbolicName() ) ) {
log("Found JIRA Agile Plugin");
var bctx = bundle.getBundleContext();
var refs = bctx.getAllServiceReferences(null,null);
if ( refs ) {
for(var j=0; j<refs.length;j++) {
var prop = refs[j].getProperty("org.springframework.context.service.name");
if ( "com.pyxis.greenhopper.jira".equals(prop) ) {
log ( "Found Greenhopper ServiceReference : " + prop );
return bctx.getService( refs[j] );
}
}
}
}
//log ( bundle );
}
return null;
}
function log(msg) {
java.lang.System.out.println( "" + msg);
}
No comments:
Post a Comment