upload.main.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const {fork} = require('child_process');
  2. const fs = require('fs');
  3. const path = require('path');
  4. let config = {
  5. appIds: [], // 小程序appid
  6. version: "",//版本号
  7. desc: "",//版本描述
  8. env: '正式环境'
  9. }
  10. function publishMiniProgram(options) {
  11. return new Promise((resolve, reject) => {
  12. const child = fork('./destroy/upload.wx.js');
  13. // console.log('入参:',options);
  14. child.send(options);
  15. child.on('message', (msg) => {
  16. if (msg.error) {
  17. reject(new Error(msg.error));
  18. } else {
  19. resolve(msg);
  20. }
  21. });
  22. child.on('error', reject);
  23. child.on('exit', (code) => {
  24. if (code !== 0) {
  25. reject(new Error(`child process exited with code ${code}`));
  26. }
  27. });
  28. })
  29. }
  30. exports.start = async () => {
  31. try {
  32. const file = await fs.promises.readFile(
  33. path.join(__dirname, '../destroy/config.json'),
  34. 'utf-8'
  35. );
  36. const fileJson = JSON.parse(file);
  37. config = {
  38. ...config,
  39. appIds: fileJson.appIds,
  40. version: fileJson.version,
  41. desc: fileJson.desc,
  42. env: fileJson.env || '正式环境',
  43. robot: fileJson.robot
  44. };
  45. let desc_one = `本次提交小程序: ${config.appIds.map(item => `${item.name} (${item.appid})`).join(', ')}`;
  46. let desc_two = `版本: ${config.version}`;
  47. let desc_three = `描述: ${config.desc}` + '\n' + '▶️ 开始上传IAA小说代码';
  48. console.log(desc_one);
  49. console.log(desc_two);
  50. console.log(`环境: ${config.env}`);
  51. console.log(desc_three);
  52. sendNotice(desc_one + '\n' + desc_two + '\n' +
  53. '-----------------------------------'
  54. + desc_three);
  55. // 3. 顺序发布(避免并发资源竞争)
  56. let successCount = 0;
  57. let failedCount = 0;
  58. let failApp = '';
  59. for (const [index, item] of config.appIds.entries()) {
  60. try {
  61. console.log(`\n开始发布第 ${index + 1} 个小程序: ${item.name} (${item.appid}) 版本:${config.version}`);
  62. await publishMiniProgram({
  63. appid: item.appid,
  64. name: item.name,
  65. version: config.version,
  66. desc: `${config.env}——${config.desc}`,
  67. env: config.env
  68. });
  69. successCount++;
  70. console.log(`✅ 发布成功: ${item.name} 版本:${config.version}`);
  71. } catch (err) {
  72. failedCount++;
  73. console.error(`❌ 发布失败: ${item.name} 版本:${config.version}`, err.message);
  74. failApp += `${item.name} (${item.appid})\n`;
  75. }
  76. }
  77. resultMsg = '版本:' + config.version + `\n发布结果: ✅ ${successCount} 个小程序发布成功,❌ ${failedCount} 个小程序发布失败。` + '\n失败列表:' + failApp;
  78. sendNotice(resultMsg);
  79. // 4. 返回统计结果
  80. return {
  81. success: successCount,
  82. failed: failedCount,
  83. };
  84. } catch (e) {
  85. console.error('❌ 启动发布流程失败:', e.message);
  86. throw e;
  87. }
  88. }
  89. function sendNotice(msg) {
  90. console.log(msg)
  91. url = config.robot
  92. if (url) {
  93. fetch(url, {
  94. method: 'POST',
  95. headers: {
  96. 'Content-Type': 'application/json'
  97. },
  98. body: JSON.stringify({
  99. msgtype: 'text',
  100. text: {
  101. content: msg
  102. }
  103. })
  104. })
  105. } else {
  106. console.log('未配置机器人地址')
  107. }
  108. }