7

現在書いている AngularJS アプリケーションの継続的な展開のために Codeship と Heroku を試しています。アプリは Yeoman を使用して作成され、bower と grunt を使用します。Codeship は無料で使用でき、これを構成して AngularJS プロジェクトをビルドすることができ、ビルド後に展開ステップを追加する機能が提供されたため、最初はこれが本当に良いセットアップのように思えました。選択できる PaaS プロバイダーも多数ありました (Heroku、S3、Google App Engine など)。ただし、Heroku でアプリを実行するのに少し行き詰まったようです。

この問題は、このディレクトリが Heroku ポストビルドに公開されるように、すべてのドキュメントが/distmy からパスを削除することを示唆しているという事実から始まりました。.gitignoreこれは主に、ローカル マシンから Heroku にパブリッシュすることについて説明したドキュメントからのものでしたが、コードシップが内部で行っているのはこれだけだと思います。ビルド出力をソース管理にチェックインする必要があるとは思わないため、これを行いたくありませんでした。正当な理由で/distフォルダが追加されました。.gitignoreさらに、この種のことは、マシンから最新のビルドをプッシュするだけでよいため、CI サーバーを持つという点をいくらか無効にします。

bower install && grunt buildさらに掘り下げた後、Herokuでビルドを再実行し、すべてのbower依存関係を再設定するなど、packages.jsonファイルにpostinstallステップを追加できることがわかりました(ソースにチェックインしてほしい他のもの) control!) とdistディレクトリ。

これを試してみると、依存関係としてbowerとを に追加する必要があることが明らかになりました。gruntpackages.jsondevDependencies

だから私は今行き詰まっているようです。やりたいことは、ビルド アーティファクト ( /dist)、依存関係 ( /bower_components)、およびserver.jsサイトを実行するファイルを公開することだけです。Heroku と Codeship でこれを達成する方法を知っている人はいますか? あるいは、さまざまなツールを使用してこれに成功した人はいますか。私は無料のものを探しており、それが本番環境で安定していないこと (複数のサーバーにスケーリングしないなど) を受け入れたいと思っていますが、アプリを継続的にデプロイすることだけが目的なので、今のところこれで問題ありません。内部テストを行い、結果を私のチームの非技術者メンバーと共有して、優先したい機能について話し合うことができるようにする.

アドバイスをいただければ幸いです。

ありがとう

4

2 に答える 2

3

コードシップのクルーのマルコです。これについてアプリ内メッセージを送信しましたか?お客様のアプリケーションを Codeship で構築し、Heroku に正常にデプロイできると確信しています。

非常に短い答えとして、これを実行する最も簡単な方法は、 package.jsonの依存関係にbowerとの両方を追加することです。もう 1 つの可能性は、両方のツールが既にインストールされているカスタム ビルドパックを探すことです。grunt

最後に、Codeship でツールを実行し、新しくインストールしたファイルをリポジトリに追加し、変更をコミットして、この新しいコミットを Heroku にプッシュすることもできます。これを使用したい場合は、おそらく変更を強制的にプッシュする必要があります。

アプリ内メッセンジャー (サイトの右下隅) からお気軽にご連絡ください。喜んでお手伝いさせていただきます。

于 2015-05-04T12:26:04.023 に答える
2

これを機能させる方法は 2 つあります。

Heroku Node カスタム ビルドパック

mbuchetics Heroku ビルド パックを使用します。これは、アプリが Heroku にプッシュされると、基本的にアプリを再構築することで機能します。

これを機能させるには、まだいくつかのトリックを採用する必要がありました。と呼ばれる2Gruntfile.jsつの新しいタスクを構成する必要がheroku:productionありheroku:developmentました。これは、ビルドパックがアプリをビルドするために実行するものです。最初はメインbuildタスクにエイリアスを付けただけでしたが、ビルドパックまたは Heroku の実行に問題があることがわかったjshintので、最終的にタスクをコピーしてbuild不要な部分を取り出しました。

また、packages.jsonこれを追加する必要がありました:

"scripts": {
    "postinstall": "bower cache clean && bower install"
}

これによりbower_components、Heroku で確実に利用できるようになりました。

長所

これにより、ディレクトリ内の「バイナリ」とディレクトリ内の依存関係がソース管理にコミットされないように、.gitignoreファイルをそのまま維持することができました。distbower_components

短所

これは基本的に、アプリが Heroku にあるときにアプリを再構築することであり、私は通常、ビルドと展開のパイプライン全体で同じ「バイナリ」を使用することを好みます。そうすれば、ビルドされた同じコード、テストされた同じコード、デプロイされた同じコードであることがわかります。

また、アプリが 2 回ビルドされるのを待たなければならないため、展開が遅くなります。

CodeShip カスタム スクリプトの導入

アプリを 2 回ビルドしたことに満足できなかったので、既存の Heroku パイプラインの代わりに CodeShip のカスタム スクリプト パイプラインを使用してみました。スクリプトは基本的に.gitignoreファイルを変更して、distフォルダーをコミットしてからHerokuリモートにプッシュできるようにしました (リモートのコードoriginは変更の影響を受けません)。

最終的に次のbashスクリプトになりました。

#!/bin/bash

gitRemoteName="heroku_$APP_NAME"
gitRemoteUrl="git@heroku.com:$APP_NAME.git"

# Configure git remote
git config --global user.email "you-email@example.com"
git config --global user.name "Build"
git remote add $gitRemoteName $gitRemoteUrl

# Allow dist to be pushed to heroku remote repo
echo '!dist' >> .gitignore
# Also make sure any other exclusions dont apply to that directory
echo '!dist/*' >> .gitignore

# Commit build output
git add -A .
herokuCommitMessage="Build $CI_BUILD_NUMBER for branch $CI_BRANCH. Commited by $CI_COMMITTER_NAME. Commit hash $CI_COMMIT_ID"
echo $herokuCommitMessage
git commit -m "$herokuCommitMessage"
# Must merge the last build in Heroku remote, but always chose new files in merge
git fetch $gitRemoteName
git merge "$gitRemoteName/master" -X ours -m "Merge last build and overwrite with new build"
# Branch is in detached mode so must reference the commit hash to push
git push $gitRemoteName $(git rev-parse HEAD):refs/heads/master

長所

これには、アプリの 1 つのビルドのみが必要であり、テスト フェーズでテストされたものと同じバイナリをデプロイします。

短所

私はこのスクリプトをかなりの回数使用しましたが、比較的安定しているようです。ただし、私が知っている 1 つの問題は、新しいパイプラインが作成されたときにブランチにコードがないため、リモートmasterからマージしようとするとこのスクリプトが失敗することです。heroku現時点ではmaster、ビルドを開始する前にブランチを Heroku に最初にプッシュすることでこれを回避していますが、次のように実行できるより良い Git コマンドがあると思います。「このブランチが既に存在する場合にのみマージします」。

于 2015-05-04T16:32:29.337 に答える