[Python-de] Continuous Integration: N git Repositories

Martin A. Brown martin at linux-ip.net
Mi Apr 20 12:20:08 EDT 2016


Hallo,

>> ich hab zwar in Deiner Mail keine wirkliche Frage gelesen, will aber
>> trotzdem mal antworten.
>
> Ja, Arnold, richtig gesehen. Ich hatte gar keine Frage gestellt. 
> Ich wollte als Einführung kurz die Begriffe klären.

Ich finde Deine Frage die richtige Frage, und ich stimme mit Dir 
überein:

   Es ist zum Heulen, dass das in jeder Firma immer wieder erneut 
   erfunden und erneut implementiert wird.

(So muß es immer sein, wenn das richtige Gerät fehlt.)

Ich schlage einen anderen Weg und Werkzeug vor.  Wenigstens, darf 
man 'Continuous Build' benutzen wenn Linux das Zielplatform ist.  
(Ich kenne mich mit Windows nicht aus.)

Kurz:  

Hast Du von dem OBS, Open Build Service gehört?  Ich empfehle es:

  http://openbuildservice.org/

> Ich hätte gerne ein paar Verbesserungen an dem Setup. Aber es ist 
> im Moment schon eine Bastellösung.

Wenn man (irgend)eine Software sehr genau anschaut sieht man daß es 
alles gebasteltes Zeug ist.  Wunderschönes gebasteltes Zeug!

Aber im Ernst, muß ich zugeben:  Eine Bastellösung führt in Richtung 
Komplexität und Komplexität ist unser Erzfeind hier.

> Ich bin kein Freund von komplexer Konfig in Jenkins. Kommt eine 
> neue Firma dazu, was dann? Eine Web-GUI ist ja ganz nett, aber 
> copy+paste von Jenkins-Konfig ist ähnlich wie copy+paste von 
> Quelltext. Das kann man machen, aber langfristig wird es 
> Kuddelmuddel.

Jeder Konfig neigt stets in die Verwickelung.

> Was ist an dem CI eines Projekts (Definition des Begriffs siehe 
> erste Mail) anders als am CI einer Bibliothek?
>
> Ein Projekt ist eigentlich nicht viel. Etwas Konfig und eine Liste 
> von Abhängigkeiten.

Genau.

> Ich stelle mir das so vor: Im CI des Projekts werden alle 
> Abhängigkeiten auf den aktuellsten Stand gebracht. Wenn dann die 
> Tests alle erfolgreich sind, dann wird der aktuelle Stand der 
> Abhängigkeiten festgezurrt und als stabil gekennzeichnet.
>
> Und dafür kenne ich im Moment kein Tool.

Es ist wahrscheinlich daß man OBS auf solcher Weise benutzen könnte.

> Bei uns gibt es rund 5 Repos bei denen es täglich Änderungen gibt 
> und rund 30 Repos mit wenig Änderungen.

<snip>

Vor einer Woche habe ich eine Einführung in OBS geschrieben.  Meine 
Absicht war den Anstoß und Hintergrund des OBS zu beschreiben und 
den Kern des Systems darzustellen.  Zweitens wollte ich einen 
Unterschied zwischen Continuous Integration und Continuous Build 
erklären.

  http://linux-ip.net/continuous-build-with-the-open-build-service.html

(Leider ist diese nur auf Englisch geschrieben.)

Und, jetzt, weiter auf Deine Frage.  Die Idee daß Du vorgeschlagen 
hast, Thomas, scheint mir ganz nah an den Stärken des OBS.

Jetzt versuche ich zu beschrieben wie ich dieses Problem mit OBS 
lösen würde.

Ausgangspunkt:  5 Kunden, jeder hat seine eigene Infrastruktur.
                100 Paketen (mehr oder weniger)
                Entwicklungshaus, einige Mitarbeiter.
                Jenkins als CI server (jetzt auch mit 'artifacts')

Was würde ich tun?  OBS hinzufügen.

Wenn jedes Stück Software wirklich open source ist und nichts 
geschützt werden muß, dann startete ich einfach mit dem öffentlichem 
OBS.

  * Für jede Kunde, würde ich ein OBS Projekt machen.
  * Unterstützten Platformmen in 'prjconf' einschalten.  z.B.
    für Kunde A, CentOS-7.1-x86_64, für Kunde B,
    OpenSUSE-13.2-x86_64
  * Ein einziges Paket [0] in das Projekt aufladen und sichern daß 
    das OBS gute RPMs baut
  * Alle anderen Paketen aufladen und sichern daß alles gut läuft.

Wenn die Software proprietär ist, dann kann man das OBS selbst 
installieren (es gibt auch Appliance und VM).  Dieselbe Strategie 
kann man folgen, aber man muß zuerst das ganze OBS mit den 
gewünschten Distributions ausstatten.  Dann kann man ein Projekt pro 
Kunde und so weiter machen.

Bei einer früheren Firma, haben wir das gemacht.  Unsere eigenen 
200+ Paketen brauchten ungefähr 350 öffentliche Abhängigkeiten.  
Wie kommt man zurecht mit so einer Menge von Software?  Nur mit 
Automatisierung.

Unsere Lösung:

  * OBS selbst installieren (ein einziger zweckbestimmter Rechner, 
    und einige zusätzliche fürs Bauen: "workers").
  * Mit rsync, die Distribution kopieren lassen (täglich, unter 
    unserer Kontrolle); genannt "upstream distributions"
  * Ein Projekt für alle andere öffentliche Abhängigkeiten; 
    A) ein Paket wird nicht von 'upstream' geliefert; B) wir 
    brauchten eine neuere Version; bei uns 'third-party' genannt
  * Ein Projekt machen für jeden Geschäftszweck (in Deiner Lage
    würde ich Ein Projekt pro Kunde machen)

Ich habe zwei zusätzliche Gedanken.

Erstens, ist es ganz richtig die gebauten Pakete festhalten zu 
wollen.  Mit dem OBS gibt es einige Mechanismen die hier dienen 
könnten, aber ich persönlich habe keine Erfahrung damit.  Unsere 
Lösung war ein bißchen komplexer, aber gut für die Entwickler.  Wir 
hatten ein Projekt für alle aktuellen Entwicklungsarbeit.  
Natürlich war dieses Projekt war oft beim Bauen.  Wenn ein Paket 
(oder eine Gruppe von Paketen) für Veröffentlichung bereit war, 
kopierten wir diejenigen in ein strenger kontrolliertes Projekt.  
So könnten wir die endgültige Paketen besser feststellen.

Zweitens, kann man OBS mit VCS Quellen benutzen.  In OBS Sprache 
meint man 'source services'.  Diese Art von Konfiguration gleicht 
dem CI System wie Jenkins und Travis.

Vielleicht ist diese Antwort nicht genau was Du erwarten hättest, 
denn diese ist keine Python-spezifische Antwort.

Jedenfalls, sehe ich einen Unterschied zwischen continuous 
integration und continuous build.  Ich sehe das erfolgreiche Ablauf 
von Bauen und Testen in ein CI-System (e.g. Jenkins) als die 
Endstation von Entwicklung.  Anstatt diese 'build artifacts' zu 
benutzen, würde ich das ganze Bauproblem auf ein continuous build 
(e.g. OBS) schieben.

Hoffentlich ist meine Antwort hilfreich,

-Martin

 [0] In meiner Erfahrung sind die Paketen nicht immer nur Python.  
     Meiner Meinung nach ist es gut, alle Software mit demselben 
     Package Management Tool (apt, dnf, zypper) zu beherrschen.  
     Daher, baue ich mein Python Paketen meistens in RPMs (und nun 
     .debs).  z.B.:

       python setup.py bdist_rpm

(Und, Entschuldigungen, wenn ich da oben irgendwo die Beugungen 
verwechselt habe.)

-- 
Martin A. Brown
http://linux-ip.net/


Mehr Informationen über die Mailingliste python-de