(-_-).oO(タイトルは気にしない事、考えるの面倒なんだよ)
はじめに
Python+FlaskなwebアプリをJenkinsでビルドしまくるようにしたのでそのメモ。
ディレクトリ構成はこんな感じ(見せたくないディレクトリは消してます)。
% tree -d
.
├── env (virtual env)
├── project
│ ├── app
│ ├── conf
│ ├── logs
│ ├── models
│ │ └── mongo
│ ├── services
│ ├── static
│ ├── templates
│ ├── tests
│ │ ├── app
│ │ ├── cover
│ │ ├── data
│ │ ├── models
│ │ │ └── mongo
│ │ ├── services
│ │ ├── utils
│ │ └── view
│ └── utils
└── script
├── deploy (fabricとか)
└── tools
トップディレクトリ直下にprojectというディレクトリがあり、その下にアプリケーションが全て展開されている。
また、projectディレクトリからnosetestsが実行でき、現時点でテストが全て通るようになっている。
また、coverageを導入しておき、カバレッジを取得できるようにしておく。
テストの実行方法は以下のとおり。
% source env/bin/activate
% cd project
% export PYTHONPATH=$PYTHONPATH:`pwd`
% nosetests -v -w tests/ --with-coverage --with-xunit --cover-package=app --cover-package=models --cover-package=services --cover-package=utils --cover-html --cover-xml
Jenkinsを立ち上げる前にやること
Jenkins内でvirtualenvで環境を整えるため、必ずpip freezeしたものをコミットしておくこと(もしくはshellでいちいち実行してもいいけどバージョンとか考えるとpip freezeが楽)。
% source env/bin/activate
% cd project
% pip freeze > requirements.txt
% git add requirements.txt
% git commit
% git push origin master
Jenkins側の作業
まず、使ってるVCSのプラグインとカバレッジ計測をするためにCoberturaプラグインをインストールする。
そして新しいジョブを作成して、ソースコード管理でレポジトリのパスを入力します。
次に、ビルドのビルド手順の追加からシェルの実行を選んで以下のように入力します。
if [ ! -d venv ]; then
virtualenv --distribute venv
fi
source venv/bin/activate
cd project
pip install -r requirements.txt
export PYTHONPATH=$PYTHONPATH:$WORKSPACE/project
echo "設定のコピーとか事前にやることがあればここでやる"
nosetests -v -w tests/ --with-coverage --with-xunit --cover-package=app --cover-package=models --cover-package=services --cover-package=utils --cover-html --cover-xml
sed "s|filename=\"|filename=\"project/|g" $WORKSPACE/project/tests/coverage.xml > $WORKSPACE/project/tests/coverage2.xml
最後のsedはディレクトリ直下にソースコードがないため、カバレッジの方でソースコードが見れない問題を解決するため、カバレッジの計測結果のパスにトップディレクトリからの相対パスを追加します(参考: Hudson “Source code is unavailable.”)
次にビルド後の処理を2つ追加します。
一つはJUnitテスト結果の集計を追加して、テスト結果XMLに以下の内容をコピーします。
project/nosetests.xml
もう一つはCobertura カバレッジ・レポートの集計を追加して、Cobertura XMLレポート パターンに以下の内容をコピーします。
project/tests/coverage2.xml
これで保存をして、ビルドをぶん回します。
たぶん、ダッシュボードを見て幸せになれると思います。