功能

miniprogram-ci 目前提供以下能力:

  1. 上传代码,对应小程序开发者工具的上传
  2. 预览代码,对应小程序开发者工具的预览
  3. 构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm
  4. 上传云开发云函数代码,对应小程序开发者工具的上传云函数能力
  5. 上传云托管代码,对应小程序开发者工具的上传云托管能力
  6. 上传云存储/静态托管文件,对应小程序开发者工具-云开发-云存储和静态托管文件管理
  7. 代理,配置 miniprogram-ci 的网络请求代理方式
  8. 支持获取最近上传版本的 sourceMap
  9. 支持 node 脚本调用方式和 命令行 调用方式


1. 在微信后台下载秘钥。

“微信公众平台-开发-开发设置”下载代码上传密钥,并配置 IP 白名单。打开后只有白名单中的 IP 才能调用相关接口。
获得密钥文件一般为,private.${appid}.key。

2. 安装上传工具。

在项目中安装 miniprogram-ci。

  1. npm install miniprogram-ci --save

3. 放置密钥

在 package.json 文件中添加上传密钥所在路径。本文新建 key 文件夹存放该密钥
项目中文件名 private.wxappid.key

  1. // package.json
  2. ......
  3. "uploadKey": "/key/private.wxappid.key",
  4. ......

4. 添加上传脚本。

在项目根目录下添加 upload.wx.js 文件。

  1. // upload.wx.js
  2. const ci = require('miniprogram-ci')
  3. // 从 package.json 中读取 version,description 和 uploadKey
  4. let { version, description: desc, uploadKey } = require('./package.json')
  5. // 读取小程序 appid
  6. let { appid } = require('./project.config.json')
  7. if (!version) version = '1.0.0'
  8. if (!desc) desc = new Date() + '上传'
  9. if (!appid) appid = 'touristid'
  10. if (!uploadKey) uploadKey = `/key/private.${appid}.key`
  11. // 创建项目对象
  12. const project = new ci.Project({
  13. appid, // 小程序appid
  14. type: 'miniProgram', // 类型,小程序或小游戏
  15. projectPath: process.cwd(), // 项目路径
  16. privateKeyPath: process.cwd() + uploadKey, // 密钥路径
  17. ignores: ['node_modules/**/*'], // 忽略的文件
  18. })
  19. // 调用上传方法
  20. ci.upload({
  21. project,
  22. version,
  23. desc,
  24. setting: {
  25. es6: true, // 是否 "es6 转 es5"
  26. minify: true, // 是否压缩代码
  27. },
  28. }).then(res => {
  29. console.log(res)
  30. console.log('上传成功')
  31. }).catch(error => {
  32. if (error.errCode == -1) {
  33. console.log('上传成功')
  34. }
  35. console.log(error)
  36. console.log('上传失败')
  37. process.exit(-1)
  38. })

5. 执行上传

  1. node upload.wx.js

6.simple-git

  1. const dayjs = require('dayjs')
  2. const ci = require('miniprogram-ci')
  3. const path = require('path')
  4. const simpleGit = require('simple-git')
  5. const git = simpleGit()
  6. const ENV = process.env.NODE_ENV
  7. const appid = require(`../config/${ENV === 'test' ? 'testbuild' : ENV}.json`).ALL_MODULE_APPID
  8. const projectPath = path.resolve(
  9. __dirname,
  10. `../dist/${ENV === 'development' ? 'dev' : ENV === 'test' ? 'test' : 'prod'}`,
  11. )
  12. const privateKeyPath = path.resolve(__dirname, `../config/private.${appid}.key`)
  13. const minorVersion = require('../package.json').version.split('.').slice(0, 2).join('.')
  14. const version = `${minorVersion}.${dayjs().format('MMDDHHmmss')}`
  15. ;(async () => {
  16. const { userName, userEmail } = await getUserNameAndUserEmail()
  17. const commitMsg = await getLastCommit()
  18. const project = new ci.Project({
  19. appid,
  20. type: 'miniProgram',
  21. projectPath,
  22. privateKeyPath,
  23. ignores: ['node_modules/**/*'],
  24. })
  25. const uploadResult = await ci.upload({
  26. project,
  27. version,
  28. desc: `发布人: ${userName}<${userEmail}> ${dayjs().format('YYYY-MM-DD HH:mm:ss')} \n\r${commitMsg}`,
  29. setting: {
  30. minifyWXML: true,
  31. minifyWXSS: true,
  32. minifyJS: true,
  33. minify: true,
  34. },
  35. // onProgressUpdate: console.log,
  36. robot: 1,
  37. })
  38. console.log(uploadResult)
  39. console.log('ENV: ', ENV)
  40. console.log('appid: ', appid)
  41. console.log('version: ', version)
  42. })()
  43. async function getUserNameAndUserEmail() {
  44. const configList = await git.listConfig()
  45. let userName, userEmail
  46. Object.keys(configList.values).some(file => {
  47. const value = configList.values[file]
  48. if (value['user.name'] && value['user.email']) {
  49. userName = value['user.name']
  50. userEmail = value['user.email']
  51. return true
  52. }
  53. })
  54. return { userName, userEmail }
  55. }
  56. async function getLastCommit() {
  57. const { latest } = await git.log({ maxCount: 1 })
  58. return `提交信息:(${latest.hash.slice(0, 8)}) ${latest.message}`
  59. }

更多信息请参考微信小程序官方文档:
https://developers.weixin.qq.com/miniprogram/dev/devtools/ci.html