Wie gehen Sie mit der Versionierung in einem mehrseitigen Projekt um?

13

Ich weiß, dass es eine breite Frage ist, also werde ich versuchen, so spezifisch wie möglich zu sein. Diese Frage ist eher eine "organisatorische" als eine technische Frage.

Wir haben ein vielseitiges Projekt mit folgenden Hauptkomponenten:

  • Ein Server, der die Kerngeschäftslogik hostet (Datenmodelle)
  • Ein Backoffice für Kunden, das die Kerngeschäftslogik verwendet
  • Eine Anwendungs-API (REST), die auch die Kerngeschäftslogik verwendet
  • Es gibt Smartphone-Apps (iOS und Android), die die Anwendungs-API verwenden
  • Es gibt eine andere Tablet-App (Android) als die Smartphone-App, die dieselbe Anwendungs-API verwendet.

Bald werde ich mit aktiven Kunden in Produktion sein. Und wie bei jedem Projekt muss ich alle verschiedenen Komponenten im Laufe der Zeit warten. Das bedeutet, dass alle folgenden Elemente aktualisiert werden können:

  • der Code der Kerngeschäftslogik auf dem Server (wird vom Backoffice, der API und als Nebeneffekt von mobilen Apps verwendet)
  • die API selbst (wird sowohl von Smartphone- als auch von Tablet-Apps verwendet)
  • alle mobilen Apps (via Appstore / Googleplay)

Natürlich können serverseitige Teile (Kerngeschäftslogikcode und API-Code) sofort von mir selbst geändert werden. Neue mobile Apps müssen jedoch von den Clients im Appstore / Googleplay heruntergeladen werden, und ich kann nicht sicher sein, ob sie auf dem neuesten Stand sind.

Könnten Sie Anleitungen und Tipps für bewährte Verfahren geben, um diese Upgrades reibungslos und ohne Risiko für den Kunden zu gestalten?

Welche Komponente brauche ich zur "Version"? Wie kann sichergestellt werden, dass alles funktioniert, auch wenn der Client seine mobile App nicht aktualisiert? Sollte ich ihn zwingen, ein Upgrade durchzuführen, um meine Arbeit zu erleichtern?

Mit einem Wort, wie sollte ich mich organisieren, damit mein vielseitiges Projekt im Laufe der Zeit lebendig wird?

David D.
quelle
2
Ist Ihr Problem anders als bei der API-Versionierung ?
k3b
Ja, die meisten dieser Themen scheinen sich mit der API-Versionierung bei öffentlichen APIs zu befassen. Meine API ist eine "Anwendungs- / private" API. Sie wird nur verwendet, damit meine mobilen Apps funktionieren. Außerdem ist meine Frage weiter gefasst, da es sich nicht um eine bestimmte Komponente handelt, sondern um das gesamte Projekt :)
David D.

Antworten:

9

Da Sie nicht steuern können, wann die mobilen Apps auf eine neue Version aktualisiert werden, müssen Sie mindestens Ihre REST-API versionieren. Wenn Sie dies nicht tun, können Sie keine abwärtskompatiblen Änderungen an dieser Schnittstelle vornehmen.

Neben der REST-API empfiehlt es sich, auch die anderen Kommunikationsschnittstellen zu versionieren, die über eine Netzwerkschnittstelle gehen. Auf diese Weise müssen Sie auch nicht alle Backoffice-Clients gleichzeitig mit den Servern aktualisieren, und Sie können eine schrittweise Migration auf eine neue Version mit einer "Beta-Test" -Periode implementieren.

Neben der Versionierung der Kommunikationsschnittstellen sollten Sie auch versuchen, die Änderungen so weit wie möglich abwärtskompatibel zu machen. Im Idealfall können Sie eine neue Schnittstellenversion einführen, die die alten Clients weiterhin vollständig unterstützt, damit sie nicht bemerken, dass sich etwas geändert hat.

Bart van Ingen Schenau
quelle
Danke dafür. Könnten Sie zum Verständnis ein Beispiel für eine "andere Kommunikationsschnittstelle" geben?
David D.
@DavidW.: Ein Beispiel für eine andere Kommunikationsschnittstelle wäre die Schnittstelle zwischen dem Backoffice-Client und dem Kerngeschäftsserver. Oder zwischen dem API-Service und dem Kerngeschäftsdienst.
Bart van Ingen Schenau
4

Dieser Beitrag macht einen interessanten Punkt über Ihre Frage.

Praktischer ausgedrückt, wenn Sie 3 Komponenten haben:

  • 2 Verbraucher: ein Front-End und eine mobile App
  • 1 API-Anbieter: ein Back-End

Sie könnten das typische Mmp-Versionsschema (Major.minor.patch) für jedes verwenden, aber in Ihre Back-End-URL könnten Sie etwas als einfügen http://youhost/M.m/resourceURI.

Während Sie sich weiterentwickeln und die Änderungen in der API keinen Einfluss auf Ihren Vertrag mit den Verbrauchern haben, behalten Sie M.mden Inhalt der URL bei. Von dem Moment an, in dem Sie im BackEnd eine Änderung vornehmen, die sich auf Ihre Verbraucher auswirkt (sei es eine Verhaltensänderung oder ein anderes Objekt), verwenden Sie ein M.m+1, M+1.m+1oder M+1.m.

Um die Dinge am Laufen zu halten, müssen Sie das neue Back-End gleichzeitig mit dem alten bereitstellen, während Ihre Benutzer die neuen Konsumenten installieren und die ältere API langsam beenden.

Eine bessere Antwort als meine finden Sie hier: Versionierung der REST-API auf Stackoverflow

Mimsugara
quelle
Ich denke, es ist unmöglich, mehr als eine Kerngeschäftslogik in meinem Projekt zu haben (sonst würde ich mehrere Datenbanken benötigen). Ich kann jedoch sicherstellen, dass alle REST-APIs weiterhin mit dieser aktuellen Kerngeschäftslogik kompatibel sind. Vergessen Sie nicht, dass meine APIs keine öffentliche API sind und Verbraucher die URIs nicht direkt verwenden sollen. Meine Client-Anwendungen tun dies. Guter Punkt für die M / m + 1 Notation danke.
David D.
1
Wenn Sie eine Art Proxy / Load Balancer haben, der die API-URL verbirgt, können Sie einfach einen benutzerdefinierten HTTP-Header hinzufügen und den Load Balancer so konfigurieren, dass er auf jede Implementierung verweist. Auf diese Weise hat jeder Consumer die HTTP-Nachricht an dieselbe URL gesendet, aber Angabe der erwarteten API-Version im Header.
Mimsugara
2

Ich empfehle Ihnen, einen Continuous Integration Server zu installieren, ihn an Ihr Code-Repository und ein Snapshot / Release-Repository anzuschließen und Ihre Builds zu automatisieren. Dies hat eine Reihe von Vorteilen:

  1. Jede Komponente wird bei der Veröffentlichung versioniert. Dies umfasst Bibliotheken auf niedriger Ebene sowie Ihre Endprodukte.
  2. Jedes Code-Commit löst einen Snapshot-Build aus. Dies hilft, Ihre Entwickler ehrlich zu halten, insbesondere wenn Sie die Funktion verwenden, um dem Täter, der den Build gebrochen hat, eine E-Mail zu senden.
  3. Jeder Build kann Unit-Tests ausführen. Dies verbessert die Codequalität deutlich.
  4. Jede Version wird mit einem Tag versehen. Wenn also ein Produktionsfix erforderlich ist, ist es einfach, vom Tag zu verzweigen und das Update durchzuführen.
  5. Sie müssen ein Kompatibilitätsregister führen. (zB BackOffice 1.0.23 ist kompatibel mit REST API 2.0.267 usw.). Ich kenne kein Tool, das in diesem Bereich helfen könnte.

Meine Erfahrung war mit Open Source-Tools: SVN, Maven 2, Jenkins und Nexus, aber es gibt Alternativen zu all diesen.

Unterschätzen Sie nicht die Lernzeit, um Ihr Team auf den neuesten Stand zu bringen. Aber sobald sie auf dem neuesten Stand sind, werden sie nie mehr zurückkehren.

Kiwiron
quelle
Interessanter Punkt danke. Funktioniert die automatische Erstellung von Snapshots, wenn mein Projekt in 3 Git-Repos verteilt ist (1 für das Backend, 1 für die Tablet-App, 1 für die Smartphone-App)?
David D.
@ David W. Jenkins unterstützt dies sicherlich, da jeder Job seine eigene Code-Repository-URL hat.
Kiwiron
2

Für ein relativ kleines Team für Entwicklung und Bereitstellung funktioniert das von IBM Jazz verwendete Client N-1-Kompatibilitätsmodell möglicherweise recht gut

Versuchen Sie , Clients und Server auf derselben Versionsnummer zu halten. [Anstatt eine Matrix unabhängiger Versionen und deren Kompatibilitäten zu verwalten]

Stellen Sie eine Richtlinie auf, dass die Clientversion Xyy mit allen Serverversionen über Xyy, jedoch unter X + 2.0.0 funktioniert

Für eine Serverversion 4.0 sollte es idealerweise für jeden Clienttyp eine Clientversion 4.0 geben. Die Kompatibilität sollte jedoch beibehalten werden, um geringfügig unterschiedliche Versionen von Clients und Servern zu ermöglichen.

Eine Client-Version 4.x sollte mit der Server-Version 4.x und höher, jedoch unter 6.0 kompatibel sein. Ein Server 4.x sollte mit allen Clients ab Version 3.0 kompatibel sein, jedoch kleiner oder gleich 4.x.

Auf diese Weise können Sie eine Version auf dem Server aktualisieren, ohne sich Gedanken über die sofortige Veröffentlichung neuer Versionen der Clients machen zu müssen. Es muss jedoch nur ein genau definiertes Kompatibilitätsfenster beibehalten werden.

Ref: IBM Jazz Model [ https://www.ibm.com/support/knowledgecenter/de/SSYMRC_6.0.0/com.ibm.jazz.install.doc/topics/c_n-1.html]

profaisal
quelle
1

Zunächst möchte ich das Problem etwas anders formulieren. Sie haben gefragt, welche Software Sie "versionieren" müssen. Version ist ein überladener Begriff in CS und kann ungefähr 100 verschiedene Dinge bedeuten. Die wichtigsten Dinge, die ich betrachten würde, sind:

  1. Versionskontrolle - Die Versionskontrolle ist ein Konfigurationsverwaltungstool, mit dem Sie Snapshots und den Verlauf Ihrer Entwicklung verfolgen können. ALLE CODE SOLLTEN UNTER VERSIONSKONTROLLE STEHEN. Es ist mir egal, ob es nur die praktischen Skripte sind, die Sie Ihrem Bin-Ordner hinzufügen. Alles, was es wert war, Zeit mit dem Schreiben zu verbringen, ist die zwei Sekunden wert, um es einer Revisionskontrollsoftware hinzuzufügen.
  2. Konfigurationsmanagement - Wie steuere ich, was sich im Build befindet? Alle Software sollte ein gewisses Maß an Konfigurationsmanagement haben. Ich möchte Managern den Unterschied zwischen Versionskontrolle und Konfigurationsmanagement beschreiben, da die Versionskontrolle nur ein Werkzeug zum Verfolgen des Entwicklungsverlaufs ist, während das Konfigurationsmanagement die Richtlinien für die Erstellung des Verlaufs und die Vorgehensweise bei der Entscheidung über den Code sind ist gut.
  3. Softwareversionierung - Zuweisen von Namen zu Codeversionen. Dies ist die Sache, an der sich viele Leute festhalten, wenn sie das Problem zum ersten Mal sehen, weil sie es gewohnt sind, "MineSweeper 7.1.29290149210" oder was auch immer auf den Sachen zu sehen, die sie kaufen, aber ehrlich gesagt finde ich das der kleinste Teil eines viel größeren Problems. Um ehrlich zu sein, verwenden Sie einfach den von 1 generierten Hash und kümmern sich nicht so sehr darum, dass er nicht von Menschen lesbar ist.

Da es für mich das nebulöseste und interessanteste ist, werde ich mich nur auf # 2 konzentrieren. Es gibt keine einheitliche Ausstechlösung für das Konfigurationsmanagement. Regeln, die für ein 2- oder 3-köpfiges Team gut funktionieren, können zu locker sein, um in einem Projekt, an dem Hunderte von Mitarbeitern arbeiten, vernünftig zu bleiben. Regeln, die für das große Team gelten, erfordern möglicherweise viel zu viel Aufwand für das kleine Team. Sie müssen höchstwahrscheinlich etwas Eigenes zusammenschustern, um etwas zusammenzubringen, aber ich würde die folgende Liste verwenden, um die Spezifikationen für Ihr Konfigurationsmanagementsystem zu entwickeln:

  1. Wie kann ich die Versionen (und die damit verbundenen Probleme) verfolgen, die ich auf dem Markt unterstütze?
  2. Wie entscheide ich, welche Entwicklungspfade für die Freigabe an Produktionssysteme bereit sind? (Es könnte auch für jeden anderen Schritt in einem Prozess bereit sein)
  3. Wer sollte die Konfiguration des Systems steuern / verwalten können? Wie sieht der Workflow zum Hinzufügen von Code aus, der an andere Entwickler verteilt werden soll?
  4. Wie werde ich die Interaktion zwischen interagierenden Teilen steuern? Woher weiß ich, ob das Ändern eines Teils den Rest des Systems beschädigt?
  5. Wie werden wir unser Konfigurationsmanagementsystem im Laufe der Zeit verbessern?

Benötigen Sie Hilfe bei der Beantwortung der obigen Fragen? Sie sollten wahrscheinlich einen Berater oder Software-Engineering-Manager beauftragen ... Antworten, die Lehrbücher füllen können und für diese Art von Forum weit außerhalb des Rahmens liegen.

IdeaHat
quelle
Sehr interessante Antwort, danke dafür. Die Frage Nr. 1 ist in einem "Einkomponenten" -Projekt leicht zu beantworten und scheint in einem Mehrkomponentenprojekt sehr kompliziert zu sein.
David D.