アプリケーションのステータスを確認するために1分に1回実行されるNode.jsスクリプトがあります。通常、正常に動作します。サービスが稼働中の場合は0で終了します。停止している場合は1で終了します。すべて正常です。ノードHTTPリクエストは永久にハングします
しかし、しばらくの間、それはちょっとだけ止まります。コンソールは「Calling status API ...」と報告し、無期限にそこで停止します。 Nodeのビルトイン2分のタイムアウトではタイムアウトしません。エラーはありません。ただそこに座って、待って、永遠に。これは、次のステータスチェックジョブの実行をブロックするため、問題です。
この時点で私のチーム全体がそれを見ていて、どんな状況が起こるのか把握することはできません。開始から終了までのタイムアウトで構築されているので、次の仕事に進むことができますが、基本的にはステータスチェックをスキップして盲目を作ります。だから、私はあなたに良い人に質問を開きます。ここで
は(取り外し名前/ URLを含む)スクリプトです:あなたのいずれかが、これはおそらく、出力やタイムアウトせずにハングアップする可能性のある場所を見ることができる場合
#!/usr/bin/env node
// SETTINGS: -------------------------------------------------------------------------------------------------
/** URL to contact for status information. */
const STATUS_API = process.env.STATUS_API;
/** Number of attempts to make before reporting as a failure. */
const ATTEMPT_LIMIT = 3;
/** Amount of time to wait before starting another attempt, in milliseconds. */
const ATTEMPT_DELAY = 5000;
// RUNTIME: --------------------------------------------------------------------------------------------------
const URL = require('url');
const https = require('https');
// Make the first attempt.
make_attempt(1, STATUS_API);
// FUNCTIONS: ------------------------------------------------------------------------------------------------
function make_attempt(attempt_number, url) {
console.log('\n\nCONNECTION ATTEMPT:', attempt_number);
check_status(url, function (success) {
console.log('\nAttempt', success ? 'PASSED' : 'FAILED');
// If this attempt succeeded, report success.
if (success) {
console.log('\nSTATUS CHECK PASSED after', attempt_number, 'attempt(s).');
process.exit(0);
}
// Otherwise, if we have additional attempts, try again.
else if (attempt_number < ATTEMPT_LIMIT) {
setTimeout(make_attempt.bind(null, attempt_number + 1, url), ATTEMPT_DELAY);
}
// Otherwise, we're out of attempts. Report failure.
else {
console.log("\nSTATUS CHECK FAILED");
process.exit(1);
}
})
}
function check_status(url, callback) {
var handle_error = function (error) {
console.log("\tFailed.\n");
console.log('\t' + error.toString().replace(/\n\r?/g, '\n\t'));
callback(false);
};
console.log("\tCalling status API...");
try {
var options = URL.parse(url);
options.timeout = 20000;
https.get(options, function (response) {
var body = '';
response.setEncoding('utf8');
response.on('data', function (data) {body += data;});
response.on('end', function() {
console.log("\tConnected.\n");
try {
var parsed = JSON.parse(body);
if ((!parsed.started || !parsed.uptime)) {
console.log('\tReceived unexpected JSON response:');
console.log('\t\t' + JSON.stringify(parsed, null, 1).replace(/\n\r?/g, '\n\t\t'));
callback(false);
}
else {
console.log('\tReceived status details from API:');
console.log('\t\tServer started:', parsed.started);
console.log('\t\tServer uptime:', parsed.uptime);
callback(true);
}
}
catch (error) {
console.log('\tReceived unexpected non-JSON response:');
console.log('\t\t' + body.trim().replace(/\n\r?/g, '\n\t\t'));
callback(false);
}
});
}).on('error', handle_error);
}
catch (error) {
handle_error(error);
}
}
、それは非常に参考になると思います! P.S.:
は、 ジェームズ・タナー
EDITをありがとうrequest
の代わりにhttps
を直接使用するので、スクリプトの実行時にインストールする必要はありません。これは、Jenkinsに割り当てられた任意のビルドマシンでカスタムインストールを実行せずにスクリプトを実行できるためです。あなたの応答のコールバックあなたの状態をチェックしませインサイド
レスポンスコールバックのステータスコードが200に等しくない場合はエラーを表示します。 – Keith
ああ、申し訳ありません@キース、私はそれについてはっきりしていないと思います。成功は応答によって決まります。 200コードでは必ずしも十分ではありません。 –
私のコメントを編集しました。私は入力を終える前に "Add"を押すでしょう。 –