92 lines
3.1 KiB
JavaScript
92 lines
3.1 KiB
JavaScript
#!/usr/bin/env node
|
|
// Copyright (c) GitHub. All rights reserved.
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
var childProcess = require("child_process");
|
|
var path = require("path")
|
|
|
|
var supported = ['linux', 'darwin']
|
|
|
|
if (supported.indexOf(process.platform) == -1) {
|
|
console.log('Unsupported platform: ' + process.platform);
|
|
console.log('Supported platforms are: ' + supported.toString());
|
|
process.exit(1);
|
|
}
|
|
|
|
var stopping = false;
|
|
var listener = null;
|
|
|
|
var runService = function() {
|
|
var listenerExePath = path.join(__dirname, '../bin/Runner.Listener');
|
|
var interactive = process.argv[2] === "interactive";
|
|
|
|
if(!stopping) {
|
|
try {
|
|
if (interactive) {
|
|
console.log('Starting Runner listener interactively');
|
|
listener = childProcess.spawn(listenerExePath, ['run'].concat(process.argv.slice(3)), { env: process.env });
|
|
} else {
|
|
console.log('Starting Runner listener with startup type: service');
|
|
listener = childProcess.spawn(listenerExePath, ['run', '--startuptype', 'service'].concat(process.argv.slice(2)), { env: process.env });
|
|
}
|
|
|
|
console.log('Started listener process');
|
|
|
|
listener.stdout.on('data', (data) => {
|
|
process.stdout.write(data.toString('utf8'));
|
|
});
|
|
|
|
listener.stderr.on('data', (data) => {
|
|
process.stdout.write(data.toString('utf8'));
|
|
});
|
|
|
|
listener.on('close', (code) => {
|
|
console.log(`Runner listener exited with error code ${code}`);
|
|
|
|
if (code === 0) {
|
|
console.log('Runner listener exit with 0 return code, stop the service, no retry needed.');
|
|
stopping = true;
|
|
} else if (code === 1) {
|
|
console.log('Runner listener exit with terminated error, stop the service, no retry needed.');
|
|
stopping = true;
|
|
} else if (code === 2) {
|
|
console.log('Runner listener exit with retryable error, re-launch runner in 5 seconds.');
|
|
} else if (code === 3) {
|
|
console.log('Runner listener exit because of updating, re-launch runner in 5 seconds.');
|
|
} else {
|
|
console.log('Runner listener exit with undefined return code, re-launch runner in 5 seconds.');
|
|
}
|
|
|
|
if(!stopping) {
|
|
setTimeout(runService, 5000);
|
|
}
|
|
});
|
|
|
|
} catch(ex) {
|
|
console.log(ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
runService();
|
|
console.log('Started running service');
|
|
|
|
var gracefulShutdown = function(code) {
|
|
console.log('Shutting down runner listener');
|
|
stopping = true;
|
|
if (listener) {
|
|
console.log('Sending SIGINT to runner listener to stop');
|
|
listener.kill('SIGINT');
|
|
|
|
// TODO wait for 30 seconds and send a SIGKILL
|
|
}
|
|
}
|
|
|
|
process.on('SIGINT', () => {
|
|
gracefulShutdown(0);
|
|
});
|
|
|
|
process.on('SIGTERM', () => {
|
|
gracefulShutdown(0);
|
|
});
|