Notes
  • 简介
  • Linux
    • Ubuntu
      • Ubuntu 20.04 ARM64 修改PAGE_SIZE 64k
    • Samba
      • CentOS7安装Samba
      • 简单案例
      • 审计
      • 相关命令
    • Systemd
    • FPM 打包 nginx rpm 包
    • rpm 打包-从二进制文件进行打包
    • Centos7 重置密码
    • CentOS7搭建kvm并创建虚拟机
    • CentOS7-KVM 嵌套虚拟化
    • CentOS7 KVM GPU 穿透
    • Bonding
    • CentOS7 发送邮件
    • CentOS7 安装 OpenVPN
    • Linux 多线路由策略
    • Webmin 安装
    • NoVNC 安装
    • SRS-RTMP 服务部署
    • CentOS7 安装 MongoDB
    • confluence 安装
    • jira 安装
    • crowd 安装
    • ScriptRunner For Jira
    • ScriptRunner For Confluence
    • Ubuntu VNC
    • Ubuntu18.04-VNC 安装
    • deb 打包
    • iptables
    • debian 保持软件包一致
    • Ubuntu18.04 编译安装 grpc
    • CentOS7 安装 odoo13
    • Pacemaker 入门
    • Firewalld Rich Language
    • PHP Xdebug
    • CentOS7.3 编译安装 Python3.6
    • 葫芦儿打包
    • CentOS7 安装 Tomcat8
    • CentOS7 安装 JDK
    • GuacamoleServer 编译安装
    • FreeBSD7.0安装AMP
    • CentOS7 换源
    • deb下载并离线安装
    • pip下载并离线安装
  • Network
    • 案例一
  • AI
    • 微调Qwen2.5
    • Qwen2.5 VL AWQ量化
    • qwen2.5 填充权重
  • JavaScript
  • Zabbix
    • CentOS7 安装 Zabbix4.0 LTS
    • Zabbix 加密连接
    • Zabbix 主动和被动模式
    • Zabbix 配置邮件报警
    • Zabbix 监控 MySQL
  • 数据库
    • MySQL
      • CentOS7 Install MySQL5.7
      • MySql 主从配置
      • CentOS7 安装 Percona XtraDB Cluster
      • MySql 压力测试-sysbench
      • MariaDB Galera Cluster
      • 备份脚本
    • MongoDB
      • 启用账号密码登录
      • 备份脚本
  • Nginx
    • CentOS7 安装 Nginx
    • Nginx 配置
    • nginx-http-flv-module
    • Nginx-WebDAV
  • Docker
    • CentOS7 安装 Docker
    • Dockerfile
    • DockerSwarm 集群
    • Docker 安装 guacamole
  • Python
    • 虚拟环境
  • Windows
    • Windows 问题集合
    • 迅雷自动安装 Chrome 插件
    • RDP 注册表
    • Rdp File Setting
    • 本地组策略对象(LGPO)工具
    • 禁用应用联网
    • SQL Server 问题处理
    • SQL Server Trigger
    • NSIS 脚本
    • 使用QEMU运行ARM64 CentOS7
    • DOS 脚本
    • Windows 11 设置旧版右键菜单
    • 远程桌面二次验证
  • Apple
    • AppStore 应用开发及上架
    • Apple 打包 Golang WebDav 制作 pkg 安装包
  • Android
    • Android Studio创建具有root权限的虚拟机
    • Android读写挂载system
    • Android安卓CA至系统
  • 证书
    • 证书名称(主题)
    • 证书扩展
    • SSL 自签
    • 免费 https 证书申请
  • 树莓派
    • 树莓派系统烧录及系统打包制作
    • 树莓派基础操作
    • 树莓派安装 NextCloud
    • 树莓派安装 LNMP
    • 树莓派自定义开机界面和登录提示
    • 树莓派安装 HomeAssistant
    • HomeAssistant 配置
    • 树莓派自动挂载 U 盘
    • 树莓派安装 vsftpd
    • vsftpd 配置文件详解
  • ceph
    • ceph-deploy 部署 ceph nautilus 版本
    • ceph dashboard
  • OpenStack
    • OpenStack VM 配置 Virtual IP
    • OpenStack Glance 对接 Ceph RBD 存储
    • OpenStack Cinder Volumes 对接 Ceph RBD 存储
    • OpenStack 集群搭建
    • OpenStack Rocky 单节点部署
    • OpenStack Rocky 集群部署
    • OpenStack CentOS6 镜像制作
    • OpenStack-Ubuntu 镜像制作
    • Openstack-Windows 镜像制作
    • OpenStack-RBD 导入镜像
    • OpenStack-Rocky 灾备
    • rbd-mirror
  • FFmpeg
    • CentOS7 静态编译FFmpeg
    • MacOS10.12静态编译FFmpeg
    • CentOS7 Arm64静态编译FFmpeg
    • 使用NVIDIA显卡
    • 脚本
  • Other
    • 华为一碰传标签制作
    • 常用软件
    • wireguard
由 GitBook 提供支持
在本页
  • 工作流属性
  • ScriptRunner
  • 获取问题
  • 获取用户
  • 获取关注列表
  • 获取自定义字段值
  • 更新问题
  • 历史经办人
  • 清空历史经办人
  • 设置抄送人
  • 设置审批人为部门主管
  • 批量子任务
  • JQL 搜索问题
  1. Linux

ScriptRunner For Jira

工作流属性

jira.issue.editable = true / false表示该问题是可编辑的
jira.permission.edit.group = <任何jira组>意味着,只有属于该组的用户才能编辑问题

注:详细的属性如下。
格式:jira.permission.[subtasks.]{permission}.{type}[.suffix]
subtasks : 可选,如果想要把这个权限继承到子任务中的话就写上这个选项。
permission : JIRA对应的权限类的缩写,下面是基于JIRA4.2的可用权限类缩写列表,这个就不一一翻译了,相信如果对JIRA有一定的了解都应该知道对应的权限是什么。
admin, use, sysadmin, project, browse, create, edit, scheduleissue, assign, assignable, attach, resolve, close, comment, delete, work, worklogdeleteall, worklogdeleteown, worklogeditall, worklogeditown, link, sharefilters, groupsubscriptions, move, setsecurity, pickusers, viewversioncontrol
type : 允许/拒绝当前权限的用户,可用的值有下面几个。
group, user, assignee, reporter, lead, userCF, projectrole
suffix : 后缀,如果想要对两个用户组进行权限设置,可以通过后缀来区分。比如jira.permission.edit.group.1, jira.permission.edit.group.2
接下来在属性值中填入对应的值,比如想给某个用户组操作权限,属性值里就填用户组的名字,想给用户设置权限就在属性值中填用户的名字。

插件安装

ScriptRunner

获取问题

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
IssueManager issueManager = ComponentAccessor.getIssueManager()
Issue issue = issueManager.getIssueByCurrentKey("APPROVAL-6")

获取用户

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.util.UserManager
import com.atlassian.jira.user.ApplicationUser
UserManager userManager = ComponentAccessor.getUserManager()
ApplicationUser user = userManager.getUserByName("ganzhen")

获取关注列表

import com.atlassian.jira.issue.watchers.WatcherManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.user.ApplicationUser;
WatcherManager watcherManager = ComponentAccessor.getWatcherManager()
Collection<ApplicationUser> watchers = watcherManager.getWatchersUnsorted(issue)

获取自定义字段值

import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.user.ApplicationUser;
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
// 10911历史经办人字段ID
CustomField historyAssineesField = customFieldManager.getCustomFieldObject(10911);
Collection<ApplicationUser> historyAssinees = (Collection<ApplicationUser>)issue.getCustomFieldValue(historyAssineesField);

更新问题

Script Console

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.fields.layout.field.FieldLayout
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.jira.event.type.EventDispatchOption

IssueManager issueManager = ComponentAccessor.getIssueManager()
UserManager userManager = ComponentAccessor.getUserManager()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
Issue issue = issueManager.getIssueByCurrentKey("APPROVAL-37")
// 设置解决结果
issue.setResolutionId("10100")
// 更新问题,不触发事件和通知
issueManager.updateIssue(issue.getReporter(),issue,EventDispatchOption.DO_NOT_DISPATCH,false)

历史经办人

Listeners

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.issue.IssueEvent
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.user.ApplicationUser

// String eventName = ComponentAccessor.getEventTypeManager().getEventType(event.getEventTypeId()).getName()
// log.warn(eventName)
Issue issue = event.getIssue()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
// 10915历史经办人字段ID
CustomField historyAssigneesField = customFieldManager.getCustomFieldObject(10915)
Collection<ApplicationUser> historyAssignees = (Collection<ApplicationUser>)issue.getCustomFieldValue(historyAssigneesField)
if(historyAssignees == null){
    historyAssignees = new HashSet<ApplicationUser>()
}
if(issue.getAssignee() != null){
    historyAssignees.add(issue.getAssignee())
}
MutableIssue mutableIssue = (MutableIssue) issue
mutableIssue.setCustomFieldValue(historyAssigneesField,historyAssignees)
// 写入数据
FieldLayoutItem fieldLayoutItem = ComponentAccessor.getFieldLayoutManager().getFieldLayout(issue).getFieldLayoutItem(historyAssigneesField)
Map<String, ModifiedValue> modifiedFields = mutableIssue.getModifiedFields()
ModifiedValue modifiedValue = modifiedFields.get(historyAssigneesField.getId())
DefaultIssueChangeHolder issueChangeHolder = new DefaultIssueChangeHolder()
historyAssigneesField.updateValue(fieldLayoutItem,mutableIssue,modifiedValue,issueChangeHolder)
// log.warn("success")

清空历史经办人

Post Function

import com.atlassian.jira.security.groups.GroupManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.user.ApplicationUser

// 设置历史经办人
GroupManager groupManager = ComponentAccessor.getGroupManager()
Collection<ApplicationUser> users = new HashSet<ApplicationUser>()

CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
// 10915 历史经办人字段
CustomField historyAssigneesField = customFieldManager.getCustomFieldObject(10915)
issue.setCustomFieldValue(historyAssigneesField,users)

设置抄送人

Post Function

import com.atlassian.jira.security.groups.GroupManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.user.ApplicationUser

// 设置抄送人
GroupManager groupManager = ComponentAccessor.getGroupManager()
Collection<ApplicationUser> users = groupManager.getUsersInGroup("财务中心",false)

CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
// 10916 抄送人字段
CustomField CCListField = customFieldManager.getCustomFieldObject(10916)
issue.setCustomFieldValue(CCListField,users)

设置审批人为部门主管

Post Function 注:需要用户组中有 XX 和 XX 主管组

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.jira.bc.group.search.GroupPickerSearchService
import com.atlassian.jira.bc.group.search.GroupPickerSearchServiceImpl
import com.atlassian.crowd.embedded.api.Group
import com.atlassian.jira.security.groups.GroupManager

UserManager userManager = ComponentAccessor.getUserManager()
ApplicationUser reporter = null
reporter = issue.getAssignee()
GroupManager groupManager = ComponentAccessor.getGroupManager()
GroupPickerSearchService groupPickerSearchService = new GroupPickerSearchServiceImpl(userManager)
ApplicationUser assignee = null
List<Group> groups = groupPickerSearchService.findGroups("主管")
for(int i=0;i<groups.size();i++){
    Group group = groups[i]
    String groupName = group.getName()
    Collection<ApplicationUser> usersInGroup = groupManager.getUsersInGroup(groupName,false)
    // 主管组没有激活的人,跳过
    if(usersInGroup.size()<1){
        continue
    }
    String subGroupName = groupName.substring(0,groupName.length()-2)
    Group subGroup = groupPickerSearchService.getGroupByName(subGroupName)
    // 找不到对应的非主管组,跳过
    if(subGroup == null){
        continue
    }
    // 报告人不在非主管组,跳过
    if(! groupManager.isUserInGroup(reporter,subGroup)){
        continue
    }
    assignee = usersInGroup[0]
    break
}
issue.setAssignee(assignee)

批量子任务

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.security.groups.GroupManager
import com.atlassian.jira.config.SubTaskManager

IssueManager issueManager = ComponentAccessor.getIssueManager()
GroupManager groupManager = ComponentAccessor.getGroupManager()
IssueFactory issueFactory = ComponentAccessor.getIssueFactory()
SubTaskManager subTaskManager = ComponentAccessor.getSubTaskManager()

Issue issue = issueManager.getIssueByCurrentKey("OPTS-109")
Issue parentIssue = issue

if (parentIssue.getIssueType().isSubTask())
 return

Collection<ApplicationUser> users = groupManager.getUsersInGroup("一键四连",false)
for(ApplicationUser user : users){
    MutableIssue newSubTask = issueFactory.getIssue()
    newSubTask.setProjectObject(parentIssue.getProjectObject())
    newSubTask.setIssueTypeId("10101")
    newSubTask.setParentObject(parentIssue)
    newSubTask.setSummary(parentIssue.getSummary())
    newSubTask.setDescription(parentIssue.getDescription())
    newSubTask.setPriority(parentIssue.getPriority())
    newSubTask.setAssignee(user)
    newSubTask.setReporter(parentIssue.getAssignee())

    issueManager.createIssueObject(parentIssue.getAssignee(), newSubTask)
    subTaskManager.createSubTaskIssueLink(parentIssue,newSubTask,parentIssue.getAssignee())
}

JQL 搜索问题

import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.jql.parser.JqlQueryParser;
import com.atlassian.jira.issue.search.SearchProvider;
import com.atlassian.jira.web.bean.PagerFilter;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.search.SearchQuery;

def findIssues(String jqlQuery,String username) {
  def issueManager = ComponentAccessor.issueManager;
  def userManager = ComponentAccessor.userManager;
  def user = userManager.getUserByName(username);
  def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser);
  def searchProvider = ComponentAccessor.getComponent(SearchProvider);
  def query = jqlQueryParser.parseQuery(jqlQuery);
  def searchQuery = SearchQuery.create(query, user);

  def results = searchProvider.search(searchQuery, PagerFilter.getUnlimitedFilter());
  log.warn "issue cnt: ${results.getTotal()}";
  results.getResults().collect { res ->
    def doc = res.getDocument();
    def key = doc.get("key");
    def issue = ComponentAccessor.getIssueManager().getIssueObject(key);
    return issue;
  }
}

def jqlQuery = "resolution = Unresolved ORDER BY priority DESC, updated DESC";
def issues = findIssues(jqlQuery, 'zhxlp');

上一页crowd 安装下一页ScriptRunner For Confluence

最后更新于3年前