fis3-deploy-bos
Version:
发布文件到百度云
190 lines (161 loc) • 5.02 kB
JavaScript
/**
* @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();
});
}