小程序集成CI/CD可以让我们在发布流程,版本控制上得到更好的体验。
主要有以下几点优势:
- 小程序的发布版本必定和gitlab的代码版本保持一致
- 解决多人开发时需要频繁切换体验版,提升发布效率
- 解决上线前提审版本后需要切回体验版的问题
- 根据约定的小程序版本命名规范,可以追踪到具体的代码版本
集成CI/CD思路
- 打包小程序
- 借助小程序官方提供的 miniprogram-ci 中的脚本调用方式,结合gitlab ci执行对应的发布脚本。
a. 执行脚本时需要传版本参数、指定发布机器人、描述说明(这里我们将commit message作为描述)
集成后的开发&发布模式
- 发布alpha版本:代码提交到test分支自动发布(commit message作为发布的描述说明),默认此分支设置的机器人就是体验版本,多次发布无需切换体验版。
- 发布beta版本:将test代码合并到preview分支,自动打包提交,此分支设置的机器人就是beta版本,需要在微信公众平台提交审核,审核通过后,管理员看到是beta版本,进行灰度发布。
- 发布正式版本:将test/preview 代码合并到master分支,自动打包提交,此分支设置的机器人就是正式版本,需要在微信公众平台提交审核,审核通过后,管理员看到是线上版本,进行全量发布。
开发时,无需在微信开发者工具中上传代码。
微信公众平台中的版本管理中只能看到机器人发布的版本,不再有个人提交的版本。
集成步骤
1、安装miniprogram-ci
npm i miniprogram-ci -D
2、准备ci.js 发布脚本文件
const ci = require('miniprogram-ci')
// gitlab-runner执行脚本时,传进来的参数
var params = process.argv.splice(2)
var version = params[0]
var robot = parseInt(params[1])
var desc = params.splice(2).join(' ')
// appid 和privateKeyPath需要设置下
const project = new ci.Project({
appid: '',
type: 'miniProgram',
projectPath: './',
privateKeyPath: './ci-private.key',
ignores: ['node_modules/**/*', 'src/**/*']
})
/** 上传 */
async function upload({
version = '0.0.0', desc = 'test', robot = 1 }) {
await ci.upload({
project,
version,
desc,
setting: {
es7: true,
minify: true,
autoPrefixWXSS: true
},
robot,
onProgressUpdate: console.log
})
}
upload({
version, desc, robot })
更多发布设置可参考官方文档。
3、密钥文件
具体位置是在小程序管理平台中的,开发->开发设置->小程序代码上传->小程序代码上传密钥。
将生成的密钥文件放在项目的根目录下,如图:
注:密钥文件只有小程序的管理员有权限生成。
4、ip白名单
这里添加 ip 白名单,指定的 ip 才能执行上传脚本。
5、.gitlab-ci.yml 发布文件
我们约定test分支作为发布体验版的分支,preview分支作为发布beta版本的分支,master分支作为发布正式版本的分支。beta版本和正式版本对应的都是线上环境,alpha版本对应的是测试环境,因此打包命令有所区分,分别是npm run build 和 npm run build:test,打包命令需要在package.json中支持。
在gitlab-runner中执行发布脚本,并传入所需的参数。
注:每次开发新版本,需要手动修改版本号。
# test、preview和master分支默认支持线上部署
stages:
- build
- deploy
# 小程序版本设置,每次开发新版本需要手动更新
variables:
PROJECT_VERSION: 1.0.0
# 安装依赖&&构建打包
build test:
stage: build
only:
- test
tags:
- f2e
script:
- cnpm i
- npm run build:test
- node ci.js $PROJECT_VERSION.$CI_COMMIT_SHORT_SHA.alpha 1 $(git log -1 --pretty=%B)
build preview:
stage: build
only:
- preview
tags:
- f2e
script:
- cnpm i
- npm run build
- node ci.js $PROJECT_VERSION.beta 2 $(git log -1 --pretty=%B)
build prd:
stage: build
only:
- master
tags:
- f2e
script:
- cnpm i
- npm run build
- node ci.js $PROJECT_VERSION 3 $(git log -1 --pretty=%B)
package.json
{
...
"scripts": {
...
"build": "cross-env NODE_ENV=production ./node_modules/.bin/wepy build --no-cache",
"build:test": "cross-env NODE_ENV=test ./node_modules/.bin/wepy build --no-cache",
...
},
...
}