既に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
コマンドのエイリアス)により
[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 名では無くレポジトリ名 です。
この指定により
[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 ) とを使う場合は
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変更ここまで)
(2017年追記)
なお、以前の古い ddollar/heroku-buildpack-multi
を使う設定のまま2017/1/1以降に git push heroku master
すると
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.
「古いんじゃボケ」と怒られます。このようなときには、いま設定されているビルドパックを削除したあとに新しい heroku/heroku-buildpack-multi
を設定してやります。
$ heroku buildpacks:clear
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
そして git push heroku master
とすれば OK です。
(2017年追記ここまで)
##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での (いまは載ってないので '15/9/1削除)PATH
及びLD_LIBRARY_PATH
に関してはこのように載っていました。
##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](https://github.com/stomita/heroku-buildpack-phantomjs)
###~~環境変数を設定していないと~~
~~herokuがPhantomJSの場所が分からず`Unable to find phantomjs executable. `エラーになりました。~~
今は不要です。('15/9/1現在)
#herokuにdeployする
heroku-buildpack-multiを使ったときのログを載せておきます。
###いまのもの('15/9/1現在)
```bash
$ 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を引数に取ります。
例えば
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 の削除
```sh
$ 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
-
2016/2/3に2.1.1へ更新されました ↩