upload.main.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 (args) => {
  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. type: 1,
  45. appName: '',
  46. app: {}
  47. };
  48. // console.log('args', args);
  49. if (args) {
  50. // console.log('入参args:', args)
  51. config.type = parseInt(args['t']);
  52. if (config.type === 2) {
  53. config.appName = args['a'];
  54. config.app = config.appIds.find(item => item.name === config.appName);
  55. if (!config.app) {
  56. console.log(`未找到小程序[${config.appId}]`);
  57. return
  58. }
  59. }
  60. config.desc = args['d']; // 描述
  61. config.version = args['v']; // 版本
  62. }
  63. let desc_one = `本次提交小程序: ${config.appIds.map(item => `${item.name} (${item.appid})`).join(', ')}`;
  64. if (config.type === 2) {
  65. desc_one = `本次提交小程序: ${config.app.name} (${config.app.appid})`;
  66. }
  67. let desc_two = `版本: ${config.version}`;
  68. let desc_three = `描述: ${config.desc}` + '\n' + '▶️ 开始上传IAA小说代码';
  69. console.log(desc_one);
  70. console.log(desc_two);
  71. console.log(`环境: ${config.env}`);
  72. console.log(desc_three);
  73. // sendNotice(desc_one + '\n' + desc_two + '\n' +
  74. // '-----------------------------------'
  75. // + desc_three);
  76. // 3. 顺序发布(避免并发资源竞争)
  77. let successCount = 0;
  78. let failedCount = 0;
  79. let failApp = '';
  80. if (config.type === 2) {
  81. try {
  82. console.log(`\n开始发布小程序: ${config.app.name} (${config.app.appid}) 版本:${config.version}`);
  83. await publishMiniProgram({
  84. appid: config.app.appid,
  85. name: config.app.name,
  86. version: config.version,
  87. desc: `${config.env}——${config.desc}`,
  88. env: config.env
  89. });
  90. successCount++;
  91. console.log(`✅ 发布成功: ${config.app.name} 版本:${config.version}`);
  92. } catch (e) {
  93. failedCount++;
  94. console.error(`❌ 发布失败: ${config.app.name} (${config.app.appid}) 版本:${config.version}`, e.message);
  95. failApp += `${config.app.name} (${config.app.appid})\n`;
  96. }
  97. } else {
  98. for (const [index, item] of config.appIds.entries()) {
  99. try {
  100. console.log(`\n开始发布第 ${index + 1} 个小程序: ${item.name} (${item.appid}) 版本:${config.version}`);
  101. await publishMiniProgram({
  102. appid: item.appid,
  103. name: item.name,
  104. version: config.version,
  105. desc: `${config.env}——${config.desc}`,
  106. env: config.env
  107. });
  108. successCount++;
  109. console.log(`✅ 发布成功: ${item.name} 版本:${config.version}`);
  110. } catch (err) {
  111. failedCount++;
  112. console.error(`❌ 发布失败: ${item.name} 版本:${config.version}`, err.message);
  113. failApp += `${item.name} (${item.appid})\n`;
  114. }
  115. }
  116. }
  117. resultMsg = '版本:' + config.version + `\n发布结果: ✅ ${successCount} 个小程序发布成功,❌ ${failedCount} 个小程序发布失败。` + '\n失败列表:' + failApp;
  118. // sendNotice(resultMsg);
  119. // 4. 返回统计结果
  120. return {
  121. success: successCount,
  122. failed: failedCount,
  123. };
  124. } catch (e) {
  125. console.error('❌ 启动发布流程失败:', e.message);
  126. throw e;
  127. }
  128. }
  129. function sendNotice(msg) {
  130. console.log(msg)
  131. url = config.robot
  132. if (url) {
  133. fetch(url, {
  134. method: 'POST',
  135. headers: {
  136. 'Content-Type': 'application/json'
  137. },
  138. body: JSON.stringify({
  139. msgtype: 'text',
  140. text: {
  141. content: msg
  142. }
  143. })
  144. })
  145. } else {
  146. console.log('未配置机器人地址')
  147. }
  148. }