CentOS 6.5 + pyenv + pytest + git + jenkinsでCI環境を作成するまで

More than 1 year has passed since last update.

概要

自宅開発用にCentOS上にCI環境を構築した際のはまりどころを自分メモ.
あくまでもその場対応が多々あるため,最終的にはどこかで修正することになりそう…

やりたかったこと

今回やりたかったことは以下の通り
1. pyenvで環境構築したい
2. pytestでテストを実行してカバレッジも計測したい

最終的な構成

これを実現するために以下のように構築しました.

  • CentOS 6.5
  • git(ソースからmake install,/usr/binにシンボリックリンク)
  • jenkins(公式にあるyumレポジトリからインストール)
    • pyenv plugin
    • GIT plugin
    • Cobertura Plugin

注: git,jenkinsのインストール方法については割愛

pyenv pluginの設定

  1. 各プロジェクトの設定画面 > ビルド環境で「pyenv build wrapper」にチェックを入れる
  2. 「The Python version」に利用するpythonのバージョン(ex 2.7.3)を設定
  3. 「Preinstall pip list」にはrequirements以外にインストールしたいパッケージ(pytest等)を設定します.但し,ここに登録した項目を1つのテキストと見なしてpip installを実行しているらしく,スペース区切りで複数指定するとエラーになったため,「ビルド > シェルの実行」で別途インストールする方が楽かもしれません.

カバレッジ,テスト結果関連の設定

カバレッジ,テスト結果の取得

各プロジェクトの設定画面 > ビルド > シェルの実行でテストを実行する際に,以下のコマンドを実行する.なお,runtest.pyは後述するpy.testのテスト実行用スクリプトです.(ケースによってはpy.testコマンドで十分です)

python runtest.py --junitxml=<テスト結果を出力するファイル名> --cov-report xml --cov <テスト対象>

参考までに今回私の設定だと以下のようになります.

python runtest.py --junitxml=pytest.xml --cov-report xml --cov .

この場合,テスト結果は「pytest.xml」に,カバレッジは「coverage.xml」に出力され,カバレッジの評価対象はテスト実行したディレクトリに含まれる全ファイルとなります.

カバレッジレポートの集計

各プロジェクトの設定画面 > ビルド後の処理 > Cobertura カバレッジ・レポートの集計で「Cobertura XMLレポート パターン」に「coverage.xml」と設定する.

テスト結果の集計

各プロジェクトの設定画面 > ビルド後の処理 > JUnitテスト結果の集計で「テスト結果XML」にテスト実行時のオプション「--junitxml」で指定したファイル名を設定する.

ハマった箇所

基本的には参考リンクの内容を粛々と進めるだけですが,
数カ所ハマる箇所がありました.
0. (番外)anyenv(pyenv)で入れたpythonが見つからない
→当初はanyenvで入れたpyenvで環境構築する予定でしたが,PATHの問題等で面倒だったため,これに関してはpyenv pluginで対応することにした
1. yumでインストールできるgitのバージョンが古く,jenkinsで使用するオプションが動かない
2. py.testをローカルの実行時と同じコマンドで実行すると,テスト対象のプログラムのImportErrorとなる.

問題の解決方法

1. yumでインストールできるgitが古い

yumでインストール可能なgitはバージョンが1.7.1と古く,最新版のjenkinsでは「-c」オプションが無いことでエラーになりました.
何らかのオプションや設定によっては「-c」オプションを回避できるかもしれませんが,そもそも古いバージョンを使う理由も無いので,yumでインストールしたgitを削除し,バージョン2.2.1をソースからビルドしました.
詳細は参考リンクを参照してください.
なお,参考リンクの記事では,gitを/usr/local/bin以下に置いていますが,そのままだとpyenv pluginがgitを見つけられずにエラーとなるため,/usr/bin以下にインストールする,もしくはシンボリックリンクを配置しておいてください.(jenkinsの設定でPATHを追加してもpyenv pluginでは参照してくれませんでした…)

2. py.testをローカルの実行時と同じコマンドで実行すると,テスト対象のプログラムのImportErrorとなる

原因について詳細に調査していませんが,ローカルだと特にPYTHONPATHを弄っていない状態で実行できていた物が,jenkins上だとImport Errorになるケースがありました.
これについては「py.test --genscript=runtests.py」を実行して生成された「runtests.py」を実行するように変更することで回避できました.

参考リンク

jenkinsのインストール
http://pkg.jenkins-ci.org/redhat/

gitのインストール
http://tabunmuri.hatenablog.com/entry/2014/01/06/CentOS%E3%81%AB%E6%A8%99%E6%BA%96%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%8F%A4%E3%81%84git%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7

jenkinsでgitが「Unknown option: -c」と言うメッセージが出る
https://answers.atlassian.com/questions/11079588/git-status-failed-with-code-129-unknown-option--c-

pytest + coverage
http://d.hatena.ne.jp/kuma8/20121124/1353723982

pytest runscript
http://pytest.org/latest/goodpractises.html#create-a-pytest-standalone-script