一、为什么要做小程序自动化部署方案?
- 同个项目多人开发,频繁上传代码,来回切换不同人的版本,效率低下。
- 上传的小程序代码和代码仓库的代码无法保持一致。
- 版本控制问题无法很好解决。
- 本地提交的代码,发正式版提交审核后,需要重新打包发布,切回体验版。
二、背景知识
三、方案思路
1.打包小程序
2. 借助小程序官方提供的 miniprogram-ci 中的脚本调用方式,结合gitlab ci执行对应的发布脚本
1 |
执行脚本时需要传版本参数、指定发布机器人、描述说明(这里我们将commit message作为描述) |
前面全是抄的废话,下来进入正题
3、集成步骤( 默认你已经了解并使用过gitlab-ci,不在纠结这个东西怎么用)
4、安装miniprogram-ci
1 2 3 4 |
#自动把模块和版本号添加到dependencies npm i miniprogram-ci -S #全局安装 npm install miniprogram-ci --global |
5、准备上传密钥,后面会用到
1 2 3 4 |
密钥文件只有小程序的管理员有权限生成。 具体位置是在小程序管理平台中的,开发->开发设置->小程序代码上传->小程序代码上传密钥。 将生成的密钥文件放在项目的根目录下。 这里还可以开启ip白名单,指定的ip才能执行上传脚本(我们这种方案里,就是gitlab-runner所在的机器的ip) |
6、ci.js 发布脚本
1 |
此脚本,根据不同环境可以创建多份,每个发布环境的上传密钥可能不一样 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
const ci = require('miniprogram-ci') var arguments = process.argv.splice(2) var version = arguments[0] var robot = parseInt(arguments[1]) var desc = arguments.splice(2).join(' ') const project = new ci.Project({ appid: 'wx3afbccxxcc413a04c', type: 'miniProgram', projectPath: './', privateKeyPath: './ci-private.key', ignores: ['node_modules/**/*', 'src/**/*'] }) /** 上传 */ async function upload({ version = '1.0.0', desc = '这个作者很懒,什么也没写', robot = 1 }) { await ci.upload({ project, version, desc, setting: { es7: true, minify: true, autoPrefixWXSS: true }, robot, onProgressUpdate: console.log }) } upload({ version, desc}) // 第一个参数是发布的版本号 // 第二个参数是自定义备注 // 第三个参数指定使用哪一个 ci 机器人,可选值:1 ~ 30 |
更多参数详情设置可参考官方文档
四、gitlab-ci yaml 仅供参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
stages: - deploy - release job_deploy: stage: deploy script: - cp -rf /opt/script/npmlogin.sh ./ - rm ./package-lock.json - npm cache clear --force - bash ./npmlogin.sh - npm install - npm run build:$PRO cache: key: "$CI_COMMIT_REF_SLUG" paths: - ${CACHE_DIR} tags: - publicwebrunner rules: - if: '$CI_PIPELINE_SOURCE == "push"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success job_release: stage: release script: - if [[ "$PRO" =~ "app" ]];then cp -rf /opt/script/wechat/pro-ci.js ./ci.js; cp -rf /opt/script/wechat/pro-ci-private.key ./ci-private.key; fi - if [[ "$PRO" =~ "dev" ]];then cp -rf /opt/script/wechat/dev-ci.js ./ci.js; cp -rf /opt/script/wechat/dev-ci-private.key ./ci-private.key; fi - if [[ "$PRO" =~ "fat" ]];then cp -rf /opt/script/wechat/fat-ci.js ./ci.js; cp -rf /opt/script/wechat/fat-ci-private.key ./ci-private.key; fi - if [[ "$PRO" =~ "uat" ]];then cp -rf /opt/script/wechat/uat-ci.js ./ci.js; cp -rf /opt/script/wechat/uat-ci-private.key ./ci-private.key; fi - if [[ "$PRO" =~ "sim" ]];then cp -rf /opt/script/wechat/sim-ci.js ./ci.js; cp -rf /opt/script/wechat/sim-ci-private.key ./ci-private.key; fi - node ci.js ${CI_COMMIT_BRANCH#*release/} $([[ "$DESC" == "" ]] && echo "提交版本的人什么都没写" || echo "$DESC") tags: - publicwebrunner rules: - if: '$CI_PIPELINE_SOURCE == "push"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success |
1 |
脚本中的文件存放目录和路径自行解决 |
改造package.json文件
1 |
我们在gitlab中指定,preview/master 分支执行npm run build进行打包,test分支执行npm run build:test进行打包,因此我们要在package.json中支持此命令 |
1 2 3 4 5 6 7 8 9 10 |
{ ... "scripts": { ... "build": "xxx", "build:test": "xxx", ... }, ... } |
- 本文固定链接: https://www.yoyoask.com/?p=9150
- 转载请注明: shooter 于 SHOOTER 发表