もちっとメモ

もちっとメモ

もぐりのエンジニアが日々の中で試してみたことを気が向いたときに書き連ねていきます

PythonからJenkinsのジョブを実行したい

経緯

最近ぼちぼち出張も増えてきて、出先で作業することも増えてきました。 出先ではノートPCを使って作業するのですが、手配したばかりで中は環境構築がなされていないすっからかんのPCです。 今後のためにがっつり環境を作ってもいいのですが、せっかく新品なのであまり環境を汚したくないですし、頑張ったところでまあスペックはたかが知れているようなものなので、なんとか普段使っているPCのリソースを使って重たい作業を回したいなあと考えていました。 そんな折、何をとち狂ったのかのか、「Jenkinsのジョブで実行ファイルを叩けば行けるんじゃない?ついでにFlaskでフロントを作ってWebアプリとして動かせるようにしてしまえ。」と思い立ってしまったのが事の始まりでした。 ということでなんか本来の使い方から外れているような気もしますが、タイトルの通りpython(Flask)からJenkinsのジョブを実行する環境を作ったので備忘録的に残しておきます。

Jenkins環境

サーバー環境はすでに用意してあるものとします。 まず、ユーザー名とAPIトークンをメモっておきます。 Jenkinsにログインしてユーザー名をクリックすると設定の中から確認できます。 次にリモートから実行を受け付けられるようにjobを用意します。 jobの種類は恐らくはなんでもいいのですが、今回は「フリースタイル・プロジェクトのビルド」で作ります。基本的には普通にジョブを作る時と一緒なので、リモートから実行するときに便利そうな設定だけ書いておきます。

ビルドのパラメーター化

ビルドのスクリプトを書くときにパラメーターを使いたい場合に設定します。POSTリクエストを投げた際にここで設定した名前をキーとしてパラメータを取得できます。

ビルド・トリガ

「リモートからビルド」にチェックを入れて認証トークンを設定します。 恐らくなんでもいいので任意のトークン名を入力します。 ここでJenkinsの画面に、「リモートからビルドするには次のURLを使用します~」のようなメッセージが出ていると思うので、ここにリクエストを投げればリモートからジョブを実行できます。 ビルドのパラメーター化でパラメーターを設定した場合は、「buildWithParameters?token」の方を使用します。「TOKEN_NAME」の部分には認証トークンが入ります。 ビルド Windowsバッチコマンドであれば%で囲ってあげるとビルドのパラメータを取得できます。

SET PARAM = %param% 
APP.exe %PARAM% 

シェルスクリプトの場合は$でしたっけ?ここはJenkinsではなくバッチやシェルスクリプトの書き方に沿って書いてください。 これでJenkins側の設定は終わりです。

pythonスクリプト

次にpython側のスクリプトを作ります。今回はFlask経由で実行するので若干冗長です。実行だけでよければjobの関数の部分さえあれば十分です。 render_templateredirectはWebアプリとして使いたいがためのお飾りです。 使う環境は3系を使います。

from flask import Flask ,request,redirect,render_template 
import urllib3 


app = Flask(__name__) 


@app.route('/')
def index():
 return render_template('index.html') 

@app.route('/job') 
def job():
 param = request.args.get('param')
 url = 'JENKINS_URL/job/jobname/buildWithParameters?token=TOKEN_NAME¶m='+param #¶mの部分はJenkinsのビルドのパラメーター化で設定したキーにしてください
 username = "username" #Jenskinsのユーザー名
 password = "password" #JenkinsのAPIトークン
 http = urllib3.PoolManager()
 headers = urllib3.util.make_headers(basic_auth=('%s:%s' % (username,password)))
 response = http.request('POST', url, headers=headers)
 return redirect('http://localhost:8080/') 


if __name__ == '__main__':
 app.debug = True
 app.run(host='0.0.0.0',port=8080) 

適当にhtmlも書きます。

See the Pen KxVvgQ by Sashimimochi (@sashimimochi) on CodePen.

これでlocalhost:8080にアクセスして実行ボタンを押せばJenkinsが稼働しているサーバーのリソースを使って実行ファイルを動かせるようになりました。これで出先でもある程度作業ができるようになったかな。 セキュリティー等は考慮していないガバガバ構築なのでそのあたりは悪しからず。