Authored by 姜枫

add ci api

... ... @@ -39,7 +39,7 @@ class Build {
};
}
run(bid) {
run(bid, callback) {
this.bid = bid;
let self = this;
this._prebuild();
... ... @@ -55,6 +55,7 @@ class Build {
let diff = (new Date()).getTime() - self.startTime;
let costTime = moment.duration(diff, 'ms').humanize();
self._log(`\n\n========== build success. cost: ${costTime} =======================`)
callback();
}).catch((e) => {
console.error(e);
self._state('fail');
... ...
'use strict';
const Router = require('koa-router');
const _ = require('lodash');
const Operation = require('../../logger/operation');
const Build = require('../../ci/build');
const Deploy = require('../../ci/deploy');
const DeployPool = require('../../ci/deploy_pool');
const {
Building,
Project,
Server,
DeployInfo,
RestartInfo,
DeleteRestartInfo
} = require('../../models');
let r = new Router();
r.get('/params', async(ctx) => {
ctx.body = {
env: {
production: '线上环境',
preview: '灰度环境'
},
cloud: {
aws: '亚马逊',
qcloud: '腾讯云'
}
};
});
r.get('/projects', async(ctx) => {
let q = ctx.request.query;
let cloud = _.trim(q.cloud);
let query = {};
if (cloud) {
query.cloud = cloud;
}
let projects = await Project.find(query);
ctx.body = _.map(projects, p => {
return {
id: p._id,
name: p.name,
subname: p.subname
};
});
});
r.get('/publish', async (ctx) => {
let q = ctx.request.query;
let id = q.id;
let env = q.env;
let branch = q.branch;
let p = await Project.findById(id);
let build = new Build(p);
let {
buildTime,
distFile
} = build.build(branch);
let buildingDoc = await Building.insert({
buildTime: buildTime,
project: p.name,
projectId: id,
branch: branch,
env: env,
distFile: distFile,
state: 'waiting',
md5: '',
createdAt: new Date(),
updatedAt: new Date()
});
let building = buildingDoc[0];
let bid = building._id;
build.run(bid, async () => {
let targets = p.deploy[env].target;
if (typeof targets === 'string') {
targets = [targets];
}
targets.forEach(async(host) => {
let deploy = new Deploy(p, building, host);
DeployPool.deploy(deploy);
});
await Operation.action('app', 'PROJECT_DEPLOY', '项目分发部署', {
_id: bid,
project: p.name,
branch: building.branch,
env: building.env
});
});
await Operation.action('app', 'NEW_PROJECT_BUILDING', '新增项目构建', {
_id: id,
project: p.name,
branch: branch,
env: env
});
ctx.body = {
code: 200,
bid: bid
};
});
r.get('/builds', async (ctx) => {
let q = ctx.request.query;
let buildings = await Building.cfind({
env: q.env,
projectId: q.id,
state: 'success'
}).sort({
buildTime: -1
}).limit(30).exec();
ctx.body = _.map(buildings, b => {
return {id: b._id, createdAt: b.createdAt, buildNo: b.buildTime};
});
});
r.get('/rollback', async (ctx) => {
let q = ctx.request.query;
let buildingId = q.id;
let building = await Building.findById(q.id);
if (!building) {
ctx.body = {
code: 201,
msg: '该版本不存在'
};
} else if (building.state == 'success') {
let project = await Project.findById(building.projectId);
let targets = project.deploy[building.env].target;
if (typeof targets === 'string') {
targets = [targets];
}
targets.forEach(async(host) => {
let doc = await DeployInfo.findOne({
projectId: project._id,
host: host,
env: building.env
});
if (!doc || doc.state !== 'running' || doc.building !== building.buildTime) {
let deploy = new Deploy(project, building, host);
// if (project.type === 'php') {
// deploy = new DeployPhp(project, building, host);
// } else {
// deploy = new Deploy(project, building, host);
// }
DeployPool.deploy(deploy);
}
});
await Operation.action(ctx.session.user, 'PROJECT_DEPLOY', '项目分发部署', {
_id: buildingId,
project: project.name,
branch: building.branch,
env: building.env
});
ctx.body = {
code: 200,
targets: targets
};
} else {
ctx.body = {
code: 201,
msg: '该版本未构建成功,暂不能分发'
};
}
});
r.get('/state', async (ctx) => {
let q = ctx.request.query;
let building = await Building.findById(q.bid);
let doc = await DeployInfo.find({
projectId: building.projectId,
env: building.env,
building: building.buildTime
});
let deploys = _.map(doc, d => {
return {
host: d.host,
state: d.state
};
});
ctx.body = {
build: building.state,
deploy: deploys
};
});
module.exports = r;
\ No newline at end of file
... ...
... ... @@ -16,6 +16,7 @@ const productCache = require( './actions/product_cache');
const apiCache = require('./actions/api_cache');
const degrade = require('./actions/degrade');
const deploy = require('./actions/deploy');
const api = require('./actions/api');
const noAuth = new Router();
const base = new Router();
... ... @@ -24,6 +25,7 @@ module.exports = function (app) {
noAuth.use('', login.routes(), login.allowedMethods());
noAuth.use('', common.routes(), common.allowedMethods());
noAuth.use('/api', api.routes(), api.allowedMethods());
app.use(noAuth.routes(), noAuth.allowedMethods());
app.use(async (ctx, next) => {
... ... @@ -48,6 +50,8 @@ module.exports = function (app) {
base.use('/degrade', degrade.routes(), degrade.allowedMethods());
base.use('/deploys', deploy.routes(), deploy.allowedMethods());
base.use('', index.routes(), index.allowedMethods());
app.use(base.routes(), base.allowedMethods());
... ...