强化版的uni-app小程序持续集成

3,232 阅读3分钟

1. 开始

最近做了小程序的持续集成相关的工作,主要解决了以下痛点:

  1. 构建时间长,流程繁琐
  2. 外部开发人员无法预览

本次CI功能点如下:

  1. 自动进行uni-app打包,打包两份:test和release环境
  2. 将打包产物自动上传
  3. 自动预览、生成图片
  4. 将预览图片上传到腾讯云
  5. 发送构建通知、腾讯云图片地址到企业微信

2. 优化点

相比普通的CI,本次优化点有以下几个。

2.1. 多环境区分

对于开发版,同一个开发者只能保留一份,当我们既想看测试环境,又想看正式环境时就捉襟见肘了。

借助小程序ci,对多个环境用不同的机器人,这样就不会覆盖了。

2.2. 配置驱动

由于小程序ci机器人范围有限(1-30),所以只能手动维护,让其重复利用。

这里我让项目每个分支每个环境分别对应一个机器人,当一个分支废弃后,这个机器人就可以释放给其他分支使用。

同时其他配置项也可以统一保管起来,比如腾讯云密钥、小程序密钥等,方便维护。

2.3. 自动重试

有时候上传或者预览会失败,可能是环境问题,也可能是多个流水线同时上传会冲突,因为需要增加自动重试功能。

2.4. 并行提速

上传和预览是可以同步进行的,这样可以节省一些构建时间。

2.5. canvas绘图

小程序ci默认提供的图片只有二维码,笔者用canvas将一些构建信息和二维码绘制到一张新图上,方便定位和查看。

绘制的信息示例:

  • 版本号:1.0.5
  • 提交者:CI机器人5
  • 环境:test
  • 分支:release
  • 构建时间:2022-10-19: 09:36:37
  • 最后提交:lee - 修复page
  • 二维码

2.6. 定时执行

由于开发版二维码存在有效期,这里加了个定时执行,这样可以保持二维码最新,不会失效。

3. 其他

3.1. canvas

canvas版本需要和node版本匹配才可以,否则会报一些奇奇怪怪的错,这里直接在CI中安装对应的canvas版本,并用bash脚本调用js脚本的方式来解决。部分代码如下:

cd $WORKSPACE
echo "VUE_APP_AUTHOR = CI ROBOT ${robot}">>.env.local

echo "
// ...
" > tmp-mp-ci.js

npm install
npm i miniprogram-ci
npm i canvas@2.6.1
npm i t-comm@latest --registry=https://registry.npmjs.org/ 


if [[ "${env}" = "production" ]]; then
  npm run build:mp:prod
else 
  npm run build:mp
fi

node tmp-mp-ci.js

3.2. 变量传递问题

流水线中nodejs脚本中获取CI变量十分容易,只需要${env}即可。

但是一个普通的打包时才会运行的nodejs脚本,如何获得CI变量呢?

可以把CI变量写到环境变量文件中,比如.env.local,然后打包时读取这个文件。

CI变量 => 写入环境变量文件 => 打包时读取文件

3.3. 扩展性

这里讨论下本CI的扩展性,当有新项目接入时,只需要做:

  1. 增加一条新的配置
  2. 实例化新项目的流水线

可以看到,非常简单。

当原有项目更新时,或者CI框架变动时,只需要做:

  1. 更新配置
  2. CI命令更新