Jenkins ShiningPanda Pluginによるジョブ固有のPython環境(virtualenv)

2016.02.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

冬場は週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」と入力すれば良いでしょう。

jenkins-plugins

インストール済みPythonの追加(オプション)

システムでインストールされているPython以外のPythonを利用したい場合は、Jenkinsのシステム設定からPythonを登録します。 現在のAmazon LinuxではPython 2.7がデフォルトとなっていますが、3系を利用したい場合などは、ここでインストール方法やパスを設定してください。

system_python

システム側のPythonを切り替えると惨劇の可能性があります。 システムには新しいPythonをインストールだけ行い切替はJenkinsで行ってください。

また、ShiningPanda Plugin( vitrualenv)を使う場合、Pythonのデフォルトモジュール空間は利用しません。

ジョブの作成とVirtualenv Builderの追加

準備ができたならばジョブを作成します。 普通にジョブを作成し、ビルド手順に「シェルの実行」を選択すると、デフォルトのPythonが実行されます。 ジョブ固有のPython環境で実行するためには「Virtualenv Builder」を追加してください。

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環境が作成されます。 このためモジュール空間などは各ジョブで独立しているため、システムモジュールが個々のジョブの実行に影響を与えなくなります。 また、モジュールのバージョンを固定することもできるので、幾つかのバージョンで動作確認を行いたい場合も便利に使えることでしょう。