Aspen to Cedar

Heroku から Aspen stack から Cedar stack に移行してくださいね、というメールが来ました。 現在 Aspen stack 上で稼働しているサービスは 2 つあり、そのうち一つは破棄してかまわないサービスでしたが、 もう一つは残しておきたかったので、移行することにしました。

移行に関しては Migrating to the Celadon Cedar Stack を参考にしました。

今使っている古い Stack から Cedar stack には更新ができないみたいで、Cedar stack のアプリを新規に作成することになります。

やったこと

Gemfile

Aspen stack では bundler を用いて gem を管理していません。Cedar stack では bundler を使って gem を管理するので、Gemfile が必要になってきます。

ソースから使用している gem を抜き出して Gemfile に記述していきます。バージョンを今と同じにした方がいい、と考えましたが、この際なので最新版を入れておくことにしました。 問題が出たらその都度解決するという方針です。なるべくなら出ない方がいいんですが。

一点注意点として、Heroku の環境では sqlite3 の gem をインストールできない。開発環境は sqlite3 を使っている場合は Gemfile に 開発環境は sqlite3, 本番環境は pg を使うと明示する必要があります。

group :production do
    gem 'pg'
end

group :development do
    gem 'sqlite3'
end

Heroku では開発環境でも PostgreSQL を使うのをおすすめしてます。 https://devcenter.heroku.com/articles/how-do-i-use-sqlite3-for-development まあ、仕事だったら確実にそうしてるだろうね。ごもっともです。でも、今回はそこまでする余裕もないので。

Procfile

Cedar から Procfile で実行するコマンド(?)を指定しなければいけないので、Procfile を作成。

web: bundle exec thin start -p $PORT -e $RACK_ENV

Ruby 1.8.6 => Ruby 1.9.2

Ruby 1.9.2 では Regexp.quote の第二引数がなくなっていました。第二引数は文字コードを指定するのですが、1.9.2 からは $KCODE が廃止され先頭行に magic comment で文字コードを指定することになったので、その影響でしょう。

Regexp.quote(string[,kcode]) # 1.8.6
Regexp.quote(string)         # 1.9.2

Ruby のバージョンアップによる影響があったのは上記 一カ所だけでした。思ったいたよりも少なかったです。

gem ライブラリのアップデート

この際だからということで ライブラリも全て最新にアップデートしました。これも思っていたよりも修正が必要な箇所は少なく。Twitter のライブラリだけでした。

# old
tauth = Twitter::OAuth.new(CONSUMER_TOKEN, CONSUMER_SECRET)
tauth.authorize_from_access(ATOKEN, ASECRET)
twitter = Twitter::Base.new(tauth)

# new
Twitter.configure do |config|
  config.consumer_key       = CONSUMER_TOKEN
  config.consumer_secret    = CONSUMER_SECRET
  config.oauth_token        = ATOKEN
  config.oauth_token_secret = ASECRET
end

旧サービス

新しく Cedar stack でサービスを動かし始めても、旧サービスは残っています。新旧でドメインも変わるので、旧サービスにアクセスがあったら新サービスへリダイレクトさせようかとも考えたのですが、そうすると新サービスのドメインにずっとプレフィックスが付いてしまうのでやめました。旧サービスは移行が終わったら閉じて、旧サービスで使っていたドメイン(アプリ名)を新しいサービスに着けました。