返回笔记首页

小程序面试相关

主题配置

小程序面试相关

:::color2 多小程序统一管理,自动构建 + 上传代码,自动区分环境(dev / test / prod),自动提审 + 审核通过后自动发布

主导设计并落地微信小程序 CI/CD 自动化发布体系,实现多小程序、多环境的构建、上传、审核、发布全流程自动化,发布效率提升 80%+,线上误操作事故下降 90%。

:::

实战案例脚本

miniprogram-ci.zip

微信小程序 CI/CD 自动化发布平台

项目背景

公司维护多个微信小程序,原发布流程依赖人工操作(开发者工具上传→提审→发布),存在效率低、误操作风险高(体验版误提审)、版本不可追溯等问题。

技术栈

GitLab CI、Node.js、miniprogram-ci、Redis/MySQL、企业微信机器人

核心职责
  1. 全流程自动化
    • 基于 GitLab CI + miniprogram-ci 实现代码提交到发布上线的全自动化流程
    • 脱离开发者工具,通过 CI 完成构建、上传、提审、发布全流程
    • 实现审核状态自动轮询,审核通过后自动发布
  2. 多环境管理
    • 设计 dev/test/prod 三环境构建隔离方案,自动注入环境配置
    • 实现分支与环境强绑定校验(develop→dev、test→test、master→prod)
    • 从机制上防止体验版误提审上线
  3. 多小程序统一管理
    • 设计统一配置方案,支持多 AppId 的独立发布和权限隔离
    • 通过配置文件管理小程序信息、审核参数、私钥证书
  4. 发布安全保障
    • 版本号格式和递增校验
    • 生产环境发布二次确认机制
    • 关键操作(提审、发布)手动触发控制
  5. 可观测性建设
    • 发布记录、审核状态、版本信息持久化存储
    • 企业微信/飞书机器人实时通知发布状态
    • 发布人、变更日志、审核结果可追溯
  6. 流程标准化
    • 沉淀团队统一发布规范文档
    • 封装可复用的 CI 流水线模板
项目成果
  • 发布效率提升 80%,从 30 分钟缩短至 5 分钟
  • 完全避免人为误操作导致的线上事故
  • 支持 5+ 个小程序的统一发布管理

给你一个标准的项目讲解话术,分为简短版和详细版。


简短版(3分钟)

面试官您好,我来介绍下这个项目

项目背景: 我们公司同时维护 5 个微信小程序,每个都有开发、测试、生产三套环境。之前发布全靠人工:开发者工具手动上传代码,然后在后台提审、等审核通过再手动发布。

这样做有几个问题:

第一,一次发布要 30 分钟左右,效率低;

第二,经常出现人为失误,比如把测试版本误提审到生产;第三,发布记录不完整,出问题了追溯不到是谁发的、发了什么。

我的职责: 我负责设计并实现了整套自动化发布系统。

核心实现

  1. 基于 GitLab CI + 微信官方的 miniprogram-ci 工具,实现了从代码提交到上线的全流程自动化
  2. 通过分支和环境强绑定,develop 分支只能发开发环境,test 分支只能发测试环境,master 分支只能发生产环境,配合 CI 的校验脚本,从机制上杜绝了误操作
  3. 封装了统一的配置管理,一套代码支持多个小程序,每个小程序独立配置 AppID、密钥、审核参数
  4. 实现了审核状态自动轮询,提审后自动检查审核进度,通过了自动触发发布
  5. 关键操作比如生产发布设置了手动确认,需要人工点击才执行

项目效果: 发布时间从 30 分钟降到 5 分钟,效率提升 80%。上线半年零事故,之前平均每月有 1-2 次误操作导致的线上问题,现在完全避免了。现在团队 5 个小程序都在用这套流程。


详细版(5-8分钟,应对追问)

【背景部分 - 说痛点】

面试官您好,我来详细介绍这个项目。

我们公司业务涉及电商、服务、工具等多个领域,同时维护 5 个微信小程序。每个小程序都有 dev、test、prod 三套环境。

原来的发布流程是这样的:开发人员在本地使用微信开发者工具手动上传代码,然后登录微信公众平台后台手动提交审核,审核通过后再手动点发布。这套流程存在几个明显问题:

  1. 效率低:一次完整发布要 30 分钟,包括打开开发者工具、选择版本、填写描述、上传、登录后台、填审核信息、提审,审核通过后还要再登录发布
  2. 易出错:开发人员经常会选错环境或版本,最常见的是把测试版本误提审到生产,导致线上事故
  3. 不可追溯:发布记录散落在各处,出问题后查不到是谁发的、什么时候发的、发了什么内容

当时我统计过,平均每月有 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

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

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 才能执行。

【难点和亮点 - 说思考】
遇到的难点
  1. 私钥安全:上传需要小程序的私钥文件,不能提交到代码仓库。我的方案是把私钥 Base64 编码后存到 GitLab 的 CI Variables 里,设置为 Masked,CI 执行时动态解码生成私钥文件。
  2. 多环境配置注入:不同环境的 API 地址不同,不能写死在代码里。我在 CI 上传前自动生成 config/env.js 文件,根据当前环境注入对应配置,这样小程序代码无感知。
  3. 审核时间不确定:微信审核快的几小时,慢的要 1-2 天。我设计成手动触发轮询,避免长时间占用 Runner,也给了开发人员灵活性。
做得比较好的点
  1. 防误操作机制:通过分支环境强校验,从源头杜绝了人为失误
  2. 可追溯性:每次发布都有 Pipeline 记录,包括发布人、时间、版本号、变更日志
  3. 可扩展性:增加新小程序只需要在配置文件加几行,不用改代码
【成果 - 说数据】

这套系统上线后:

  • 效率提升 80%:发布时间从 30 分钟降到 5 分钟
  • 零事故:上线半年没有发生过误操作导致的线上问题
  • 覆盖全业务:支持了公司全部 5 个小程序的发布
  • 团队认可:其他团队也在推广使用

后来我还加了灰度发布功能,可以先让 10% 用户体验新版本,观察数据后再全量。

【总结】

这个项目让我对 CI/CD 的理解更深了。我认为好的自动化系统不只是写几个脚本,更重要的是:

  1. 从流程上防止错误
  2. 让系统有足够的安全保障
  3. 做好可观测性,出问题能快速定位

以上就是这个项目的情况,您看还有什么想了解的吗?


应对追问的准备

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 测试,当前架构还需要扩展。