upload-mp-weixin.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. const fs = require("fs");
  2. const path = require("path");
  3. const https = require("https");
  4. const ci = require("miniprogram-ci");
  5. const execSync = require("child_process").execSync;
  6. const distDir = path.resolve(__dirname, "../dist");
  7. // 实例化小程序 ci
  8. const project = new ci.Project({
  9. appid: "",
  10. type: "miniProgram",
  11. projectPath: path.resolve(distDir, "./build/mp-weixin"),
  12. privateKeyPath: path.resolve(__dirname, "./private..key"),
  13. ignores: [],
  14. });
  15. // 钉钉webhook
  16. const dingTalkWebHook = `https://oapi.dingtalk.com/robot/send?access_token=${
  17. process.env.DINGTALK_WEBHOOK_TOKEN || ""
  18. }`;
  19. const gitShortKey = execSync("git rev-parse --short HEAD").toString().trim();
  20. const gitCommitMsg = execSync("git log --pretty=format:“%s” -1")
  21. .toString()
  22. .trim()
  23. .replace(/(^["“])|(["”]$)/g, "");
  24. const gitCommitName = execSync("git log --pretty=format:“%cn” -1")
  25. .toString()
  26. .trim()
  27. .replace(/(^["“])|(["”]$)/g, "");
  28. let desc = `${gitCommitName}: ${gitCommitMsg}`;
  29. if (process.env.change_desc && process.env.operator) {
  30. desc = `${process.env.operator}: ${process.env.change_desc}`;
  31. }
  32. // 发布钉钉通知
  33. const postDingTalk = (qrcode, isPro = false, version) => {
  34. const ver = isPro ? "体验版" : "开发版";
  35. const data = JSON.stringify({
  36. msgtype: "markdown",
  37. markdown: {
  38. title: `小程序 【${ver}】上传成功`,
  39. text: `# [小程序 【${ver}】](${qrcode})上传成功 \n\n @13718996400 \n\n > ${desc} ${
  40. version ? `\n\n > version: ${version}` : ""
  41. } \n\n ![小程序二维码](${qrcode})${
  42. isPro
  43. ? " \n\n 小程序发布请前往[小程序版本管理](https://mp.weixin.qq.com/)"
  44. : ""
  45. }`,
  46. },
  47. at: {
  48. atMobiles: ["13718996400"],
  49. atUserIds: [""],
  50. isAtAll: false,
  51. },
  52. });
  53. return new Promise((resolve, reject) => {
  54. const req = https.request(
  55. {
  56. hostname: "oapi.dingtalk.com",
  57. port: 443,
  58. path: dingTalkWebHook,
  59. method: "POST",
  60. headers: {
  61. "Content-Type": "application/json",
  62. },
  63. },
  64. (res) => {
  65. res.on("data", (d) => {
  66. const resData = JSON.parse(d.toString());
  67. if (res.statusCode === 200 && resData.errcode === 0) {
  68. resolve(resData);
  69. } else {
  70. reject(resData);
  71. }
  72. });
  73. }
  74. );
  75. req.on("error", (e) => {
  76. reject(e);
  77. });
  78. req.write(data);
  79. req.end();
  80. });
  81. };
  82. const onProgressUpdate = (taskStatus) => {
  83. switch (taskStatus._status) {
  84. case "doing":
  85. console.log("上传中: ", taskStatus._msg);
  86. break;
  87. case "done":
  88. console.log("上传完成: ", taskStatus._msg);
  89. break;
  90. }
  91. };
  92. // 测试环境用开发版,不上传至小程序后台
  93. const preview = async () => {
  94. try {
  95. fs.mkdirSync(path.resolve(distDir, `./qrcode`));
  96. } catch (e) {}
  97. const previewResult = await ci.preview({
  98. project,
  99. desc,
  100. setting: {},
  101. qrcodeFormat: "image",
  102. qrcodeOutputDest: path.resolve(distDir, `./qrcode/${gitShortKey}.jpg`),
  103. onProgressUpdate,
  104. pagePath: "pages/index/index", // 预览页面
  105. // searchQuery: 'a=1&b=2', // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`
  106. });
  107. console.log("小程序上传完成🚀 ", previewResult);
  108. try {
  109. console.info("上传二维码完成 🚀", `/${gitShortKey}.jpg`);
  110. } catch (e) {
  111. console.info("上传出错,请检查网络或过会再试 ❌", e);
  112. throw new Error(e);
  113. }
  114. try {
  115. await postDingTalk(`/${gitShortKey}.jpg`);
  116. } catch (e) {}
  117. };
  118. // 正式环境用体验版,上传至小程序后台
  119. const publish = async () => {
  120. const version =
  121. process.env.MP_VERSON || process.env.version
  122. ? `1.0.${process.env.version}`
  123. : "1.0.0";
  124. try {
  125. const uploadResult = await ci.upload({
  126. project,
  127. version,
  128. desc,
  129. setting: {},
  130. onProgressUpdate,
  131. });
  132. console.log("小程序上传完成🚀 ", uploadResult);
  133. } catch (e) {
  134. console.info("上传出错,请检查网络或过会再试 ❌", e);
  135. throw new Error(e);
  136. }
  137. try {
  138. await postDingTalk(`.jpg`, true, version);
  139. } catch (e) {
  140. console.log("钉钉通知失败:", e);
  141. }
  142. };
  143. (async () => {
  144. if (process.argv.includes("--publish")) {
  145. console.log("发布小程序🚀");
  146. publish();
  147. } else {
  148. console.log("上传预览小程序🚀");
  149. preview();
  150. }
  151. })();