小程序CI/CD之自动化打包预览并钉钉通知发布进程

小程序打包方式分为两种:手动打包、自动打包
那如何实现 自动打包 呐?我们今天就来聊一聊!

首先,很重要,看 官方文档
这里提到今天我们要聊的“主角” miniprogram-ci

miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。
开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。

然后,我们 怎么做!!!

一:准备工作

使用 miniprogram-ci 前应访问"微信公众平台-开发-开发设置"后下载代码上传密钥(最终是需要放在项目根目录下的),并配置 IP 白名单 开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。
img
再者便是,需要在我们的项目中做好环境区分,即做好:测试环境 、预发环境、生产环境 等环境的区分

package.json 文件中代码如下所示:

env
ps:我们的小程序使用的是 Uni-App 开发的,因此代码打包命令行的前缀是 build:mp-weixin-xx 类似这样

二:下载包

npm install miniprogram-ci --save

三:项目根目录下编写脚本文件upload.js-实现自动化上传

直接上代码,有注释!(ps:不清楚的地方,我们评论区见~~)

const project_config = require("./project.config.json");
const child_process = require("child_process");
const ci = require("miniprogram-ci");
const inquirer = require("inquirer");
const request = require("request");
const fse = require("fs-extra");
const util = require("util");
const path = require("path");
const fs = require("fs");const example = {appid: "",  // 小程序的appidname: "",  // 小程序的名字choices: ["测试环境3-test3","测试环境4-test4","预发环境-pre","演示环境-rep","生产环境-prod",],robot_1: 1, // 机器人 1 号robot_2: 2, // 机器人 2 号robot_3: 3, // 机器人 3 号version: "1.0.0",
};class appletCI {exec = util.promisify(child_process.exec);config = {};// 流水线执行上传操作方法async init() {const result_data = await this.inquirer(project_config);this.config = await this.update_config(result_data);this.fs_rewrite_config();await this.upload(result_data);}// 问答:选择环境、版本号、描述async inquirer(config) {return inquirer.prompt([{type: "list",name: "env",message: "请选择部署环境:",default: 0,choices: example.choices,},{type: "input",name: "version",message: `设置上传的版本号(当前版本号:${config.version}):`,filter(opts) {if (opts === "") {return config.version;}return opts;},},{type: "input",name: "desc",message: "请写一个简单的介绍来描述这个版本改动过:",},]);}// 更新配置信息async update_config(user_info) {const env = user_info.env.split("-")[1];const env_desc = user_info.env.split("-")[0];const config = {appid: "",  // 小程序的appidname: "",  // 小程序的名字env,env_desc,version: user_info.version,desc: user_info.desc || env_desc,robot:env === "prod" || env === "pre"? example.robot_3: env === "rep"? example.robot_2: example.robot_1,};return config;}// 重写配置文件fs_rewrite_config() {fs.writeFileSync("./project.config.json",JSON.stringify(this.config),(err) => {if (err) {console.log("自动写入 project.config.json 文件失败,请手动填写,并检查错误!");}});}// 打包上传async upload() {const {appid: "",  // 小程序的appidname: "",  // 小程序的名字env = "test3",env_desc = "测试环境3",desc = "测试环境3",robot = example.robot_1,version = example.version,} = this.config || {};console.log(`${env_desc}正在打包`);this.message(`${name}小程序-${env_desc},正在部署`);await this.exec(`npm run build:mp-weixin-${env}`, { cwd: "./" });await this.copyFiles();console.log(`${env_desc}正在部署`);const project = new ci.Project({appid,type: "miniProgram",projectPath: path.join(__dirname, "./dist/build/mp-weixin"),privateKeyPath: path.join(__dirname, "./private." + appid + ".key"),ignores: ["node_modules/**/*", ".vscode", ".hbuilderx"],});await ci.upload({project,robot,desc,version,onProgressUpdate: console.log,}).then(() => {this.message(`${name}小程序-${env_desc},部署完成`);console.log("部署完成");}).catch((error) => {if (error.errCode == -1) {this.message(`${name}小程序-${env_desc},部署完成`);console.log("部署完成");return;}this.message(`${name}小程序-${env_desc},部署失败,原因为:${error}`);console.log("部署失败", error);process.exit(-1);});}// 复制 project.config 文件至 distasync copyFiles() {try {await fse.copy(path.join(__dirname, "./project.config.json"),path.join(__dirname, "./dist/build/mp-weixin/project.config.json"));} catch (err) {console.error(err);}}// 发送钉钉消息message(content) {const data = {msgtype: "text",text: { content },};request({url: "",  // 钉钉群里可以看到的webhook地址method: "POST",headers: {"content-type": "application/json",},body: JSON.stringify(data),});}
}const CI = new appletCI();
CI.init();

执行 :

node upload

执行完命令行的终端交互:
env
end
继续回车即可 自动化打包完成!

随后,我们去小程序管理后台拿到预览码即可
preview

附录1:钉钉通知结果:
dingding

附录:2:钉钉的webhook地址如下图:
webhook
附录3:代码中有写到,自动化打包更改的 project.config.json 文件内容如下(每次打包后,该文件都会被更新):

{
"name":"",
"appid":"",
"env":"test3",
"env_desc":"测试环境3",
"version":"",
"desc":"",
"robot":1
}

再聊点其他的,提升点

鉴于在使用过程中获取体验码时,还需打开小程序管理后台获取验证码图片,未彻底解放双手,那么我们再去官方文档中扒拉扒拉,发现 preview 方法是专门实现预览功能滴,即,可实现:自动下载预览二维码图片至本地的某个路径!

具体可查看-预览模块如何实现:
preview

至此,解放双手,happy end!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nacos开启鉴权

nacos版本1.4.3 1.nacos配置开启鉴权 application.properties 或 application.yaml 文件中 nacos.core.auth.enabled 设置为 true 2.修改JWT令牌 如果是Linux系统可以使用命令随机生成 echo -n ThisIsARandomlyGeneratedSecureKey32CharactersLong | base64 nacos.core.au…

【HarmonyOS-Stage应用模型-UIAbility生命周期】

概述 在应用开发过程中,组件的生命周期尤为重要,当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。我们可以通过生命周期来对应用的状态进行监控并执行特定的操作。比如在创建时进行应用初始化、…

网络摄像头项目

1.OV2640 简介 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图像 传感器。该传感器体积小、工作电压低,提供单片 UXGA 摄像头和影像处理器的所有功能。通 过 SCCB 总线控制,可以…

【机器学习】LoRA:大语言模型中低秩自适应分析

LoRA:大型语言模型中的低秩自适应调优策略 一、LoRA的原理与优势二、LoRA在编程和数学任务中的性能表现四、总结与展望 随着人工智能技术的飞速发展,大型语言模型已成为自然语言处理领域的明星技术。然而,这些模型通常拥有数以亿计的参数&…

做好产线工控安全的关键

在现代化工业生产中,产线工控安全是确保生产顺利进行、产品质量稳定、员工生命安全的重要一环。随着信息技术的飞速发展,工控系统面临着越来越多的安全威胁,因此,如何做好产线工控安全成为了摆在我们面前的重要课题。 首先&#x…

使用Python进行高并发压测:技术指南与实战案例

目录 一、引言 二、压测基础知识 压测的目的与类型 压测工具的选择 三、使用Python进行压测 Python压测框架的选择 压测脚本的编写 压测的执行与监控 四、实战案例分析 案例背景介绍 压测计划制定 压测实施过程 结果分析与优化建议 五、常见问题与解决方案 六、…

centos7下卸载MySQL,Oracle数据库

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

JVM 运行流程

JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键,那么 JVM 是如何执行的呢? JVM 执行流程 程序在执行之前先要把java代码转换成字节码(class 文件), JVM 首先需要把字节码通过一定的 方式 类加…

文件怎么加密?文件加密软件哪个好用?

在数字化生活和工作中,文件安全已成为不容忽视的话题。 为了保护个人隐私和企业敏感数据不被非法访问或泄露,文件加密成为了不可或缺的手段。 本文将介绍文件加密的基本概念、加密方法以及推荐几款好用的文件加密软件,帮助您为重要文件穿上“…

捋一捋C++中的逻辑运算(一)——表达式逻辑运算

注意,今天要谈的逻辑运算是C语言编程中的“与或非”逻辑运算,不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算,本章介绍表达式逻辑运算,下一章介绍位逻辑运算。 目录 一、几个基本的概…

视频号上怎么卖货?需要直播,还有粉丝吗?一篇文章带你了解!

大家好,我是电商糖果 关于在视频号上卖货,这是大家最常提起的话题。 大家之所以对视频号卖货感兴趣,主要原因还是抖音卖货火起来了。 而视频号是和抖音处于同一个赛道,这两年也在往电商方向发力。 所以大家对视频号推出电商平…

Window11端口开放防火墙

(1)打开控制面板,进入【控制面板\系统和安全\Windows Defender 防火墙】 (2)点击左侧菜单【高级设置】,进入防火墙设置页面 (3)根据需要选择【入站规则】或者【出站规则】&#xff…

ubtun三节点安装k8s

文章目录 修改Ubuntu配置关闭swap:关闭防火墙 安装docker 修改Ubuntu配置 关闭swap: vim /etc/fstab /dev/disk/by-uuid/a1ce2ecf-91f4-4f53-9984-b2af1e9713c5 /boot ext4 defaults 0 1 /swap.img none swap sw 0 0修改/dev/dis…

nestjs 全栈进阶--拦截器

视频教程 23_nestjs中的拦截器_哔哩哔哩_bilibili 1. rxjs 介绍 RxJS(Reactive Extensions for JavaScript)是一款专为JavaScript和TypeScript设计的响应式编程库,它遵循ReactiveX规范,提供了一套强大的工具和API,用…

Mac 使用Docker安装Elasticsearch、Kibana

安装ElasticSearch 通过docker安装es docker pull elasticsearch:8.6.2 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

Scala 练习一 将Mysql表数据导入HBase

Scala 练习一 将Mysql表数据导入HBase 续第一篇:Java代码将Mysql表数据导入HBase表 源码仓库地址:https://gitee.com/leaf-domain/data-to-hbase 一、整体介绍 HBase特质 连接HBase, 创建HBase执行对象 初始化配置信息:多条(hbase.zookeeper.…

ARM学习(28)NXP 双coreMCU IMX1160学习

笔者最近接触到一块IMXRT1160的双core板子,特依次来记录学习一下 1、IMXRT1160 板子介绍 介绍一下NXP的Demo板子,是一个双core的板子,Cortex-M7和Cortex-M4,总计1MB的RAM空间,256KB的ROM空间,提供了丰富的…

Window10磁盘的分盘和合并

注意: 当我们c盘不够大需要扩大磁盘空间时,当c盘后面没有未划分的磁盘时候,我们是无法进行扩充c盘的,此时,我们可以先删除后面一个磁盘,再进行扩大。 如下:c盘后没有未分配的空间,…

【项目管理常见问题大揭秘】每个管理者都要Get的「五维思维」~

走上管理岗☸要懂得五维思维 💼自我管理——做自己的CEO 严于律己:严格要求自己,注重个人品牌建设 宽以待人:接纳不同观点,提升团队凝聚力 尊重事实:鼓励团队成员发挥优势,避免负面评价 坚守诚…

求助:西莫电子期刊 交流互助 传递

点击上方 “机械电气电机杂谈 ” → 点击右上角“...” → 点选“设为星标 ★”,为加上机械电气电机杂谈星标,以后找夏老师就方便啦!你的星标就是我更新动力,星标越多,更新越快,干货越多! 关注…