あなたが自分で言ったように、第三の方法があります。開発、テスト、展開を混同していると思います。あなたが何を達成しようとしているのかを理解するために、まずSDLC全体を全体として見ることを提案します。これは大きなトピックですが、要約するために最善を尽くします。
TL; DR;
要するに、以下を分離する必要があります。
- あなたのコード、から
- アプリケーション構成、から
- システム環境の構成。
それぞれが互いに独立しており、適切である必要があります。
長いバージョン
まず、コードと(別個の)構成で構成されるアプリケーションがあります。これは、ビルド機能と意図的な機能の両方についてテストする必要があります-これは継続的インテグレーション(CI)と呼ばれます。このサービスには、オンラインでもローカルでも多くのプロバイダーがあります。たとえば、リポジトリにリンクし、コミットするたびにビルドおよびテストするクラウドプロバイダーのCircleCIなどです。リポジトリがオンプレミスであり、クラウドプロバイダーを使用できない場合、Jenkinsのようなもの同等になります。アプリケーションがかなり標準的な場合、おそらくCIサービスが使用できる既存のDockerイメージがあります。そうでない場合は、アプリケーションコードと構成をデプロイできるもの、またはそのようなクラスターを作成する必要があります。正しく設定すると、アプリケーションコードの品質に関する豊富な統計情報が得られます。
次に、アプリケーションの機能と正確性に満足したら、コードベースに特定のリリースのタグを適切に付ける必要があります。次に、このビルドをテスト環境に展開する必要があります。コードはCIでテストされたものと同じであることに注意してください(これを正しく行った場合はおそらくそうです)が、構成が異なる場合があります。繰り返しますが、一部のCIプロバイダーはこのステップを提供できるため、パッケージ化されたアプリケーションと個別の構成のデプロイメントをテストできます。通常、この段階には、ユーザー機能テスト(新機能用)と自動テスト(既知の機能用)が含まれます。リリースがこの段階に合格した場合、統合テストのリリース候補があります。別のDockerコンテナーから自動化テストを実行できますが、テストの努力を示すいくつかのメトリックは、コーディングの努力と1:1です(これについては自信がありませんが)。
最後から2番目は、実稼働環境のように(システム)環境を構築するステップです。本番環境でDockerを使用している場合、ここでセキュリティの強化、ネットワークおよびサーバーの最適化などを考えることができます。 、 私の言ったように。これで、アプリケーションの機能テストが完了し、セキュリティとパフォーマンスに関心を持つようになりました。機能テストに従って、ここでのテストは他のDockerイメージから開発、デプロイ、実行できます。このステップはかつては恐ろしく高価であり、そのために行われることはほとんどなかったため、生産を再現する専用のハードウェアが必要でした。今日、これは完全に実行可能です。ほとんどの規模の環境全体をオンデマンドで立ち上げて破棄できるからです。
最後に、統合テスト(IPアドレス、データベースURI、パスワードなど)からの構成デルタのわずかなセットのみで、本番稼働準備が整ったリリースが必要です。コードベースは、少なくとも3つの異なる環境でテストされています。ポイントとシステム構成の大部分を少なくとも1回。