Edited at

BitbucketのPrivate repositoryをタダでCIする

More than 5 years have passed since last update.


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の実行内容


local_jenkins_job

nosetests -c nose.cfg



DEV@cloud上のJenkinsの実行内容


cloudbee_jenkins_job

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 というディレクトリが作られてそこに一通り入る)