Jira 任务同步到 Microsoft Teams

简介: 假设你有这么一个任务:你需要将 Jira 上的任务定时同步到 Microsoft Teams 上,并提醒相关的负责人当前的任务。

假设你有这么一个任务:


你需要将 Jira 上的任务定时同步到 Microsoft Teams 上,并提醒相关的负责人当前的任务。


举个例子:在每个工作日(周一到周五)早上 10 点钟 01 分 01 秒 的时候,通过机器人发送一条消息到你所在团队的 channel 上,并 @ 相关的任务负责人员。


相关解析:

  1. Jira Software 专为软件团队中每个成员构建,可用于规划、跟踪和发布卓越的软件。
  2. Microsoft Teams 微软协助沟通软件。
  3. channel: 团队的频道,一个团队可以有多个频道。


基础工作



我们要实现一个服务,作为一个前端切图仔,我们选用nodejs来开发。这里选用了Koa框架。


因为实现的功能比较简单,不涉及到前端的开发,所以这里不进行前端技术的选型。


后台的开发涉及到获取 Jira 的数据,我们直接使用相关的包 jira-client 来获取。


综上,你只需要安装的关键包文件如下:


npm install koa // nodejs 框架
npm install jira-client // 获取 jira 数据
npm install aixos // http 库
npm install node-cron // 定时任务处理
# 或
npm install koa jira-client axios node-cron
复制代码


从 Jira 获取数据


我们只是 Jira 数据的搬运工,jira-client 文档 已经详细介绍了我们能够通过何种方式获取到相关数据。


比如:


/**
* 删除指定 Jira 的 Issue
* [Jira Doc](http://docs.atlassian.com/jira/REST/latest/#id290791)
* @name deleteIssue
* @function
* @param { string } issueId - 要删除的 Issue 的 Id
*/
deleteIssue(issueId) {
  return this.doRequest(this.makeRequestHeader(this.makeUri({
    pathname: `/issue/${issueId}`
  }), {
    method: 'DELETE',
    followAllRedirects: true
  }))
}
复制代码


当然,我们要实现的是查询的任务,使用的是 searchJira 方法。


我们对 jira-client 包提供的方法封装如下:


import JiraApi from 'jira-client';
// jira-client 实例
const instance = new JiraApi({
  protocol: config.jira.protocol,
  host: config.jira.host,
  username: config.jira.username,
  password: config.jira.password,
  apiVersion: config.jira.apiVersion,
  strictSSL: config.jira.strictSSL
})
// 搜索 Jira
export.searchJira = async (ctx, next) => {
  let ctx_query = ctx.query
  try {
    const issue = await instance.searchJira(ctx_query.searchString, {
      maxResult: 1
    });
    ctx.body = {
      success: true,
      data: issue
    }
  } catch (err) {
    ctx.body = err
  }
  await next()
}
// searchString 这个字段是 Jira 查询条件,比如:project in (Project1, Project2) AND resolution = Unresolved ORDER BY priority DESC, updated DESC 。 这些查询的内容可以在 Jira 中自行调整后在请求 url 上的 searchString 字段上带上就好。
复制代码


通过上面的操作,你可以获取到相关 JiraIssues 数据,如下:


image.png


卡片数据组装



上面我们能够成功获取到了 Jira 上的数据,那么我们把获取到的数据进行美化,组装成相应的卡片。


详细的格式卡可戳链接了解详情。


因为我们需要 @任务的负责人 ,所以我们选择的卡片类型是 adaptive-card


const body_list = [];
const msteams_entities = [];
body_list.push({
  "type": "TextBlock",
  "text": `<at>${_item.username}</at> 当前任务`,
  "weight": "bolder",
  "wrap": true
}, {
  "type": "TextBlock",
  "text": `到期任务: ${personalOverdueIssuesCount}`,
  "wrap": true,
  "color": `${personalOverdueIssuesCount >= 1 ? "attention" : "default"}`
});
msteams_entities.push({
  "type": "mention",
  "text": `<at>${_item.username}</at>`,
  "mentioned": {
    "id": `${_item.email}`,
    "name": `${_item.display_name}`
  }
})
let postMoreLink = `${config.jira.jira_hostname}/issues/?jql=${encodeURIComponent(`resolution = Unresolved AND assignee in (${_item.username}) ORDER BY priority DESC, duedate ASC`)}`;
const page_json = {
  "type": "message",
  "attachments": [
      {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
          "type": "AdaptiveCard",
          "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
          "version": "1.0",
          "body": body_team_list,
          "actions": [
              {
              "type": "Action.OpenUrl",
              "url": postMoreLink,
              "title": "详情"
              }
          ],
          "msteams": {
              "width": "Full",
              "entities": msteams_team_entities
          }
      }
  }]
};
复制代码


为了很好地兼容移动端和pc端,请选用文档支持的属性,不可自己编写相关的 markdown 进行内容美化。


发送数据到 Microsoft Teams 的 Channel 上



查看 Microsoft Teams 的相关文档,如果我们需要打通 Microsoft Teams 软件的话,我们需要创建传入 Webhook创建传入 Webhook,官方已经有很详细的介绍了,这里不累赘介绍。


我们在自己的团队中创建了 channel-02


image.png


然后将内容传送到这个频道上。


我们选用了 axiosHTTP 库进行数据的发送。


const axios = require('axios');
axios.post(channel.url, page_json).then(res => {
  console.log(res)
});
// 因为是定时的任务,我们还引入了处理定时的库 - [node-cron](https://www.npmjs.com/package/node-cron)
const cron = require('node-cron');
cron.schedule("01 01 10 * * 1-5", () => {
  // 调起相关的请求
  // init()
}, {
  scheduled: true,
  timezone: "Asia/Shanghai", // 中国时区,根据你团队所在的时区进行调整
})
复制代码


我们发送到 channel-02 上的效果如下:


image.png


上图右上角出现的红色的 @ 表示已经触发并提醒当前任务的负责人,比如图上我自己 Jimmy。相关提醒还会在电脑的右上角进行 banner 横幅跳出展示。


相关文章
|
12月前
|
存储 JSON API
作为开发者,我如何提高任务型大模型应用的响应性能
本文基于实际场景,分享了作为开发者提高大模型响应性能的四个实用方法。
2239 57
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现深度学习模型:智能零售与智能购物
【8月更文挑战第3天】 使用Python实现深度学习模型:智能零售与智能购物
376 2
|
弹性计算 运维 负载均衡
阿里云SLB的性能优势
【11月更文挑战第3天】
269 3
|
并行计算 Serverless 应用服务中间件
函数计算操作报错合集之部署Stable Diffusion启动失败,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
608 7
|
存储 监控 Java
深入剖析堆和栈的区别及其在内存管理中的影响
深入剖析堆和栈的区别及其在内存管理中的影响
|
存储 Java Linux
Linux环境变量配置及常见问题解决方案
Linux环境变量配置及常见问题解决方案
|
网络协议 Linux 程序员
【Linux】虚拟机ipv4地址消失,主机ping不通
【Linux】虚拟机ipv4地址消失,主机ping不通
536 0
|
C语言
【学习笔记】Verilog之四:结构建模方法
Verilog 提供两种建模方法:行为建模和结构建模。行为建模专注于电路功能描述,类似高级编程语言,不涉及底层实现。数据流建模使用 `assign` 进行连续赋值,适合描述组合逻辑。线网可以在声明时直接赋值。顺序行为建模通过 `initial` 和 `always` 语句实现,`initial` 用于一次性初始化,`always` 则用于响应特定事件的重复执行。时序控制包括时延和事件控制,用于精确控制电路行为。阻塞和非阻塞赋值决定了语句执行的顺序和并发性。过程性连续赋值如 `assign-deassign` 和 `force-release` 提供了更多灵活性。
|
存储 JavaScript Oracle
探究 Java 应用的启动速度优化
在高性能的背后,Java 的启动性能差也令人印象深刻,大家印象中的 Java 笨重缓慢的印象也大多来源于此。高性能和快启动速度似乎有一些相悖,本文将和大家一起探究两者是否可以兼得。
1895 95
探究 Java 应用的启动速度优化
支付存在钓鱼风险-解决方案
付存在钓鱼风险 是由于商户直接在服务端提交请求到支付宝网关地址导致出现这样的情况。 因电脑网站支付是需要在前端显示付款页面让用户进行扫码或者输入密码进行付款的,所以不是直接服务端请求直接扣用户的余额的。
9462 12