Ubuntu+nginx+uwsgiのサーバーに、CicleCIを通したGithubプロジェクトをデプロイできるようにした話
Githubで管理しているflaskアプリを、CicleCiでグリーンになったら、Ubuntu+nginx+uwsgiのVPSサーバーにデプロイできるようにしました。
お遊びアプリ作るときのバックエンド用にさらっとアプリ置ける場所欲しいよね、と思って用意したものです。
使用したバージョン
Ubuntu 14.04.2 LTS
nginx/1.4.6
uwsgi 2.0.10
ansible 1.9.1
Vagrant 1.7.2(手元でテストするときに使った
実現するワークフロー
この結果以下の様なワークフローになります。
2.ansibleのスクリプトを使用し、プロビジョニングする。(ここでUbuntu+nginx+uwsgiのサーバーが完成
3.releace/*ブランチを作成しgithubにpushする
4.CicleCIのテストが動く。
5.グリーンであれば、2のサーバーにデプロイされる。(ここでアプリのデプロイが完了
6.http://arvelt.net/hello-flask でHello World!が表示される(複サブディレクトリを使用できるようにしました。
7.アップデートする場合は3から実施する。
仕組み
2要素にわけて構成しました。
1.サーバーを整えるansibleスクリプト(arvelt/simple-python-api-server-ansible-book · GitHub
表でnginxが振り分けて、うらでuwsgiが動くようになっています。uwsgiを選択したのは、バックエンドはpythonで作る予定だからです。
最初はansible-galaxyをなるべく使おうと思っていましたが、動かしてもあっちこっちの設定が知らないままにされているというようなことになってしまい、返ってハマりがちでした。結局最小の設定を自分で仕込むでいます。
nginxとuwsgiをつなぐ箇所が何度もつまり続けました。unixソケットファイルというのを使うのがよいらしいのですが、どうにもうまくいかないのでポートを使用するようにしています。
2.CicleCI用の設定ファイルを持ったGithubプロジェクト(arvelt/hello-flask · GitHub
このワークフローの構造を作るため取り組みなので、flaskを使用したhello-worldアプリです。cicleCI上でテストを実行しますが、cicle ciはデプロイの設定をすることができます。HerokuやAWSは元から用意されていますが、それ以外にも任意のスクリプトを実行させることができます。
私はデプロイスクリプトとしてansibleコマンドを指定することで、githubからcloneさせてデプロイできるようにしました。
cicle ciから別のサーバーにデプロイするために、CicleCIのProjectSettingからsshの秘密鍵や環境変数を登録できるようになっています。ansibleには変数で受け取るようにしておけばそれらの値を使うことができます。
特にsudoするときのパスワードをどう渡すかは大変苦慮しました。スクリプトではask-sudo-passは使えないからです。ansible-sudo-passwordという値があることに気づいてからは、いかにしてそれに渡すかということに腐心しました。なんとかうまくいってよかったです。
所感
今回はVPSにデプロイできるようにしていますが、これは例えば、リリースブランチにpushするたびにAWSで新規インスタンスを作成して、その上にデプロイする、という様なことも簡単にできます。ここらへんはプロビジョニングツールを使った利点です。
データベース周りがないのですが、今回はそこまでいけずに力尽きたというのがあります。実務で使うものでもないので、MongoDBなどを選択して環境にするかもしれません。
これらのプロビジョニングツールを試したい場合、Vagrantを使用するのが非常に有効です。手元で作っては壊しを何度も繰り返せます。VPSもそれ自体はよいですが、なにぶん外部に公開されていますので、あまりおかしなことはできないというのもあります。
ところでこの仕組は私が考えたものではなく、先人がやっていたことを改めて手元でやってみたという確認です。大本はそちらのほうをごらんください。
GitHub 時代のデプロイ戦略 - naoyaのはてなダイアリー