Herokuのapp作成手順(buildpack-multiを使う場合も含む)

  • 34
    いいね
  • 0
    コメント

既にGemfile, Gemfile.lock, Procfileがあり(もちろんコードもある)、git init, git add ., git commitしている状況とします(git init してない場合を追記しましたが)。
ちなみに、Papertrailでログを見る場合、ソースコードには標準出力をバッファしないよう

$stdout.sync = true

を入れておくことをオススメします。

appの名前

appの名前をapp-testとします(仮名です)。
app_testとしようかと一瞬思いましたが、herokuのapp名にアンダースコアが使えないのを思い出しました)

app登録

$ heroku create app-test
Creating app-test... done, stack is cedar-14
http://app-test.herokuapp.com/ | git@heroku.com: app-test.git
Git remote heroku added

この heroku create コマンド(heroku apps:create コマンドのエイリアス)により

.git/configの一部
[remote "heroku"]
    url = git@heroku.com:app-test.git
    fetch = +refs/heads/*:refs/remotes/heroku/*

が設定されます。

複数の app を登録する場合(2015/12/11追記)

新しいリモートレポジトリ名(heroku2)を指定します。

$ heroku create app-test2 --remote heroku2
Creating app-test2... done, stack is cedar-14
http://app-test2.herokuapp.com/ | git@heroku.com: app-test2.git
Git remote heroku2 added

これにより、git push heroku master で app-test にプッシュし、git push heroku2 master で app-test2 にプッシュできます。
なお、heroku コマンドを使う際にはどちらのapp が対象なのか指定しないとエラーになります。なので heroku xxx --remote heroku または heroku xxx --remote heroku2 のような形式で指定を行う必要があります。(もしくは、アプリ名を指定して heroku xxx --app app-test または heroku xxx --app app-test2
もちろん heroku コマンドの remote デフォルト指定も出来ますので、普段扱う app を指定しておくと良いでしょう。次の git コマンドでデフォルト指定が出来ます。

$  git config heroku.remote heroku

なお指定するのは app 名では無くレポジトリ名 です。
この指定により

.git/configの一部
[heroku]
    remote = heroku

が登録され、heroku xxx だけであれば app-test app を、heroku xxx --remote heroku2 と指定すると app-test2 app を対象として heroku コマンドが実行されます。
参考:Managing Multiple Environments for an App | Heroku Dev Center
(2015/12/11追記ここまで)

app 登録のときに buildpack-multi を設定(2015/11/30追記)

一気に設定出来るようです(当方未確認)。

$ heroku create app-test --buildpack https://github.com/heroku/heroku-buildpack-multi.git

参考:Using a custom buildpack | Third-Party Buildpacks | Heroku Dev Center
(2015/11/30追記ここまで)

git init し忘れていた場合

$ heroku create app-test
Creating app-test... done, stack is cedar-14
WARNING: Incomplete credentials detected, git may not work with Heroku. Run `heroku login` to update your credentials. See documentation for details: https://devcenter.heroku.com/articles/http-git#authentication

Heroku から app を作ったけど git がないよと注意してきます。
ですので git init してから git remote add heroku git@heroku.com:app-test.git heroku git:remote -a app-test しましょう。これにより Heroku へプッシュする際に git push heroku master のように引数を heroku で済ませることができるようになります。

herokuのタイムゾーンを日本に設定

$ heroku config:set TZ=Asia/Tokyo
Setting config vars and restarting app-test... done, v3
TZ: Asia/Tokyo

参考:Herokuのタイムゾーンを日本時間に設定する - アインシュタインの電話番号

その他のタイムゾーンにしたい場合にはこちらを参照ください。

Papertrailアドオン登録

ログを見るためにPapertrailアドオンを早めに登録。
もちろん無料版で。

$ heroku addons:create papertrail
Adding papertrail on app-test... done, v4 (free)
Welcome to Papertrail. Questions and ideas are welcome (support@papertrailapp.com). Happy logging!
Use `heroku addons:docs papertrail` to view documentation.

以前は heroku addons:add papertrail でしたが deprecated になったようです('15/9/1現在)。

Papertrailのタイムゾーンも日本に設定

heroku dashboardで作成したappページ
https://dashboard.heroku.com/apps/app-test/resources (←うそページです))

からPapertrailアドオンへのリンクをクリックしてPapertrail Eventsページへ。
右上の Settings をクリックして Settings ページへ移り、さらに左の縦並びから Profile を選択します。

Profile — Papertrail
Time zone があるので、Osaka / Sapporo / Tokyo のいずれかを選択し Update Preferences で更新します(なんで札幌があるんだろう)。

Ruby以外の言語を一緒に使う場合はherokuへのdeploy前にheroku-buildpack-multiを登録

複数のbuildpackを同時に使うbuildpackである heroku-buildpack-multi

を使います。('14/11/26に Heroku 公式になりました。)

ではheroku-buildpack-multiの使い方を簡単に記載しておきます。

.buildpacksファイル作成

まずは.buildpacksファイルを作り、使いたい言語に対応するbuildpackを登録します。
例えば Ruby と PhantomJS (バージョン 1.9.8 2.1.11 ) とを使う場合は

.buildpacks
https://github.com/stomita/heroku-buildpack-phantomjs.git
https://github.com/heroku/heroku-buildpack-ruby.git

とします。
もちろんその後にgit commit -aとして.buildpacksをGit管理下に置きます。

当然ですが、PhantomJS以外の言語も使えます。herokuで利用可能なbuildpackは

を見てください。

herokuのCedar stackにheroku-buildpack-multiを使うように登録

(2015/11/30変更)

$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
Buildpack set. Next release on app-test will use https://github.com/heroku/heroku-buildpack-multi.git.
Run git push heroku master to create a new release using this buildpack.

以前は heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git で設定していたのですが、どうやら環境変数を設定しても buildpacks が使われないようになった…っぽいです(詳細未確認)。
(2015/11/30変更ここまで)

herokuの環境関数を設定

Ruby 1.9.3の場合 RubyとPhantomJSの場合

参考:橋本商会 » HerokuでSinatra+PhantomJS
以下を実行して環境関数を設定し ます。 なくても良くなりました
('15/9/1追記)以前は heroku config:add で PATH と LD_LIBRARY_PATH を指定しないとダメだったのですが、最近は heroku-buildpack-ruby.git 及び heroku-buildpack-phantomjs.git を指定することにより、 Ruby インタプリタ及び PhantomJS への PATH が追加されるのだと思われます(推測)。デプロイした状況で PATH などを確認すると以下のようになります。

$ heroku run bash
Running `bash` attached to terminal... up, run.7411
~ $ echo $PATH
/app/bin:/app/vendor/bundle/bin:/app/vendor/bundle/ruby/2.1.0/bin:/usr/local/bin:/usr/bin:/bin:vendor/phantomjs/bin
~ $ echo $LD_LIBRARY_PATH
:vendor/phantomjs/lib

('15/9/1追記ここまで)

Ruby 2.0.0の場合

なぜか上記の1.9.3のPATHでもいけました。(理由不明。使ったコードが1.9.3でも2.0.0でもいけるものだったから、かもしれません。)

環境変数設定など

それぞれのbuildpackのGithubに載っている、と思います。
PhantomJSでのPATH及びLD_LIBRARY_PATHに関してはこのように載っていました。 (いまは載ってないので '15/9/1削除)

Note

If you're using heroku-buildpack-multi to include other buildpacks, you should set environment variable by your own to include following paths.

PATH="/usr/local/bin:/usr/bin:/bin:/app/vendor/phantomjs/bin"
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/lib:/app/vendor/phantomjs/lib"

stomita/heroku-buildpack-phantomjs

環境変数を設定していないと

herokuがPhantomJSの場所が分からずUnable to find phantomjs executable.エラーになりました。

今は不要です。('15/9/1現在)

herokuにdeployする

heroku-buildpack-multiを使ったときのログを載せておきます。

いまのもの('15/9/1現在)

$ git push heroku master
  :
 (中略)
  :
remote: -----> Fetching custom git buildpack... done
remote: -----> Multipack app detected
remote: =====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
remote: =====> Detected Framework: PhantomJS
remote: -----> Extracting PhantomJS 1.9.8 binaries to /tmp/build_46007cdcc7dec8b50724e146966fb879/vendor/phantomjs
remote: -----> exporting PATH and LIBRARY_PATH
remote: =====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
remote: =====> Detected Framework: Ruby
remote: -----> Compiling Ruby
remote: -----> Using Ruby version: ruby-2.1.7
remote: -----> Installing dependencies using bundler 1.9.7
  :
 (後略)
  :

PhantomJS の Buildpack で exporting PATH and LIBRARY_PATH と表示されています。

古いもの

$ git push heroku master
  :
 (中略)
  :
-----> Fetching custom git buildpack... done
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
=====> Detected Framework: PhantomJS
-----> Extracting PhantomJS 1.9.7 binaries to /tmp/build_fc8597ea-9758-4e68-wxyz-df31f9c72752/vendor/phantomjs
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
=====> Detected Framework: Ruby
-----> Compiling Ruby
-----> Using Ruby version: ruby-1.9.3
  :
 (後略)
  :

app起動

deployを終えてもappはherokuに載っただけでまだ起動していません(process type が web の場合だけは勝手に起動しますw)。
heroku ps:scaleで起動させます。
このコマンドはProcfileの冒頭のprocess typeを引数に取ります。
例えば

Procfile
cron: bundle exec ruby apptest.rb

である場合は、process type cron を用いて cron=1 とします。

$ heroku ps:scale cron=1
Scaling dynos... done, now running cron at 1:1X.

余談:process type名

ちなみに、process type には任意の名前が使えます。
ただし web だけは特別で、HTTP トラフィックのルーティングを受ける名前になっています(そして、ルータアクセスを受けないまま30分間ほど経過すると SIGTERM が送られてプロセスが落とされますorz

The web process type is special as it’s the only process type that will receive HTTP traffic from Heroku’s routers. Other process types can be named arbitrarily.
Process Types and the Procfile | Heroku Dev Center

個人的には、Twitter の bot には bot、定期稼働する app には cron などと名付けたりしていますw

おまけ:https://github.com/ddollar/heroku-buildpack-multi を使っていて放置していた場合

怒られます。

remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Multipack app detected
remote: WARNING: This buildpack is no longer maintained.
remote: 
remote: Please choose a different buildpack or go to https://github.com/ddollar/heroku-buildpack-multi
remote: and fork it to your own account.
remote: 
remote: This buildpack will cease to function at the stroke of midnight on January 1, 2017.
remote:  !     Push rejected, failed to compile Multipack app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !   Push rejected to app-test.
remote: 

ので、怒られないように更新します。

buildpack の削除

$ heroku buildpacks:clear 
Buildpacks cleared.
 ▸    The BUILDPACK_URL config var is still set and will be used for the next release

buildpack の登録

$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
Buildpack set. Next release on app-test will use https://github.com/heroku/heroku-buildpack-multi.git.
Run git push heroku master to create a new release using this buildpack.

push

$ git push heroku master
 :
remote: -----> Multipack app detected
remote: =====> Downloading Buildpack: https://github.com/stomita/heroku-buildpack-phantomjs.git
 :
remote: Verifying deploy... done.
To git@heroku.com:app-test.git
   4d25f4e..8ac7e86  master -> master

  1. 2016/2/3に2.1.1へ更新されました