皆様、明けましておめでとうございます。今年もどうかよろしくお願いいたします。
さて、2014年の元日にpip 1.5 がリリースされました。
このバージョンには、今までのバージョンと互換性のない変更点がいくつかあるために、新春早々からその対応をしていた方もいらっしゃるようで、お疲れ様でした。
現時点で、Travis CI の Python 環境にインストールされている pip のバージョンは 1.4.1 ですが、1.5 にアップグレードされるのは時間の問題です。
どうせアップグレードされるのだから先にアップグレードしてしまった方が楽だろう、ということで考えてみたのが下記の手順です。
事前にdevel相当のブランチからfix-requrementsブランチを切ったりするのは、お好みでどうぞ。
1. .travis.ymlのbefore_script:エントリにpip freezeを追加する
before_script:エントリは、テスト本体が実行されるscript:エントリの直前に実行されるエントリです。
このエントリにpip freezeを追加します。
before_script:
- "pip freeze"
もし、requirements.txtが存在するようでしたら、pip freeze -r requirements.txtと記述すると、出力結果が少し見やすくなります。
ただし、pip freezeはpip installとは違い、-rで複数のファイルを指定すると、最後に指定したファイルしか有効になりませんのでご注意ください。
3. 編集した .travis.ymlを commit して Travis CI でテストを走らせる。
これは、デフォルトのpipでテストをパスした時の環境をビルドログに記録するのが目的ですので、ここで一度 commit しておくことを強くオススメします。
4. .travis.ymlのbefore_install:エントリを編集する
before_install:は、pip install等を実行するinstall:エントリの直前に実行されるエントリです。
このエントリに下記の行を追加します。
before_install:
- "easy_install --version"
- "pip freeze"
- "travis_retry pip install -U setuptools"
- "cd `mktemp -d`"
- "travis_retry wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py"
- "travis_retry python get-pip.py"
- "cd $OLDPWD"
- "pip --version"
- "easy_install --version"
以下、箇条書きで説明します。
- デフォルトの pip で
pip --versionを実行しないのは、Travis CI の Python 環境では何もしなくても python と pip のバージョンがビルドログに出力されるからです。 - 行2:
pip freezeでは setuptools のバージョンは表示されないので、easy_install --versionを実行します。 - 行3: この
pip freezeはpip installの前に実行されますので、-rオプションの追加は無意味です。 - 行4: travis_retryは引数のコマンドを三回リトライするコマンドです。setuptoolsはここでアップグレードしますが、pipは
pip installではなくget-pip.pyを使ってアップグレードすることになっています。 - 行5:
get-pip.pyをダウンロードするディレクトリを作成します。 - 行6:
get-pip.pyをダウンロードします。 - 行7:
get-pip.pyを実行します。pipの本体がここでダウンロードされますので、travis_retryで実行します。 - 行8: ビルドディレクトリに戻ります。一時ディレクトリはビルド終了時に破棄されるはずなので、ここでは削除しません。
- 行9,10: pip と setuptools のインストール後にバージョンを確認しているのは、アップグレードした最新版が間違いなく使われていることを問題発生時に確認できるようにするためです。
5. pip の変更点を確認して必要があれば修正する
pip の変更点については pip の Changelog をご覧ください。
6. 変更を commit して Travis CI でテストを走らせる。
テストが無事パスすれば終了です。
最後に
以上の変更で、pip と setuptools の(開発版を除いた)最新リリースが常に適用されるようになりました。
同時に、インストールされたモジュールのバージョンの一覧がビルドログに残るようになりましたので、テストでエラーが発生した際にpip installのログを調べるよりも簡単に切り分けができるようになるはずです。
余談ですが、Ruby のプロジェクトではbefore_script: "bundle show"するのはよくあることだそうですが、Python のプロジェクトで.travis.ymlにpip freezeやpip listが含まれていた事例は見たことがありません。(ちなみに、PyPIでPython 3.Xをサポートしている3585モジュール中106ファイルの.travis.ymlで0件)
Travis CI は、サイトが Ruby で構築されているサービスのようですので、ひょっとすると Pythonista には敬遠されているのかもしれませんね。