fdm
Version:
基于gulp的1688前端集成化工具
236 lines (195 loc) • 5.66 kB
JavaScript
/**
* dongming.jidm
*/
;
var spawn = require('win-spawn');
var colors = require('colors');
var fs = require('fs');
var inquirer = require('inquirer');
var Gaea = require('../utils/gaea');
var nopt = require('nopt');
var branchInSvn = {};
var Path = require('path');
var helper = require('../utils/helper');
var gaeaWorkdir = Path.join(helper.getHomeDir(), 'neat.fdm', 'gaea');
var username = '';
var aonecrid = '';
var gaeaIp = '';
var gaeaUser = '';
var gaeaPass = '';
var parsed = null;
module.exports = {
help: function() {
p(_help());
},
run: function(argv) {
var knownOpts = {
"env": Boolean,
"ci": Boolean,
"nobuild": Boolean,
"build": Boolean,
"username": String,
"crid": String,
"help": Boolean
};
var shortHands = {
"e": ["--env"],
"c": ["--ci"],
"b": ["--build"],
"nb": ["--nobuild"],
"u": ["--username"],
"id": ["--crid"],
"h": ["--help"],
"ec": ["--env", "--ci"]
}
parsed = nopt(knownOpts, shortHands, argv);
if(parsed.argv.original.length === 1 || parsed.help) {
this.help();
return;
}
var questions = [];
if( !parsed.username && parsed.crid ) {
questions.push({
type: "input",
name: "user",
message: "请输入你的邮箱前缀:"
});
}
if( parsed.username && !parsed.crid ) {
questions.push({
type: "input",
name: "crid",
message: "请输入你参与的项目CRID:"
});
}
if( !parsed.username && !parsed.crid ) {
questions.push({
type: "input",
name: "user",
message: "请输入你的邮箱前缀:"
});
questions.push({
type: "input",
name: "crid",
message: "请输入你参与的项目CRID:"
});
}
if( parsed.env || parsed.ci ) {
// 申请盖娅测试机资源
inquirer.prompt( questions, function( answers ) {
username = answers.user || parsed.username;
aonecrid = answers.crid || parsed.crid;
p('正在申请盖娅测试机...');
Gaea.applyGaeaEnv(username, aonecrid, applyGaeaCallback);
});
return;
}
if( parsed.build ) {
// 拉取AONE上的项目分支并编译
inquirer.prompt( questions, function( answers ) {
username = answers.user || parsed.username;
aonecrid = answers.crid || parsed.crid;
p('正在获取项目中的代码分支...');
Gaea.getProjectBranches(aonecrid, getBranchesCallback);
});
return;
}
}
};
function applyGaeaCallback(data) {
if( data.success ) {
var content = data.data.content;
gaeaIp = content.hostip;
gaeaUser = content.loginname;
gaeaPass = content.password;
p('我已为你申请了盖娅测试机资源哦:');
p('ip:', gaeaIp.green);
p('user:', gaeaUser.green);
p('password:', gaeaPass.green);
if(parsed.ci) {
Gaea.getProjectBranches(aonecrid, getBranchesCallback);
}
} else {
console.log('[ERROR]'.red, data.data.message);
}
}
function getBranchesCallback(data) {
if( data.success ) {
p('PC分支:');
data.data.content.pc.forEach(function(ele, index) {
p(ele);
});
p('Mobile分支:');
data.data.content.mobile.forEach(function(ele, index) {
p(ele);
});
p('正在创建目录结构...');
Gaea.makeDirectoryStruct(data.data.content, aonecrid, mkdirStructCallback);
} else {
console.log('[ERROR]'.red, data.data.message);
}
}
function mkdirStructCallback(err, data) {
if( err ) {
throw err;
}
branchInSvn = data;
p('正在拉取项目分支...');
Gaea.fillDirectory(data, username, fillDirCallback);
}
function fillDirCallback(data) {
if(data) {
// p('[ERROR]'.red, '请检查你的svn环境,如果你用的是windows,可能还没有安装svn命令行工具,安装后重试');
// p('怎样安装svn命令行工具,可以参考doc/gaea.md');
throw data;
// return;
}
if( parsed.nobuild ) {
buildProjectCallback();
return;
}
p('开始编译项目...');
Gaea.buildProject(branchInSvn, buildProjectCallback);
}
function buildProjectCallback(data) {
if(data) {
throw data;
}
if( parsed.ci ) {
if( parsed.nobuild ) {
var destdir = Path.join(gaeaWorkdir, aonecrid);
} else {
var destdir = Path.join(gaeaWorkdir, aonecrid + '-dest');
}
Gaea.pushtoGaea(destdir, gaeaIp, gaeaUser, gaeaPass, aonecrid, pushtoGaeaCallback);
}
}
function pushtoGaeaCallback(data) {
if(data) {
throw data;
}
p('恭喜!项目已成功部署到盖娅');
}
function _help() {
return [
' Useage: fdm gaea [-e env]',
' [-c ci]',
' [-b build]',
' [-u username]',
' [-id crid]',
' [-h help]',
'',
' Options:',
'',
' -c | --ci 部署到盖娅',
' -b | --build 将AONE上的项目拉下来编译',
' -e | --env 申请盖娅测试机',
' -nb | --nobuild 与-c连用,将未编译的代码部署到盖娅',
' -u | --username 与-c/-b/-e连用,输入你的邮箱前缀',
' -id | --crid 与-c/-b/-e连用,输入你参与的项目crid',
' -h | --help 打印帮助信息'
].join('\n');
}
function p() {
console.log.apply(console, arguments);
}