Best Practice Continuous Integration

Veröffentlicht auf 25. November 2015

Generelle Ziele von Continuous Integration:

  • Standardisierung.
  • Automatisierung.
  • Schnelle Rückmeldung.

Keine Ziele:

  • Fehler anprangern.

Was wird primär automatisiert:

  • Bauen von Software.
  • Aktualisierung der Software.
  • Software Tests.
  • Statische Tests, z.B. Codeabdeckung.

System:

  • Setze deinen Server auf Linux oder einem ähnlichen System auf. Die Kommandozeile wird dein bester Freund sein bei der Automatisierung.
  • Überlege dir wer Arbeitsrechte haben darf, Leserechte sollte jeder haben.
  • Benutze LDAP oder AD oder ähnliches zur Benutzeranmeldung. Damit sind im Fehlerfall die Emails der betreffenden Personen bekannt und sie können benachrichtigt werden.
  • Verwende Plug-Ins um dir dein System so einzurichten, wie du es brauchst.
  • Sichere dein System ab.
  • Verwende Public Key Authentification für einen speziellen CI-User um dich zwischen mehreren Rechnern zu verbinden.

Jobs/Tasks:

  • Verwende eine Namenskonvention, z.B. Software_Scope/Phase_Description.
  • Baue deine Jobs granular auf, das macht die Fehlersuche einfache und schneller.
  • Baue soweit wie möglich die Produktionsumgebung nach!
  • Dokumentiere deine Jobs, am besten direkt im Job.
  • Sorge bevor du anfängst etwas zu bauen und ggf. danach für eine saubere Arbeitsumgebung. Besonders, wenn Jobs fehlschlagen müssen die nächsten Läufe wieder ohne manuelle Korrekturen laufen können -> Rollback Strategie.
  • Prüfe deine "Annahmen" bevor sie Verwendung finden. Auch Verzeichnisse die da sein sollten können verschwinden.
  • Sleep x Sekunden ist zu vermeiden, besser sind for-Schleifen die nach einem timeout abbrechen.
  • Verwende Build-Tools (Ant, Maven, Gradle, ...).
  • Verwirf alte Jobs nach einer gewissen Zeit oder Anzahl.
  • Erstelle wenn nötig eigene Wartungsjobs um deinen Server sauber zu halten.
  • Sorge dafür, dass dein Job konfigurierbar ist, um wiederverwendet zu werden. Suche dir aber auf jeden Fall eine zentrale Stelle für die Konfiguration und vermeide ein Konfigurationschaos. Dokumentiere diese Stelle in der Jobdokumentation.
  • Benachrichtige die Verursacher von Problemen immer direkt im Anschluss.
  • Vermeide zu viele uhrzeitgesteuerte Jobs. Aktionen oder Pipelines sind bessere Auslöser.

Pipeline:

  • Baue nur Job-Pipelines auf wenn Abhängigkeiten bestehen, um nicht immer das Rad neu zu erfinden. Die meisten CI-Server bieten entsprechende Funktionalitäten um dies zu visualisieren.
  • Identifiziere Jobs die gefahrlos parallel ausgeführt werden können um Zeit zu sparen.
  • Verwende bei einer Pipeline immer die gleichen Revisionen für einen Lauf!
  • Zerstöre nicht Artefakte vorhergehender Jobs. Jeder Job sollte einzeln wieder angestoßen werden können -> Rollback Strategie.
  • Beachte bei Abhängigkeiten in Pipelines, dass die Jobs sich nicht gegenseitig beeinträchtigen, z.B. dass ein Job den Testserver eines anderen Jobs herunterfährt während diese darauf arbeitet.

Instabile Jobs:

  • Fehlerhafte Jobs werden gleich und vor Feierabend beseitigt! Andernfalls werden Kollegen blockiert und die Analyse erschwert.
  • Fehlerhafte Tests werden niemals nur auskommentiert, sie werden korrigiert, geändert oder entfernt!
  • Im Notfall wird die letzte Änderung revertiert -> Rollback Strategie.

Ergebnisse veröffentlichen:

  • Erstelle Statistiken und Reports wo sinnvoll.
  • Wem Jenkins zu technisch ist und wer "managementkompatible" Auswertungen braucht, sollte zusätzlich Sonar(Qube) installieren.

Geschrieben von Robert Bullinger

Veröffentlicht in #Softwareentwicklung, #Testautomatisierung, #Continuous Integration

Kommentiere diesen Post