从github定时任务到云函数实践


前言

基于上篇 消息推送到微信:给我的npm插件加上消息推送 - 掘金 (juejin.cn) 实现了我的npm插件添加了消息推送功能,之后在项目打包使用时,可以将打包消息推送到微信,目前对于我来说体验还是不错的;于是我决定现在进一步实现我个人工作中的其他需求!

然后我就闭上眼睛开始想了想,我每天上班有那些必须做的事情呢?写代码?喝水?摸鱼?

好像没发现啥痛点问题啊!然后我突然想起来我每天是要打卡的、还有就是每周要写周报的,于是我有了想法:

  • 每天推送下班打卡消息提醒
    虽然企业微信是有下班打卡提醒的,但提醒时间好像也是不准,也不知道是我的手机问题,还是网络问题,时有时无,有时还不能准时准点推送;所以我就想要一个下班时间准点推送消息到我的微信,提醒我该打卡了!毕竟拿手机看微信的时候是比较多的。

  • 每周推送填写周报消息提醒
    每周一次周报填写,虽然我基本上没忘记过! 但不排除有事请假、一堆事忙的时候,万一忘记了就会被负责统计的同事截图发大群里通知,@谁谁谁没填写周报,属实尴尬。

所以这两点就是我个人工作中的痛点也可以说是需求,其实也是非常的简单的需求,无疑是开启2个定时任务,到点执行而已。激动的心颤抖的手,那就快点开始吧!

需求关键点

  • 消息推送服务api
    可以使用现成的别人写好的服务、当然你也可以使用node自己实现一个消息推送服务

  • 服务器
    因为我们写好代码,最终是要将其部署到服务器上的,执行脚本必然是需要一台服务器来运行的 如果你说拿自己的电脑跑定时任务也可以,但是避免不了电脑关机等一系列问题导致服务中断; 经过学习我了解到 GitHub 可以免费给开发者提供用于运行脚本的服务器资源,也就是 GitHub actions,那我熟悉呀,之前可是用它实现了我的博客自动部署的,于是我就先尝试了 github来实现我的需求!

环境搭建

很简单,因为是基于github actons, 所以必须把代码托管在github了,因为源码想的使用 ts 编写,所以就安装了 tsts-node等,但是刚开始就遇到了问题

环境依赖:

  "scripts": {
    "dev1": "node --loader ts-node/esm ./src/index.ts",
    "dev2": "ts-node ./src/index.ts",
    "dev": "tsx ./src/index.ts"
  },
  "dependencies": {
    "ts-node": "^10.9.2",
    "tsx": "^4.7.2",
    "typescript": "^5.4.5"
  }

运行.ts文件时报错问题

1、ReferenceError: exports is not defined in ES module scope

执行pnpm dev2报错: 导出未在ES模块范围中定义

原因:tsc --init 初始的 tsconfig.json 文件默认 "module": "commonjs" ,需要改成 "module": "ES6"

2、TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension “.ts”

执行pnpm dev2报错: 未知的文件扩展名“.ts”

image.png

  • 解决方案1
    使用命令node --loader ts-node/esm ./src/index.ts"

  • 解决方案2
    tsconfig中配置:

        "ts-node": {
          "esm": true
        }

3、CustomError: Cannot find module xxx

解决完问题2后,此时执行pnpm dev1pnpm dev2都会报错 CustomError: Cannot find module

image.png

看到这篇资料 :node.js - node-ts 使用 esm 模块构建,引入第三方包 ERR_MODULE_NOT_FOUND - SegmentFault 思否

说是 ts-node 本身就存在这个问题!!!好坑,不费劲了直接选择别的方案。

4、使用 tsx 替代 ts-node

tsx 可以说是简单好用,安装: pnpm i tsx,使用:tsx xxx 直接成功,报错消失。

image.png

github actions 定时任务的时区、执行时间延迟问题

  • 时区问题
    github actions 中设定的 scheduleUCT,时间 08:00(也就是北京时间的16:00),因为时区的问题北京时间需要 + 8小时,但实际运行的时间为北京时间17:00、17:20 不等

  • 任务执行时间延迟、不准
    因为 github 使用的人比较多,在准点高峰时间段,他只能排队延迟执行任务,所以如果定时任务要求准时准点的执行的话 github 就不能满足了。

网上资料 github actions 的定时任务延迟、不准问题需要设置虚拟执行环境的时区也是不能解决的!!!

最终我只能放弃,然后通过学习了解知道了云函数,然后使用云函数替代了 github actions,实现了我的需求。

什么是云函数

云函数(Cloud Function)提供了一种直接在云上运行,无状态的、短暂的、由事件触发的代码的能力。云函数是无服务器(Serverless)执行环境,用户在无需购买和管理服务器的情况下运行代码,只需使用云平台支持的语言编写代码并设置代码运行的条件,即可在云上运行代码,是实时文件处理和数据处理等场景下的理想计算平台。

简单来说就是:如果你对服务器相关知识不了解,那现在也不需要知道了;你可以用你趁手的语言写个函数(如nodejs),函数即是服务(接口),写好后直接就可以在任何地方触发调用了,其它服务器配置什么的都不需要关心。

云函数能干什么

理论上传统后端能干的事儿云函数都能干,但术业有专攻,根据云函数的特性和当下的主流环境,建议用云函数来搭建小型web应用后端、公众号/小程序、工具型接口等。

事实上小程序推的云开发就是基于腾讯云的 serverless 的,包括了云函数、云数据库和云存储。

提供云函数的公有云厂商

亚马逊的AWS、微软的Azure、Google CloudIBM Cloud、阿里云、腾讯云、百度云等都提供云函数服务。

有云 | 请求次数 | 运行时间 | 网络流量 | 免费数据库 | 东南亚区域 | 备注 |
| ———— | ——- | ———————– | ——— | —– | ———— | —— |
| AWS | 100万 | 400,000 GB-秒 | 1GB | 有 | 香港、东京、新加坡 | |
| Azure | 100万 | 400,000 GB-秒 | 5GB | 有 | 香港、韩国、日本、新加坡 | 存储帐户收费 |
| Google Cloud | 200万 | 400,000 GB-秒+200,000GHz | 5GB | 有 | 香港、台湾 | 国内无法访问 |
| IBM Cloud | 无限 | 400,000 GB-秒 | 不明 | 有 | 东京 | |
| 阿里云 | 100万 | 400,000 CU-秒 | 无 | 无 | 中国、香港、东京、新加坡 | |
| 腾讯云 | 10万 | 20,000 GB-秒 | 0.5GB | 无 | 中国、香港、新加坡 | 不再免费 |
| 百度云 | 100万 | 400,000 GB-秒 | 1GB | 无 | 中国 | 前三个月免费 | |
| 华为云 | 100万 | 400,000 GB-秒 | 不明 | 无 | 中国、香港、泰国 | |
| LeanCloud | 无限 | 18小时/天 | 1GB | 有 | 中国

这里我选择使用华为云,因为它是免费!!!对于我自己的需求来说,完全够用!真的太棒了,这里要给华为点赞!

image.png

函数创建使用

直接参考官网的用户指南,写的也是非常详细: 创建程序包_函数工作流 FunctionGraph_用户指南_构建函数 (huaweicloud.com)

zip上传代码

image.png

image.png

上传zip包需要注意的是,zip包里的入口文件名称以及导出的 执行函数要与 云函数设置中对于字段配置保持一致,不然会执行失败!

  • 配置测试事件

因为我们的需求很简单,这里可以直接选择空白模板就行
image.png

点击测试后右边就会出现测试结果

项目打包zip

由于我之前实现了一个 打包zip的npm插件,正好可以拿过来使用,简直美滋滋!

安装:
pnpm i plugin-zip-pack -D

使用:

plugins: [
      pluginZipPackRollup({
        optZipName: 'dist',
        isPackagingTime: false
      }),
]

image.png

打包成功后直接将zip包上传到 华为云函数即可(需要注意函数入口函数对应文件、名称,如果不对应会报错,执行失败)

云函数设置触发器

设置、触发器,选择定时触发器,然后根据自己的需求选择 触发规则即可。
image.png

image.png

效果截图

image.png

image.png

image.png

总结

通过学习我用了一天的时间从0到1的完成了自己的定时任务消息推送的需求;学会了云函数的使用也解决了我的日常中的需求,虽然内容简单但是这个过程中收获不少。


文章作者: 尖椒土豆sss
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 尖椒土豆sss !
 本篇
从github定时任务到云函数实践 从github定时任务到云函数实践
前言基于上篇 消息推送到微信:给我的npm插件加上消息推送 - 掘金 (juejin.cn) 实现了我的npm插件添加了消息推送功能,之后在项目打包使用时,可以将打包消息推送到微信,目前对于我来说体验还是不错的;于是我决定现在进一步实现
2024-06-03
下一篇 
用ts重构基于rollup的npm包踩坑记录 用ts重构基于rollup的npm包踩坑记录
前言在之前实现了一个npm包 我的第一个npm包:plugin-zip-pack - 掘金 (juejin.cn) 但源码是js编写的,最近想的使用ts进行重构一下。 最开始直接将源码中原来文件都修改为 .ts后缀后遇到了一系列报错问题、以
2024-04-17 尖椒土豆sss
  目录
L
O
A
D
I
N
G