浅析微信小程序自动化部署miniprogram-ci介绍及实际使用
一、miniprogram-ci 介绍
1、miniprogram-ci 简介
miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。
文档:https://www.npmjs.com/package/miniprogram-ci
2、使用前提:平台设置
使用 miniprogram-ci 前应在微信公众平台登录小程序,访问“开发-开发管理-开发设置”后下载“代码上传密钥”,并配置 IP 白名单。
开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。
代码上传密钥拥有预览、上传代码的权限,密钥不会明文存储在微信公众平台上,一旦遗失必须重置,请开发者妥善保管
3、脚本调用:npm install miniprogram-ci --save
4、项目对象:
const ci = require('miniprogram-ci')
// 注意: new ci.Project 调用时,请确保项目代码已经是完整的,避免编译过程出现找不到文件的报错。
const project = new ci.Project({
appid: 'appid',
type: 'miniProgram',
projectPath: 'the/project/path',
privateKeyPath: 'the/privatekey/path',
ignores: ['node_modules/**/*'],
})
上传代码
const ci = require('miniprogram-ci')
;(async () => {
const project = new ci.Project({
appid: 'wxsomeappid',
type: 'miniProgram',
projectPath: 'the/project/path',
privateKeyPath: 'the/path/to/privatekey',
ignores: ['node_modules/**/*'],
})
const uploadResult = await ci.upload({
project,
version: '1.1.1',
desc: 'hello',
setting: {
es6: true,
},
onProgressUpdate: console.log,
})
console.log(uploadResult)
})()
详细参数配置,见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/ci.html
二、miniprogram-ci 实际使用
看下目录结构:下面 2 个 key 是不同 appid 环境的代码上传秘钥
我们主要看下 autoUpload.js
// 自动将代码上传到小程序
const ci = require('miniprogram-ci')
const path = require('path')
const mainfest = require('../src/manifest.json')
const slog = require('single-line-log').stdout
const robot = Number(process.env.ROBOT) || 1
const buildVersion = process.env.npm_config_build_version || mainfest.versionName
function getUploadDesc() {
// dev
if (robot === 1) {
return 'build by robot --dev'
}
// test
if (robot === 2) {
return 'build by robot --test'
}
// release
if (robot === 3) {
return 'build by robot --release'
}
// uat
if (robot === 4) {
return 'build by robot --uat'
}
return mainfest.description
}
async function main() {
const project = new ci.Project({
appid: mainfest['mp-weixin'].appid, //appid
type: 'miniProgram',
projectPath: path.resolve(__dirname, '../dist/build/mp-weixin'), //项目路径
privateKeyPath: path.resolve(__dirname, `./private.${mainfest['mp-weixin'].appid}.key`), //小程序后台的上传密匙
ignores: ['node_modules/**/*']
})
let slogIndex = 0
try {
await ci.upload({
project,
version: buildVersion,
desc: getUploadDesc(),
setting: mainfest['mp-weixin'].setting,
robot,
onProgressUpdate: () => {
slog('上传中' + (slogIndex === 0 ? '.' : slogIndex === 1 ? '..' : '...') + '\n')
slogIndex++
if (slogIndex === 3) {
slogIndex = 0
}
}
})
console.log(`上传成功 版本${buildVersion}`)
} catch (error) {
console.error(`上传失败 版本${buildVersion}`, error)
}
}
main()
我们还有个 prebuild.js 用于不同的环境设置不同的 appid
const fs = require('fs')
const process = require('process')
function outputManifest() {
const manifest = require('../src/manifest.json')
manifest['mp-weixin'].appid = process.env.BUILD_ENV === 'uat' ? 'wx***' : 'wx***'
fs.writeFileSync('./src/manifest.json', JSON.stringify(manifest, null, 2) + '\n', 'UTF-8')
}
outputManifest()
那么在 package.json 的 scripts 设置命令如下
"build-dev": "cross-env BUILD_ENV=dev node ./ci/prebuild.js && cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service --mode dev uni-build --minimize && cross-env ROBOT=1 node ./ci/autoUpload.js",