長く困難な月にさまざまなことを試し、気づくたびに噛まれた後、
Herokuがデプロイメントメカニズムとしてgitリポジトリを使用しているからといって、それをgitリポジトリとして扱わないでください。
それも同様にrsyncだったかもしれません、彼らはgitに行きました、これのために気が散ることはありません
そうすれば、あらゆる種類の傷を負うことになります。前述のソリューションはすべて、どこかで惨めに失敗します。
- 毎回、または定期的に実行する必要がある、または予期しないことが発生する(サブモジュールのプッシュ、サブツリーの同期など)
- たとえば、コードをモジュール化するためにエンジンを使用する場合、Bundlerはあなたを生きたまま食べます
- エンジンをgit repoリンクとして追加しようとします+
bundle deploy
-失敗し、毎回更新をバンドルする必要があります
- エンジンを
:path
+ bundle deploy
-失敗として追加しようとすると、開発チームは:path
オプションを「このgemオプションでBundlerを使用していない」と見なし、本番環境にバンドルされません
- また、エンジンを更新するたびにRailsスタックが更新されます-_-
- 私が見つけた唯一の解決策は
/vendor
、開発でエンジンをシンボリックリンクとして使用し、実際に本番用にファイルをコピーすることです
ソリューション
問題のアプリには、git rootに4つのプロジェクトがあります。
- api-プロファイルに応じて、2つの異なるherokuホストで実行されます-アップロードとapi
- web-ウェブサイト
- web-old-移行中の古いウェブサイト
- common-エンジンで抽出された共通コンポーネント
すべてのプロジェクトにはvendor/common
、common
エンジンのルートを参照するシンボリックリンクがあります。herokuにデプロイするためのソースコードをコンパイルするときは、シンボリックリンクとrsyncを削除する必要があります。このコードは、物理的に各個別のホストのベンダーフォルダーにあるコードです。
- ホスト名のリストを引数として受け入れます
- 開発リポジトリでgit pushを実行してから、別のフォルダーでクリーンなgit pullを実行し、ダーティ(コミットされていない)変更がホストに自動的にプッシュされないようにします。
- ホストを並行してデプロイ-すべてのheroku gitリポジトリがプルされ、新しいコードが適切な場所にrsyncされ、git commitコメントの基本的なプッシュ情報でコミットされます、
- 最後に、カールを使ってpingを送信し、趣味のホストに目を覚まし、ログをテイルして、すべてがワインに移行したかどうかを確認します。
- jenkinsでもうまく機能します:D(テストの成功後にテストサーバーに自動コードプッシュ)
野生で非常にうまく動作し、6か月後の問題は最小限(いいえ)です。
これがスクリプトですhttps://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
アップデート1
@AdamBuczynski、それは決して簡単なことではありません。
1つ目は、少なくとも本番環境とテスト環境が常にあり、機能が特定されていないクラスタが多数ある場合です。突然、1つのフォルダをn herokuプロジェクトにマップする必要があります。これは、かなり基本的な要件であり、すべてを何らかの方法で整理する必要があります。スクリプトは、どこにデプロイしたいソースを「知っている」か、
2つ目は、プロジェクト間でコードを共有することです。今度は、sync_common
Herokuに特定のフォルダー構造とバンドルとrubygemsが必要であるため、開発中のシンボリックリンクを含むshennaniganが実際のrsyncされたコードに置き換えられます。共通のスレッドを宝石に抽出したい
3番目に、CIをプラグインし、サブフォルダーとgit repoを整理する方法を少し変更します。最終的には、前述の要点で終了する最も単純な使用例です。
他のプロジェクトでは、Javaビルドをプラグインする必要があります。ソフトウェアを複数のクライアントに販売する場合、インストール要件などに応じて、インストールされるモジュールをフィルタリングする必要があります。
私は本当に物事をRakefileまたは何かにバンドルすることを検討し、すべてをそのようにする必要があります...