Travisのドキュメント読んでたらDeploymentのProviderにPyPIがあって、読んだら簡単そうだったからやってみた。
travis-cliでPyPIの認証情報を暗号化したものを.travis.ymlに書いてTravisに渡すことができるので、Publicのレポジトリであっても自動リリースできる。
作戦
- GitHubでmasterからreleaseブランチにPR投げてマージする
- TravisはBuild成功時にブランチがreleaseであればPyPIにリリースする
masterは開発のもっとも進んだブランチでgit-flowとかでいうdevelopブランチ。
うれしさ
マージをトリガーにした自動リリースの仕組みを整えると特定のブランチのマージ履歴がリリース履歴と同期するのでズボラなリリースフローを改善できてうれしい。
- めんどくさいからgitでタグとかつけてらんない。Webサービスとかだとそもそもリリース多いしタグとかかったるい
- リリースするときは思いついたように荒々しくmasterをデプロイ
- リリースのヘッドがmasterのどこを指してるのよくかわからない
- 問題発生した時は
シックスセンス
で問題が解消されるコミットに出会うまで戻しデプロイを繰り返す
実行
まずtravis-cliを導入する。
gem install travis
travis login
GitHubのユーザー名とパスワード、設定してる場合は2段階認証も聞いてくるので入力する。
以下の様な.travis.ymlがある状態で、
language: python
python:
- '2.6'
- '2.7'
- '3.3'
- '3.4'
install:
- pip install -e . --use-mirrors
script:
- python setup.py test
deploy:
provider: pypi
user: Keita
on:
repo: keitaoouchi/easyimap
branch: release/pypi
distributions: sdist --formats=gztar,zip
python: 3.4
allow_failure: false
notifications:
slack:
secure: mRFzPF4qQzRfHCS9rYEKpUI9w5wvyv4AO8AVuzvwU1rExKokdl6jcxsMEYlOvozqztfjY7YSN3hm/KV60UiPBtbuox54GrvkCu/qqfx6tFRc1aS+5JclGvOGrrRyzodCIDJEuayiZIrzUSMwcwRInd+N1atpJUKoa9AgyVn+e0o=
on_success: change
on_failure: change
travis encrypt --add deploy.password
を実行すると、travisがPyPIのパスワードを聞いてくるので教えてあげると、
deploy:
provider: pypi
user: Keita
password:
secure: hiKhwSky/Vj0P3d9PZZLY4zvCdpWhNOogyNhvktY11cPTtBP1mPitMr9MMeyDzhqjc1NzetQqseOvISak9yTTQ6UVL3E7si6n2gXro3NdLlE+8LlNDzV/kAsgmAj3vhzmr1YYf6bATwtxzIDkVcTVgb5WjYqRKxKADILPbY9OKk=
on:
repo: keitaoouchi/easyimap
branch: release/pypi
distributions: sdist --formats=gztar,zip
python: 3.4
allow_failure: false
といった感じに暗号化されたパスワードをぶち込んでくる。ちなみにdeploy:on:python: 3.4
を忘れると複数バージョンのビルドごとにdeployが走ってしまうので忘れない。
あとはGitHub上でmasterからreleaseへのPRを作ってマージしてやると、このマージビルド成功時にPyPIにデプロイされる。
リリース用のPRを作ってマージして、
https://github.com/keitaoouchi/easyimap/pull/19
ビルド成功時にPyPIへのアップロードが行われて、
https://travis-ci.org/keitaoouchi/easyimap/jobs/43922642
PyPIにリリースできた。
https://pypi.python.org/pypi/easyimap/0.6.0
感想
楽だしズボラにやさしい。