UNPKG

fis3-deploy-bos

Version:

发布文件到百度云

190 lines (161 loc) 5.02 kB
/** * @description 发布文件到百度bos * @author duanjun * @date */ /*eslint browser: true, esversion: 6, vars: true, nomen: true, indent: 4, maxlen: 120, plusplus: true, sloppy: true*/ /*global define: true, require, $ , module, angular, __inline, console, phantom*/ var fs = require('fs'); var path = require('path'); var async = require('async'); var bce = require('bce-sdk-js'); function getTempPath() { var tmpPath = fis.project.getTempPath() + path.sep + 'fis3_deploy_bos'; return tmpPath; } function includeFilter(options) { var include = options.include || []; if (typeof include === 'string') { include = include.split(/[\s,]+/); } else if (include && !Array.isArray(include)) { include = [include]; } var includeGlob = include && include.map(function (str) { return fis.util.glob(str); }); function isIncluded(path) { if (!includeGlob) { return false; } var allPassed = includeGlob.every(function (pattern) { return !pattern.test(path); }); return !allPassed; } function filter(files) { var result = []; files.forEach(function (file) { if (isIncluded(file.release)) { result.push(file); } }); return result; } return { filter: filter }; } // 缓存文件 function fileCache(options) { var tmpPath = getTempPath() + path.sep + options.bucket; var dir = options.dir.replace(/\//g, ''); var jsonPath = tmpPath + path.sep + options.bucket + '-' + (options.cacheName || 'cache') + '.json'; var cache = {}; if (fis.util.isFile(jsonPath)) { if (options.cache) { cache = fis.util.readJSON(jsonPath); } else { fis.util.del(jsonPath); } } function save() { fis.util.write(jsonPath, JSON.stringify(cache)); } function filter(files) { var result = []; files.forEach(function (file) { var id = file.getId(), hash = file.getHash(); if (!cache[id] || cache[id] !== hash) { //cache[id] = hash; result.push(file); } }); return result; } function addFile(file) { cache[file.getId()] = file.getHash(); } return { filter: filter, addFile: addFile, save: save }; } function extend(target) { var sources = [].slice.call(arguments, 1); sources.forEach(function (source) { for (var prop in source) { target[prop] = source[prop]; } }); return target; } module.exports = function (options, modified, total, next) { options = extend({ cache: true, cacheName: '', include: [], bucket: '', dir: '', parallelUploadFile: 2, endpoint: 'http://bos.bj.baidubce.com', ak: '', sk: '' }, options); var uploadInclude = includeFilter(options); var uploadCache = fileCache(options); var files = modified.length == 0 ? total : modified; var fileCount = files.length; //先排除 var uploadFiles = uploadInclude.filter(files); uploadFiles = options.cache ? uploadCache.filter(uploadFiles) : uploadFiles; var uploadTmpPath = getTempPath() + path.sep + fis.project.currentMedia() + '-release'; var bosClient = new bce.BosClient({ endpoint: options.endpoint, credentials: { ak: options.ak, sk: options.sk } }); function putObjectFromFile(file) { var target = uploadTmpPath + path.sep + file.getHashRelease(); var key = options.dir + path.sep + file.getHashRelease(); fis.util.write(target, file.getContent()); return bosClient.putObjectFromFile(options.bucket, key, target); } console.log('\n\x1b[32mupload start ......') fis.util.del(uploadTmpPath); async.mapLimit(uploadFiles, options.parallelUploadFile, function (file, callback) { var retryTimes = 1; function errorHandle(error) { if (retryTimes <= 3) { setTimeout(function () { console.log('retry ' + retryTimes + ' times...'); retryTimes += 1; upload(); }, 1000 * retryTimes); } else { callback(error); } } function upload() { console.log(file.getHashRelease()); putObjectFromFile(file).then(function (response) { // 成功一个缓存一个 uploadCache.addFile(file); callback(null, file) }).catch(errorHandle); } upload(); }, function (error, results) { if (error) { console.log(error); } uploadCache.save(); console.log('\x1b[32mupload end'); next(); }); }