Jira自动化的实用工具——ScriptRunner简介及最佳实践

近日,龙智举办的DevSecOps研讨会年终专场“趋势展望与实战探讨:如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队,以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲,分享他们在DevOps领域的丰富经验与独到见解,并围绕Atlassian最新产品趋势与Jira、Confluence等工具的最佳实践,展开了深入探讨。

本篇文章回顾龙智技术总监李毅的演讲,聚焦于Jira的实用插件ScriptRunner,分享如何使用ScriptRunner拓展Jira的功能、ScriptRunner的重要功能模块以及最佳实践。

图片

演讲回顾

如何在Jira中进行团队成本与时间管理

图片

大家好,我今天将分享如何使用ScriptRunner扩展Jira的功能,内容主要分为四个部分。

首先,我将介绍ScriptRunner是什么样的产品,让大家对其有一个整体的认识。

第二部分,我将详细讲解ScriptRunner中各个功能模块的作用,以便在为业务方提供解决方案时能够有所参考,知道应该使用ScriptRunner中的哪个模块来实现目标。

第三部分是实践经验总结。我会分享在实践和为客户提供解决方案过程中积累的一些经验,推荐一些实用做法,并提供注意事项,以便大家应用ScriptRunner时能够轻松上手。

最后,我将总结一些在Jira中通用且重要的模块,以及在为客户提供服务时经常出现的使用场景。

ScriptRunner——针对Jira自动化、定制功能及扩展的解决方案

首先,我们来快速了解一下ScriptRunner是怎样的产品。ScriptRunner主要利用Groovy脚本的强大功能,实现了Jira Software和Jira Service Desk本身无法实现的功能;以及从自动化,批量操作,构建自定义工作流,到第三方系统集成,ScriptRunner赋予Jira管理员超强的扩展能力。

它的主要优势是一体化、功能强大以及降本增效。作为一个产品,它包含了多个功能模块,几乎涵盖了用户可能需要的所有功能。相比购买多个插件,我们推荐首选ScriptRunner,因为它的功能丰富且实用。其次,它的功能强大,特别适用于构建复杂的自动化工作流,以减少人工成本。此外,它还能帮助团队实现降本增效,能够通过简单的脚本来支持业务需求,而无需进行定制化插件开发。

ScriptRunner的主要特点包括自动化、高度定制化、可扩展以及提升用户体验。它不仅能够满足各种自动化需求,还能够根据不同行业的特殊要求进行高度定制,以满足业务场景的需求。同时,它的拓展性也非常好,能够轻松实现与Atlassian体系中的其他工具的集成,也可以通过RestAPI的方式与其他异构系统进行数据交互。无论是Jira管理人员还是日常使用Jira的用户,都能够充分体验到其强大的功能。

ScriptRunner功能模块

让我们一起浏览ScriptRunner的各个功能模块,了解它们的主要用途。

1、控制台——Script Console。控制台主要用于编写试验性的脚本或进行一次性功能验证。用户可以在此处执行定期清理用户、查询Issue数据、项目数据等任务,并查看结果。此外,用户还可以在控制台学习和测试Jira REST API和HAPI,非常方便。

2、Built-In Scripts,该模块集成了许多内置的通用性脚本,提供了许多实用功能,例如批量操作用户、批量操作Issue、查看日志、切换日志等。对于不太熟悉Groovy脚本编写的用户,建议先查看内置脚本,看是否已经满足需求。

3、Listeners,顾名思义,它用于监听Jira中发生的事件,并在捕捉到事件后执行特定的脚本处理。

4、Jobs允许您定期自动的运行脚本,从而节省管理员的时间,并降低人工执行的风险。

5、Script Fields就是所谓的脚本字段,它使用Groovy脚本计算或合并来自一个或多个现有字段的数据,并将它们展示在自定义字段中。通常用来展示扩展的Issue信息。

6、Behaviours行为模块,是Script Fields的特有模块,也是最重要的模块之一。它用于控制Issue界面上字段的行为,使得用户可以根据需要定制化业务场景和流程。

7、Workflows也是常用模块之一,主要通过Script Conditions、Script Validators和Script Post Functions来增强和自动化工作流程。

8、Script Fragments主要与定制化UI相关,可以添加按钮、Web图标等。

9、JQL Functions扩展了Jira的内置功能,允许您进行更精细的搜索操作,以快速获取项目/问题的更详细信息。

10、REST Endpoints模块主要利用Groovy脚本迅速定义REST Endpoints,并可以与企业内部协同使用的工具集成并交互数据,例如从HR系统拉取用户数据或从其他需求管理平台获取项目的任务开发进度等。

11、Resources模块可建立本地或外部数据库的链接,以及Ldap用户管理的链接。一旦建立了连接,在其他场景编写脚本时都可以直接使用,通过内置的BaseUtil和LdapUtil工具类,可以轻松获取所需的数据。

12、最后是Mail Handler模块,虽然使用频率不高,但在用户接收邮件时执行指定操作时非常有用。

ScriptRunner最佳实践

动态表单

在实际为客户提供解决方案时,我们总结了一些使用ScriptRunner的好方法和注意事项。

我想推荐大家尝试使用Dynamic Forms(动态表单)功能。动态表单允许创建的脚本带有一些需要用户动态输入的参数,从而增强了脚本的通用性。Dynamic Forms可以保存脚本,并且带有注释,即使对代码不太了解的用户也可以理解脚本的用途,提高了易用性。你可以编写一个通用型的脚本,在多个地方都能派上用场,因此我强烈推荐大家使用动态表单功能。

图片

我编写了一个简单的示例,以便大家了解这个概念。这个示例包含一个带有"注释"的变量,称为"user Picker"。它可以通过这种方式将变量绑定到用户上,当用户使用这个脚本时,就可以动态输入用户变量。这个脚本的实际功能非常简单,它通过JQL查询“经办人等于输入的用户变量”的所有Issue并进行批量操作。这样的脚本具有通用性,每个人都可以动态输入想要的用户变量参数。

这只是其中一个示例。实际上,动态表单可以支持Jira中绝大多数的字段类型,包括Issue、Group、Project等,甚至各种工作流方案和权限方案。你可以选择并基于它编写通用性的脚本。

HAPI

我也强烈推荐大家使用HAPI。HAPI是ScriptRunner扩展出的便捷API,它实际上是基于Jira脚本的,但做了一层紧凑的封装,进一步降低了用户的使用门槛。使用HAPI不需要对Jira过于熟悉。

通常情况下,按照JavaAPI的方式编写脚本会比较繁琐。但是,直接使用HAPI会更为简洁。

接下来我会举几个例子,大家可以体会一下。使用HAPI相对来说门槛非常低,而且编辑器中针对HAPI提供了很多代码提示功能。只要按照提示编写,基本上都会有相应的建议。这降低了很多用户的使用门槛,因此我也非常推荐大家在编写脚本时尽量使用HAPI。

图片

简单举几个例子。首先是创建Issue,非常简单,只需一句话。你可以在Console中执行一下代码,它会在“ABC”项目下创建一个类型为“Task”的Issue,其摘要为“my first HAPI”。相比使用Java API来编写,这种方式更加简单。

接下来是批量搜索Issue的写法,同样也非常简单。直接使用JQL语句,甚至可以通过filter进行过滤。我们可以限制返回的条数。

图片

以下是关于用户的一些例子。可以看到,创建用户也非常简单,只需使用users.即可,后面的信息就是用户名、邮箱和全名。通过Users.getByName就能获取到相应的用户信息。users.的使用非常广泛,它提供了许多提示,内置了许多实用的函数。而projects.则提供了与项目相关的功能提示。

因此,我非常推荐大家尝试使用HAPI来编写代码,便捷高效。

图片

以下是关于几个泛用性高的模块的推荐用法以及使用过程中需要注意的事项。

首先是特色功能——Behaviours。Behaviours通常用于用户界面,包括新增、编辑、转换界面等。它也可用于JSM的portal端。如果您正在使用JSM产品,并且需要在portal端定制字段的行为,也可以考虑使用它。

Behaviours通常用于字段的必填校验,只读控制,显示/隐藏控制,以及字段的选项动态变动,字段联动等。在使用过程中,要避免多个Behaviours脚本同时控制同一个字段的情况。需要做好控制范围,确保字段不会受到多个脚本的影响。此外,Behaviours不适用于批量操作,也不支持移动Issue界面。

它还支持项目类别的映射。通常情况下,脚本的控制范围是通过项目和问题类型映射来实现的。如果我们利用ChangeEvent事件,并在此事件中使用MappingService进行映射。那么我们就可以实现脚本对项目类别的范围控制了。

最后,Behaviours不支持插件扩展的自定义字段,但可以通过Vendors API进行兼容。Vendors指的是Marketplace上的供应商,他们通常会提供免费的API。因此,如果您希望扩展出的自定义字段也受到Behaviours的控制,可以考虑集成该API进行扩展。

图片

最后,让我们来谈谈Script Fields。Script Fields主要用于只读字段,它也集成了许多内置的脚本字段,可以满足大部分业务场景的需求。

例如,“No. of Times In Status”(状态次数),这个字段可以统计Issue进入指定状态的次数。在实际应用中,这个功能可以在很多地方发挥作用,比如一个工作流中反复进入某个状态,我们可能需要统计这个状态的次数。例如,在测试中,如果一个bug被反复打开,可能就存在问题,我们可以利用这个脚本字段来统计这种情况。这些指标可以帮助我们后续进行跟踪和分析。

另外一个常见的自定义场景是业务方有自己特殊的业务逻辑。典型的例子包括问题严重度字段的实时计算,这需要根据其他字段的值通过一定的业务规则计算后得出;或者是Issue的评分,通常也是依赖于其他字段并进行业务规则计算得出的。Script Fields通常在这些自定义场景中使用。

ScriptRunner客户案例

接下来,我将分享一些重要模块的具体实际案例,供大家参考。当大家在工作中遇到类似的场景时,可以考虑通过这些方式去实现。

Behaviours

首先是Behaviours,它主要的适用场景是在创建、编辑和转换界面中增加字段的行为逻辑(业务规则),相当于定制化业务规则。

  • 当字段A选择某选项时,字段B显示并且必填;

  • 字段A和字段B有联动效果,如:字段A选择了 "上海",字段B的选项值变为 "徐汇区","普陀区";

  • 校验字段A的日期和字段B的日期间隔不能超过60天;

  • 校验字段A的日期不能早于字段B ;

  • 限制字段A的编辑权限,只有用户组a中的用户才可以编辑,其他用户都是只读;

  • 限制某些问题类型的创建;

  • 当issuePicker字段A选择一条Issue后,自动将字段B的值变更为该Issue中某个字段的值;

Custom Listener

然后是Custom Listener模块,也是非常重要的。它适用于在发生特定事件时需要执行相应的处理逻辑的场景。

  • IssueA和IssueB有链接关系,当IssueA字段更新时,将对应的字段值同步到IssueB;

  • 当Issue中的模块发生变化时,将Issue的经办人修改为该模块的负责人;

  • IssueA和IssueB有链接关系,当IssueA状态变化时,将状态同步到IssueB;

  • 当Issue经办人变更时,给自定义字段赋值;

  • 当IssueA字段更新时,同时更新动态表单IssuePicker选择的Issue中相关字段值;

  • 当Issue中的字段、状态发生变化时,产生邮件通知或添加评论。

Workflows

Workflows也是一个被广泛使用的模块。它的适用场景是定制化专属的工作流以及自动化业务流程。我们分别从condition、validator和post-function来讨论几个典型的业务场景。

Custom script condition:

  • “问题等级”字段为S级时,需要负责人审批,其他问题等级则不需要;

根据“问题严重度”字段值的不同,执行不同的工作流。

Custom script validator:

  • 若“项目负责人”字段为空时,Issue 必须停留在原状态,工作流往下流转时需要给出错误提示。

Custom script post-function:

  • Issue 创建成功后,自动将经办人设置为经办人的主管,并且发邮件通知;

  • Issue 最终完成时,自动给“最终完成时间”字段赋值。

Script Field

最后再谈一下脚本字段,它的适用场景是字段只读并且字段值依赖其他字段自动计算或统计。通用场景有:

  • 脚本字段A的值是根据字段B、字段C 的值,按照业务规则自动计算所得;

  • 脚本字段A的值根据Issue进入Open状态后的天数统计得到。

总结一下今天演讲的主要内容:如果您要使用ScriptRunner,重点关注Behaviours、Listeners、Workflows以及Script Fields这几个模块。将精力集中在这些模块上,再加上动态表单和HAPI的使用,就可以解决绝大部分的问题。如果大家还有其他问题解决不了,可以联系Atlassian全球白金合作伙伴——龙智,我们将提供优秀的解决方案,帮助你们达到目标。

我今天的分享就到这,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费分享一套SpringBoot+Vue体育馆(预约)管理系统,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue体育馆(预约)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue体育馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue体育馆(预约)管理系统 Java毕…

【高通camera hal bug分析】高通自带相机镜像问题

首先打了两个log,一个是开启镜像的log,还有一个是没有开启镜像的log,如果我们开启镜像以后,观察开启镜像log发现 , 这段代码走的没有任何问题,因为Flip的值等于1了。 关闭镜像log如下: 如果我们不开启镜像…

java中常用的查询算法

1、线性查找 直接从左往右遍历,有则返回 适合数组或链表 public static void main(String[] args) {int[] arr { 12, 34, 32, 56, 78, 23, 34, 56, 67 };int num 34;System.out.println(fangno(arr, num));}public static ArrayList fangno(int[] arr, int num…

Java集合八股文总结

Java集合八股文总结 Collection Set TreeSet 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。HashSet 基于哈希表实现&…

Linux下的系统字体分类

在上次解决Avalo在/usrnia启动问题的时候涉及到了字体,因此特意了解了一下,/share/fonts/目录下存储了不同类型的字体文件,其各代表的意义如下: 我使用的是ubuntu20.04版本,该目录下的文件夹有: /usr/shar…

Google 在 MySQL 中推进矢量搜索,在 LLM 支持方面超越 Oracle

谷歌已将向量搜索引入其 MySQL 数据库服务,这一步领先了 MySQL 的所属公司 Oracle,迄今为止,Oracle 尚未给 MySQL 添加任何大型语言模型(LLM)方面的功能。 谷歌云数据库副总裁安迪古特曼斯 (Andi Gutmans) 表示&#…

el-form表单中,对非表单内字段增加校验的方法

1、问题说明: 在开发表单的时候,可能会遇到el-form-item中绑定的值不在表单绑定的数据对象中。 此时用prop绑定该字段名是无效的,需要单独对这个字段进行校验。 在el-form-item中有一个属性 error 。用于表单域验证错误信息,设…

Java SE入门及基础(37)

Object 类常用方法 Object类中定义的方法大多数都是属于 native 方法, native 表示的是本地方法,实现方式是在 C 中。 1. getClass() public final Class getClass () //The getClass() method returns a Class object, which has methods you can…

【算法】KY67 整数奇偶排序

描述 输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列; 2.然后输出其中的偶数,并按从小到大排列。 输入描述: 任意排序的10个整数(0~100&#x…

灰度发布难以追踪?你可能用错了工具

灰度发布进行可观测性的主要方式是通过收集和分析用户在使用新版本产品或服务时的数据,以此来评估新版本的性能、稳定性和用户满意度。这个过程通常包括以下几个步骤: 定义观测指标:首先,需要定义一套合适的观测指标(…

Java Day7 常用API

文章目录 1、Arrays1.1 简述1.2 如何比较对象数组1.2.1 方法1.1.2.2 方式2 2、Lambda3、方法引用3.1 静态方法的引用3.2 实例方法引用3.3 特定类型方法引用3.4 构造器引用 1、Arrays 1.1 简述 操作数组的一个工具类 常见方法 int[] arr{10,20,30,50,40};//将 数组的内容 组…

彩色gif闪图怎么做?分享gif动画的方法

在现在的媒体时代,动态图片已经成为了最流行的分享信息的方式。能够传达动态的视觉效果。那种带有动态效果的闪动文字图片要怎么制作呢?很简单,通过使用在线制作闪字图片工具,上传多张文字内容相同,颜色、位置不同的jp…

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 🎄API介绍🌸ServerSocket API🌸Socket API 🍀TCP中的长短连接🌳建立TCP回显客户端与服务器🌸TCP搭建服务器🌸TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API 🎄…

C语言函数—库函数

函数是什么? 数学中我们常见到函数的概念。但是你了解C语言中的函数吗? 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, ca…

VSCode调试C++项目时无法显示长字符串的所有内容

记录一次失败的尝试,参考解决vs code 调试golang时字符串显示不全的问题。_golang gin buf数据不全-CSDN博客 但是笔者当前使用的VSCode版本不支持在launch.json中添加dlvLoadConfig选项 笔者的思路是如果VSCode不支持,那就下降到下一层,VSC…

c++初阶------类和对象(下)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

判断、v-if判断显示隐藏,功能区循环案例。

判断条件 1.第一种 如果身份是管理员 &#xff0c; 那么全部显示 如果身份是员工 &#xff0c;那么除了value等于1的全部都显示 v-if"( user.state.level admin) || ( user.state.level staff && item.value ! 1)"<view class"funcBox">&…

Solidity Uniswap V2 factory contract

factory contract 工厂合约是所有已部署pair合约的注册表。我们不希望出现相同的pair&#xff0c;这样流动性就不会被分割成多个。factory合约还简化了pair合约的部署&#xff1a;无需手动部署pair合约&#xff0c;只需调用factory合约中的方法即可。 https://github.com/XuHug…

马斯克将在本周,开源类ChatGPT产品Grok

3月11日晚&#xff0c;马斯克在社交平台宣布&#xff0c;将在本周开源生成式AI产品——Grok。 Grok是马斯克旗下公司xAI在去年11月发布的&#xff0c;一款类ChatGPT产品&#xff0c;可以提供生成文本、代码、邮件、信息检索等功能。其测试性能超过GPT-3.5、LLaMA 2 70B&#x…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的铁轨缺陷检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发铁轨缺陷检测系统对于物流行业、制造业具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个铁轨缺陷检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模…