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

利用飞书多维表格自动发布版本

文章目录

      • 背景
      • 尝试1,轮询
      • 尝试2,长连接

背景

博主所在的部门比较奇特,每个车型每周都需要发版,所以实际上一周会发布好几个版本。经过之前使用流水线自动发版改造之后,发版的成本已经大大降低了,具体参考: 利用流水线实现版本一键发布。
但是由于发版的时间不固定,且忙起来之后容易忘记,所以现状就是每周由 pm 制定好了发版计划,然后到时间了之后由测试同学在群里@开发同学进行发版。
有没有什么方法可以每周设定好了发版时间,然后到时间之后自动触发发版流程,并在群里通知呢?我想到了飞书的多维表格。飞书的多维表格有自动化的能力,我们每周只需要设定好版本发布的时间,可以让其自动触发版本发布,并在群里通知所有人。
在这里插入图片描述
想象比较美好,但现实是公司的内网和飞书并不在同一个网络,因此飞书的自动化流程没办法触发到内网的流水线,为此我做了一些尝试。

尝试1,轮询

我们在飞书表格当中设定好发版车型,版本号,时间等一系列参数之后,可以在内网的服务器开启一个轮询,不断的从飞书表格当中获取这些值,到了设定好的时间之后,就在内网触发流水线进行版本发布。

但是有个问题,我们一周最多可能发布四个版本,如何设定轮询的时间间隔呢?
假定我们每天获取一次,也就是时间间隔控制在一天,那么就会出现信息获取不及时的现象,例如今天早上获取了发版信息,下午要发布一个版本,但是如果中午修改了发版计划,取消了下午发版,此时就没办法即时通知到内网,导致下午还会触发版本发布。
那么假定我们每隔10分钟获取一次,除非在发版前10分钟内修改发版计划,否则都能感知到版本计划的变更,出现上述问题的概率就大大降低,但是一直轮询,大量的网络请求其实都是无效的,而且也没有利用到飞书的自动化能力。

因此这个方法并不好。

尝试2,长连接

如果轮询不可以,那么我们是否能够在外网和内网当中建立一个长连接,利用飞书的自动化能力,当到达设定的时间时,可以通过长连接将相应的发版信息推送到内网当中,这样不就实现自动发版了么?
说干就干,在腾讯云上买了一台云服务器,最便宜的(一年才90几块钱),不过配置也够用了。
在这里插入图片描述

接着在云上部署了两个服务,一个是 http 服务,用于让飞书表格触发,一个是 websocket 服务,用于和内网保持长连接,具体如下:
http 服务
部署在云端,这里使用的是 python 的 Flask 框架

@app.route("/trigger", methods=['POST'])
def triggerEvent():
    try:
        data = json.dumps(dict(request.form))
        print(f"received msg:{data}")
        logging.info(f"received trigger msg:{data}")
        executor.submit(WebsocketService.sendMsg,data)
        return "OK"
    except Exception as ex:
        return f"error,{ex}"

def start():
    print("service start")
    app.run(host='0.0.0.0',port=8888)

websocket 服务
部署在云端,这里主要的逻辑就是,当有 websocket 客户端连接上之后就将其保存在 set 集合里面,一旦 http 服务收到消息,就会通过 set 集合里面的 websocket 客户端将消息转发出去。

clients = set()

async def __handleClient(websocket):
    print(f"new connection from {websocket.remote_address}")
    try:
        while True:
            clients.add(websocket)
            message = await websocket.recv()
            print(f"received message:{message}")
    except Exception as ex:
        print(f"exception :{ex}")
        clients.remove(websocket)


async def __sendMsgToClient(msg):
    for client in clients:
        try:
            logging.info(f"websocket send:{msg}")
            await client.send(msg)
        except Exception as ex:
            print("send msg failed")
            logging.info(f"websocket send failed:{ex}")

def sendMsg(msg):
    asyncio.run(__sendMsgToClient(msg))

async def __start():
    server = await websockets.serve(__handleClient,'0.0.0.0',8889)
    await server.wait_closed()

def start():
    print("websocket service start")
    asyncio.run(__start())

websocket 客户端
部署在内网,这里开启了一个死循环,一直监听服务端发送的消息,然后根据消息再做响应事件。

async def __webscoketClient():
    uri = "ws://xxx:8889"
    while True:
        try:
            async with websockets.connect(uri) as websocket:
                await websocket.send("hello,server!")
                while True:
                    msg = await websocket.recv()
                    logging.info(f"received message from server:{msg}")
                    __handleSocketMsg(msg)
        except Exception as ex:
            logging.info(f"connect exception :{ex}")
            print(f"reconnecting in 10 seconds")
            await asyncio.sleep(10)

飞书多维表格配置
表格当中我们可以将需要的参数都写进去,我们需要关注的是 publisTime 版本发布时间,我们需要根据时间来进行自动触发。
在这里插入图片描述
进入自动化的编辑页面,可以设定当到达记录中的时间时,往我们刚刚在腾讯云上搭建的服务器发送消息,这样就可以通过长连接将消息发送到内网,从而实现自动发布版本的能力。
在这里插入图片描述
另外,需要注意的是,在腾讯云中需要在防火墙页面把相应的端口打开,不然访问会被拒绝。


http://www.kler.cn/a/394814.html

相关文章:

  • 第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
  • 对javascript语言标准函数与箭头函数中this的理解(补充)
  • Android修行手册 - 移动端几种常用动画方案对比
  • 贪心算法求解跳跃游戏
  • 再服务器上建立新的编译环境
  • 车载网关性能 --- GW ECU报文(message)处理机制的技术解析
  • Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】标题栏
  • Isaac Sim+SKRL机器人并行强化学习
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件
  • 【CICD】GitLab Runner 和执行器(Executor
  • 通过PHP创建AWS的CloudFront并绑定证书添加备用域名
  • sql server创建固定的链路服务器
  • kafka:使用flume自定义拦截器,将json文件抽取到kafka的消息队列(topic)中,再从topic中将数据抽取到hdfs上
  • 麒麟服务器工作站SP1 arm环境qt5.6.3源码编译
  • 如何处理 iOS 客户端内 Webview H5 中后台播放的音视频问题
  • Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件
  • git config是做什么的?
  • 如何在 Ubuntu 22.04 上安装 ownCloud
  • 数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用
  • 低代码可视化-uniapp开关选择组件-低码生成器
  • 理解 C++ 中的 `const` 关键字
  • AI 模型:追求全能还是专精?
  • python 数据类型----可变数据类型
  • 在 RHEL 8 | CentOS Linux release 8.5.2111上安装 Zabbix 6
  • 网上怎么样可以挣钱,分享几种可以让你在家赚钱的兼职项目