Jenkins+ 基本シリーズ 13: 番外編 -- jar パッケージの起動監視ログ、Python スクリプトを追加

1、起因:

私も社内でJenkinsを半年ほど使っていたところ、無事にjarパッケージのプロジェクトがビルドされてDingTalkメッセージが送られてきて、実際にはプロジェクトがうまく起動しないという事態に遭遇しました。

つまり、構築が成功したからといって、サービスの起動が成功したわけではありません。

2. プロセス:

私が使用しているpythonプログラミング言語では、以下のインターフェーステストスクリプトを組み合わせるために、サービスが正常に開始されたかどうかを判断する必要があり、開始に成功した場合はテストスクリプトが実行され、そうでない場合は実行されません。

3. ツールを使用します。

Python3.x は、Jenkins ジョブのビルド後に操作手順に簡単に統合できます。

4. コードは非常に単純です。最適化されている箇所を指摘してください。引き続き最適化できます。

# -*- coding:UTF-8 -*-
# /usr/bin/python3


import subprocess
import sys


def monitor_log(log_file):
    po_pen = subprocess.Popen('tail -f ' + log_file,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE,
                              shell=True,
                              encoding='UTF-8')
    pid = po_pen.pid
    print('po_pen.pid:' + str(pid))
    while True:
        line = po_pen.stdout.readline().strip()
        # 判断内容是否为空
        if line:
            print(line)
            if 'Started' in line and 'seconds (JVM running for' in line:
                print('启动成功')
                sys.exit(0)
            elif 'Exception' in line[:50]:
                print('启动失败,有报错')
                sys.exit(1)


if __name__ == '__main__':
    monitor_log(sys.argv[1])

5. 統合方法

ビルド操作の後、実行スクリプトを SSH パブリッシャーに直接追加します。スクリプトは、ターゲット サーバーの指定されたディレクトリに配置されることに注意してください。

python3 3.x 動作環境

真ん中はpyスクリプトの絶対パス

最後は監視が必要なログの絶対パスです

6.原則プロセス【重要】

まずコードを見てみましょう.ログを監視しているため、通常のオープン方法ではファイルを開くことができません.ログは間違いなく非常に大きくなります.

ここで使用される subprocess モジュールによって実行される操作

次に、各行のフィールドの内容を判断します (コード内の判断文字列、特に起動失敗の判断を最適化する必要があります)。

Jenkins と統合する際に重要な問題は、Jenkins に py スクリプトで成功と失敗をどのようにキャプチャさせるかです. 多くの情報を参照した後、私は最終的に知っています

(食べ物は原罪・大家)

Jenkins が成功または失敗を判断する方法

次に、Python プログラムを実行したときのコンテンツの通常の出力を見てください。コード 0 コード プログラムは正常に終了します。

最後に sys モジュールのある関数を見てみましょう. ここが一番重要な部分です. コード内で起動が成功したと判断した場合は sys.exit(0) し, それ以外の場合は 1 にします.

最後に、Jenkins で練習します

成功ステータス:

失敗した状態

DingTalk グループ通知と連携する

 

最後に、ブートログ監視の完璧なソリューション

sys.argv  大家可以研究下,卖个关子

2020 年 1 月 15 日の更新: いくつかの起動例外の情報キャプチャを追加 (少しぎこちない)

# -*- coding:UTF-8 -*-
# /usr/bin/python3


import subprocess
import sys


def monitor_log(log_file):
    po_pen = subprocess.Popen('tail -f ' + log_file,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE,
                              shell=True,
                              encoding='UTF-8')
    pid = po_pen.pid
    print('po_pen.pid:' + str(pid))
    while True:
        line = po_pen.stdout.readline().strip()
        # 判断内容是否为空
        if line:
            print(line)
            if 'Started' in line and 'seconds (JVM running for' in line:
                print('启动成功')
                po_pen.kill()
                sys.exit(0)
            elif 'Application run failed' in line and 'ERROR' in line:
                print('启动失败,有报错')
                po_pen.kill()
                sys.exit(1)
            elif 'Exception' in line and 'Error' in line:
                print('启动失败,有报错')
                po_pen.kill()
                sys.exit(1)
            elif 'ERROR' in line and 'Exception' in line:
                print('启动失败,有报错')
                po_pen.kill()
                sys.exit(1)
            elif 'ERROR' in line and 'Migration of schema' in line and 'failed' in line:
                print('启动失败,有报错')
                po_pen.kill()
                sys.exit(1)
            else:
                continue


if __name__ == '__main__':
    monitor_log(sys.argv[1])

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=klkypps11wnj

おすすめ

転載: blog.csdn.net/yangj507/article/details/103101947