Taro 小程序自动化流水线:使用 miniprogram-ci 实现脚本化一键构建与上传
通过实现自动化上传,我们不仅摆脱了对可视化工具的依赖,还为后续集成到 Jenkins、GitHub Actions 等 CI 系统打下了基础。这在大中型前端团队的规范化流程中几乎是必不可少的。希望这篇文章能帮你提升小程序开发效率!如果你有更好的自动化方案,欢迎在评论区交流。
·
1. 背景与痛点
在微信小程序的日常开发中,传统的上传流程往往是这样的:
- 在编辑器(如 VSCode)写完代码。
- 打开「微信开发者工具」。
- 等待项目编译完成。
- 点击界面上的「上传」按钮。
- 输入版本号和更新备注。
这套流程虽然直观,但在多人协作或者需要频繁发布测试版本时,显得既繁琐又低效。更重要的是,它无法集成到 CI/CD 自动化流水线中。
为了解决这个问题,微信官方推出了 miniprogram-ci。本文将带你通过编写一个简单的 Node.js 脚本,实现从本地构建到自动上传的全过程。
2. 前期准备
在开始编写脚本之前,需要完成以下准备工作:
2.1 获取 AppID 和 上传密钥
- 登录 微信公众平台。
- 进入 开发管理 -> 开发设置 -> 小程序代码上传。
- 生成 小程序代码上传密钥,下载并妥善保存(通常命名为
private.wxXXXXXX.key)。 - 关闭 IP 白名单限制(或者将你的构建机 IP 加入白名单),否则脚本无法在未授权性 IP 环境下执行上传。
2.2 安装依赖
在你的 Taro 项目根目录下安装 miniprogram-ci:
npm install miniprogram-ci --save-dev
3. 核心实现:编写上传脚本
我们在项目的根目录下创建一个 upload.js 脚本。该脚本不仅负责上传,还会联动 Taro 的构建命令。
3.1 脚本代码示例 (upload.js)
const ci = require('miniprogram-ci');
const path = require('path');
const readline = require('readline');
const { spawn } = require('child_process');
const fs = require('fs');
const config = require('./project.config.json');
// 封装一个简单的交互式提问工具
function ask(question) {
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
return new Promise((resolve) =>
rl.question(question, (answer) => {
rl.close();
resolve(String(answer ?? '').trim());
})
);
}
// 封装 Shell 命令执行
function run(command, args, options = {}) {
return new Promise((resolve, reject) => {
const child = spawn(command, args, { stdio: 'inherit', ...options });
child.on('close', (code) => {
if (code === 0) resolve();
else reject(new Error(`${command} exited with code ${code}`));
});
});
}
(async () => {
// 1. 初始化项目信息
const project = new ci.Project({
appid: config.appid,
type: 'miniProgram',
projectPath: path.join(__dirname, './dist'), // Taro 编译后的目录
privateKeyPath: path.join(__dirname, './private.key'), // 你下载的上传密钥
ignores: ['node_modules/**/*'],
});
try {
// 2. 自动化构建
console.log('正在执行构建: npm run build:weapp...');
await run(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['run', 'build:weapp'], {
cwd: __dirname,
});
// 3. 交互式获取版本信息
const version = (await ask('请输入版本号 (默认 1.0.0): ')) || '1.0.0';
const desc = (await ask('请输入备注 (默认 Automated upload): ')) || 'Automated upload';
// 4. 执行上传
console.log(`正在上传版本 v${version}...`);
const uploadResult = await ci.upload({
project,
version,
desc,
setting: {
es6: true,
minify: true,
autoPrefixWXSS: true,
},
onProgressUpdate: console.log,
});
console.log('上传成功!', uploadResult);
} catch (error) {
console.error('上传失败:', error);
process.exit(1);
}
})();
3.2 关键代码解析
ci.Project: 用于定义项目的基本信息,包括appid、代码路径和私钥路径。ci.upload: 核心上传接口。你可以配置代码压缩(minify)、ES6 转 ES5 等选项,这些选项通常与微信开发者工具中的设置保持一致。spawn构建: 脚本首先调用了npm run build:weapp,确保每次上传的代码都是最新的生产环境包。
4. 实战配置
为了更方便地调用,我们可以将脚本集成到 package.json 的 scripts 中:
{
"scripts": {
"upload": "node upload.js"
}
}
现在,每当你需要发布时,只需在终端输入:
npm run upload
按照提示输入版本号和备注,剩下的工作交给脚本即可!
5. 总结
通过 miniprogram-ci 实现自动化上传,我们不仅摆脱了对可视化工具的依赖,还为后续集成到 Jenkins、GitHub Actions 等 CI 系统打下了基础。这在大中型前端团队的规范化流程中几乎是必不可少的。
希望这篇文章能帮你提升小程序开发效率!如果你有更好的自动化方案,欢迎在评论区交流。
更多推荐
所有评论(0)