-
Notifications
You must be signed in to change notification settings - Fork 9
Debugging java scala builds
あなたのソースコードをHerokuへプッシュするときに、ビルドはあなたが指定した言語用のBuildpackを使って処理をされます。たまに、ローカルでビルドしたコードがHerokuへプッシュした際に問題を抱える事があります。こういう状況の場合、問題をデバッグする一番良い方法はHerokuでビルドがどのように行われているのかを理解し、あなたのローカルの開発環境とHerokuとの間での、開発/製品の同一性をより近い下野にすることです。
あなたのコードを実行する正確な手順はあなたの言語用のビルドパックの中にあります。ビルドの概要はそれぞれの言語やフレームワークのHerokuのサポートを説明した記事の中にも発見する事が出来ます。
それぞれのビルドパックはあなたのコードをビルドするためのもっとも一般的なコマンドを実行しようと試みます。これはあなたが普段行っている処理を使ってローカルでビルドする、またはほとんどの場合、Heroku上でもビルドする何かを予想できる理由です。しかしながら問題に遭遇した場合の最適なアプローチは、Herokuがあなたのコードをビルドしている状態と、可能な限り近い形でローカルビルドを合わせようとすることで、失敗をローカルで再現しようとする事です。違いが見つかるいくつかの一般的な領域が存在するはずです。
上で述べたように、何のコマンドが、そしてどのオプションがあなたのコードをビルドするために使われているかを確認するために、あなたが選んだ言語かビルドパックのためのサポート記事を見るようにしてください。ローカルでこれを会わせる事が大切な第一歩です。
ほとんどのビルドシステムは、ビルドの高速化の為に、一度集めた依存ファイル群を保持しておくローカルビルドキャッシュを利用しています。もし、依存ファイルのあるバーションをローカルでビルドしていたなら、ビルドキャッシュの中に存在しているでしょうが、Herokuがアクセスできるパブリックなリポジトリの中には無いはずです。Herokuで起こるようなビルドをローカルで再現するために、ローカルのビルドキャッシュを一度クリアした状態でビルドを試してみた方がいいでしょう。これはあなたのビルドツールによって変わってきます。
Maven
以下のフラグをビルドコマンドに加える事で、Mavenの実行を別のローカルのリポジトリに向けさせる事が出来ます :
mvn -Dmaven.repo.local=/path/to/repo
空のディレクトリから、あなたのローカルリポジトリを指すようにしてください。
SBT or Play 2.x
以下のフラグをビルドコマンドに加える事で、Mavenの実行を別のローカルのリポジトリに向けさせる事が出来ます :
sbt -Dsbt.ivy.home=/path/to/repo clean compile stage
空のディレクトリから、あなたのローカルリポジトリを指すようにしてください。
ビルドの処理を高速化するために、いくつかのデフォルトのビルドパックは、ビルドが行われるデータセンタとのレイテンシが低いファイルストアの中に一般的な依存ファイルをキャッシュするs3positoryと呼ばれるプロキシを使用します。
s3positoryはMavenのようなリポジトリのためのプロキシです。依存ファイルがターゲットが設定されたs3positoryから回収される時、リポジトリは依存ファイルに関する確認がされます。依存ファイルが存在した場合は、レイテンシが低い場所へとコピーされから返されます。この先のリクエストはソースのリポジトリへリクエストを送るのではなく、ファイルストアから返却されるようになります。ターゲットリポジトリへのリクエストはまた同時に、さらなるスピード改善のために認められた結果を最も早い結果を返します。s3positoryについてもっと学ぶためにsource repoを見てみてください。
Heroku上のビルドが行っているのと同じ方法で、s3positoryを使用するためにあなたのローカルビルドを設定する事が出来ます。さらにより良い開発環境/プロダクション環境の同一性を提供しながら、これはあなたのローカルのビルドを高速化します。これを行うためのステップはあなたがどのツールを使用するかに依存しています。
Maven
Javaのビルドパックは、もっとも一般的なJavaの依存ファイルのリポジトリをs3positoryへ向けているデフォルトのsetting.xmlを使っています。あなたのローカルビルドでs3positoryを使うために、このsetting.xmlを使用する事が出来ます。やらなければ行けない事は、setting.xmlをあなたのローカルのMavenリポジトリのディレクトリにコピーする事だけです。(普通は ~/.m2 です。) The Java buildpack uses a default settings.xml that points the most common Java dependency repositories to s3pository. You can use this settings.xml to use s3pository in your local builds. All you have to do is copy the settings.xml to your local maven repository directory (usually ~/.m2)
SBT or Play 2.x
Scalaのビルドパックはs3positoryに向いている必要な回収機構を追加するプラグインを使用します。このプラグインをローカルで使用するために、Scalaファイルをあなたのアプリケーションのプロジェクトディレクトリか、全てのビルドに適応させるために~/.sbt/pluginsに、コピーしてください。
もしs3positoryが問題を起こしているという事を発見した場合、Herokuビルドをs3positoryを使用せずに実行することができます。s3positoryを利用しているそれぞれのビルドパックは、それを外出しにしたブランチをもっています。
$ heroku config:set BUILDPACK_URL='http://github.com/heroku/heroku-buildpack-java.git#no-s3pository'
$ heroku config:set BUILDPACK_URL='http://github.com/heroku/heroku-buildpack-scala.git#no-s3pository'