saveOSSAGitte.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /**
  2. * build成功后的运行逻辑
  3. */
  4. const path = require("path");
  5. const fs = require("fs");
  6. const oss = require("ali-oss");
  7. const { execSync } = require("child_process");
  8. // 获取需要更新的文件
  9. const NewFiles = (process.argv[2] || "").split("=")[1];
  10. console.log(NewFiles);
  11. class saveOssGitte {
  12. deleteFiles = [];
  13. constructor() {
  14. this.localDir = "dist/";
  15. this.baseOssDir = "topic/activity/";
  16. this.client = new oss({
  17. region: "oss-cn-chengdu",
  18. // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  19. accessKeyId: "LTAI4GEBqfF1GX4VwsYU2Wpg",
  20. accessKeySecret: "rVIv0E1lRfXOCrAmkFTZnfgWiuv4ea",
  21. bucket: "smcic-index",
  22. });
  23. this.execFun();
  24. if (!NewFiles) this.delDir();
  25. else this.delOneDir(NewFiles);
  26. }
  27. /**
  28. * 上传git
  29. */
  30. execFun() {
  31. try {
  32. execSync("git add .");
  33. execSync(`git commit -m "${process.argv[2] || "提交"}"`);
  34. execSync("git push -u origin master");
  35. // execSync("git push -u github master");
  36. console.log("上传git---完成");
  37. } catch (e) {
  38. console.log("上传git---失败");
  39. console.error(e);
  40. }
  41. }
  42. /**
  43. * 获得上传目录下的所有文件路径
  44. * 删除oss指定路径下文件
  45. */
  46. async delDir() {
  47. let list = await this.client.list({
  48. prefix: this.baseOssDir,
  49. });
  50. (list.objects || []).splice(0, 1);
  51. // 删除文件
  52. await Promise.all(
  53. list.objects.map(async v => {
  54. try {
  55. await this.client.delete(v.name);
  56. } catch (error) {
  57. error.failObjectName = v.name;
  58. return error;
  59. }
  60. })
  61. );
  62. console.log("oss文件清除---完成");
  63. try {
  64. await this.getFiles(path.resolve(__dirname, "./" + this.localDir));
  65. } catch (err) {
  66. console.log("数据上传oss---失败");
  67. }
  68. }
  69. /**
  70. * 删除指定文件
  71. * @param {string} pathDir
  72. */
  73. async delOneDir(pathDir) {
  74. try {
  75. await this.client.delete(this.baseOssDir + pathDir + ".html");
  76. await this.client.delete(this.baseOssDir + "/js/" + pathDir + ".js");
  77. deleteFiles.push(this.baseOssDir + pathDir + ".html");
  78. deleteFiles.push(this.baseOssDir + "/js/" + pathDir + ".js");
  79. // 查找静态资源下对应的文件
  80. let listimage = await this.client.list({
  81. prefix: this.baseOssDir + "/image",
  82. });
  83. let listmedia = await this.client.list({
  84. prefix: this.baseOssDir + "/media",
  85. });
  86. let listfonts = await this.client.list({
  87. prefix: this.baseOssDir + "/fonts",
  88. });
  89. console.log(listimage);
  90. console.log(listmedia);
  91. console.log(listfonts);
  92. // let imageList = listimage.objects.filter(v => v.name.includes(pathDir));
  93. // let mediaList = listmedia.objects.filter(v => v.name.includes(pathDir));
  94. // let fontsList = listfonts.objects.filter(v => v.name.includes(pathDir));
  95. // await Promise.all(
  96. // imageList.map(async v => {
  97. // try {
  98. // await this.client.delete(v.name); // 删除文件
  99. // deleteFiles.push(v.name);
  100. // } catch (err) {
  101. // err.failObjectName = v.name;
  102. // return err;
  103. // }
  104. // }),
  105. // mediaList.map(async v => {
  106. // try {
  107. // await this.client.delete(v.name); // 删除文件
  108. // deleteFiles.push(v.name);
  109. // } catch (err) {
  110. // err.failObjectName = v.name;
  111. // return err;
  112. // }
  113. // }),
  114. // fontsList.map(async v => {
  115. // try {
  116. // await this.client.delete(v.name); // 删除文件
  117. // deleteFiles.push(v.name);
  118. // } catch (err) {
  119. // err.failObjectName = v.name;
  120. // return err;
  121. // }
  122. // })
  123. // )
  124. console.log("oss文件清除---完成");
  125. } catch (err) {
  126. console.log("oss文件清除---失败");
  127. console.error(err);
  128. }
  129. }
  130. /**
  131. * 获取localDir下的所有文件路径
  132. * @param {string} pathDir
  133. */
  134. async getFiles(pathDir) {
  135. const dirList = fs.readdirSync(pathDir) || [];
  136. for (let i = 0; i < dirList.length; i++) {
  137. const P = [pathDir, dirList[i]];
  138. const stat = fs.lstatSync(P.join("\\"));
  139. if (!stat.isDirectory()) {
  140. await this.upFileOSS(P);
  141. } else this.getFiles(P.join("\\"));
  142. }
  143. }
  144. /**
  145. * 上传文件到oss
  146. * @param {string} filePath
  147. */
  148. async upFileOSS(filePath) {
  149. try {
  150. // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
  151. // 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
  152. let dir = filePath[0].split("\\");
  153. dir = dir.reverse()[0] + "/";
  154. if (dir === this.localDir) dir = "";
  155. await this.client.put(
  156. this.baseOssDir + dir + filePath[1],
  157. path.normalize(filePath.join("\\"))
  158. // 自定义headers
  159. //,{headers}
  160. );
  161. // const result = await client.multipartUpload(filePath[1], this.baseOssDir + dir + filePath[1], {
  162. // partSize: 1 * 1024 * 1024, // 分片大小1MB
  163. // progress: (p) => console.log(`进度:${Math.round(p * 100)}%`)
  164. // });
  165. // console.log('分片上传完成:', result);
  166. console.log("数据上传oss---完成");
  167. } catch (e) {
  168. console.error("未成功上传:", filePath.join("\\"));
  169. console.log("err--->", e);
  170. }
  171. }
  172. }
  173. new saveOssGitte();