ByteNoteByteNote

字节笔记本

2026年7月12日

微信小程序自动化部署完整指南:从 CI 到 miniprogram-ci 上传

API中转
¥120

本文整理微信小程序自动化部署的完整流程,从分支环境设计、CI 流水线搭建、miniprogram-ci 上传,到多商户 SaaS 的第三方平台方案,帮你把繁琐的手动发布变成一条可靠的自动化流水线。

整体思路

不要一开始就追求「提交代码后自动上线」。把流程拆开,该自动的自动,该人工的留人工:

代码提交 → 自动检查 → 自动构建 → 自动生成体验版 → 人工验收 → 自动上传开发版 → 人工提交审核 → 人工确认发布

微信官方的 miniprogram-ci 可以脱离微信开发者工具完成小程序的编译、预览和上传,这是整个自动化方案的基础。

分支与环境设计

text
feature/*       开发分支
    ↓ PR
develop         测试环境
    ↓ 合并
main            生产候选版本
    ↓ Git Tag
v1.2.0          正式发布版本

每个分支对应不同动作:

触发条件自动执行产生结果
提交到 feature/*ESLint、类型检查、单元测试判断代码能否合并
合并到 develop构建测试环境、生成预览二维码测试人员扫码验收
合并到 main构建生产环境、上传开发版本微信后台出现新版本
创建 v1.2.0 Tag上传正式候选版本、生成发布记录准备提交审核
审核通过人工确认发布正式上线

核心原则:构建和上传自动化,审核与正式发布保留人工确认。

完整流水线

1. 拉取代码

bash
git checkout main

2. 安装依赖

bash
pnpm install --frozen-lockfile

3. 代码质量检查

bash
pnpm lint
pnpm typecheck
pnpm test

任何一步失败,都停止后续部署。

4. 注入环境变量

建议区分三个环境:

  • .env.development
  • .env.staging
  • .env.production

例如:

bash
VITE_API_BASE_URL=https://api.example.com
VITE_ENV=production

AppSecret、代码上传密钥等敏感信息不要放入小程序代码或 Git 仓库。

5. 构建微信小程序

不同技术栈只需要替换这一条命令:

bash
# uni-app
pnpm build:mp-weixin

# Taro
pnpm build:weapp

# 原生微信小程序
pnpm build

最终获得微信小程序构建目录:

  • dist/build/mp-weixin(uni-app)
  • dist/weapp(Taro)
  • miniprogram(原生)

6. 生成体验二维码

develop 分支调用 miniprogram-cipreview,自动生成体验二维码,作为 CI 构建产物上传:

text
develop 更新
  → 构建测试版
  → 生成二维码
  → 上传到 GitHub Actions Artifacts
  → 通知测试人员扫码

7. 上传开发版本

测试通过后调用 miniprogram-ciupload

javascript
import ci from "miniprogram-ci";

const project = new ci.Project({
  appid: process.env.WX_APPID,
  type: "miniProgram",
  projectPath: process.env.WX_PROJECT_PATH,
  privateKeyPath: process.env.WX_PRIVATE_KEY_PATH,
  ignores: ["node_modules/**/*", ".git/**/*"],
});

await ci.upload({
  project,
  version: process.env.RELEASE_VERSION,
  desc: process.env.RELEASE_DESC ?? "自动化构建",
  setting: {
    es6: true,
    minify: true,
    codeProtect: true,
    autoPrefixWXSS: true,
  },
  onProgressUpdate: console.log,
});

console.log("小程序开发版本上传完成");

GitHub Actions 完整配置

yaml
name: Deploy WeChat Mini Program

on:
  push:
    branches:
      - develop
      - main
    tags:
      - "v*"

jobs:
  deploy:
    runs-on: self-hosted

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: pnpm

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Lint
        run: pnpm lint

      - name: Type check
        run: pnpm typecheck

      - name: Build mini program
        run: pnpm build:mp-weixin
        env:
          NODE_ENV: production
          API_BASE_URL: ${{ secrets.API_BASE_URL }}

      - name: Restore upload private key
        shell: bash
        run: |
          mkdir -p .ci
          printf '%s' "${WX_PRIVATE_KEY}" > .ci/private.key
          chmod 600 .ci/private.key
        env:
          WX_PRIVATE_KEY: ${{ secrets.WX_PRIVATE_KEY }}

      - name: Generate version
        shell: bash
        run: |
          if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
            echo "RELEASE_VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_ENV"
          else
            echo "RELEASE_VERSION=0.0.${GITHUB_RUN_NUMBER}" >> "$GITHUB_ENV"
          fi

      - name: Upload mini program
        if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
        run: node scripts/upload-wechat.mjs
        env:
          WX_APPID: ${{ secrets.WX_APPID }}
          WX_PROJECT_PATH: dist/build/mp-weixin
          WX_PRIVATE_KEY_PATH: .ci/private.key
          RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
          RELEASE_DESC: ${{ github.event.head_commit.message }}

      - name: Generate preview QR code
        if: github.ref == 'refs/heads/develop'
        run: node scripts/preview-wechat.mjs
        env:
          WX_APPID: ${{ secrets.WX_APPID }}
          WX_PROJECT_PATH: dist/build/mp-weixin
          WX_PRIVATE_KEY_PATH: .ci/private.key
          QR_OUTPUT_PATH: preview-qrcode.png

      - name: Upload preview QR code
        if: github.ref == 'refs/heads/develop'
        uses: actions/upload-artifact@v4
        with:
          name: wechat-preview-qrcode
          path: preview-qrcode.png

需要提前配置的内容

在微信公众平台获取:

  • 小程序 AppID
  • 代码上传密钥 private.key
  • 上传 IP 白名单

在 GitHub Secrets 中配置:

Secret 名说明
WX_APPID小程序 AppID
WX_PRIVATE_KEY代码上传密钥内容
API_BASE_URL后端 API 地址

代码上传密钥能执行预览和上传操作,应当单独存放,不能提交到仓库。开启上传 IP 白名单后,只有白名单内的出口 IP 才能上传,因此更适合使用具有固定公网 IP 的自托管 Runner。

为什么不建议自动正式发布

对于单个、自主开发的小程序,推荐自动化到「上传开发版本」为止:

text
自动上传开发版
  → 测试负责人确认
  → 运营人员提交审核
  → 审核通过
  → 负责人点击发布

原因很现实:

  • 审核资料可能涉及服务类目、隐私说明和功能页面
  • 后端接口与数据库迁移可能尚未完成
  • 自动发布后发生故障,回滚不像普通网站那么直接
  • 提交审核和正式上线属于业务动作,不只是技术动作

正式发布前保留一个人工审批节点最稳妥。

多商户 SaaS 的全自动方案

如果项目需要同时管理几十甚至几百个商户小程序,不要为每个小程序保存一份上传密钥,而应注册微信开放平台第三方平台

text
开发小程序模板
  → 上传到第三方平台草稿箱
  → 添加到模板库
  → 商户小程序扫码授权
  → 调用接口部署模板
  → 生成体验版
  → 提交审核
  → 查询审核结果
  → 自动或人工发布

第三方平台可以通过模板和代码管理接口,为多个已授权小程序批量部署代码、提交审核和发布,更适合微信生态 SaaS。

推荐路线

先采用这条路线:

text
GitHub 提交
  → 自动测试
  → 自动构建
  → develop 自动生成二维码
  → 测试确认
  → main 自动上传开发版
  → 人工提审
  → 人工发布

等未来需要为大量客户部署同一套小程序时,再升级到微信开放平台第三方平台方案:模板化部署 → 批量提审 → 批量发布。

这样既能减少开发者工具的手动操作,又不会因为过度自动化把有问题的版本直接推到线上。

分享: