読者です 読者をやめる 読者になる 読者になる

kamiのサービス制作ログ

ひとりでサービスを制作している人の作業ログ的なブログ

よかったことだけを書くミニブログサービス「iine log」をリリースしました

f:id:kami30k:20141016154753p:plain

本日、よかったことだけを書くミニブログサービス「iine log」をリリースしました。 夜寝る前などに、1日のよかったことを書くことで、すこしだけ前向きになれるサービスです。

PC/スマートフォンで利用することができます。 よかったら使ってみてください。

この記事では、iine logの制作について書いてみます。

なぜつくった

一時期、モチベーションがまったく上がらない時期がありました。 いろいろ調べてみると、「夜寝る前によかったことだけを書くことで前向きになり、モチベーションが上がる」ことが分かりました。

でも、ただノートなどに書いても長続きするとは思えませんでした。 じゃあ誰かに見てもらえるサービスにしよう、ということで制作しました。

技術

iine logで使用している技術は以下のとおりです。

学んだこと

Devise+OmniAuth

有名すぎて特に書くことのない組み合わせですが、今回OmniAuthを初めて使いました。 iine logではメールアドレス、FacebookTwitterの3つの認証方法を実装しました。

一番ハマったのは、Facebookのアプリ登録でした。

開発環境

ローカルのディレクトリ構成は以下のような感じです。

/iinelog
  /app          # Railsアプリケーション
    /app
    /bin
    /config
      :

  /infra        # Chefリポジトリ
    /cookbooks
    /data_bags
    /environments
      :
    /spec       # Serverspec
    Vagrantfile # インフラ開発用Vagrantfile

  .gitignore
  Vagrantfile   # Railsアプリケーション開発用Vagrantfile

/iinelog/.gitignoreには/app/infraを登録しています。 つまり、リポジトリは以下の3つで管理しています。

iinelog-dev-env.git # /iinelog
iinelog-app.git     # /iinelog/app
iinelog-infra.git   # /iinelog/infra

/appVagrant内の/synced_folderNFSで同期させています。 Gitの操作はホスト側から、railsコマンドなどはゲスト側から操作しています。

ちなみにRailsアプリケーション開発用Vagrantfileは、/infraの本番環境構築用レシピの一部をconfig.vm.provision :chef_soloで再利用しています。

インフラCI

開発方針としては、「Cookbookは変わるがServerspecは変わらない」で、積極的に外部のCookbookを利用しつつ、Serverspecでのテストをしっかり書いています。 これによりインフラの開発コストを下げることができます。

インフラは上記/infraで開発しています。 まずChefレシピを実装し、インフラ開発用Vagrantfileに適用、これをServerspecでテストします。 テストがパスしたらBitbucketにプッシュします。

するとCIサーバ(Jenkins)で勝手に「Dockerを起動→Chefレシピを適用→Serverspecでテスト」を行ないます。 テストをパスした場合のみ本番環境に手動トリガーでインフラデプロイできるよう、ビルドパイプラインを構築しています。

導入は大変でしたが、一度やるとインフラ開発がものすごく加速します。

E2Eテスト

E2Eテストは今までCapybaraだけで書いていましたが、今回Turnipを採用しました。 features/stepsの管理しやすい構成を考えるのに時間がかかりましたが、今はCapybara単体よりシンプルに書けています。

環境変数管理

Railsアプリケーションのdatabase.ymlsecrets.yml環境変数の管理についてです。 私は本番環境用の設定のみENV['HOGE']のように環境変数から読むようにして、ファイル自体はリポジトリにコミットしています。

環境変数の管理はChef Soloを用いています。 Data Bags でdotenvを暗号化して管理しています。 このとき、 Data Bags の暗号化用の鍵をリポジトリにコミットしないよう注意が必要です。

ChromeiPhoneエミュレータ

Google Chromeには、標準でiPhoneをエミュレーションできる機能があることを知りました。 フロント実装の際、これがものすごく便利でした。 ガラケーもできたら最高なんですが……。

f:id:kami30k:20141016154814p:plain

おわりに

今回、開発着手自体は7月末でした。 当時は無職だったので、2週間くらいでリリースする計画でした。

ただ、ちょうど7月末に都内のスタートアップにリモートで週3でコミットし始めたため、リリースが遅れてしまいました。

11月から東京にてフルタイムでコミットすることになったため、サービスをつくるスピードはもっと遅くなると思いますが、引き続きつくっていきたいと思います。

今度はRailsAPIサーバにしたSPAかスマホアプリ、課金機能実装、SwiftでのiPhoneアプリなどをつくってみたいです。