微信小程序 / 小游戏自动化 CI 工具:一行命令完成代码上传、生成体验版二维码。封装自微信官方
miniprogram-ci,提供更易用的 CLI 与配置文件。
- ✅ 一行命令:
acmp preview直接出二维码、acmp upload直接上传开发版 - ✅ 终端 ASCII 二维码:扫码即体验,无需打开图片查看器
- ✅ 同时支持小程序和小游戏:通过
type字段切换 - ✅ 自动构建:上传前自动跑你的
pnpm build/npm run build - ✅ 配置文件友好:
acmp.config.js一处配置,CLI / 编程 API 共享 - ✅ 完整 TypeScript 类型:
defineConfig提供智能提示 - ✅ CI 友好:私钥支持文件路径或字符串注入(适合环境变量)
⚠️ 重要:自开发账号 vs 第三方平台账号是两套不同的能力
本工具基于 miniprogram-ci,面向自开发账号,能做的就是 miniprogram-ci 能做的:
| 功能 | 是否支持 | 说明 |
|---|---|---|
上传开发版(upload) |
✅ | 上传到「开发版本」列表 |
体验版二维码(preview) |
✅ | 终端 ASCII / 图片 / base64 任选 |
构建 miniprogram_npm(packNpm) |
✅ | 小程序专用 |
| 提交审核 | ❌ | 自开发账号无 API,只能在 mp 后台手动点 |
| 发布 / 版本回退 / 撤回审核 / 分阶段发布 | ❌ | 同上,仅第三方平台 OpenAPI 支持 |
如果你需要全自动「写代码 → 提交审核 → 发布」,唯一路径是注册 微信开放平台第三方平台 并改造为代开发模式,那是另一套大工程,本工具不覆盖。
# 推荐作为项目 devDependency
pnpm add -D auto-control-miniprogram
# 或
npm install -D auto-control-miniprogram
# 或
yarn add -D auto-control-miniprogram登录 mp.weixin.qq.com → 开发管理 → 开发设置 → 小程序代码上传 → 生成并下载 private.<appid>.key。下载到默认 ~/Downloads/ 即可,下一步 acmp init 会自动把它复制到 .keys/;也可以手动放到 .keys/。
同样在 开发管理 → 开发设置 → 小程序代码上传 页面,把执行机器的公网出口 IP 加入白名单。
不知道自己 IP?跑
curl ifconfig.me,或第一次执行acmp preview时报错信息会直接告诉你 IP 是多少。
在项目根目录运行:
npx acmp initinit 会一次性完成:
- 生成
acmp.config.js模板(已存在则不覆盖) - 创建
.keys/目录 - 自动从
~/Downloads/复制private.wx*.key到.keys/(找不到则提示手动放) - 把
.keys/与qrcode.jpg追加到.gitignore - 往
package.json注入两条脚本:ci:preview(生成图片二维码)、ci:upload
可选开关:
npx acmp init --no-copy-keys # 不要从 ~/Downloads 自动复制私钥
npx acmp init --no-inject-scripts # 不要往 package.json 写 scripts完成后把 acmp.config.js 里的 appid 改成自己的即可。
# 生成体验版二维码(终端 ASCII,默认)
npx acmp preview
# 改为输出图片到 ./qrcode.jpg
npx acmp preview --qr-format image
# 上传到「开发版本」列表
npx acmp upload --version 1.0.0 --desc "首次发布"
# 不要执行 build 步骤(沿用上次的产物)
npx acmp preview --no-build
# 指定配置文件
npx acmp preview --config ./build/acmp.config.js
# 构建 miniprogram_npm(小程序专用)
npx acmp pack-npmacmp init 会默认往 package.json 注入这两条脚本,之后用包管理器跑即可:
pnpm ci:preview # 等价于 acmp preview --qr-format image,每次执行直接覆盖 ./qrcode.jpg
pnpm ci:upload # 上传到「开发版本」列表,需要追加 --version <ver> --desc <desc>对应的 package.json 片段:
{
"scripts": {
"ci:preview": "acmp preview --qr-format image",
"ci:upload": "acmp upload"
}
}import { preview, upload, defineConfig } from 'auto-control-miniprogram'
const config = defineConfig({
appid: 'wxXXXXXXXX',
type: 'miniProgram',
projectPath: './dist',
privateKeyPath: './.keys/private.wxXXXXXXXX.key',
build: 'pnpm build',
})
await preview(config)
// 或
await upload(config, { version: '1.0.0', desc: '首次发布' })config 也可以从环境变量装配(适合 CI):
import { preview, defineConfig } from 'auto-control-miniprogram'
await preview(
defineConfig({
appid: process.env.WX_APPID!,
privateKey: process.env.WX_PRIVATE_KEY, // 私钥内容直接注入
projectPath: './dist',
build: false, // CI 流水线里独立做 build
}),
)acmp.config.js(也支持 .cjs / .mjs / .acmprc.json / package.json 的 acmp 字段):
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
appid |
string |
— | 必填,小程序 / 小游戏 AppID |
type |
'miniProgram' | 'miniGame' | 'miniProgramPlugin' | 'miniGamePlugin' |
'miniProgram' |
项目类型 |
projectPath |
string |
'./dist' |
待上传代码目录 |
privateKeyPath |
string |
'./.keys/private.<appid>.key' |
上传私钥文件路径 |
privateKey |
string |
— | 直接传私钥内容(与 privateKeyPath 二选一) |
ignores |
string[] |
['node_modules/**/*'] |
忽略上传的文件 glob |
setting |
CompileSetting |
— | 编译设置(透传给 miniprogram-ci) |
build |
string | false |
— | 上传前自动执行的命令;false 跳过 |
qrcodeFormat |
'terminal' | 'image' | 'base64' |
'terminal' |
二维码输出形式 |
qrcodeOutput |
string |
'./qrcode.jpg' |
二维码图片路径(仅 image 格式) |
pagePath |
string |
'' |
预览的页面路径 |
searchQuery |
string |
'' |
预览页面的 query |
scene |
number |
— | 预览场景值 |
robot |
number |
1 |
上传机器编号(1~30) |
CompileSetting 包含:es6 / es7 / minify / minifyJS / minifyWXML / minifyWXSS / codeProtect / autoPrefixWXSS / uploadWithSourceMap / disableUseStrict / ignoreUploadUnusedFiles。
// acmp.config.js
/** @type {import('auto-control-miniprogram').AcmpConfig} */
module.exports = {
appid: 'wxabc1234567890',
type: 'miniProgram',
projectPath: './dist',
build: 'pnpm build',
qrcodeFormat: 'terminal',
setting: {
es6: true,
es7: true,
minify: true,
autoPrefixWXSS: true,
},
}// acmp.config.js
/** @type {import('auto-control-miniprogram').AcmpConfig} */
module.exports = {
appid: 'wxabc1234567890',
type: 'miniGame',
projectPath: './dist',
build: 'pnpm build',
qrcodeFormat: 'terminal',
ignores: ['node_modules/**/*'],
}更多示例见 examples/。
执行机器的公网出口 IP 没在白名单里。去小程序后台「开发管理 → 开发设置 → 小程序代码上传」加上即可。换网络(WiFi 切换、热点、VPN)后 IP 会变,需要重新加。
扫码账号必须先在小程序后台「成员管理 → 体验成员」中加为体验者。
体验版二维码有效期 25 分钟,过期后重新跑 acmp preview 即可。
自开发账号没有提审 / 发布 API,需要登录 mp.weixin.qq.com → 管理 → 版本管理 → 开发版本 手动「提交审核」。审核通过后再点「发布」。
把私钥内容存到 CI Secret,然后通过 privateKey 字段注入:
import { upload, defineConfig } from 'auto-control-miniprogram'
await upload(
defineConfig({
appid: process.env.WX_APPID!,
privateKey: process.env.WX_PRIVATE_KEY!,
projectPath: './dist',
build: false,
}),
{ version: process.env.GIT_TAG!, desc: process.env.GIT_COMMIT_MESSAGE || '' },
)CI 机器的出口 IP 同样要加进白名单。
支持 acmp.config.js / .cjs / .mjs,由 cosmiconfig 加载。TypeScript 配置文件目前需要先编译为 JS。
- 子命令
acmp check:检查 IP / 私钥 / projectPath 等基础项 - 子命令
acmp size:分析包体大小 - 配置文件支持
.ts(jiti 加载) - 第三方平台代开发场景的可选支持
欢迎在 Issues 提建议。
参见 CONTRIBUTING.md。
- 微信团队的
miniprogram-ci— 一切上传 / 预览能力的底层来源 - 掘金 · 微信小程序 CI/CD 实践 — 早期方案参考
MIT © wangjunbin