在日常的小程序开发中不使用自动化可能会出现的一些问题:

  1. 分支切换,代码上传,预览码生成,操作无脑但耗时
  2. 当生成码的要求同时来的时候,需要等待
  3. 小程序单独的机制,导致无法像web端那样做整体流程管控
  4. 非开发人员获取体验码的流程依赖开发人员

自动化的流程构思

  1. 通过钉钉的指令触发构建 (目前还未实现该步骤,后续补充)
  2. 以node端为中介,完成流程化操作
  3. jenkins端进行打包上传预览等耗时操作
  4. 回调node端,对原有的信息进行美化
  5. 钉钉接收node端的信息,反馈用户

实施流程:

小程序自动化打包上传

  1. 生成小程序密钥
  2. 将密钥文件保存在项目根目录下

  1. 安装Taro自带小程序CI插件 npm i @tarojs/plugin-mini-ci -D
  2. 使用Taro插件
//  /config/index.js
const CIPluginOpt = {weapp: {appid: "*******************",privateKeyPath: "private.wx30ea7a15d8979ead.key" // 配置密钥的路径},// 版本号version: "1.0.0"
};const config={...config,plugins: [["@tarojs/plugin-mini-ci", CIPluginOpt]]
}
  1. 配置命令
// package.json
{"scripts": {//  构建完后自动 “打开开发者工具”"build:weapp": "taro build --type weapp --open",//  构建完后自动“上传代码作为体验版”"build:weapp:upload": "taro build --type weapp --upload",//  构建完后自动 “上传代码作为开发版并生成预览二维码”     "build:weapp:preview": "taro build --type weapp --preview"},"taroConfig": {"version": "1.0.0","desc": "上传描述"}
}

到这一步为止小程序的CI已经完成,可以看到执行完 npm run build:weapp:upload 会出现Taro的打包编译过程和结果,微信公众号的后台也出现了本次打包上传的记录

中间可能会涉及因为主包过大而上传失败的问题,这时候的建议就是能进行分包处理,具体的分包可以参考官网

https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/basic.html

  1. dist 文件压缩(因为要将文件上传oss,配合后期钉钉直接下载dist文件包,所以我的预期是将dist文件包以及Taro的打包产物一起上传oss)
  • 安装jszip(jszip是一个用于创建、读取和编辑.zip文件的JavaScript库,且API的使用也很简单。)

    • npm install jszip
  • 执行压缩
// zip.js
const JSZip = require("jszip");
const zip = new JSZip();const fs = require("fs");
const path = require("path");function readDir(zip, dirPath) {// 读取dist下的根文件目录const files = fs.readdirSync(dirPath);files.forEach(fileName => {const fillPath = dirPath + "/" + fileName;const file = fs.statSync(fillPath); // 如果是文件夹的话需要递归遍历下面的子文件if (file.isDirectory()) {const dirZip = zip.folder(fileName);readDir(dirZip, fillPath);} else {// 读取每个文件为buffer存到zip中zip.file(fileName, fs.readFileSync(fillPath));}});
}function create(sourceDir) {readDir(zip, sourceDir);zip.generateAsync({type: "nodebuffer", // 压缩类型compression: "DEFLATE", // 压缩算法compressionOptions: {// 压缩级别level: 9}}).then(content => {// 我将压缩后的文件放在dist目录下的zip文件夹中,方便一同上传ossconst dest = path.join(__dirname, "./dist/zip");if (dest) {// 删除旧包目录const folder_exists = fs.existsSync("./dist/zip");if (folder_exists == true) {const dirList = fs.readdirSync("./dist/zip");dirList.forEach(function(fileName) {fs.unlinkSync("./dist/zip/" + fileName);});}}// 创建新包目录fs.mkdirSync(dest, { recursive: true }); // 把zip包写到硬盘中,这个content现在是一段bufferfs.writeFileSync(`${dest}/miniPrograms.service.zip`, content);});
}function generateZip() {const sourceDir = path.join(__dirname, "./dist");fs.access(sourceDir, err => {if (err) {fs.mkdirSync(sourceDir);}create(sourceDir);});
}generateZip();

在package.json 中增加执行压缩的命令"build:zip":"node zip.js",

  1. oss上传
//  oss.client.js
const OSS = require("ali-oss");
const util = require("util");
const fs = require("fs");
const path = require("path");const readdir = util.promisify(fs.readdir);
const stat = util.promisify(fs.stat);class OssClient {constructor() {this.client = new OSS({region: "oss-cn-hangzhou",accessKeyId: "your accessKeyId ", // process.env.ACCESSKEYID,accessKeySecret: "your accessKeySecret", // process.env.ACCESSKEYSECRET,bucket:process.env.APP_ENV === "production" ? "static" : "staticdev", // process.env.BUCKET,});}async putStream(dir, ossDir = "/", fileName) {try {const stream = fs.createReadStream(path.resolve(dir, fileName));return await this.client.putStream(ossDir + fileName, stream);} catch (e) {console.log(e);}}async putDir(dir, ossDir) {let files;try {files = await readdir(dir);} catch (e) {console.log(`【当前目录不存在】 -- ${dir} --`);return undefined;}for (const i in files) {const state = await stat(`${dir}/${files[i]}`);if (state.isDirectory()) {await this.putDir(`${dir}/${files[i]}`, `${ossDir}/${files[i]}`);} else {await this.putStream(dir, `${ossDir}/`, files[i]);}}}async upload() {try {await this.putDir(path.resolve(__dirname, "dist"),`miniPrograms.service`);} catch (e) {console.log("【上传异常请重试】", e);}}
}new OssClient().upload().then(() => {console.log("上传成功");}).catch((error) => {console.log("上传异常", error);});

在package.json 中增加执行压缩的命令"oss:test":"cross-env NODE_ENV=development node oss.client.js",

  1. 编写打包脚本
// build:test.sh
git pull
echo "编译开始..."
yarn
echo "开始自动化上传"
npm run build:weapp-dev:upload
echo "小程序上传成功"
echo "开始压缩"
npm run build:zip
echo "压缩完成"
npm run oss:test
echo "编译成功..."

执行编译脚本即可自动化编译上传

node 接口编写

注: 本项目使用egg.js

  1. 安装 dingtalk-robot-sender
  2. 在钉钉群中增加一个自定义机器人,复制Webhook链接备用

  1. 在service中新增接口
//  /app/service/DingMiniTips.ts
import { Service } from 'egg';
import * as ChatBot from 'dingtalk-robot-sender';const robot = new ChatBot({webhook:'your webhook',// 使用钉钉自定义机器人的Webhook链接
});export default class Test extends Service {public async dingTips(ctx) {// 发送钉钉消息const textContent = {msgtype: 'actionCard',actionCard: {title: '小程序自动化构建',text: '小程序自动化构建已完成 \n\n\n 请点击下载获取最新的小程序压缩包 \n\n\n',btnOrientation: '0',btns: [{title: '下载',actionURL:'your zip address', //使用上传到oss的zip地址},],},};robot.send(textContent).then(res => {console.log('res', res);});}
}
  1. 在controller 中引入新增的接口
// /app/controller/miniAppTips.ts
import { Controller } from 'egg';export default class HomeController extends Controller {public async MiniAppTips() {const { ctx } = this;await ctx.service.dingMiniTips.dingTips(ctx);ctx.status = 200;// 这里相对简单的返回,后期需要根据信息返回接收的状态ctx.body = {data: null,msg: '构建信息发送成功',};}
}
  1. 在router.ts 中增加此接口
router.get('/miniAppTips', controller.miniAppTips.MiniAppTips);

到这一步可以测试钉钉与oss的链接是否生效,在postcode中请求该接口,钉钉则会出现对应卡片信息

点击下载可以下载小程序上传在oss的dist文件包

gitLab小程序项目Jenkins自动发布

这一步可以参考我之前写过的文章关于项目与Jenkins自动化发布流程( 服务端项目服务器配置流程(GitLab+Jenkins))

部署的流程都是相同的,唯一需要增加的就是执行的脚本需要增加一条命令触发钉钉的机器人

cd /storage/node/miniPrograms.service
sh build-test.sh
curl http://*****.com/miniAppTips

自此为止全部流程已完成,只需要在Jenkins上点击构建或者本地上传更改代码,就会触发Jenkins的构建。执行完成build-test.sh 的脚本之后,小程序自动化打包上传微信公众平台,dist文件包括压缩包上传oss。全部完成后触发curl命令,触发链接钉钉的接口,钉钉发送卡牌提示,点击消灾就可以将压缩包下载,测试工程师可以根据解压后的dist文件在微信开发者工具中测试代码。

微信小程序自动化打包(taro+oss+ci+Jenkins+node+钉钉)相关推荐

  1. Windows10windows server 2012r2作为slave 用jenkins部署微信小程序自动化打包

    背景 微信小程序的测试发布在没有 CI/CD 等相关工具的情况下,存在着如下的问题: 小程序开发助手中,同一个开发者只能显示一个开发版本 测试同事.产品经理.UI设计师找开发要二维码,或者本地拉取代码 ...

  2. 微信小程序自动化框架minium实践,手把手带你玩minium

    一.背景需求 精选小程序发生了一次线上问题,测试阶段的小程序开发码测试ok,但是小程序正式码由于打包问题,"我的订单"页面文件打包失败,导致线上用户访问我的页面白屏. 当前并不能避 ...

  3. 使用 HBuilder X 将微信 小程序 项目 打包

    项目场景: 提示:这里简述项目相关背景: 使用 HBuilder X 将微信 小程序 项目 打包 问题描述 这里描述项目中遇到的问题:` 使用 HBuilder X 将微信 小程序 项目 打包 解决方 ...

  4. 微信上python小课 骗局_聊聊 Python 做微信小程序自动化,那些踩过的坑?

    1. 场景 之前写过 微信小程序的几种方式,对于有源码的小程序推荐使用微信开放的 SDK 来做自动化,否则只能使用原生或 WebView 的方式. 最近在用 Python + Appium 在微信小程 ...

  5. android微信自动化脚本,appium——微信小程序自动化

    由于腾讯系QQ.微信是基于腾讯自研X5内核-类似webview,不是谷歌原生webview,所以调试会有些许差异(有很 多app厂商也开始采用X5内核) 微信小程序自动化测试只能够支持手机,模拟器是不 ...

  6. 微信小程序自动化构建(云效)

    文章目录 前言 一.miniprogram-ci 二.将appid和privateKey配置成云效参数 1.修改上传时的脚本 2.修改manifest.json中的appid 3.修改云效配置 总结 ...

  7. android微信小程序自动填表_微信小程序自动化,记录趟过的坑!

    项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...

  8. 史上最全最新微信小程序自动化教程

    背景 微信小程序作为现在流行的一种应用载体,很多小伙伴都有对其做自动化测试的需求,由于腾讯系QQ.微信等是基于腾讯自研X5内核,不是谷歌原生webview,所以调试会有些许差异(现在很多app产品也开 ...

  9. uni-app 开发微信小程序 自动化编译,启动项目

    最近开发一个uni-app的小程序项目,因为习惯使用vscode 而项目不得不借助hbuderx 运行,微信开发工具调试,偶尔还需要使用 ios模拟器, 8g内存的mac 就变的异常卡顿,所以就研究了 ...

最新文章

  1. Python Day34
  2. 《Windows游戏编程大师技巧》三、Windows高级编程
  3. python函数与方法的区别_python中函数和方法有哪些区别
  4. 彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  5. 冷启动阶段的多规则策略如何筛选?
  6. [导入]实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除...
  7. Learn OpenGL(一)图形渲染管线(Pipeline)
  8. android 平板怎么截图,平板电脑怎样截图
  9. 解决.bat文件一闪而过的方法
  10. 集福啦!你想要的“福”这里都有~
  11. Springboot拦截器实现IP黑名单
  12. 什么牌子的护眼灯最好推荐?盘点口碑好的护眼灯品牌
  13. 我的spring入门级理解
  14. 突发!百度CEO李彦宏被当众泼了一瓶水
  15. FastJson远程命令执行漏洞
  16. Arduino ESP8266固件bin升级四种方法
  17. [篇五章四]-关于 Windows 10 没有桌面图标如何调出来
  18. 论文写作笔记2:AIME-相关论文
  19. 液晶面板里面有些什么配件_LED面板灯由哪些部件组成
  20. 哈佛商学院MBA课程安排及学制

热门文章

  1. VTK笔记-计算MPR切面-vtkImageReslice类
  2. 纵横字谜的答案(Crossword Answers UVa232)
  3. 区块链技术在消费电子产品追溯系统中的应用
  4. jquery实现流程图绘制工具——展现红警三建造出兵操作 ——一 简介
  5. 【已解决】pycharm 远程服务器报错 Couldn‘t refresh skeletons for remote interpreter
  6. Intel与ARM处理器对比分析
  7. Fiora:漏洞PoC框架的图形版,快捷搜索PoC、一键运行Nuclei
  8. matlab三维点电荷电势图,Matlab模拟三维空间中点电荷的电势分布
  9. 一层层堆叠的意思是什么_堆叠的解释及造句
  10. 手机怎么裁剪视频尺寸简单?推荐给你这两个裁剪方法