Wie kann CI für interpretierte Sprachen verwendet werden?

23

Ich habe noch nie ein Continuous Integration System (CI) verwendet. Ich programmiere hauptsächlich in MATLAB, Python oder PHP. Keiner von beiden hat einen Build-Schritt und ich sehe nicht, wie ein CI für meine Arbeit verwendet werden könnte. Ein Freund von einem großen Projekt in einer großen Firma sagte mir, dass Sprache keine Rolle spielt.

Ich verstehe nicht, wie CI für mich von Nutzen wäre, wenn ich keinen Build-Schritt hätte. Ich kann mir CI als Testumgebung vorstellen, in der Unit-Tests durchgeführt werden. Vermisse ich etwas?

Lord Loh.
quelle
14
Ob dies zutrifft, hängt davon ab, was Sie als "Build-Schritt" ansehen. Du scheinst es nur als das Nötigste anzusehen, um dir etwas zum Laufen zu bringen. In meinem Team verstehen wir Build als Kompilierung, statische Analyse und Komponententests (mit Platz für weitere Aufgaben). Diese Definition hat den Vorteil, dass ein Commit, bei dem Komponententests fehlschlagen, nicht "erstellt" wird und zunächst nicht in das Repo aufgenommen werden darf.
Chris Hayes
Ein CI-System kann und sollte alle automatisierten Tests testen - Kompilieren und Verknüpfen können als eine Form von automatisierten Tests angesehen werden. Bei eingeschränkten Ressourcen können einige der langsameren Tests möglicherweise nur für nächtliche Builds oder sogar für Wochenend-Builds ausgeführt werden, CI führt sie jedoch aus. Fragen Sie sich Folgendes: Warum möchten Sie Tests automatisieren und dennoch die automatisierten Tests manuell ausführen?
Peter - Unban Robert Harvey

Antworten:

32

Kontinuierliche Integration als Begriff bezieht sich auf zwei unterschiedliche Ideen.

Der erste ist ein Workflow: Anstatt dass jeder in einem Team an seiner eigenen Niederlassung arbeitet und dann nach ein paar Wochen Programmierung versucht, seine Änderungen in der Hauptlinie zusammenzuführen, werden diese Änderungen (fast) kontinuierlich integriert. Dadurch können Probleme frühzeitig auftreten und inkompatible Änderungen vermieden werden. Dies setzt jedoch voraus, dass wir leicht prüfen können, ob eine Änderung „funktioniert“.

Hier kommt die zweite Idee ins Spiel, die sich als weitaus populärer herausstellte. Ein CI-Server ist eine saubere Umgebung, in der die Änderungen so schnell wie möglich getestet werden. Die saubere Umgebung ist notwendig, damit der Build reproduzierbar ist. Wenn es einmal funktioniert, sollte es immer funktionieren. Dadurch werden Probleme vermieden, die jedoch auf meinem Computer aufgetreten sind. Ein CI-Server ist insbesondere dann nützlich, wenn Ihre Software auf verschiedenen Systemen oder in verschiedenen Konfigurationen ausgeführt wird und Sie sicherstellen müssen, dass alles funktioniert.

Das Fehlen eines Build-Schritts ist unerheblich. CI ist jedoch nur sinnvoll, wenn Sie über eine Testsuite verfügen. Diese Testsuite muss automatisch sein und darf keine Fehler aufweisen. Wenn die Tests fehlschlagen, sollte der entsprechende Entwickler eine Benachrichtigung erhalten, damit er das von ihm eingeführte Problem beheben kann („Abbruch des Builds“, auch wenn kein Build als Kompilierung vorhanden ist).

Es stellt sich heraus, dass ein solcher Server nicht nur zum Testen nützlich ist. Tatsächlich ist die meiste CI-Software wirklich mies, wenn es darum geht, Tests in verschiedenen Konfigurationen auszuführen, aber alle Arten von Jobs gut zu verwalten. ZB kann es zusätzlich zu "kontinuierlichen" Unit-Tests einen vollständigen Test als nächtliches Build geben. Die Software kann mit mehreren Python-Versionen und verschiedenen Bibliotheksversionen getestet werden. Eine Website könnte auf tote Links getestet werden. Wir können statische Analysen, Stilprüfungen, Testabdeckungstools usw. über den Code ausführen. Dokumentation kann generiert werden. Wenn alle Testsuiten bestanden sind, kann der Paketierungsprozess gestartet werden, sodass Sie bereit sind, Ihre Software freizugeben. Dies ist in einer agilen Umgebung nützlich, in der Sie jederzeit ein implementierbares (und demo-fähiges) Produkt benötigen. Mit dem Aufkommen von Web-Apps entsteht auch die Idee einer kontinuierlichen Bereitstellung: Wenn alle Tests bestanden sind, können wir die Änderungen automatisch in die Produktion übernehmen. Dies setzt natürlich voraus, dass Sie sich in Ihrer Testsuite wirklich sicher sind (wenn nicht, haben Sie größere Probleme).

amon
quelle
3
"CI ist nur dann sinnvoll, wenn Sie über eine Testsuite verfügen" - Beachten Sie, dass der Compiler für eine kompilierte Sprache selbst eine rudimentäre Testsuite ist, die viele häufig auftretende Fehler aufdeckt.
user253751
@immibis Ich denke, es geht nicht um kompiliertes oder interpretiertes, sondern um statisches Tippen. Eine Sprache mit einem statischen Typsystem kann automatisch bestimmte Korrektheitseigenschaften nachweisen . Dies ist sogar besser als Tests, die nur anhand von Beispielen funktionieren. Das einzige häufige Problem, das von einem CI-Server beim Kompilieren festgestellt wird, ist, dass ein Entwickler vergessen hat, eine neue Datei festzuschreiben. In allen anderen Fällen benötigen wir keinen CI-Server und können nur lokal kompilieren, um nach Fehlern zu suchen.
amon
1
@amon Unwahr. Es ist nicht ungewöhnlich, in letzter Minute eine Änderung vorzunehmen und dann zu vergessen, die Kompilierung vor dem Festschreiben zu testen. Es gibt auch Probleme, wenn Sie Abhängigkeiten zu etwas hinzufügen, das Sie global lokal installiert, aber nirgendwo anders installiert haben.
jpmc26
24

Es stimmt, Sie brauchen kein spezielles CI-System, um Builds durchzuführen und zu überprüfen, ob diese korrekt sind, aber das ist nur ein Teil dessen, worum es bei CI geht.

Der Zweck von CI besteht darin, Fehler so schnell wie möglich zu erkennen, da die Fehlerbehebung in der Regel umso billiger ist, je früher ein Fehler erkannt wird. Zu diesem Zweck kann ein CI-System in dem Fall, in dem ein Erstellungsschritt nicht erforderlich ist, die Verwendung von Codeanalyse-Tools, die Bereitstellung in einer Testumgebung, Unit / Integration / Regression / andere Tests, die Sie automatisieren können, und alle anderen Schritte automatisieren Sie können automatisch ausführen, um nach Fehlern zu suchen.

Iker
quelle
8
Ich würde hinzufügen: Die naheliegendste Möglichkeit, das System automatisch zu testen, besteht darin , es automatisch auszuführen . Beispielsweise können Sie eine Website mit Tools wie JMeter oder Selen testen.
Reinierpost
7

Kontinuierliche Integration führt mehr als nur eine Kompilierung des Codes durch. Wenn das alles wäre, würden wir nicht annähernd so viele Werkzeuge dafür brauchen!

Einige andere Aufgaben, die mir spontan einfallen, die eine kontinuierliche Integrationspipeline häufig ausführt:

  • Automatische Tests ausführen. (Python hat eine Fülle automatisierter Testbibliotheken, und PHP hat zumindest einige. Ich kann nicht mit MATLAB sprechen.)
  • Bündeln Sie die Software für die Verteilung. Indem Sie diesen Prozess automatisieren, stellen Sie sicher, dass er jedes Mal exakt, konsistent und wiederholbar ausgeführt wird. Es werden keine Schritte vergessen; Das Erstellen eines solchen Distributionspakets dauert höchstens einen Klick. (Es ist eine großartige Idee, Ihre Python-App als Rad zu bündeln!)
  • Markieren von Meilenstein-Commits Wenn Sie ein Paket für die Produktion erstellen, möchten Sie es wahrscheinlich mit Tags versehen.
  • Automatisch inkrementierende Versionsnummern. Normalerweise ist dies nur die "Build" -Nummer und nicht die aussagekräftigeren Teile, aber es kann hilfreich sein, einen bestimmten Build eindeutig zu identifizieren, damit Sie wissen, was wo bereitgestellt wird.

Wenn Sie im engeren Sinne ein Stück weiter an die Grenze der "kontinuierlichen Integration" gehen, können Sie auch Folgendes tun:

  • Haben Sie einen automatisierten Prozess zum Einrichten eines Betriebssystems und zum Installieren Ihrer Abhängigkeiten.
  • Automatisches Bereitstellen von Kopien der Software (hauptsächlich nützlich für Webanwendungen oder Software, die von einem Paketmanager verteilt wird). Einige Teams verwenden dies tatsächlich für die Bereitstellung in der Produktion (kontinuierliche Bereitstellung), aber auch wenn dies nicht der Fall ist, können Sie dies für die Bereitstellung zusätzlicher, nicht in der Produktion befindlicher Kopien des Codes nutzen. Für einige Projekte, in denen ich arbeite, haben wir eine Kopie für Entwickler, um ihren Code zu testen, bevor er für die Qualitätssicherung verfügbar gemacht wird, eine Kopie für die Qualitätssicherung und eine "stabilere" Kopie für Demozwecke.

Der Punkt ist einfach der folgende: Es gibt Aufgaben, die Sie regelmäßig bei der Entwicklung von Software ausführen müssen, außer nur den Code zu schreiben. Indem Sie diese Aufgaben automatisieren und auf einem Server ausführen, erhalten Sie

  • Konsistenter Prozess (Stan und Sally werden die Dinge nicht auf unterschiedliche Art und Weise erledigen.)
  • Kenntnisse über im Code aufgezeichnete Prozesse (Jeder, der die Skripte lesen kann, kann die Schritte bei der Bereitstellung erlernen, anstatt dass Sally die einzige ist, die dies tut oder weiß, wie.)
  • Einfachere Duplizierung von Prozessen (Einfache Bereitstellung mehrerer Kopien der Website: Sie stellen nur eine neue Konfiguration bereit!)
  • Umfassendere Tests (Bob hat nur seine Seite getestet, aber seine Änderungen haben Sallys Seite zerstört. Sally hat vergessen, eine Datei festzuschreiben. Stan hat eine neue Abhängigkeit hinzugefügt, die neben der App installiert werden muss, diese jedoch nicht erkannt, da sie automatisch von der IDE installiert wird Ich habe all das in der einen oder anderen Form gesehen.)

Und wahrscheinlich auch einige andere Vorteile, die mir gar nicht in den Sinn kommen.

jpmc26
quelle
Danke für die Antwort. Die Beispiele sind großartig. Ich wünschte, ich könnte mehr als eine Antwort als angenommen stimmen: - /
Lord Loh.
@LordLoh. Keine Bange. Ich bin nur froh, dass ich helfen konnte. =) Danke, dass du mich informiert hast.
jpmc26
1
Upvoted, ausgezeichnete Antwort. Wenn Sie dies nicht tun, profitieren Sie möglicherweise nicht von den angebotenen Vorteilen. ZB können Konsistenz, Prozesskenntnisse und Einfachheit leiden, wenn Sie überbauen. Also ... bewerten Sie Ihre Bedürfnisse realistisch und schnell!
brian_o
1

Möglicherweise müssen Sie die Lösungen nicht kompilieren, aber CI kann Ihnen trotzdem helfen, indem Sie die Konfigurationsdateien / Ordnerpfade usw. ändern und wenn Sie in einem Team sind, die Änderungen des Produktstatus fördern und bereitstellen

Angenommen, Sie stellen Ihren Python-Code auf 5 verschiedenen QA-Servern bereit und müssen auf verschiedene QA-Datenbanken verweisen. Anschließend führen Sie den automatisierten Testlauf (ausgelöst durch CI) aus, befördern den Build in die Produktion und stellen ihn dort mit den entsprechenden Konfigurationsänderungen für jeden Produktionsserver bereit .

Mike
quelle