Wir sind als Unternehmen gewachsen, unsere Produkte expandieren und unsere Aktivitäten und Bemühungen im Zusammenhang mit DevOps nehmen ebenfalls zu. Wir haben mithilfe von Bereitstellungspipelines und anderen Plugins von Bamboo auf flexiblere und konfigurierbarere Jenkins umgestellt. wechselte zu Ansible und begann hier und da intern mit Docker.
All diese Dinge erfordern ein gewisses Maß an Codierung oder Konfiguration - Ansible-Skripte und -Konfigurationen, Jenkins-Groovy-Skripte, Dockerfiles und YAML-Konfigurationen.
Denn jetzt haben wir ein separaten „ops“ Repository mit High-Level - Verzeichnissen für erstellt jenkins
, ansible
, docker
und other
(das ist ein schrecklicher Name, aber für jetzt alle „andere“ DevOps Automatisierung Dinge sind dort).
Unser Ansatz fühlt sich nicht richtig an und lässt sich möglicherweise nicht skalieren. Was sind jedoch die Best Practices und Empfehlungen, um DevOps-bezogenen Code in einem Code-Repository oder in Repositorys zu speichern?
Antworten:
Die aktuelle Organisation des von Ihnen beschriebenen Codes und der Konfiguration wird durch die beteiligten technischen Lösungen strukturiert. Dies ist ein schlechtes Design, das viel Aufwand bei unseren Wartungsaktivitäten und viele Fallen auf unserem Weg verursacht. Stattdessen sollte diese Organisation nach den von uns bereitgestellten Artefakten strukturiert sein .
Der Grund dafür ist, dass wir Artefakte ( z. B. ein Docker-Image oder ein Softwarepaket) als Objekte der folgenden Verben betrachten möchten :
um einen minimalen Satz automatisierter Aufgaben zu berücksichtigen, die wir ausführen möchten. Wenn Sie etwas an der Implementierung des Testverbs ändern möchten, können Sie den Ordner, der diesem Artefakt entspricht, im entsprechenden Repository aufrufen und dann die Jenkins-spezifischen Automatisierungselemente ermitteln, die aktualisiert werden müssen. Wenn die Automatisierungsrezepte nach technischen Lösungen strukturiert sind, müssen wir aus heiterem Himmel herausfinden, dass Jenkins an den Testverfahren beteiligt ist, und dort die artefaktbezogenen Automatisierungselemente finden. In komplexen Situationen macht die Organisation um technische Lösungen Aktualisierungen sehr schwierig, da wir a priori alle technischen Lösungen kennen müssen, die an einem Service beteiligt sind, um sie entsprechend zu aktualisieren.
Beispielsweise kann ein Repository, das den Code für eine Website und einen Mikrodienst "a" enthält, die folgenden Unterverzeichnisse für Vorgänge enthalten:
die jeweils drei Skripte genannt
build
,test
unddeploy
. Nachdem die Organisation der Automatisierungselemente irgendwie geklärt wurde, wenden wir uns der Konfiguration zu.Die Hauptbedingungen und -anforderungen für die Konfigurationsorganisation werden durch das
deploy
Verb festgelegt, wenn es auf ein serviceähnliches Artefakt angewendet wird. Dasdeploy
Verb sollte folgende Parameter haben:Aus betrieblicher Sicht entspricht diese Aufschlüsselung der Parametrisierung den natürlichen Freiheitsgraden des Bereitstellungsproblems - abgesehen von den Anmeldeinformationen, die mit der Laufzeitkonfiguration gebündelt werden könnten. Es ist jedoch besser, sie zu trennen, um eine unachtsame Verbreitung zu vermeiden.
quelle
Ich kann auf Docker antworten. Eine der besten Methoden zur Verwendung von Docker besteht darin, die Docker-Datei und die Compose-Dateien im selben Repository des Projekts zu belassen. Überall dort, wo Sie das Projekt klonen, können Sie das Docker-Image erstellen Behalten Sie beispielsweise mehrere Versionen von Docker Compose-Dateien (Prod, Staging, Dev) bei, damit Sie das Image erstellen und den Container mit einer bestimmten Option für jede Umgebung ausführen können. Beispielsweise können Sie für einen Dev-Computer ein bestimmtes Netzwerk verwenden und mehr Abhängigkeitscontainer oder was auch immer ausführen.
quelle
Der Code jedes Tools geht in ein eigenes Repo. für zB
Dies würde Ihnen helfen, die Prozess-Orchestrierung besser zu skalieren und verschiedene Zweige für jede Umgebung zu verwalten
Dies würde Ihnen eine detailliertere Kontrolle geben und Ihren gesamten Versionsaufwand auf die Versionskontrollsysteme verlagern. Erstellen Sie außerdem separate Zweige für jede Umgebung und kennzeichnen Sie den Code für jede Produktionsversion (wie bei der Anwendungscodebasis). Denken Sie an Infra und verarbeiten Sie in Bezug auf Code. (Jede Änderung des Prozesses muss kodifiziert und an QA, SIT, UAT und dann an PROD gesendet werden.) Ähnlich wie bei der Anwendung.
Zum Beispiel kann V2.1 von Ansible in der Produktion (Hauptzweig) ausgeführt werden, während V2.0 von Docker-Containern in Prod (Hauptzweig) ausgeführt wird.
Bewahren Sie Ihre DB-Skripte / Bash-Skripte auf ähnliche Weise in ihren eigenen Repositorys auf. Möglicherweise können Sie eine Healthcheck-Datei (JSON / YAML) konfigurieren, um die Versionen aller Tools / Teile in jeder bereitgestellten URL für Nachverfolgungs- und Automatisierungszwecke anzuzeigen. (Damit Ihre Webhooks die URL lesen und Bereitstellungen automatisieren)
quelle
Die Unterscheidung zwischen Ops, Dev und DevOps fördert die Isolation und erzwingt die Einstellung "Über die Mauer werfen". Um die Zusammenarbeit zwischen den Teams zu verbessern, sollte alles in ein Repository gestellt werden, das zum Erstellen und Bereitstellen des Projekts erforderlich ist.
Trotzdem die Antwort auf die Frage:
Wenn config zum Ausführen des Projekts erforderlich ist, sollte es im selben Verzeichnis abgelegt werden.
quelle