Private repositoryをタダでCI
概要
BitbucketはタダでPrivate repositoryをつくれるので、運営しているwebサービスのソースなど公開しちゃうのはちょっと。。。というものを預けるのに便利です。最近はTravis-CIなんかがあって、サーバを立てなくてもCI出来たりしますが、githubしか対応していなくて涙目でした。
今回、CloudBeeを使ってリポジトリからCIまで無料な環境を作ったのでそのまとめです。
アプリケーション構成
細かいものは他にもありますが、テストに関係しそうな構成はだいたいこんな感じ
- Python (2.7.2)
- MongoDB
- web.py
- nose
- coverage
- mongomock
- pep8
前提条件
ユニットテストの外部依存は面倒で嫌いなので、MongoDBやその他入出力を伴うテストは全てMock化しています。若干バグ(というか機能不足)ありますが、mongomockでだいたいいけます。あとpep8はテストスクリプト化して、リポジトリ中の全ソースにスタイルチェックをかけてます。
ローカルJenkinsでやってたこと
nosetestsをたたいて、カバレッジの収集とユニットテスト(含むpep8チェック)です。カバレッジはCobertura XMLレポート、ユニットテストはJunitテスト結果として集計します。
構築手順
DEV@cloudのアカウント作成
FREE版(300min/month, 2GBまで無料)にSign upしてアカウントを作成します。いろいろ答えてアカウント作成していくと、おなじみのJenkins画面に到達します。基本的にローカルサーバで動かすものと一緒で、管理者権限を持ってる状態(自由にプラグインが追加できる)です。
Jenkinsの環境整備
ローカルのJenkinsと基本的にいっしょです。Jenkinsの管理->プラグインの管理で、必要なプラグインを導入します。今回、使いそうだった以下を入れました。(多すぎかも)
- Jenkins Cobertura Plugin
- CloudBees Python Installations Plugin
- CloudBees Jenkins-as-a-Service Python Installations
ジョブの作成
いよいよメインです。ローカルサーバとして所有しているわけではないので、Python実行環境はvirtualenvを使う必要があります。あとはprivateリポジトリなのでアクセス用のssh鍵周りの設定が必要ですが、CloudBeeに予めssh鍵がありますので、Bitbucket側にreadonlyの鍵として登録(リポジトリのConfig->Deployment keys)しておきます。
ローカルJenkinsの実行内容
nosetests -c nose.cfg
DEV@cloud上のJenkinsの実行内容
virtualenv --distribute DEV
DEV/bin/pip install -r requirements.txt
DEV/bin/nosetests -c nose.cfg
virtualenv用に若干記述が増えています。requirements.txtはpip freezeとかでも出力できるアレです。nose.cfgはカバレッジ取得等のnosetestsのオプションが入ってます。
これでジョブを実行すると、ローカルのJenkins同様に普通に実行されあえなく完了です。
あとはscmのポーリングなり定期実行なり、お好みにあわせて実行するだけです。
若干はまったところ
pep8チェッカーはプロジェクトディレクトリ全体にかけるようにしていましたが、virtualenvを入れたことで、プロジェクトディレクトリ内にライブラリが入るようになります。
なので、初回のジョブ実行時はライブラリ群に対するPEP8警告が出まくって大変でした。。。
プロジェクト全体に対して実行する処理がある場合は事前に除外するようにしましょう。(上記の例だと [PROJECT_DIR]/DEV というディレクトリが作られてそこに一通り入る)