皆様、明けましておめでとうございます。今年もどうかよろしくお願いいたします。
さて、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 には敬遠されているのかもしれませんね。