Symfoware

Symfowareについての考察blog

JenkinsのジョブをPythonでリモートから実行する

処理に時間のかかるバッチプログラムをJenkinsのジョブとして定義。
クライアントからはそのジョブを起動する処理を書いて、すぐに処理を終了させる。
なんてことができないか調べてみました。


最初にうまく行かなかった方法を記載しておきます。


JenkinsのAPI Token



Jenkins 2.11のジョブを実行してみます。
まず、API Tokenを取得する必要があるようです。

ログインした状態で、設定画面を開きます。

698_01.png


画面の中央辺りに、「APIトークンの表示」というボタンがあるのでクリック。

698_02.png


ここにユーザーIDとAPIトークンが表示されます。

698_03.png





ジョブの作成



「test-job」というジョブを作成。
内容は、文字列をechoするだけです。

698_04.png

698_05.png


これを別端末からPythonで実行してみます。




Pythonのサンプルプログラム



job/[jobの名称]/buildにpostすれば動くとのことだったので、こんなプログラムを作成しました。

※このプログラムは動作しません。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. # URLは[jenkins]/[ジョブ名]/build
  5. url = 'http://192.168.1.102:8080/job/test-job/build'
  6. # 設定画面で表示されたAPIトークン
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. # POSTする値はtoken?
  9. data = {
  10.     'token' : password
  11. }
  12. request = urllib2.Request(url, data=json.dumps(data))
  13. request.get_method = lambda: 'POST'
  14. # job実行
  15. response = urllib2.urlopen(request)
  16. ret = response.read()
  17. print 'Response:', ret
  18. print 'ok'




実行するとこんなエラーが。


Traceback (most recent call last):
File "jenkins.py", line 22, in <module>
    response = urllib2.urlopen(request)
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 435, in open
    response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 548, in http_response
    'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 473, in error
    return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 556, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: No valid crumb was included in the request








ビルド・トリガのリモートからビルド



諦めかけていた時、改めてジョブの設定画面を見てみると、
「リモートからビルド」の設定を見つけました。

698_06.png



リモートからビルドを実行するには次のURLを使用します:

JENKINS_URL/job/test-job/build?token=TOKEN_NAME
もしくは、
/buildWithParameters?token=TOKEN_NAME

&cause=要因を追加する(オプション)と、ビルドを実行した要因として記録することができます。




認証トークンに適当な文字列を入力して保存します。

698_07.png


ユーザーIDとAPIトークンはベーシック認証で指定します。
Python標準機能だとうまく認証が通過できなかったので、

Python urllib2 Basic Auth Problem
こちらを参考に、自分でヘッダーに情報を書き込みます。


  1. # -*- coding:utf-8 -*-
  2. import urllib2, base64
  3. # URLは[jenkins]/[ジョブ名]/build
  4. url = 'http://192.168.1.102:8080/job/test-job/build?token=sample_token'
  5. # 設定画面で表示されたユーザID、APIトークンでベーシック認証
  6. username = 'symfo'
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. request = urllib2.Request(url)
  9. # http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem
  10. # You need the replace to handle encodestring adding a trailing newline
  11. # (https://docs.python.org/2/library/base64.html#base64.encodestring)
  12. base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
  13. request.add_header("Authorization", "Basic %s" % base64string)
  14. result = urllib2.urlopen(request)




プログラムを実行すると、リモートからジョブが実行できました。

698_08.png

698_09.png


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/06/29(水) 00:19:48|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ