Was bedeutet "automatisiertes Erstellen"?

15

Ich versuche, einem Projekt Continuous Integration hinzuzufügen.

Laut Wikipedia besteht ein Hauptbestandteil von CI aus automatisierten Builds. Ich bin jedoch verwirrt darüber, was genau dies bedeutet, da die Artikel zu CI und Build-Automatisierung nicht übereinstimmen.

Konkrete Verwirrungspunkte: Was bedeutet "automatisiertes Erstellen" im Zusammenhang mit:

  • Ein Projekt, das eine interpretierte Sprache wie Python oder Perl verwendet?
  • Erstellen von der Quelle auf dem Computer eines Endbenutzers?
  • eine Anwendung mit Abhängigkeiten, die nicht einfach vorkompiliert und verteilt werden können, z. B. eine Datenbank in einem lokalen RDBMS auf dem Computer des Benutzers?

quelle
2
Ich habe mit beiden getaggt buildsund buildwusste nicht, welchen ich verwenden sollte.

Antworten:

14

Sie haben zu Recht festgestellt, dass für einige Technologien kein Kompilierungsschritt erforderlich ist. Ich empfehle jedoch, den Begriff "Build-Automatisierung" breiter zu fassen. Stellen Sie sich "Build" mit den folgenden zwei Hauptkomponenten vor:

  • Der Prozess für Transformationsquellenartefakte (Code, Datenbankschema, Dokumentation usw.), der für einen Endbenutzer bereitgestellt wird.
  • Die Anwendung von Qualitätssicherungsmaßnahmen während dieser Transformation

Automatisierung bedeutet dann einfach, dass einige - wenn nicht alle - dieser Vorgänge automatisch ausgeführt werden (das heißt, dass kein manueller Eingriff erforderlich ist). Dies kann abhängig von Ihrer Technologie eine ganze Reihe von Schritten umfassen:

Transformationsschritte:

  • Zusammenstellung
  • Verknüpfen
  • Verpackung
  • Einsatz
  • Datenmigration
  • Backup
  • Benachrichtigung

Qualitätssicherungsschritte:

  • Compiler Warnungen / Fehler
  • Unit-Tests
  • Integrationstests
  • Systemtests
  • Bereitstellungsauthentifizierung

Heutzutage können Sie mit guten CI-Tools all diese Probleme lösen. Anfänglich sind die meisten Geschäfte daran interessiert, die Kompilierung ihres Codes zu automatisieren, da dies die erste und sichtbarste Ursache für Probleme in der konventionellen Softwareentwicklung ist.

Stephen Gross
quelle
21

Ein automatisierter Build ist eine Beschreibung eines Prozesses, der die folgenden Grundlagen abdecken sollte:

  1. Holen Sie sich den neuesten Code aus der Quellcodeverwaltung
  2. Kompilieren Sie den neuesten Code in die ausführbare Datei
  3. Führen Sie Tests (Komponententests, Systemtests, Integrationstests) mit kompiliertem Code aus
  4. Stellen Sie die fertige ausführbare Datei an einem bekannten Speicherort für die Bereitstellung bereit.
  5. Veröffentlichen Sie die Ergebnisse des Builds.
    5.1 Erfolgreiche Kompilierung, Unit-Test-Erfolg

Es ist ein Hand-off-Prozess, der ohne manuelle Eingriffe ausgeführt werden sollte.

Sheldon Warkentin
quelle
3
Da dies ausdrücklich angefordert wurde, können Sie erwähnen, dass nicht zutreffende Schritte optional sind. Wenn es sich bei Ihrer App beispielsweise um eine Reihe von Python-Skripten handelt, ist Schritt 2 möglicherweise nichts oder es ist so einfach, den Code in eine einzelne Datei zu komprimieren. Es ist durchaus akzeptabel, keinen Kompilierungsschritt zu haben.
Bryan Oakley
@BryanOakley Das ist fair. Das Äquivalent zum Fehlen einer Kompilierung für Skripte kann darin bestehen, sicherzustellen, dass alle Abhängigkeiten, sofern vorhanden, zu diesem Zeitpunkt ordnungsgemäß erfasst werden. Beispielsweise sollten alle zusätzlichen Bibliotheken von Drittanbietern, die für Ihr Python-Skript erforderlich sind, enthalten sein, damit sie in allen folgenden Schritten enthalten sind. Ich nehme an, dass dies auch unnötig ist, wenn bekannt ist, dass die Ziel- und Buildmaschine immer über alle erforderlichen Bibliotheken verfügt.
Sheldon Warkentin
2

Für mich ist ein automatisierter Build etwas, das

  • geschieht automatisch, entweder nach einem Zeitplan oder bei jedem Commit zur Quellcodeverwaltung
  • Erstellt eine Reihe von Artefakten, die einfach auf jedem Server bereitgestellt werden können

Das Ziel ist ein Bereitstellungsprozess, der wiederholt werden kann - sprich: getestet -, sodass Sie zu dem Zeitpunkt, an dem Sie die Bereitstellung in der Produktion vornehmen, mit einem gewissen Maß an Sicherheit feststellen können, dass nichts schief geht. Je weniger menschliche Interaktion in den Erstellungs- und Bereitstellungsprozessen stattfindet, desto sicherer ist Ihre Version.

Wenn Sie eine nicht kompilierte Sprache haben, können Sie dennoch eine Site erstellen und diese komprimieren, um ein einzelnes Artefakt zu erstellen.

Mit einem guten CI-Tool können Sie viele Aufgaben in den Erstellungsprozess einbinden, einschließlich der Ausführung von Komponententests. Außerdem werden Ihre erfolgreichen und erfolglosen Builds, die Testabdeckung usw. protokolliert. Aber nichts davon ist Teil dessen, was ich als automatisierten Build definieren würde. (Das heißt, ein guter automatisierter Build-Prozess hat diese Dinge, aber ein schlechter nennt sich nicht umsonst "automatisierter Build", weil ihm diese Dinge fehlen.)

Ich würde vorschlagen, dass Integrations- / Regressionstests als Teil des Bereitstellungsprozesses und nicht als Teil des Erstellungsprozesses ausgeführt werden (auch wenn Sie eine geeignete Umgebung haben, können Sie sie mit jedem Build bereitstellen).

pdr
quelle
Es kann auch nützlich sein, einen geplanten Build zu haben und es Entwicklern zu ermöglichen, einen automatisierten Build mit einer Aktion zu starten (wenn es zwei Aktionen sind, ist es nicht wirklich automatisiert, oder?). In unserem Fall ist der Build für einige Systeme auch so Sehnsucht nach einem Kickoff für jedes Commit, damit es im Zeitplan und auf Anfrage ist.
David Thornley
@ DavidThornley: Ja. Das ist nützlich. Mit den meisten CI-Tools können Sie einen Build außerhalb Ihres festgelegten Zeitplans starten. Aber auch hier hört es nicht auf, ein automatisiertes Build zu sein, da diese Option nicht vorhanden ist. Es wäre kein automatisierter Build mehr, wenn ein Entwickler ihn immer auslösen müsste.
pdr
1
a project using an interpreted language, such as Python or Perl?

Bei gedolmetschten Sprachen kann es vorkommen, dass etwas schief geht. Einige interpenetrierte Sprachen haben Compiler, aber in den meisten Fällen ist es nicht unbedingt erforderlich, sie zu verwenden. In diesem Fall würde ich den Code im Allgemeinen nur auf Syntax- und Parsing-Fehler überprüfen, anstatt ihn zu kompilieren, oder direkt zum Ausführen der Tests für den Code übergehen.

Erstellen von der Quelle auf dem Computer eines Endbenutzers?

Für mich bedeutet dies, dass Sie einen einzigen Befehl bereitstellen können, den Endbenutzer ausführen können, um die neueste Version des Programms abzurufen, es zu kompilieren, zu konfigurieren und nach Bedarf bereitzustellen.

eine Anwendung mit Abhängigkeiten, die nicht einfach vorkompiliert und verteilt werden können, z. B. eine Datenbank in einem lokalen RDBMS auf dem Computer des Benutzers?

Diese fallen unter den Testteil der kontinuierlichen Integration, da Sie die Datenbanken automatisch zerstören und rekonstruieren können, um sicherzustellen, dass die Skripte korrekt sind und das Programm sie korrekt testet.

rjzii
quelle
1

Was Sie in Ihrer Frage besprechen, sind tatsächlich 3 verschiedene Konzepte:

Die kontinuierliche Integration in ihrem Kern besteht darin, kleine Änderungen vorzunehmen und diese Änderungen häufig mit der "globalen Wahrheit" zu synchronisieren. Anstatt einen Checkout durchzuführen und eine Woche zu warten, sollte ein Entwickler an Aufgaben arbeiten, die innerhalb eines Tages erledigt werden können, damit sein Code nicht zu weit vom Haupt-Repository abweicht.

Um dies zu erreichen, ohne seinem Team Schmerzen zu bereiten (dh das Einchecken einer Quelle, die keine bestehende Funktionalität aufbaut oder bricht). Der Entwickler muss sicherstellen, dass sein Code den Build nicht "unterbricht". Wenn dies manuell durchgeführt wird, erhöht sich der zusätzliche Aufwand für den Entwicklungsprozess (stellen Sie sich ein Projekt vor, dessen Erstellung lange dauert und / oder das viele Abhängigkeiten aufweist, bei denen eine Änderung an einer Codezeile die Anwendung auf unerwartete Weise beeinflussen kann).

Um diese Situation zu entschärfen, verwenden wir andere Techniken, um diesen Overhead zu beseitigen.

Wir verwenden automatisierte Builds, um die Quelle auszuchecken und zu erstellen. Optional führen wir automatisierte Tests durch , um zu überprüfen, ob die Anwendung ordnungsgemäß funktioniert (dieser Schritt ist nur so nützlich wie die Testsuite).

Ein weiterer Schritt kontinuierliche Abgabe richtet sich Ihr Problem mit Datenbank und andere Sorgen. Die Idee dabei ist, eine gewisse Versionierungsstufe für die Datenbank und andere Faktoren der Umgebung bereitzustellen, damit wir so schnell wie möglich bestätigen können, dass die Anwendung in einer Umgebung arbeitet, die so produktionsnah wie möglich ist .

Michael Brown
quelle
1
Tolle Punkte ... es ist schade, dass die meisten Leute nicht bis zum Ende des Threads lesen und abstimmen.
hotshot309
0

"Automatische Erstellung" bedeutet, dass Sie mit einer (planbaren) Aktion (normalerweise einem Shell-Skript oder einer Batch-Datei) von der Quellcodeverwaltung zu einem versandfähigen Paket wechseln können.

Was genau ein Build ist, hängt in diesem Zusammenhang stark davon ab, was genau Sie versenden, wie es geliefert wird und welche Schritte für die verschiedenen Teile Ihres Entwicklungsstacks erforderlich sind. In jedem Fall beginnen Sie mit Was ist in der Quellcodeverwaltung, und Sie erhalten ein versandfähiges Produkt (oder eine Fehlermeldung und einen verärgerten Projektmanager).

Bei einem einfachen Python-Projekt besteht ein automatisierter Build möglicherweise nur aus zwei Schritten: Auschecken der Quellen und Kopieren der relevanten Dateien in die richtigen Verzeichnisse. Bei komplexeren Projekten kann es sich um Folgendes handeln:

  • Kompilieren, Verknüpfen
  • Ausführen automatisierter Tests
  • Installationspakete erstellen
  • installieren
  • Datenbank (en) ändern
  • Erstellen von Backups (für den Fall, dass Sie ein Rollback durchführen müssen)
tdammers
quelle