当前位置: 首页 > news >正文

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全球白金合作伙伴——龙智,我们将提供优秀的解决方案,帮助你们达到目标。

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

相关文章:

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

近日,龙智举办的DevSecOps研讨会年终专场“趋势展望与实战探讨:如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队,以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲,分享他们在D…...

App拉起微信小程序参考文章

App拉起微信小程序参考文章h5页面跳转小程序-----明文URL Scheme_weixin://dl/business/?appid*appid*&path*path*&qu-CSDN博客文章浏览阅读561次,点赞16次,收藏5次。仅需两步,就能实现h5跳转小程序,明文 URL Scheme&…...

AcWing 4956. 冶炼金属

对于这个题,V越大,除出来的数就越小,V越小,除出来的数就越大,当我们找一个最大和最小值的时候,就可以通过这个性质进行二分来求解。 可以通过求满足 [ A V ] [\frac{A}{V}] [VA​] 小于等于 B B B的最小的…...

记一次面试经历

这段时间正好是金三银四的黄金时间段,正好这段时间也有很多企业有hc在招人,本文主要就是来聊聊我这段时间的面试经历吧。目前我是从北京投上海的岗位,现在有两家保底的offer。 简历投递 简历这块是基础也是必要的门槛,有没有面试…...

js【详解】DOM

文档对象模型(Document Object Model,简称DOM) DOM 是哪种数据结构 ? DOM 的本质是浏览器通过HTML代码解析出来的一棵 树。 操作 DOM 常用的 API 有哪些 ? 获取 DOM 节点 //方式 1:通过【id】获取&#xf…...

《互联网的世界》第六讲-去中心化和安全

互联网构建于开放互联的中立原则之上,公平接入,数据互联互通,流量被无差别对待,这意味着互联网本质上是匿名,去中心的,这与我们的现实世界完全不同。 但互联网上的主流业务却是 c/s 产销模式,试…...

nginx代理参数proxy_pass

proxy_pass参数用于配置反向代理,指定客户端请求被转发到后端服务器,后端地址可以是域名、ip端口URI 代理后端报错提示本地找不到CSS文件、JavaScript文件或图片 例如: nginx :10.1.74.109 后端服务:http://10.1.74.…...

_note_01

1.什么是跨平台 跨平台是指一个应用程序或一个编程语言,可以在不同的操作系统或平台上运行,而不需要对代码进行修改或重新编译。 跨平台应用程序或编程语言的设计和实现可以使开发者减少对特定平台的依赖,从而降低维护和开发的成本。同时&am…...

聊聊python中面向对象编程思想

面向对象编程思想 1、什么是面向过程 传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化! → 将要实现的功能描述为一个从开始到结束按部就班的连续的“步骤” → 依次逐步完成这些步骤,如果某一个步骤的难度较大&#xff…...

MySQL-视图:视图概述、使用视图注意点、视图是否影响基本表

视图 一、视图概述二、使用视图注意点三、视图操作是否影响基本表 一、视图概述 在数据库管理系统中,视图(View)是一种虚拟表,它并不实际存储数据,而是基于一个或多个实际表的查询结果。视图提供了一种对数据库中数据…...

鸿蒙开发(四)-低代码开发

鸿蒙开发(四)-低代码开发 本文主要介绍下鸿蒙下的低代码开发。 鸿蒙低代码是指在鸿蒙操作系统进行应用开发时,采用简化开发流程和减少编码量的方式来提高开发效率。 1:开启低代码开发 首先我们打开DevEco Studio .然后创建工程。 如图所示&#xff…...

BUU [网鼎杯 2020 半决赛]AliceWebsite

BUU [网鼎杯 2020 半决赛]AliceWebsite 开题&#xff1a; hint附件是源码。在index.php中有一个毫无过滤的本地文件包含 <?php $action (isset($_GET[action]) ? $_GET[action] : home.php); if (file_exists($action)) {include $action; } else {echo "File not…...

超越 Siri 和 Alexa:探索LLM(大型语言模型)的世界

揭秘LLM&#xff1a;语言模型新革命&#xff0c;智能交互的未来趋势 近年来&#xff0c;虚拟助手的世界发生了重大转变。 虽然 Siri 和 Alexa 本身就是革命性的&#xff0c;但一种称为大型语言模型 (LLM) 的新型人工智能正在将虚拟助手的概念提升到一个全新的水平。 在这篇博文…...

Linux删除Mysql

//rpm包安装方式卸载 查包名&#xff1a;rpm -qa|grep -i mysql 删除命令&#xff1a;rpm -e –nodeps 包名//yum安装方式下载 1.查看已安装的mysql 命令&#xff1a;rpm -qa | grep -i mysql 2.卸载mysql 命令&#xff1a;yum remove mysql-community-server-5.6.36-2.el7.x86…...

CNN中常见的池化操作有哪些,作用是什么?

CNN中常见的池化操作有哪些&#xff0c;作用是什么&#xff1f; CNN中常见的池化操作只要是两种&#xff0c;平均值池化和最大值池化最大值池化常用于分类任务&#xff0c;是指在输入数据的局部区域内取最大值作为输出。最大池化的作用是降低特征图的尺寸&#xff0c;减少参数…...

能打印单据的软件,如进出库单据,物流快运单据,定制单据样式

能打印单据的软件&#xff0c;如进出库单据&#xff0c;物流快运单据&#xff0c;定制单据样式 一、前言 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、不同行业打印的单据不同 2、同一个行业打印的样式可能不同 3、有的行业已经印刷好了许多打印…...

uniapp列表进入动画

app列表入场动画 - DCloud 插件市场 列表入场动画https://ext.dcloud.net.cn/plugin?id16957...

FPGA TestBench编写学习

1 timescale 1.1 简介 timescale指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用&#xff0c;它告诉编译器和仿真器如何解释代码中的时间值。 timescale指令的语法如下&#xff1a; timescale <time_unit> <time_precis…...

Centos7 安装mongoDB

下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz 解压 tar -zxvf mongodb-linux-x86_64-3.2.12.tgz移动到指定位置 mv mongodb-linux-x86_64-3.2.12/ /usr/local/mongodb在/usr/local/mongodb下创建文件夹 cd /usr/local/mongodb m…...

Redis冲冲冲——Redis持久化方式及其区别

目录 引出Redis持久化方式Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...