web-dev-qa-db-ja.com

Nodejs npmステップは、TeamCityのすべてのビルドでパッケージをダウンロードします

Nodejs npmに関しては、私は少しn00bですが、いくつかの記事で推奨されている手順を使用してビルド環境に実装したため、ビルド時間が3倍になりました。

標準的なもの(minify/concat/etc js/css/etc)に使用します

TeamCityを使用し、Node.js NPMステップを追加してから、タスクを実行するためのgulpステップを追加しました(RE: https://github.com/jonnyzzz/TeamCity.Node

NPMをセットアップするタスクは、最も時間がかかり、2分10秒です。これは、各ビルドですべてのパッケージを再ダウンロードするように見えるコマンド「npminstall」を呼び出す合計ビルド時間の65%以上です

ステップ3/7:NPMセットアップ(Node.js NPM)(2m:10s)

[npm install]開始:cmd/c npm install

以前の合計ビルド時間は、単体テストを含めて約1分30秒でした。

これらをローカルにキャッシュし、ビルドごとに再ダウンロードしないようにする方法はありますか?ビルドフォルダとは対照的に、ユーザープロファイルまたは何かに?

詳細..

これはおそらくセットアップを最もよく説明しています http://www.dotnetcurry.com/visualstudio/1096/using-grunt-gulp-bower-visual-studio-2013-2015

新しいタスクランナーエクスプローラーを使用しているC#プロジェクトがあります。これにより、依存関係がpackage.jsonに保存されます。これにより、ワークスペースのローカル環境で「npminstall」を1回事前実行します(これを防ぐには.tfignoreを使用する必要があります)チェックインからソースへ)、新しいローカルワークスペースを開始しない限り、再度ではありません。

ビルドを実行すると、コマンドラインから「npm install」を実行する必要があり、package.jsonファイルから依存関係を取得して、ファイルが既に存在する場合でも、毎回ビルドの作業ディレクトリ内のサブフォルダーにインストールします。以前のビルドから(つまり、TCエージェントがクリーンアップしていない)、作業フォルダーの外にインストールすることはできません。

私は間違っている可能性があります...または私が間違っていることを願っています、そしてこれをサポートするためのgulpの方法を探していますが、それを機能させる方法はタスクランナーエクスプローラーと連携する必要があるため、F5エクスペリエンス開発者はまだ彼らのローカルで同じです。

はい、複数のエージェントがいます。

15
Joe

これを修正するために私が見つけた最善の方法は、ノードモジュールフォルダをバックアップ/復元することでした。ここでそれについてのブログ投稿を行いました。

https://beerandserversdontmix.com/2016/06/04/teamcity-and-avoiding-redownloading-of-npm-packages/

6
Joe

Node.jsについてはわかりませんが、TeamCity固有の提案をいくつか示します。

  1. NPMはおそらくファイルを%TEMP%にダウンロードしますか?その場合、TeamCityエージェントが%TEMP%ディレクトリをハイジャック(<TeamCity Home>/buildAgent/temp/buildTmpにリダイレクト)し、新しいビルドが行われるたびに常にこのディレクトリを完全に消去するため、後続のTeamCityビルド間で再利用できなくなります。 (buildTmpここ を参照)。
    • その意味で、ダウンロードしたファイルをworkspace(ビルドをチェックアウトするディレクトリ)に保存するようにNPMに指示できれば望ましいでしょう。
  2. NPMがワークスペース(チェックアウトディレクトリ)にダウンロードされている場合、実行ごとにクリーンチェックアウトを実行するように要求しましたか? (「構成設定の編集|バージョン管理設定|詳細オプションを表示|」を参照ビルドチェックボックスの前にチェックアウトディレクトリ内のすべてのファイルをクリーンアップします。)
    • その場合は、チェックボックスをオフにしてください。
  3. ディスク容量が少ないため、TeamCityがチェックアウトディレクトリをクリーンアップしている可能性がありますか?このクリーンアップは、TeamCityがスペースが不足していることに気付いたときに自動的に開始されます。 (空きディスク容量ビルド機能を使用すると、クリーンアップをさらに積極的に行うことができます。)
    • その場合は、ビルド機能の使用を中止してください。それが使用されておらず、自動クリーンアップが原因である場合、制御するのは困難です。 TeamCityによって管理されていないファイルシステムの部分(独自の%TEMP%およびその他の場所)を単純にクリーンアップして、TeamCityにある程度の余裕を持たせるのが最善です。
  4. ビルドは毎回別のエージェントで実行されていますか? (ビルド履歴を参照してください。)その場合、ダウンロードされたアーティファクトは再利用できません(たとえチェックアウトディレクトリにダウンロードされたとしても)。毎回異なるマシンのファイルシステムにダウンロードされるためです。 TeamCityはエージェントとワークスペースの再利用(同じエージェントに固執する)に引き寄せられるため、これが当てはまるとは思えません。
    • その場合、エージェント要件を設定し、ビルドを1つの特定のエージェントで常に実行するように指定することで、エージェントの再利用を強制できます。そのエージェントを独自のプールに単一化して、他のビルドを実行できないようにすることもできます。
11
sferencik

「緩い」パッケージバージョンを使用していない場合、これが問題になる可能性があります。 npm install [email protected]のようなものを指定できますが、その場合は常に古いバージョンのままになり、開発者がビルド対象を頻繁に変更している場合は、ビルドシステムがチャーンします。

Packages.jsonでは、*と〜を使用して、3。*や〜2.5などのワイルドカードバージョンを定義できます。これにより、3.0.2や3.0.99などの3.xの「マイナー」リビジョンを取得できます。 2.5.xのどのバージョンでもインストールできますが、2.6.0ではできません。

0
dragon788