Jenkins ShiningPanda Pluginによるジョブ固有のPython環境(virtualenv)
冬場は週4から5でスノーボードな渡辺です。 AWSの仕事をしつつオフは雪山、札幌オフィスではそんな仲間も募集しています。
Amazon LinuxなどRedhat系Linuxでは、Pythonのシステム依存度が非常に高く、下手にアップデートなどを行うと悲劇となることがよく知られています。 デフォルトのモジュール空間へのライブラリ追加も極力避けたいところです。 特にJenkinsでPythonのシステムをテストする場合や、Pythonのスクリプトを実行したい場合は、ジョブ毎にモジュール空間を分けることがベストプラクティスです。
今回は、Jenkins ShiningPanda Plugin(輝くパンダ?)プラグインを利用して、ジョブ固有のPython環境を作る方法を紹介します。 ShiningPanda Pluginではvirtualenvを利用して、複数(ジョブ毎)のPython環境を切り替えます。
ShiningPanda Pluginのインストール
Jenkinsの管理画面からプラグインマネージャを開き、ShiningPanda Pluginをインストールします。 「利用可能タブ」でフィルターに「panda」と入力すれば良いでしょう。
インストール済みPythonの追加(オプション)
システムでインストールされているPython以外のPythonを利用したい場合は、Jenkinsのシステム設定からPythonを登録します。 現在のAmazon LinuxではPython 2.7がデフォルトとなっていますが、3系を利用したい場合などは、ここでインストール方法やパスを設定してください。
システム側のPythonを切り替えると惨劇の可能性があります。 システムには新しいPythonをインストールだけ行い切替はJenkinsで行ってください。
また、ShiningPanda Plugin( vitrualenv)を使う場合、Pythonのデフォルトモジュール空間は利用しません。
ジョブの作成とVirtualenv Builderの追加
準備ができたならばジョブを作成します。 普通にジョブを作成し、ビルド手順に「シェルの実行」を選択すると、デフォルトのPythonが実行されます。 ジョブ固有のPython環境で実行するためには「Virtualenv Builder」を追加してください。
Python version
オプションで追加のPythonを設定していなければ、選択できるPythonはひとつしかありません。 Python3系などを利用したい場合は、ここでバージョンを指定することができます。 なお、ひとつのジョブで複数のバージョンを指定して、それぞれジョブを実行することなどもできます(今回は扱いません)。
Clear
virtualenvのファイルを都度消す場合は、このオプションを有効にします。 pipインストールなどを、ジョブ毎に実行したい場合以外は利用する必要はありません。
Nature, Command
Shell(XShell), Pythonが選択し、Commandに応じて切り替えます。
SCMなどからPythonのスクリプトをダウンロードして実行するのであれば、Shellを選択します。 commandには、次のようにpipによるモジュールのインストールなどを行った上で、ワークスペース上のPythonスクリプトを実行すれば良いでしょう。
python --version pip install boto python src/examples/regions.py
モジュールのインストールなどを行った後、Pythonスクリプトをそのまま記述したい場合は、ビルド手順を2つ追加してください。 最初のビルド手順では、natureにshellを選択し、モジュールのインストールなどを行います。
python --version pip install boto
ふたつ目のビルド手順では、natureにPythonを指定し、Pythonのスクリプトをそのまま記述しましょう。
from boto.ec2.connection import EC2Connection def main(): conn = EC2Connection() regions = conn.get_all_regions() print regions if __name__ == '__main__': main()
まとめ
ShiningPandaではVirtualenvを利用してPythonの実行環境を制御しています。
デフォルトでは、Jenkinsのホームディレクトリ(例: /var/lib/jenkins)直下にshiningpandaディレクトリが作成され、ジョブ毎にvirtualenv環境が作成されます。 このためモジュール空間などは各ジョブで独立しているため、システムモジュールが個々のジョブの実行に影響を与えなくなります。 また、モジュールのバージョンを固定することもできるので、幾つかのバージョンで動作確認を行いたい場合も便利に使えることでしょう。