web-dev-qa-db-ja.com

Jenkins-ビルドステップ中に完全なコンソール出力を取得します

私は何日もインターネットを調べてきましたが、 this のような問題があります。

コンソール出力を生(プレーン)テキストで取得する必要があります。しかし、HTMLでも問題がなければ、いつでも解析できます。唯一のことは、ビルドステップ中に取得する必要があるということですこれは、使用できる場所が切り捨てられるため問題です...

次のURL(ジョブに関連する)からコンソール出力を取得してみました。

  • /consoleText
  • /logText/progressiveText
  • /logText/progressiveHTML

2つのテキストはプレーンテキストであり、トランケーションがない場合は完璧ですが、HTML 1も同じです...まさに私が必要とするもの-トランケートされただけです...

/consoleFullを表示すると、切り捨てたりバッファリングしたりせずに、コンソールがリアルタイムで更新されるため、この情報を何らかの方法で取得できると思います。

ただし、そのWebページを調べたところ、目的のコンテンツを見つけるのではなく、本来あるべき場所にこのコードが見つかりました(ページのコード全体は含めていませんでした。ほとんど関係がないため、これらの回答は可能だと思います)自分で何があるべきかを見つけて知る)

      new Ajax.Request(href,{
          method: "post",
          parameters: {"start":e.fetchedBytes},
        requestHeaders: headers,
          onComplete: function(rsp,_) {

          var stickToBottom = scroller.isSticking();
          var text = rsp.responseText;
          if(text!="") {
            var p = document.createElement("DIV");
            e.appendChild(p); // Needs to be first for IE
            // Use "outerHTML" for IE; workaround for:
            // http://www.quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
            if (p.outerHTML) {
              p.outerHTML = '<pre>'+text+'</pre>';
              p = e.lastChild;
            }
            else p.innerHTML = text;
            Behaviour.applySubtree(p);
            if(stickToBottom) scroller.scrollToBottom();
          }

          e.fetchedBytes     = rsp.getResponseHeader("X-Text-Size");
          e.consoleAnnotator = rsp.getResponseHeader("X-ConsoleAnnotator");
            if(rsp.getResponseHeader("X-More-Data")=="true")
              setTimeout(function(){fetchNext(e,href);},1000);
          else
              $("spinner").style.display = "none";
          }
      });

具体的には、textからコンテンツを取得する方法があることを期待しています。私はこの言語に慣れていないので、自分が望むコンテンツをどのようにして入手できるかわかりません。ビルドステップ中にスクリプトの一部としてこのコンテンツを取得したいので、プラグインは役に立ちません

18
Inbar Rose

あなたはすでにかなり良い調査をしました。追加できるのは以下のみです。知っているコンソール関連のプラグインはすべて、ビルド後のアクションとして設計されています。

Log Trigger プラグインは、Hudsonビルドがコンソールログで特定の正規表現を検索し、見つかった場合に追加のダウンストリームジョブをトリガーできるようにするビルド後のアクションを提供します。

したがって、問題に対する簡単な解決策はないようです。次のオプションが表示されます。

1。 teeまたは類似のものを使用します(シェルビルドステップにのみ適用可能)

このソリューションは普遍的ではありませんが、コマンドまたはコマンドセットによって生成された最新のコンソール出力にすばやくアクセスできます。

tee-標準入力から読み取り、標準出力とファイルに書き込みます

システムレベルで同義語を使用すると、コンソール出力を生成するために他のJenkinsビルドステップを変更できます。コンソール出力を含むファイルは、Jenkinsまたはその他の方法で参照できます。

2。 Jenkinsコードを変更する

内部での使用を簡単に修正するか、特定のシステム全体の設定を導入するパッチを提供することができます。

3。/consoleの動作を模倣する

例のコードは、Jenkinsサーバーからの更新を要求するために使用されます。ご想像のとおり、サーバー側はオフセットで始まる情報を返すことができます。私に見せてください。


定期的にコンソールページがサーバーにリクエストを送信します:

enter image description here


パラメータは簡単です:

enter image description here


応答は追加される情報のチャンクです:

enter image description here


オフセット(開始)値が更新された別のリクエスト

enter image description here


Content-Lengthを分析することで、データがないことを簡単に理解できます

enter image description here


だから答えは:url/job-name/build-number/logText/progressiveHtmlを使用し、開始オフセットを指定して、リクエストを送信し、コンソールの更新を受信します。

20
Renat Gilmanov

同様の問題がありました。Jenkinsfileビルドスクリプトの最後の部分では、ConsoleLogを解析して、特定のエラーメッセージをメールビルドレポートに含める必要があります。

最初の試み:httpリクエスト。
ハックのように感じられましたが、ほとんどは機能しましたが、Jenkinsサーバーへのアクセスをロックダウンしたときに問題が発生し、ビルドノードがページでhttp以外の取得を実行できなくなりました

2番目の試み:APIを使用してログ行を列挙します。
それは正しいことのように思われましたが、私のノードが100 MBのログファイルを通過するのに30分かかるため、ひどく失敗しました。私の推定では、Jenkinsサーバーはファイルをキャッシュしていなかったので、各リクエストには、最後に読み取られたポイントまでのファイル全体の再読み取りが含まれていました。

3番目に成功したソリューション:サーバーでgrepを実行します。

node('master') {  
  sh 'grep some_criteria $JENKINS_HOME/workspace/path/to/job/console.log'  
}

高速で信頼性が高く、ログファイルのサイズは問題ではありませんでした。

はい、これにはJenkins管理者の信頼とJenkinsサーバーのディレクトリパスに関する知識が必要でしたが、私は管理者であったため、自分が正しいことをすると信頼していました。あなたのマイレージは異なる場合があります。

1
Jason De Arte

洞察を加えると、Jenkinsビルドが進行中の場合、.../consoleText URLの応答は正確に10000行に達しました。 Pythonで 'requests()'パッケージを使用していました。 curlを使用して同じURLを試しましたが、最初の10K行しか受信しませんでした。ビルドが完了した後にのみ、両方のメソッドが完全なログ(私の場合は22,000行以上)を返しました。

私はさらに調査し、また報告したいと思います。

[2015-08-18]更新:これは既知の問題( こちらを参照) のようで、Jenkins 1.618以降で修正されています。まだ1.615を実行しているので確認できません。アミール

1
Amir Katz