Es gibt einen dritten Weg, wie Sie selbst sagten. Ich denke, Sie vermischen Entwicklung, Test und Bereitstellung. Ich schlage vor, den gesamten SDLC als Ganzes zu betrachten, um zu verstehen, was Sie erreichen wollen. Dies ist ein großes Thema, aber ich werde mein Bestes geben, um es zusammenzufassen.
TL; DR;
Kurz gesagt, müssen Sie Folgendes trennen:
- Ihr Code, von
- die Anwendungskonfiguration von
- die Konfiguration der Systemumgebung.
Jeder muss unabhängig voneinander und angemessen sein:
- versiongesteuert
- geprüft
- einsetzbar
Längere Version
Zunächst haben Sie eine Anwendung, die aus Code und (separaten) Konfigurationssätzen besteht. Dies muss sowohl für die Erstellung als auch für die absichtliche Funktion getestet werden - dies wird als kontinuierliche Integration (Continuous Integration, CI) bezeichnet. Es gibt viele Anbieter dieses Dienstes sowohl online als auch lokal - zum Beispiel CircleCI für einen Cloud-Anbieter, der eine Verknüpfung zu Ihrem Repository herstellt und bei jedem Commit erstellt und testet. Wenn Ihr Repository vor Ort ist und keinen Cloud-Anbieter verwenden kann, etwa Jenkinswäre ein Äquivalent. Wenn es sich bei Ihrer Anwendung um eine Standardanwendung handelt, ist möglicherweise ein Docker-Image vorhanden, das der CI-Dienst verwenden kann. Andernfalls müssen Sie einen oder einen Cluster erstellen, in dem der Anwendungscode und die Konfiguration bereitgestellt werden können. Bei richtiger Konfiguration erhalten Sie eine Fülle von Statistiken zur Qualität Ihres Anwendungscodes.
Sobald Sie mit der Funktionalität und Richtigkeit Ihrer Anwendung zufrieden sind, sollte die Codebasis für eine bestimmte Version entsprechend gekennzeichnet werden. Dieser Build sollte dann in einer Testumgebung bereitgestellt werden. Beachten Sie, dass der Code mit dem Code übereinstimmt, der in Ihrem CI getestet wurde (dies ist nachweislich der Fall, wenn Sie dies korrekt durchgeführt haben), Ihre Konfiguration jedoch möglicherweise davon abweicht. Wieder können einige CI-Anbieter diesen Schritt anbieten, damit Sie die Bereitstellung einer gepackten Anwendung und eine diskrete Konfiguration testen können. Diese Phase umfasst in der Regel Benutzerfunktionstests (für neue Funktionen) sowie automatisierte Tests (für bekannte Funktionen). Wenn die Freigabe diese Phase besteht, haben Sie einen Freigabekandidaten für den Integrationstest. Sie können die Automatisierungstests von einem anderen Docker-Container aus ausführen.Einige Metriken besagen, dass der Testaufwand 1: 1 für den Codierungsaufwand ist (obwohl ich mir selbst nicht sicher bin).
Im nächsten Schritt erstellen Sie Ihre (System-) Umgebung so, als wäre es die Produktion. Wenn Sie Docker in der Produktion verwenden, denken Sie hier an die Sicherheitshärtung, Netzwerk- und Serveroptimierung usw. Ihre Docker-Images basieren möglicherweise auf denen, die Sie in der Entwicklung verwendet haben (im Idealfall), es können jedoch Änderungen in Bezug auf Skalierung und Sicherheit auftreten , wie ich sagte. Bis jetzt sollte der Funktionstest der Anwendung abgeschlossen sein, Sie sind mehr auf Sicherheit und Leistung bedacht. Gemäß den Funktionstests können Ihre Tests hier von anderen Docker-Images aus entwickelt, bereitgestellt und ausgeführt werden. Dieser Schritt war früher furchtbar teuer und wurde nur selten ausgeführt. Dafür war dedizierte Hardware erforderlich, mit der die Produktion reproduziert werden konnte. Heutzutage ist dies völlig realisierbar, da Sie bei Bedarf die gesamte Umgebung in nahezu jeder Größenordnung auf- und abbauen können.
Schließlich haben Sie eine Version, die mit nur wenigen Konfigurationsdeltas aus Ihren Integrationstests (IP-Adressen, Datenbank-URIs, Kennwörter usw.) produktionsbereit sein sollte. Ihre Codebasis wurde dabei mindestens in drei verschiedenen Umgebungen getestet Punkt und die Mehrheit der Systemkonfiguration mindestens einmal.