better wait reasons update + start working on running multiple projects after build complete

This commit is contained in:
oleg 2015-06-15 21:40:01 +03:00
parent 361a5a5436
commit 85844bcb40
4 changed files with 26 additions and 26 deletions

View File

@ -1,6 +1,6 @@
nodes: nodes:
- type: local - type: local
maxExecutorsCount: 1 maxExecutorsCount: 2
notify: {} notify: {}

View File

@ -59,7 +59,7 @@ Distributor.prototype._runNext = function(callback) {
self._updateBuild( self._updateBuild(
queueItem.build, queueItem.build,
{startDate: Date.now(), status: 'in-progress'}, {startDate: Date.now(), status: 'in-progress', waitReason: ''},
this.slot() this.slot()
); );
}, },
@ -75,7 +75,13 @@ Distributor.prototype._runNext = function(callback) {
error: err ? err.message : null error: err ? err.message : null
}, },
function(err, build) { function(err, build) {
self._onBuildComplete(err, build, stepCallback) if (err) {
console.error(
'Error during build update: ', err.stack || err
);
return stepCallback(err);
}
self._onBuildComplete(build, stepCallback);
} }
); );
}); });
@ -107,13 +113,14 @@ Distributor.prototype._updateWaitReasons = function() {
}); });
var waitReason = _(waitReasons).compact().join(', '); var waitReason = _(waitReasons).compact().join(', ');
if (waitReason !== item.build.waitReason) { // set only non-empty reasons
if (waitReason && waitReason !== item.build.waitReason) {
self._updateBuild(item.build, {waitReason: waitReason}); self._updateBuild(item.build, {waitReason: waitReason});
} }
}); });
}; };
Distributor.prototype._onBuildComplete = function(err, build, callback) { Distributor.prototype._onBuildComplete = function(build, callback) {
var self = this; var self = this;
Steppy( Steppy(

View File

@ -28,6 +28,10 @@ Node.prototype.hasFreeExecutor = function(project) {
return !this.getExecutorWaitReason(project); return !this.getExecutorWaitReason(project);
}; };
Node.prototype.getFreeExecutorsCount = function() {
return this.maxExecutorsCount - _(this.executors).size();
};
Node.prototype._createExecutor = function(project) { Node.prototype._createExecutor = function(project) {
return createExecutor({ return createExecutor({
type: this.type, type: this.type,

View File

@ -69,20 +69,15 @@ describe('Distributor', function() {
expect(changes.completed).equal(false); expect(changes.completed).equal(false);
}); });
it('build should have empty wait reason', function() { it('build should be in-progress', function() {
var changes = updateBuildSpy.getCall(1).args[1]; var changes = updateBuildSpy.getCall(1).args[1];
expect(changes).only.have.keys('waitReason'); expect(changes).only.have.keys('startDate', 'status', 'waitReason');
expect(changes.status).equal('in-progress');
expect(changes.waitReason).equal(''); expect(changes.waitReason).equal('');
}); });
it('build should be in-progress', function() {
var changes = updateBuildSpy.getCall(2).args[1];
expect(changes).only.have.keys('startDate', 'status');
expect(changes.status).equal('in-progress');
});
it('build should be done', function() { it('build should be done', function() {
var changes = updateBuildSpy.getCall(3).args[1]; var changes = updateBuildSpy.getCall(2).args[1];
expect(changes).only.have.keys( expect(changes).only.have.keys(
'endDate', 'status', 'completed', 'error' 'endDate', 'status', 'completed', 'error'
); );
@ -91,8 +86,8 @@ describe('Distributor', function() {
expect(changes.error).equal(null); expect(changes.error).equal(null);
}); });
it('update build called 4 times in total', function() { it('update build called 3 times in total', function() {
expect(updateBuildSpy.callCount).equal(4); expect(updateBuildSpy.callCount).equal(3);
}); });
after(function() { after(function() {
@ -134,26 +129,20 @@ describe('Distributor', function() {
expect(changes.status).equal('queued'); expect(changes.status).equal('queued');
}); });
it('build should have empty wait reason', function() {
var changes = updateBuildSpy.getCall(1).args[1];
expect(changes).only.have.keys('waitReason');
expect(changes.waitReason).equal('');
});
it('build should be in-progress', function() { it('build should be in-progress', function() {
var changes = updateBuildSpy.getCall(2).args[1]; var changes = updateBuildSpy.getCall(1).args[1];
expect(changes.status).equal('in-progress'); expect(changes.status).equal('in-progress');
}); });
it('build should be fail', function() { it('build should be fail', function() {
var changes = updateBuildSpy.getCall(3).args[1]; var changes = updateBuildSpy.getCall(2).args[1];
expect(changes.status).equal('error'); expect(changes.status).equal('error');
expect(changes.completed).equal(true); expect(changes.completed).equal(true);
expect(changes.error).equal('Some error'); expect(changes.error).equal('Some error');
}); });
it('update build called 4 times in total', function() { it('update build called 3 times in total', function() {
expect(updateBuildSpy.callCount).equal(4); expect(updateBuildSpy.callCount).equal(3);
}); });
after(function() { after(function() {