PythonベースのJenkinsの二次開発操作


背景
最近私達は雲を整えて実行するプラットフォームにいます。下の階にはJenkinsを使ってエンジンを実行しています。簡単にシナリオを統一したスケジュールを作ります。
Jenkinsは確かにとても便利なフレームです。RESTfulのAPIをセットにして提供しています。とても便利なのは二次開発ができます。
よく使うJenkins概念
私たちはJenkinsを使う時、普通はJenkinsのViewを見ます。
つまり、私たちが見ているのは基本的にはいくつかのビューです。
各構築の内容は、実行用例に関わらず、シナリオを実行しますか?それともパッケージを作成して発表しますか?すべてjobです。
各jobは対応のnameがあります。もしこのjobがあるフォルダに置かれたら、nameはフォルダ名+job名です。jobの情報を見ると、フルハウスに戻ります。nameフィールドとは、これです。
PythonSDK
このコマンドを実行するとSDKがインストールできます。
公式サイト:https://pypi.org/project/python-jenkins/
説明文書:http://python-jenkins.readthedocs.io/en/latest/
説明文書は全部英語です。興味があれば、これを見るのが一番いいですが、このSDKは実はとても簡単です。直接ソースコードを見に行けば大丈夫です。
ここにいくつかの比較的に常用する方法を並べて、私の今回の開発の時使ういくつかで、私は自分で書く過程の中で、1歩ずつ書きます。
開発プロセス
job情報検索
Jenkinsでは、各構築はすべてjobです。だから、開発をする時は、ページに歴史の構築情報を展示します。そのため、歴史執行jobの情報を得ることができます。だから私たちはget_を使います。jobinfoという方法です。

 def get_job_info(self, name, depth=0, fetch_all_builds=False):
 '''Get job information dictionary.

 :param name: Job name, ``str``
 :param depth: JSON depth, ``int``
 :param fetch_all_builds: If true, all builds will be retrieved
     from Jenkins. Otherwise, Jenkins will
     only return the most recent 100
     builds. This comes at the expense of
     an additional API call which may
     return significant amounts of
     data. ``bool``
 :returns: dictionary of job information
 '''
ここのnameパラメータはjobの名前です。例えば自動化テストというjobを新設しました。このnameは自動化テストです。もし私がこのjobをあるフォルダに置いたら、nameというパラメータはフォルダ名/自動化テストが必要です。
ここには穴があります。Python 2.7バージョンでこのnameを伝えます。変数の形で過去を伝えたら、エラーを報告します。回避する方法はname.encode('utf-8')を符号化処理してください。返したパラメータはこれらです。
buildsフィールドにはすべての履歴構築データが保存されています。propertyというフィールドにJenkins構築時の各種パラメータがあります。
ビルドログ
構築データを入手したら、私達はページに展示しなければなりません。ページで直接ログを見ることができれば、もっと便利になります。ですから、毎回の構築ログを取り出したいです。get_を呼び出す必要があります。build_ソロ曲out putという方法です。

 def get_build_console_output(self, name, number):
 '''Get build console text.

 :param name: Job name, ``str``
 :param number: Build number, ``int``
 :returns: Build console output, ``str``
 '''
ここでJenkinsの構築ログを入手できます。戻りは文字列です。注意したいのは、構築ログを表示する場合、構築時にこの方法を呼び出すだけでいいです。呼び出し時に構築したログに戻ります。socketやポーリングでリアルタイムログの展示ができます。
ビルドを実行
構築を実行するのはもちろん非常に重要な一歩です。jobこの方法は構築を実行する。

 def build_job(self, name, parameters=None, token=None):
 '''Trigger build job.

 This method returns a queue item number that you can pass to
 :meth:`Jenkins.get_queue_item`. Note that this queue number is only
 valid for about five minutes after the job completes, so you should
 get/poll the queue information as soon as possible to determine the
 job's URL.

 :param name: name of job
 :param parameters: parameters for job, or ``None``, ``dict``
 :param token: Jenkins API token
 :returns: ``int`` queue item
 '''
ここのnameパラメータはjob情報検索のパラメータと同じで、符号化の問題もあります。parametersフィールドから入ってきたのは辞書の種類で、つまりページをクリックして構築するときに必要なパラメータです。tokenパラメータはJenkinsという種類の初期化時にすでにありますので、一般的には入る必要がありません。この方法はクオーツに戻ります。itemの番号は、これがJenkinsの構築番号です。この番号は他のデータの問い合わせができます。例えば、構築状態を構築したり、構築をキャンセルしたりするなど、SDKで対応する方法があります。
これを使って、構築中であるかどうかを確認してはいけません。この番号は一定時間で無効になります。構築時間が長すぎると、クエリの結果が出なくなり、エラーが発生します。実際には、jobはまだ構築中です。
これらの方法は使用しやすいですが、いくつかの限界があります。私たちが構築する時に第三者のプラグインを使ったら、これらの方法は第三者のプラグインの結果を得ることができません。例えば、私たちはRobotFraamewarkのプラグインを使って結果を処理しました。これらの方法では結果を得ることができません。
原理から始める
Jenkinsが外部に提供しているのはRESTfulのインターフェイスです。PythonのSDKのする動作は実際にこのインターフェースを要求します。包装をしただけで、使いやすさを保証しました。request、たとえば:
レスポンス=self.junins_request(requests.Request)
'POST'self.build_joburl(name,parameters,token)
興味があったら自分でソースを読んでみてください。SDK全体は実はrequestsという倉庫に基づいて包装をしました。そして最後は全部jecinsを通して包装しました。requestはRESTfulのAPIを要求する。私たちはjecinsのページに入ります。右下にこんなものが見えます。
このマークがあるページはインターフェースがあります。このインターフェースはどうやって取りますか?
ソースから答えを見つけられます。多くの方法の中にはこのようなものがあります。

self.jenkins_open(requests.Request('GET', self._build_url(INFO),auth=auth),
   add_crumb=False, resolve_auth=False)

response = self.jenkins_open(requests.Request('GET', self._build_url(BUILD_INFO,locals())))
一番上の配置で見つけられます。
INFO='appi/json'
つまり、私たちがページを見た後に/appi/jsonを加えると、データが得られます。
すべての操作はこのデータの背後にあります。つまり、このurlの接続規則を書けば、簡単に二次開発ができます。
もちろん、開発の過程で、歴史データを持つ時、インターフェースは歴史構築の状態に戻りません。
締め括りをつける
全体の开発プロセスは、ソースの比较的简単な理由のために、基本的に问题が発生したソースコードを见て解决することができますが、大きな问题は、リターン结果のリストには、地方のリストがないので、开発が完了した后、常に补完する必要があります。
以上のPythonベースのJenkinsの二次開発操作は小編集で皆さんに提供した内容の全部です。参考にしていただければと思います。よろしくお願いします。