# 1. 开始

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

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

本次CI功能点如下:

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

# 2. 优化点

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

# 2.1. 多环境区分

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

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

# 2.2. 配置驱动

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

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

另外,developrelease这两个分支是不会废弃的,其对应的机器人是固定的,可以体现在流水线中,如:

  • wx_ci__esports_11__release__test
  • wx_ci__esports_12__release__release
  • wx_ci__esports_13__develop__test
  • wx_ci__esports_14__develop__release

为什么不让最重要的release分支的机器人序号为1呢?因为1是默认机器人的位置,这会导致release版本很容易被覆盖。

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

# 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. qq小程序体验版

QQ小程序可以在ci中设置体验版,如何用实例的方式控制呢?

如果单独建一个专门的非实例化的流水线,维护成本会变高,这里可以复制下上个步骤,复制的job只更改一个地方——设置体验版,然后用流水线变量控制。

# 3.4. 扩展性

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

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

可以看到,非常简单。

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

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