
:::color2 多小程序统一管理,自动构建 + 上传代码,自动区分环境(dev / test / prod),自动提审 + 审核通过后自动发布
主导设计并落地微信小程序 CI/CD 自动化发布体系,实现多小程序、多环境的构建、上传、审核、发布全流程自动化,发布效率提升 80%+,线上误操作事故下降 90%。
:::
实战案例脚本
微信小程序 CI/CD 自动化发布平台
项目背景
公司维护多个微信小程序,原发布流程依赖人工操作(开发者工具上传→提审→发布),存在效率低、误操作风险高(体验版误提审)、版本不可追溯等问题。
技术栈
GitLab CI、Node.js、miniprogram-ci、Redis/MySQL、企业微信机器人
核心职责
- 全流程自动化
- 基于 GitLab CI + miniprogram-ci 实现代码提交到发布上线的全自动化流程
- 脱离开发者工具,通过 CI 完成构建、上传、提审、发布全流程
- 实现审核状态自动轮询,审核通过后自动发布
- 多环境管理
- 设计 dev/test/prod 三环境构建隔离方案,自动注入环境配置
- 实现分支与环境强绑定校验(develop→dev、test→test、master→prod)
- 从机制上防止体验版误提审上线
- 多小程序统一管理
- 设计统一配置方案,支持多 AppId 的独立发布和权限隔离
- 通过配置文件管理小程序信息、审核参数、私钥证书
- 发布安全保障
- 版本号格式和递增校验
- 生产环境发布二次确认机制
- 关键操作(提审、发布)手动触发控制
- 可观测性建设
- 发布记录、审核状态、版本信息持久化存储
- 企业微信/飞书机器人实时通知发布状态
- 发布人、变更日志、审核结果可追溯
- 流程标准化
- 沉淀团队统一发布规范文档
- 封装可复用的 CI 流水线模板
项目成果
- 发布效率提升 80%,从 30 分钟缩短至 5 分钟
- 完全避免人为误操作导致的线上事故
- 支持 5+ 个小程序的统一发布管理
给你一个标准的项目讲解话术,分为简短版和详细版。
简短版(3分钟)
面试官您好,我来介绍下这个项目
项目背景: 我们公司同时维护 5 个微信小程序,每个都有开发、测试、生产三套环境。之前发布全靠人工:开发者工具手动上传代码,然后在后台提审、等审核通过再手动发布。
这样做有几个问题:
第一,一次发布要 30 分钟左右,效率低;
第二,经常出现人为失误,比如把测试版本误提审到生产;第三,发布记录不完整,出问题了追溯不到是谁发的、发了什么。
我的职责: 我负责设计并实现了整套自动化发布系统。
核心实现
- 基于 GitLab CI + 微信官方的 miniprogram-ci 工具,实现了从代码提交到上线的全流程自动化
- 通过分支和环境强绑定,develop 分支只能发开发环境,test 分支只能发测试环境,master 分支只能发生产环境,配合 CI 的校验脚本,从机制上杜绝了误操作
- 封装了统一的配置管理,一套代码支持多个小程序,每个小程序独立配置 AppID、密钥、审核参数
- 实现了审核状态自动轮询,提审后自动检查审核进度,通过了自动触发发布
- 关键操作比如生产发布设置了手动确认,需要人工点击才执行
项目效果: 发布时间从 30 分钟降到 5 分钟,效率提升 80%。上线半年零事故,之前平均每月有 1-2 次误操作导致的线上问题,现在完全避免了。现在团队 5 个小程序都在用这套流程。
详细版(5-8分钟,应对追问)
【背景部分 - 说痛点】
面试官您好,我来详细介绍这个项目。
我们公司业务涉及电商、服务、工具等多个领域,同时维护 5 个微信小程序。每个小程序都有 dev、test、prod 三套环境。
原来的发布流程是这样的:开发人员在本地使用微信开发者工具手动上传代码,然后登录微信公众平台后台手动提交审核,审核通过后再手动点发布。这套流程存在几个明显问题:
- 效率低:一次完整发布要 30 分钟,包括打开开发者工具、选择版本、填写描述、上传、登录后台、填审核信息、提审,审核通过后还要再登录发布
- 易出错:开发人员经常会选错环境或版本,最常见的是把测试版本误提审到生产,导致线上事故
- 不可追溯:发布记录散落在各处,出问题后查不到是谁发的、什么时候发的、发了什么内容
当时我统计过,平均每月有 1-2 次因为人为操作失误导致的线上问题。
【方案设计 - 说思路】
针对这些问题,我设计了一套完整的自动化发布方案。
整体思路是: 让发布流程代码化、自动化、可追溯。
技术选型
- CI 平台选了 GitLab CI,因为我们代码就在 GitLab 上
- 上传工具用微信官方的 miniprogram-ci,脱离开发者工具,可以通过命令行完成上传
- 审核和发布调用微信开放接口
- 用 Node.js 封装了一套脚本
核心设计
第一,全流程自动化。我把发布流程拆成 6 个阶段:参数校验、代码构建、上传代码、提交审核、轮询审核状态、自动发布。每个阶段都是一个独立的 CI job,串联起来形成完整的 Pipeline。
第二,多环境隔离。我设计了分支和环境的强绑定机制:
- develop 分支提交后,CI 自动判断只能发 dev 环境,会注入开发环境的 API 地址,上传到开发版本
- test 分支只能发 test 环境
- master 分支只能发 prod 环境
如果有人试图在 develop 分支发 prod 环境,校验脚本会直接报错退出。这个校验是在 CI 的第一个阶段就做的,成本很低。
第三,多小程序统一管理。我设计了一套配置文件,把每个小程序的 AppID、名称、审核类目、私钥路径等信息都配置化。发布时通过环境变量指定 APP_ID,脚本自动读取对应配置。这样一套代码可以管理所有小程序。
第四,安全保障。关键操作都加了校验:
- 版本号必须符合 x.y.z 格式
- 私钥文件必须存在
- 生产环境发布需要二次确认
- 提审和发布都设置为手动触发,必须人工点击
【具体实现 - 说细节】
我具体讲下几个关键点的实现:
1. 代码上传
这块用的是微信官方的 miniprogram-ci 包。核心代码是:
javascript
const project = new ci.Project({
appid: app.appid,
projectPath: './miniprogram',
privateKeyPath: './private/xxx.key'
});
await ci.upload({
project,
version: '1.0.0',
desc: '版本描述',
setting: {
es6: true,
minify: true // 生产环境压缩
}
});
上传前我会自动注入环境配置,比如 API 地址,生成一个 config/env.js 文件,小程序代码直接引用。
2. 审核提交
调用微信的 submit_audit 接口。需要先用 AppID 和 AppSecret 获取 access_token,然后提交审核参数:
javascript
const res = await axios.post(
'https://api.weixin.qq.com/wxa/submit_audit?access_token=' + token,
{
item_list: [{
address: 'pages/index/index',
tag: '购物 商城',
first_class: '电商平台'
// 审核类目等信息
}]
}
);
返回一个 auditid,后面用这个 ID 查询审核状态。
3. 审核轮询
这是个比较麻烦的点。微信审核一般需要几个小时到 1 天,不能一直占用 CI Runner。
我的做法是:提审完成后,这个 job 就结束了,保存 auditid 到文件。然后在 Pipeline 里加一个手动触发的 poll job,开发人员自己决定什么时候开始轮询。
轮询逻辑是每分钟查一次审核状态:
- 审核通过(status=0):保存结果,job 成功退出
- 审核拒绝(status=1):输出拒绝原因,job 失败退出
- 审核中(status=2):继续等待
- 轮询 60 次还没通过:超时退出
4. 自动发布
审核通过后,调用 release 接口发布。生产环境发布我加了二次确认,需要在 GitLab Variables 里设置 AUTO_CONFIRM=true 才能执行。
【难点和亮点 - 说思考】
遇到的难点
- 私钥安全:上传需要小程序的私钥文件,不能提交到代码仓库。我的方案是把私钥 Base64 编码后存到 GitLab 的 CI Variables 里,设置为 Masked,CI 执行时动态解码生成私钥文件。
- 多环境配置注入:不同环境的 API 地址不同,不能写死在代码里。我在 CI 上传前自动生成 config/env.js 文件,根据当前环境注入对应配置,这样小程序代码无感知。
- 审核时间不确定:微信审核快的几小时,慢的要 1-2 天。我设计成手动触发轮询,避免长时间占用 Runner,也给了开发人员灵活性。
做得比较好的点
- 防误操作机制:通过分支环境强校验,从源头杜绝了人为失误
- 可追溯性:每次发布都有 Pipeline 记录,包括发布人、时间、版本号、变更日志
- 可扩展性:增加新小程序只需要在配置文件加几行,不用改代码
【成果 - 说数据】
这套系统上线后:
- 效率提升 80%:发布时间从 30 分钟降到 5 分钟
- 零事故:上线半年没有发生过误操作导致的线上问题
- 覆盖全业务:支持了公司全部 5 个小程序的发布
- 团队认可:其他团队也在推广使用
后来我还加了灰度发布功能,可以先让 10% 用户体验新版本,观察数据后再全量。
【总结】
这个项目让我对 CI/CD 的理解更深了。我认为好的自动化系统不只是写几个脚本,更重要的是:
- 从流程上防止错误
- 让系统有足够的安全保障
- 做好可观测性,出问题能快速定位
以上就是这个项目的情况,您看还有什么想了解的吗?
应对追问的准备
Q: 为什么选择 GitLab CI 而不是 Jenkins? 我们团队代码就在 GitLab 上,用 GitLab CI 可以和代码仓库无缝集成,不需要额外维护 Jenkins 服务器。而且 GitLab CI 的 Pipeline 配置是代码化的,可以版本管理。
Q: 如果审核被拒怎么办? 审核被拒后,CI 会输出拒绝原因,开发人员根据原因修复问题,提交新代码重新触发 Pipeline。所有的审核记录都保存在 audit-result.json 里,方便追溯。
Q: 私钥泄露了怎么办? 私钥存在 GitLab CI Variables 里,设置了 Masked 和 Protected,只有 Maintainer 能看到。而且只在受保护的分支上才能使用。如果真的泄露了,可以在微信公众平台重新生成密钥,更新 GitLab Variables 即可。
Q: 支持回滚吗? 支持。回滚有两种方式:一是在 master 分支 revert 代码后重新触发 Pipeline;二是切换到历史版本的 tag 重新发布。不过微信小程序没有直接回滚接口,必须重新上传代码、提审、发布。
Q: 这个系统有什么不足? 主要是审核时间不可控,完全依赖微信的审核速度。我们的做法是尽量在工作日提审,通常会快一些。另外,如果要加更复杂的发布策略,比如定时发布、AB 测试,当前架构还需要扩展。