Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#1

Build-Prozess mit Jenkins, SVN -> Builden alter Versionsstände von 3 Repos

  Alt 15. Jan 2020, 17:33
Hallo Schwarmintelligenz,

ich wollte mal euren Rat einholen und erfahren, wie das woanders gelöst wird.

Ich führe gerade in meiner neuen Firma einen Build-Prozess mit Jenkins ein. Die Delphi-Projekte baue ich über MSBUILD.
Historisch bedingt nutzen wir SVN als Versionsverwaltung (VisualSVN und als Clients TortoiseSVN) und zur Entwicklung z.Z. Delphi XE5.

Für mein Problem möchte ich drei Repositories vorstellen:

Im Folgenden nutze ich die absoluten Pfade auf einen normalen Entwickler-Rechner, damit man gedanklich leichter folgen kann:

In "C:\Projekte\FooBar 3.0\develop\_XE5" liegt ein Gruppenprojekt (FooBar_Group.groupproj).
Das beihaltet FooBar.dproj aus dem gleichen Unterordner und auch verschiedene DLL-Projekte aus "C:\Projekte\Tools".

Das Builden in Debug Win32 nach jedem Einchecken, um auf vergessene Units zu prüfen stellt kein Problem da (Jenkins pollt alle 5 Minuten auf Änderung).
Auch der Nightly Build der aktuellsten Sourcen in Release Win64 mit übersetzen per Sisulizer und das Packen des Setups stellt keine Hürde dar.

Interssant wirds jetzt erst, wenn man auf Zuruf einen reproduzierbaren Build von dem Stand vor z.B drei Wochen haben möchte.
Hier ist es im Moment so, dass nach dem bisher händischen Erstellen eines Releases die SVN-Revision des Hauptprogramms getaggt wird.
Sie lässt sich dann bspw. so im SVN finden: https://mycompanysvn/FooBar/tags/Freigaben/V3.0.004.0
Hier ist aber nur der Stand des Hauptprogramms zu finden, nicht das was unter Tools und Komponenten zu finden ist.

Wie ist der allgemein übliche Weg, um die Abhängigkeiten in Zeit (Datum, Uhrzeit) bzw. SVN-Revisionsnummer zwischen drei verschiedenen Repositories zu managen?

1. Mein erster Gedanke war, einen parametrierbaren Build zu erstellen, der sechs Eingabefelder hat.
Pro Repository ein für die SVN-URL und ein optionales String-Eingabefeld für die Revsionsnummer.
Da muss man aber ziemlich viel im SVN-Log nachgucken, was wann wie zusammmengehört und ist so bspw. für externe Abteilungen unbenutzbar.
Während ich den Zusammenhang zwischen SVN-Log, drei Repositories und SVN-Revisionsnummer von den Entwicklern verlangen kann, sieht es da beim Produktmanagment schon anders aus.
Wenn die einen bestimmten Versionsstand brauchen, sollte das für die Kollegen relativ straight forward sein, ohne groß Nachfragen zu müssen.

2. Dann kam noch die Idee auf, die Abhängigkeiten im Hauptprogramm als Textdatei/Batchdatei zu hinterlegen.
Diese wird während des Build-Prozesses ausgelesen und anhand der darin definierten Werte werden die Abhängigkeiten aufgelöst.
Also bspw. ist die SVN-Revisionsnummer für "Tools" und "Komponenten" im aktuellsten Fall -1, so dass diese Repositories auf den neusten Stand ausgecheckt werden.
Wenn man aber bspw. etwas baut mit dem oben erwähnten Tag "V3.0.004.0", dann muss derjenige Entwickler, der den Branch angelegt hat, die SVN-Revisionsnummern für "Tools" und "Komponenten" auf den damals definierten Stand setzen (SET Tools_SVN_Revision=8123; SET Komponenten_SVN_Revision=427).

Code:
svn checkout https://mycompanysvn/Tools/branches/R3951@8123
svn checkout https://mycompanysvn/Komponenten/branches/R051@427
Ich vermute und hoffe, es gibt noch andere Möglichkeiten und Wege, die mithilfe von SVN und Jenkins gelöst werden können.

Sollte irgendwas unklar sein in meiner Schilderung, bitte ich um Rückfragen.

Wie ist eure "Best Practice", wie löst ihr das in eurem Build-Prozess?
  Mit Zitat antworten Zitat