Kensuke Kousaka's Blog

Notes for Developing Software, Service.

WerckerとHerokuを使って自動デプロイを試してみた

GitHubやBitbucketにコードをプッシュすれば自動的にアプリのテスト・ビルド・デプロイを行うことができるCI(Continuous Integration,継続的インテグレーション)サービスであるWerckerと,Herokuを使い,アプリ開発の負担の一つであるデプロイ作業の自動化を試してみた.

なお,今回自動デプロイの対象とするアプリケーションは,Python 3系を用いてまったり開発中のTwitter botアプリである.

準備

まずはGitHubにこのアプリのコミットをプッシュしておく.なお,アプリ動作に必要な鍵情報など(Twitter botにおいてはAPI鍵など)は,最終的にHeroku上で動作させる点を考慮し,環境変数の形で外部から情報を得られるようにしておく.また,WerckerとHerokuについて,アカウントを登録しておく.

Werckerアプリ作成

GitHubにコードをプッシュできたら,これをもとにWerckerでアプリを作成する.まずはグローバルナビゲーションからCreateApplicationとクリックする.

f:id:k3n:20180610122921j:plain

その後は,示される手順に沿って推奨設定で進めていくといい.wercker.ymlについては後で中身を変更するが,ひとまず提示されるものをコピーして,プロジェクトのルート直下に追加する.アプリ作成が完了したら,wercker.ymlの編集に移る.

wercker.ymlの編集

先ほどのアプリ作成時に提示されるwercker.ymlは,GitHubにプッシュしたコードを元にそれっぽいものを示してくれたもので,あくまでサンプルである.なのでこれからwercker.ymlの詳細を詰めていく. まず,編集が完了したwercker.ymlを以下に示す.

wercker.yml for Python 3.x based Twitter bot appli ...

行の先頭に#が付いているのがコメントであり,ほとんどがコメントになるので見苦しいかもしれない.まずbox: python:3.4-slimというものでこのプログラムを動かすコンテナを指定している.また,build:step:の中でpip-install:とあり,requirements_file: "requirements.txt"と書いている.このrequirements.txtにはpipでインストールしたこのプログラムに必要なライブラリの一覧を書くことになる.これは次のステップで作成する.script:の部分では任意のスクリプトを実行させることができる.ここではPythonとpipのバージョンと,pipでインストールしているライブラリの一覧を出力させている.最後に,deploy:steps:heroku-deploy:の部分でHerokuへのデプロイに必要な情報を書いている.これは後に控えるWerckerとHerokuの連携部分で必要になってくる.これらをwercker.ymlに書けば,編集は完了である.

requirements.txtの作成

このプログラムの動作に必要な,pipでインストールするライブラリの一覧をrequirements.txtファイルに書き,プロジェクトのルート直下に置く.pipでインストール済みのライブラリ一覧は,以下のコマンドで参照できる.

$ pip freeze

そのため,以下のコマンドを打ち,pip freezeで出力された内容をrequirements.txtにリダイレクトさせることで,簡単にrequirements.txtを作成できる.

$ pip freeze > requirements.txt

もしプログラムの動作に必要のないライブラリが混じっていたら適宜削除すればいいが,基本的にはこれでrequirements.txtの作成は完了である.

Herokuアプリ作成

Herokuにもアプリを作成する. まずはグローバルナビゲーションから+Create new appと選択する.その後はアプリ名の指定やリージョンの指定があるのでお好みで.

f:id:k3n:20180610123035j:plain

作成できたらそのアプリの詳細画面からSettingsに行き,Config Variablesの部分でアプリの動作に必要な環境変数の追加を行う.

f:id:k3n:20180610123050j:plain

追加できたら,次にWerckerとHerokuの連携設定に移る.

WerckerとHerokuの連携

まず,Herokuのアカウント管理画面に行く.

f:id:k3n:20180610123106j:plain

管理画面の下の方にあるAPI Keyの部分でShow API Keyを選択し,Herokuアカウントのパスワードを入力してHerokuのAPI Keyを得る.

f:id:k3n:20180610123120j:plain

HerokuのAPI Keyを得られたらWerckerに移ってアプリケーションの設定画面に行き,TargetsAdd deploy targetcustom deployと選択する.

f:id:k3n:20180610123134j:plain

Deploy target nameにはherokuなどと入力し,Auto deployにはチェックを入れておく.ブランチ名にはmasterなどをお好みで.入力ができたらSaveを選択する.するとDeploy pipelineという項目が新たに表示されるので,ここのAdd new variableを選択する.ここで設定する変数は,wercker.ymlheroku-deploy:で指定したHEROKU_KEYHEROKU_USERHEROKU_APP_NAMEの三つである.HEROKU_KEYには先ほど得たHerokuのAPI Keyを,HEROKU_USERにはHerokuアカウントのメールアドレスを,HEROKU_APP_NAMEにはHerokuに作成したアプリ名をそれぞれ指定する.設定は以下のように行う.なお,Protectedにはチェックを入れておくこと.設定ができたらOKを選択する.

f:id:k3n:20180610123148j:plain

WerckerとHerokuの設定は完了した.あとはプログラムをHerokuで動作させるためのProcfileの作成を行い,GitHubへプッシュする.

Procfileの作成,GitHubへのプッシュ

まずはプログラムをHerokuで動作させるためのProcfileをプロジェクトのルート直下に置く. このプログラムのProcfileは以下のようになる.

Procfile for Python 3.x based Twitter bot applicat ...

Herokuの動作モードはbotを指定し,その後にアプリを起動する際のコードを書く.動作モードには他にもwebなどがあるので,自分のプログラムに最適なものを選ぶ.Procfileを作成できたら今まで行ってきた変更をコミットし,GitHubにプッシュする.するとWerckerでアプリのテストが自動的に走り,テストが通ればHerokuにアプリがデプロイされるはずだ.Herokuでアプリが自動的に動かなかった場合は,Herokuでアプリの詳細画面に行き,ResourcesタブからアプリのスイッチをONにすればいい.次回からは自動的に動くようになる.

以上でコードをGitHubにプッシュすればWerckerで自動的にテストが走り,Herokuにデプロイされる環境が構築できたことになる.