saveOSSAGitte.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. this.delDir()
  27. }
  28. /**
  29. * 上传git
  30. */
  31. execFun() {
  32. try {
  33. execSync("git add .");
  34. execSync(`git commit -m "${process.argv[2] || "提交"}"`);
  35. execSync("git push -u origin master");
  36. // execSync("git push -u github master");
  37. console.log("上传git---完成");
  38. } catch (e) {
  39. console.log("上传git---失败");
  40. console.error(e);
  41. }
  42. }
  43. /**
  44. * 获得上传目录下的所有文件路径
  45. * 删除oss指定路径下文件
  46. */
  47. async delDir() {
  48. let list = await this.client.list({
  49. prefix: this.baseOssDir,
  50. });
  51. (list.objects || []).splice(0, 1);
  52. // 删除文件
  53. await Promise.all(
  54. list.objects.map(async v => {
  55. try {
  56. await this.client.delete(v.name);
  57. } catch (error) {
  58. error.failObjectName = v.name;
  59. return error;
  60. }
  61. })
  62. );
  63. console.log("oss文件清除---完成");
  64. try {
  65. await this.getFiles(path.resolve(__dirname, "./" + this.localDir));
  66. } catch (err) {
  67. console.log("数据上传oss---失败");
  68. }
  69. }
  70. /**
  71. * 删除指定文件
  72. * @param {string} pathDir
  73. */
  74. async delOneDir(pathDir) {
  75. try {
  76. await this.client.delete(this.baseOssDir + pathDir + ".html");
  77. await this.client.delete(this.baseOssDir + "/js/" + pathDir + ".js");
  78. this.deleteFiles.push(this.baseOssDir + pathDir + ".html");
  79. this.deleteFiles.push(this.baseOssDir + "/js/" + pathDir + ".js");
  80. // 查找静态资源下对应的文件
  81. let listimage = await this.client.list({
  82. prefix: this.baseOssDir + "/image",
  83. });
  84. let listmedia = await this.client.list({
  85. prefix: this.baseOssDir + "/media",
  86. });
  87. let listfonts = await this.client.list({
  88. prefix: this.baseOssDir + "/fonts",
  89. });
  90. console.log(listimage);
  91. console.log(listmedia);
  92. console.log(listfonts);
  93. // let imageList = listimage.objects.filter(v => v.name.includes(pathDir));
  94. // let mediaList = listmedia.objects.filter(v => v.name.includes(pathDir));
  95. // let fontsList = listfonts.objects.filter(v => v.name.includes(pathDir));
  96. // await Promise.all(
  97. // imageList.map(async v => {
  98. // try {
  99. // await this.client.delete(v.name); // 删除文件
  100. // this.deleteFiles.push(v.name);
  101. // } catch (err) {
  102. // err.failObjectName = v.name;
  103. // return err;
  104. // }
  105. // }),
  106. // mediaList.map(async v => {
  107. // try {
  108. // await this.client.delete(v.name); // 删除文件
  109. // this.deleteFiles.push(v.name);
  110. // } catch (err) {
  111. // err.failObjectName = v.name;
  112. // return err;
  113. // }
  114. // }),
  115. // fontsList.map(async v => {
  116. // try {
  117. // await this.client.delete(v.name); // 删除文件
  118. // this.deleteFiles.push(v.name);
  119. // } catch (err) {
  120. // err.failObjectName = v.name;
  121. // return err;
  122. // }
  123. // })
  124. // )
  125. console.log("oss文件清除---完成");
  126. } catch (err) {
  127. console.log("oss文件清除---失败");
  128. console.error(err);
  129. }
  130. }
  131. /**
  132. * 获取localDir下的所有文件路径
  133. * @param {string} pathDir
  134. */
  135. async getFiles(pathDir) {
  136. const dirList = fs.readdirSync(pathDir) || [];
  137. for (let i = 0; i < dirList.length; i++) {
  138. const P = [pathDir, dirList[i]];
  139. const stat = fs.lstatSync(P.join("\\"));
  140. if (!stat.isDirectory()) {
  141. await this.upFileOSS(P);
  142. } else this.getFiles(P.join("\\"));
  143. }
  144. }
  145. /**
  146. * 上传文件到oss
  147. * @param {string} filePath
  148. */
  149. async upFileOSS(filePath) {
  150. try {
  151. // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
  152. // 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
  153. let dir = filePath[0].split("\\");
  154. dir = dir.reverse()[0] + "/";
  155. if (dir === this.localDir) dir = "";
  156. await this.client.put(
  157. this.baseOssDir + dir + filePath[1],
  158. path.normalize(filePath.join("\\"))
  159. // 自定义headers
  160. //,{headers}
  161. );
  162. // const result = await client.multipartUpload(filePath[1], this.baseOssDir + dir + filePath[1], {
  163. // partSize: 1 * 1024 * 1024, // 分片大小1MB
  164. // progress: (p) => console.log(`进度:${Math.round(p * 100)}%`)
  165. // });
  166. // console.log('分片上传完成:', result);
  167. console.log("数据上传oss---完成");
  168. } catch (e) {
  169. console.error("未成功上传:", filePath.join("\\"));
  170. console.log("err--->", e);
  171. }
  172. }
  173. }
  174. new saveOssGitte();