== 【1】待解决问题 ==
最近为了统计JIRA中的任务延期情况,需要每个任务都填写实际完成时间。
"实际完成时间"这个字段为日期格式的。
如果人工填写,增加了人员的额外劳动,另外也容易不真实。
所以,尝试使用JIRA的工作流,设置自动填写实际完成时间的值。
== 【2】尝试过的方法 ==
首先,使用了JIRA工作流的“结果处理”中的“更新问题字段”功能,
发现这个功能不支持自定义字段值的设置。就算是JIRA默认字段,也支持的非常少。
而,我们的“实际完成时间”字段为自定义字段,这个方法不可行。
之后,想通过插件实现这个功能。但考虑JIRA服务器的安全,不能随便挂载插件。
== 【3】正确方法的操作步骤 ==
后来,查了各种资料,使用JIRA工作流的“结果处理”中的“Script Post-Function”可以实现。
下面详细说明步骤:
1. 使用管理员权限的帐户登录JIRA
2. 登录后,点击右上角的“设置->项目”菜单
3. 在展开的页面中,点击主菜单中的“问题”,点击左侧菜单中的“工作流”菜单
4. 在展示的工作流列表中找到要编译的工作流,点击右侧的“编辑”链接
5. 在展示的工作中,点击需要添加脚本的工作流动作。我是要在“测试通过”的动作中添加脚本。
6. 选择“结果处理”页签,点击“添加结果处理功能”链接
7. 在展开的页面中,选择“Script Post-Function”后,点击“增加”按钮
8. 在新页面中,点击“Custom Script Post-Function”链接
9. 在展开的页面的“Inline script”栏中编写我们的脚本(脚本内容后面说明)后,点击“增加”按钮
10. 回到工作流编辑页面,点击“发布草稿”。这时,带有脚本的工作流就生效了。
11. 在JIRA中对任务进行“测试通过”的操作,脚本就会被执行。
12. 进入第6步的页面中查看执行日志。日志和任务界面都显示正确就OK了。
(没有上传图片,因为要处理项目信息,而图片比较多。看了步骤还不会的,请私信我)
== 【4】脚本内容 ==
import java.util.Date;
import java.text.SimpleDateFormat;
import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.component.ComponentAccessor;
import org.apache.log4j.Category;
import java.sql.Timestamp;
ComponentManager componentMgn = ComponentManager.getInstance();
def Category log = Category.getInstance("com.onresolve.jira.groovy")
//log.setLevel(org.apache.log4j.Level.INFO);
//log.info("[S] log:");
//Get CustomField of "实际完成时间"
def devFindateForm = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("实际完成时间");
//log.info("字段名:");
//log.info(devFindateForm);
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
//log.info(sdf.format(new Date().getTime()));
//set value for "实际完成时间"
issue.setCustomFieldValue(devFindateForm, new Timestamp(new Date().getTime()));
== 【5】脚本说明 ==
JIRA工作流中使用的是Groovy脚本,会Java的应该都能写。
工作流中的脚本不能进行调试,只能通过输出log测试。
脚本测试通过后,就把log注释掉了。
这段脚本是加在任务工作流的“测试通过”的动作中,当操作者在JIRA任务中操作“测试通过”时,
脚本会被执行,“完成时间”字段会被设置为当前日期。
如果工作流存在回退的流程,还需要在回退的动作中,增加脚本删除这个字段的值。
关于JIRA API类和方法的使用,请参考下文中JIRA API官方网址。
脚本中最后一行的“issue”表示当前正在操作的JIRA任务。
== 【6】脚本运行问题解决说明 ==
虽然起作用的脚本只有两行,但在测试过程中,还是遇到了问题。
报错:java.lang.IllegalArgumentException: Java type java.util.Date not currently supported. Sorry.
原因:“实际完成时间”为日期格式的字段,把Date类型的对象作为setCustomFieldValue()的第2个参数
错误代码:issue.setCustomFieldValue(devFindateForm, new Date().getTime())
解决方法:日期格式的字段应该使用Timestamp类型作为参数,把Timestamp类型的对象作为setCustomFieldValue()的第2个参数
== 【7】设置“测试人员”脚本示例 ==
需求:
当任务完成时,设置“测试人员”为操作JIRA任务的人,以标识完成任务的人。
不使用经办人字段是因为这个字段一直在变,不便于统计。
脚本如下:
def devFindateForm = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("测试人员");
def currentUser = ((WorkflowContext)transientVars.get("context")).getCaller();
def appCurUser = ComponentAccessor.getUserManager().getUserByKey(currentUser);
issue.setCustomFieldValue(devFindateForm, appCurUser);
== 【8】JIRA API官方网址 ==
Index of ./software/jira/docs/api
自己选择不同的版本看,我看的是7.3.3
Atlassian JIRA 7.3.3 API