メインコンテンツへスキップ
非公式ベータ版翻訳

このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →

タスク実行の分散 (DTE)

Lernaはキャッシュ--sinceフラグを使用して平均的なCI時間を短縮します。しかし、これらの機能はいずれも最悪のケースシナリオでは効果がありません。リポジトリのコア部分が変更され、すべてのタスクをCIで実行する必要がある場合、パフォーマンスを向上させる唯一の方法はエージェントジョブを追加し、タスクを効率的に並列化することです。

タスクを並列化する最も明白な方法は、タスクタイプごとに分割することです。すべてのテストを1つのジョブで実行し、すべてのビルドを別のジョブで、すべてのlintタスクを3つ目のジョブで実行します。この戦略はビニングと呼ばれます。一部のテストタスクがビルドタスクを前提条件としている場合、この方法は難しくなる可能性がありますが、何らかの方法で対処できると仮定すると、典型的な設定は下図のようになります。ここではテストタスクは必要なビルド成果物が準備できるまで遅延されますが、ビルドとlintタスクはすぐに開始できます。

ビニングを使用したCI

ビニングアプローチの問題点は、1つ以上のジョブでアイドル時間が発生することです。Nxの分散タスク実行(DTE)は、タスクの平均実行時間に基づいて個々のタスクをエージェントジョブに割り当てることで、このアイドル時間を可能な限り最小限に抑えます。Nxはタスクが正しい順序で実行されることを保証し、分散キャッシュを使用して以前のタスクからのビルド成果物が必要なすべてのエージェントジョブで利用可能にします。

Nxの分散タスク実行を設定すると、タスクグラフは以下のようになります:

DTEを使用したCI

CIの完了時間が短縮されるだけでなく、デバッグ体験も単一ジョブでCI全体を実行した場合と同様になります。これはNxが分散キャッシュを使用して、メインジョブ上ですべてのログとビルド成果物を再現するためです。

詳細については、最悪ケースのCI時間を改善する包括的ガイドをご覧ください。

設定方法

タスク実行を分散するには、(1) Nx Cloudに接続し、(2) CIワークフローでDTEを有効化する必要があります。

1. Connect to Nx Cloud via the interactive, browser-based workflow
npx nx connect-to-nx-cloud

CIワークフローの設定

組織ごとにCI/CDパイプラインの管理方法が異なるため、すべてのケースを網羅することは不可能ですが、主要プロバイダー向けのNx CLIでDTEを設定する以下の例は優れた出発点となり、lerna runnx run-manynx affectedの代わり)などLerna固有のコマンドへの適用も容易です:

メインジョブで再生する必要があるため、分散可能なのはキャッシュ可能な操作のみであることに注意してください。

DTE設定の詳細については、こちらのガイドをお読みください。

CI実行フロー

分散タスク実行はあらゆるCIプロバイダーで動作します。CIシステム内でジョブを起動する責任はユーザーにあります。Nx Cloudはそれらのジョブが連携する方法を調整します。CIシステムで作成する必要があるジョブには2種類あります。

  1. 実行内容を制御するメインジョブ1つ

  2. 実際にタスクを実行する複数のエージェントジョブ

メインジョブの実行フローは以下の通りです:

# Coordinate the agents to run the tasks
- npx nx-cloud start-ci-run
# Run any commands you want here
- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main
# Stop any run away agents
- npx nx-cloud stop-all-agents

エージェントジョブの実行フローは非常にシンプルです:

# Wait for tasks to execute
- npx nx-cloud start-agent

メインジョブは分散処理を使用しない場合とほぼ同じです。必要な操作は次の2点のみです:

  • 最初にnpx nx-cloud start-ci-runを実行する
  • オプションで最後にnpx nx-cloud stop-all-agentsを実行する

エージェントジョブは長時間実行されるstart-agentプロセスを実行し、該当CI実行に関連する全タスクを処理します。設定に必要な操作はnpx nx-cloud start-agentを実行するだけです。このプロセスはNx Cloudが終了を指示するまで継続的に実行されます。

注意点:

  • メインジョブとエージェントジョブは同じ環境・同じソースコードを持つ必要があります
  • 両ジョブはほぼ同時に起動します
  • メインジョブが完了すると全エージェントが停止します

重要な注意点:Nx Cloudエージェントは「マシン」ではなく「マシン上で実行される長時間プロセス」です。つまりNx Cloudはエージェントを管理せず、CI設定ファイルで管理する必要があります(前述のCI設定例を参照)。

Nx Cloudはオーケストレーターとして機能します。メインジョブがNx Cloudに実行内容を伝えると、Nx Cloudはそれらのタスクをエージェント間で分散します。Nx Cloudはファイルを自動的に転送します:

  • エージェント間での転送
  • エージェントからメインジョブへの転送

この結果として、例えばメインジョブでlerna run build --since=mainが完了する時点では、エージェント上で生成された全ファイルアーティファクトがメインジョブにコピーされ、あたかもメインジョブが全てローカルでビルドしたかのような状態になります。

並列実行の実現方法

--concurrencyオプションはエージェントに伝播されます。例:npx lerna run build --since=main --concurrency=3 --dteは各エージェントで最大3つのビルドターゲットを並列実行するようNx Cloudに指示します。10台のエージェントがある場合、全体で最大30のビルドが並列実行されます。

可能な限り多くのコマンドを並列実行することも重要です。例えば:

- lerna run lint --since=main
- lerna run test --since=main
- lerna run build --since=main

より劣っている

- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main

後者の方法では3つのコマンドを同時にスケジューリングするため、ビルドタスクがないエージェントは即座にテストやリントの実行を開始できます。結果としてエージェントの稼働率が向上し、CI時間が短縮されます。

関連リポジトリと実装例