あなたの質問に対する答えは、取り組んでいるプロジェクトと設定したい目標によって大きく異なります。
一般に、(小規模なプロジェクトの場合は当然のことですが) ビルドは非常に高速である必要があり、展開に必要なものがすべて含まれている必要があります。これは私にとって常に目標であり、たとえ達成できなくても、少なくとも一度はそうではありません。常に改善できることを見続けているだけです。
大規模なレガシー プロジェクトに取り組んできた経験から、非常に多くの問題が蓄積されて物事の速度が低下し、実現不可能になる可能性があることを知っています。少なくとも当面のターゲットとしてではありません。大規模なレガシー プロジェクトでは、通常、コンパイルとリンクに時間がかかりすぎます。テスト (存在する場合) も実行に時間がかかりすぎる可能性があり、展開に必要なすべての情報の生成も遅く、手動でさえある可能性があります。また、ビルド ハードウェアが不十分である可能性があります。この不完全なリストに追加するものは他にもたくさんあります。
このようなプロジェクトに取り組むときは、別々のサイクルで作業を行うようにしています。
最初のサイクル、ビルド、自動化された単体テストの実行、ビルドのパッケージ化、およびアーカイブを行う堅牢なCI サーバー。これは、行われた変更に関する開発への迅速なフィードバックを提供するために高速である必要があります。これが遅い場合は、ビルド用のより良いハードウェアを入手し、依存関係を整理し、遅い単体テストを修正するなどしてください。これをできるだけ速くしたいと考えています。ビルドはすべてデプロイ可能なビルドです。
2 番目のサイクルは、CI システムによって作成されたビルドのみをピックアップする、より遅いサイクルになります。ソース コードを入力として使用するのではなく、リリース ビルドを使用します。これらは、必要に応じて (ビルドが生成されるたびに) ピックアップされるか、別のサイクルを実行する準備ができたときに最新のものを使用できます。このより長いサイクルは、ビルドをテスト サーバーにデプロイし、自動化された機能テストを実行し、「遅すぎる」、「まだ速くない」、または必要な他のことを実行することで構成されます。組織によっては、展開可能なパッケージ (ドキュメントなど) に追加したり、クライアントに表示されるものなどに応じてリリースの名前を変更したりできます。ここで渡されたビルドは、すぐに使用できる可能性があります。
実行するパフォーマンス テストもある場合は、2 番目のサイクルのビルドを入力として使用する 3 番目のサイクルが必要になる場合があります。
これは簡単に説明しますが、ここでの主なポイントは、物事を分離することです。そのため、1 つのサイクルよりも迅速にフィードバックを取得しながら、すべてを連鎖させることができます。これは、スピード (フィードバック) の利点と、物事を行うための自然な場所を得ることができるため、良いアプローチだと思います。
最後に、特に CI を後付けする場合は、これを行う方法もプロジェクトごとに異なることに言及したいと思います。ビルドと単体テストのみを含む別の継続的なビルドを作成し、リリースとテストにフィードする 1 日 1 回 (または何か) のビルドを作成することもできます。これはもちろん、開発のみが高速 CI ビルドを使用することを意味します。高速 CI ビルドは不完全であり、展開には適していないためです。それでも、長期的には、これはあなたが望む場所ではありません。チェーン全体を自動化したい。