Tools im CI-Prozess Seminararbeit WS 20/21 - Thomas Jansen 3201738 Prof. Dr. rer. nat. Kraft Torsten Rehfisch
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Seminararbeit WS 20/21 im Studiengang Angewandte Mathematik und Informatik Tools im CI-Prozess Autor Thomas Jansen Matrikelnummer 3201738 1. Betreuer Prof. Dr. rer. nat. Kraft 2. Betreuer Kraft Torsten Rehfisch Eschweiler, den 15. Dezember 2020
Inhaltsverzeichnis 1 Einleitung 3 2 Build-Prozess 4 3 Buildtools 4 3.1 Make 5 3.2 Maven 6 3.3 Gradle 7 4 Build-Server 8 5 Continuous Integration 9 5.1 Definition 9 5.2 Intention 9 5.3 Verhaltensregel 10 5.4 Nightly Build 11 5.5 Continuous Delivery 12 6 Automation-Tools 13 6.1 Jenkins 13 6.1.1 Bereitstellung und Kosten 14 6.1.2 Versionsverwaltungssysteme 14 6.1.3 Sprachen und Buildtools 14 6.1.4 Anwendung 14 6.1.5 Skalierbarkeit 16 6.1.6 Wartung 16 6.1.7 Fazit 16 6.2 Travis CI 17 6.2.1 Bereitstellung und Kosten 17 6.2.2 Versionsverwaltungssysteme 17 6.2.3 Sprachen und Buildtools 17 6.2.4 Anwendung 18 6.2.5 Skalierbarkeit 19 6.2.6 Wartung 19 Seite 1
6.2.7 Fazit 19 6.3 GitLab CI/CD 20 6.3.1 Bereitstellung und Kosten 20 6.3.2 Versionsverwaltungssysteme 20 6.3.3 Sprachen und Buildtools 20 6.3.4 Anwendung 20 6.3.5 Skalierbarkeit 21 6.3.6 Wartung 21 6.3.7 Fazit 22 7 Schlusswort 23 8 Anhang 24 8.1 Default Configuration einer Travis CI VM 24 8.2 Pullrequest Message mit TravisCI 26 8.3 GitLab CI/CD WebUI 26 9 Quellen 27 Seite 2
1 Einleitung Im Verlauf der Entwicklung von Softwareentwicklung ist ein klarer Trend zu entde- cken: Programme werden immer komplexer. Nicht nur die reine Anzahl der Code- zeilen steigt stetig. Im gleichen Maße wie die Leistungsfähigkeit Hardwarekompo- nenten zeigt, nehmen auch die Ansprüche an Programme zu. Systeme werden vermehrt auf High-Performance getrimmt und die Implementierung hochkomplexer Algorithmen soll die Effizienz von Programmcode steigern. Um dies zu bewerkstelligen steigt zwangsläufig die Zahl der Personen, die in ei- nem Projekt involviert sind. Um die Koordination innerhalb des Projektes weiter zu gewährleisten, werden Programme modularisiert und Teams aus kleinen Personengruppen sind für die Entwicklung einzelner Modulen verantwortlich. Doch so wie bereits Herausforderungen entstehen, wenn zwei Entwickler am Code entwickeln, bringt das Arbeiten von mehreren Teams an einem Projekt Her- ausforderungen mit sich: Wie wird Code aus unterschiedlichen Entwicklungsständen zusammengeführt? Ein Modul hat sich geändert, wie reagieren andere Module darauf? Was passiert, wenn sich Schnittstellen ändern? Wie wird Codequalität sichergestellt und Code getestet? Wie wird Fehleranalyse betrieben? Auch in meinem Unternehmen musste man sich mit diesen Fragen auseinander setzen und es wurde in den letzten Jahren zunehmend die Modernisierung von Entwicklungsprozessen vorangetrieben. Große Projektgruppen wurden in kleinere agile Teams aufgeteilt. Agile ist ein Soft- wareentwicklungsprozess der geprägt ist von kurzen Entwurfsphase, schnell iterie- renden Programmversionen und selbstorganisierten Teams. In der agilen Softwareentwicklung gilt Continuous Integration als Best Practice und Teams haben in Eigeninitiative Continuous Integration Prozesse mit zugehörigen Tools eingeführt. 1 Aus verschiedenen Gründen soll möglichst konzernweit die Entwicklungsprozesse vereinheitlicht werden und somit auch die Zahl der verwendeten Tools. Eine Vereinheitlichung verringert Kosten bei der Anschaffung, Administration und Wartung von Tools. Außerdem verringert sich die Einarbeitungszeit beim Wechseln zwischen Teams oder Aufbau von neuen Teams. Seite 3
Diese Arbeit befasst sich zunächst mit dem Build-Prozess von Softwarekompo- nenten. Anschließend wird belichtet, wie sogenannte Buildtools den Build formali- sieren und Build-Automation ermöglichen. Weiter wird der Begriff Continuous Integration erklärt und wie Continuous Integra- tion den Entwicklungsprozess beeinflusst. Abschließend werden drei an Automati- onsservern vorgestellt. 2 Build-Prozess Da Continuous Integration die Verwendung von Buildtools voraussetzt, muss zu- erst geklärt werden, was der Build-Prozess und Buildtools eigentlich sind. Im einfachsten Sinne entspricht der Build dem kompilieren von Sourcecode zu Maschinencode. Je nach Sprache und Umgebung finden jedoch zusätzlich zum reinen Kompilieren noch weitere Prozesse statt. Während des Builds eines Java-Programmes können neben dem Kompilieren, also dem Umwandeln von .java-Dateien zu .class-Dateien, weitere Ressourcen wie Konfigurationsdateien, für Webanwendungen .html- oder .css-Dateien oder Multimediadateien wie Bilder oder Videos zu einer .jar-Datei gepackt werden. Als weiteres Beispiel muss in Kotlin, einer Programmiersprache, die die Java Vir- tual Machine als Laufzeitumgebung verwendet, muss während des Build zunächst Kotlin-Code in Java-Code umgewandelt werden. Weitere Sprachen können sich in den einzelnen Schritten unterscheiden, aber das Ergebnis des Builds ist ein lauffähiges Programm. 3 Buildtools Wenn mehrere Personen an einer Codebasis arbeiten, wird erwartet, dass sich das Programm für jeden identisch verhält. Der Build von identischem Sourcecode kann in unterschiedlichen Umgebungen jedoch zu potentiell drastisch abweichen- den Programmen führen. Beispielsweise interpretieren Compiler unterschiedlicher Versionen der selben Sprache Code unterschiedlich. Das Kompilieren könnte mit einem Fehler abbre- chen oder das laufende Programm könnte sich unerwartet verhalten. Weiter kön- nen Plugins oder Frameworks in der lokal verwendeten Entwicklungsumgebung den Build-Prozess beeinflussen. Seite 4
Damit trotzdem Entwickler die Entwicklungsumgebung frei wählen können, werden sogenannte Buildtools verwendet. Buildtools formalisieren den Build-Prozess und sorgen damit dafür, dass sich der Build unabhängig von der Umgebung wird. 2 Drei populäre Buildtools sind Make, Maven und Gradle. 3.1 Make Make ist eines der ältesten Buildtools und wird bis heute noch für die Program- miersprachen C und C++ verwendet. Innerhalb der sogenannten Makefile können Abhängigkeiten für den Buildprozess definiert werden. Ein Anwendungsbeispiel für die eine Makefile: 3 CC=gcc hello_make: beforeEach HelloWorld.c $(CC) HelloWorld.c -o ./Output/HelloWorld beforeEach: mkdir Output run: hello_make ./Output/HelloWorld Mit dem Konsolenbefehl make wird die Makefile aufgerufen. In der ersten Zeile wird eine Variable gesetzt, die in diesem Fall die Wahl des ver- wendeten Compilers vorgibt. Anschließend wird das erste sogenannte Target auf- gerufen, hier hello_make. Dieses Target hat die Vorbedingungen beforeEach und HelloWorld.c, die bewirken, dass bevor das in hello_make definierte Skript aufge- rufen wird, das Target beforeEach durchlaufen wurde und die Datei HelloWorld.c existiert. Nach dem Erstellen des Verzeichnisses Output, wird der Sourcecode in der Datei HelloWorld.c mit dem gewählten Compiler gcc nach Output/HelloWorld kompiliert. Mit dem Aufruf von make run wird zunächst das Target hello_make durchlaufen und anschließend das kompilierte Programm gestartet. Der Makefile-Mechanismus ist beliebig erweiterbar durch Testfälle für das Pro- gramm oder Definition von verwendeten Programmcodebibliotheken. Das Beispiel zeigt im einfachsten Sinne, wie mit dem Buildtool Make für Entwickler auf unterschiedlichen Umgebungen ein einheitlicher Build-Prozess gewährleistet werden kann. Seite 5
3.2 Maven Maven ist das Standard-Buildtool für Java Programme. Hier heißt die Konfigurati- onsfile pom.xml. Maven ist im Gegensatz zu Make ein weitaus ausgereifteres Tool, das eine Großzahl an zusätzlichen Funktionen bereitstellt. Maven implementiert einen sieben-phasigen Build-Lifecycle. Bestehend aus den Phasen/Scopes validate, compile, test, package, verify, install und deploy. Diese können jeweils auf der Konsole aufgerufen werden (Bsp.: mvn install). Die Phasen sind aufeinander aufbauend und handeln anhand der Konfigurations- datei pom.xml, die sich im Rootverzeichnis des Projektes befinden muss. Beispiel pom.xml: 4.0.0 org.example HelloWorld 1.0 jar org.apache.maven.plugins maven-compiler-plugin 2.3.2 junit junit 3.8.1 test Während der Phase validate wird die pom.xml syntaktisch und logisch geprüft. Es wird getestet, ob Referenzen aufgelöst werden können und ob die Projektstruktur maven-konform ist. In der Phase compile wird namensgetreu das Projekt kompiliert. In der pom.xml können hierzu explicit Plugins zum Build (maven-compiler-plugin) und verwendete Frameworks (junit) inclusive Version angegeben werden. Dass die hier angegebenen Abhängigkeiten auch tatsächlich in das Programm eingebunden werden, wird durch eine weiteren, projektunabhängigen Konfigurati- onsdatei, der sogenannten settings.xml gewährleistet. Seite 6
In dieser Datei wird zum einen ein lokales Repository-Verzeichnis angegeben, zum andern können Artefaktrepositories definiert werden. Artefaktrepositories sind Ablageorte für Codeartefakte wie Frameworks, Plugins oder ganze Programme. Man kann sowohl öffentliche Repositories verwenden, die allerhand open-source Artefakte beinhalten, oder private, in denen ein Unternehmen seinen entwickelten Code aufbewahren und untereinander zugänglich machen kann. In einer pom.xml erwähnte Artefakte werden, falls diese nicht bereits lokal existie- ren, von einem Artefaktrepository in das lokale Verzeichnis geladen und sind für alle Projekte zugänglich. Zusätzlich verwendet das Maven-Framework eine standardisierte Verzeichnis- struktur: !"project #"pom.xml !"src #"main $ #"java $ #"resources #"test #"java #"resources Alle unter src/test liegenden Tests wie JUnit- oder HtmlUnit-Tests werden mit dem Scope test ausgeführt. In der Phase package wird das Programm in das in der pom.xml angegebene Format gepackt, in diesem Beispiel jar. Mit dem Befehl mvn install wird das gebaute Programm in das lokale Repository abgelegt und ist für alle lokalen Maven-Projekte referenzierbar. In der letzten Phase im Maven-Lifecycle deploy wird das gebaute Programm in einem externen Artefaktrepository abgelegt und kann von anderen verwendet werden. 4 3.3 Gradle Gradle ist das von Google verwendete Standardtool zur Androidentwicklung. Im Gegensatz zu Maven benutzt Gradle keine Konfigurationsdatei sondern die Groo- vy-Datei build.gradle. Groovy ist eine auf der Java Virtual Machine laufende Pro- Seite 7
grammier und Skriptsprache. Somit handelt es sich bei build.gradle um ein direkt ausführbares Skript. Dadurch ist Gradle in der Lage Build-Prozesse zu parallelisie- ren. Damit ist Gradle besonders geeignet für den Bau großer Projekte oder Sys- teme, die aus mehreren Programmen zusammen gesetzt sind. 5 Das Potential der einzelnen Buildtools wurde im Rahmen dieser Arbeit nur leicht angeschnitten. Trotzdem sind die Vorteile, die die Verwendung von Buildtools mit sich bringt offensichtlich. Entwickler sind flexibel in der Wahl der Entwicklungsumgebung. Abhängigkeiten werden selbstständig aufgelöst. Versionsänderungen von Abhängigkeiten werden zentral konfiguriert. Der Build-Prozess verläuft in jeder Umgebung identisch. Tests werden automatisiert durchgeführt und der Bereitstellungsmechanismus ist stan- dardisiert. Abschließend können ganze Builds durch teilweise einzeilige Skripte angestoßen werden und sind so Grundbaustein für die Automatisierung in Zu- sammenhang von Continuous Integration. 4 Build-Server Ein Build-Server ist ein Server auf dem Builds automatisiert durchgeführt werden. Build-Server sind mit allen Systemen und Umgebungen verbunden, die im Verlauf des Builds benötigt werden. Durch einen Build-Server wird gewährleistet, dass je- der Build identisch, sprich mit den selben Parametern, angestoßen wird. Weiter können hier Skripte definiert werden, um auf Buildergebnisse zu reagieren. So können Entwickler bei einem Fehlschlag informiert werden oder bei Erfolg werden weitere Tests angestoßen, die nicht während des Builds stattfinden. Außerdem können von hier aus Programme auf Testumgebungen verteilt werden. Seite 8
5 Continuous Integration 5.1 Definition „Kontinuierliche Integration (auch fortlaufende oder permanente Integration; eng- lisch continuous integration (CI)) ist ein Begriff aus der Software-Entwicklung, der den Prozess des fortlaufenden Zusammenfügens von Komponenten zu einer An- wendung beschreibt.“ 6 In anderen Worten: Continuous Integration bedeutet, dass jede Änderung von Code in einem Codemanagementsystem den Build des gesamten Programmes anstößt. 5.2 Intention Continuous Integration gelangte besonders zu Popularität als eine der Grundsäu- len des Vorgehensmodells Extreme Programming. Neben weiteren Praktiken wie Pair-Programming, in dem mindestens zwei Entwickler gemeinsam Code entwi- ckeln, oder testgetriebener Entwicklung, dem Konzept, dass vor der Implementie- rung von Code Testfälle geschrieben werden, gehört auch die permanente Integra- tion zu einer Praktik, die die Effektivität im Softwareentwicklungsprozess steigern soll. 7 Extreme Programming in der Praxis umzusetzen ist jedoch sehr aufwendig und ist fast nur für erfahrene Expertenteams anwendbar. Trotzdem wurden viele der Grundpraktiken des Extreme Programmings in teilwei- se abgewandelter Form der Breite zugänglich gemacht und gelten heute als Best Practice. So auch das Konzept der permanenten Integration bzw. Continuous Integration. Das Ziel von Continuous Integration ist die Zeitspanne zwischen Codeänderung und Build des Programmes zu minimieren. Entwicklerteams eines Projektes arbeiten zeitgleich an unterschiedlichen Modulen des selben Programmes mit teilweise direkten Abhängigkeiten, die bereits bei der Entwicklung des eigenen Moduls von Bedeutung sind, oder indirekten Abhängig- keiten, die erst im Kontext des gesamten Programmes in Erscheinung treten. Das Minimieren der Zeitspanne zwischen Codeänderung am Programmcode und Build des gesamten Programmes bringt mehrere Vorteile mit sich. Zum einen bekommt der Entwickler zeitnah die Rückmeldung, ob nach seinen vorgenommenen Codeänderungen das Programm lauffähig ist und den in den Buildtools definierten Testfällen entspricht. Seite 9
Besonderes Problem bei der Entwicklung mehrer Personen bzw. Teams an einer Codebasis sind Abweichungen zwischen aktuellem Codestand und lokalen Kopien mit unterschiedlichen Entwicklungsständen. Während des lokalen Entwickelns an einem Modul sind Änderungen von Schnitt- stellen oder Abhängigkeiten nicht spürbar. Deswegen sind nach Tests von Modulen nur aussagekräftig nach der Integration in das gesamte Programm. Die Minimierung der Zeitspanne zwischen Änderung eines Moduls und bauen des Programmes führt weiter dazu, dass Fehler schneller entdeckt und behoben wer- den. Außerdem sind durch die Tatsache, dass Entwickler Codeänderungen regelmäßi- ger ausrollen müssen, die lokalen Kopien auf den Systemen der Entwickler aktuel- ler. Durch eine niedrigere Anzahl an Codeänderungen wird die Fehleranalyse ver- einfacht und beschleunigt. Schließlich wird durch regelmäßige Builds gewährleistet, dass Fehler schneller ge- funden und Auswirkungen potentieller Fehlerkaskaden, die auftreten, wenn auf ei- nem Fehler weiterer Code aufbaut, eingegrenzt werden. 5.3 Verhaltensregel Martin Fowler, Mitautor es Manifests für agile Software-Entwicklung, stellt in seiner Arbeit „Continuous Integration“ einige Verhaltensregeln auf, um erfolgreich Conti- nuous Integration im Entwicklungsalltag verwenden zu können: Zum einen ist zwingend, dass der Gesamtcode eines Programmes an einem Ort abgelegt wird und von diesem bezogen wird. In der Praxis ist folglich die Verwendung eines Source Control Management Sys- tem zwingend nötig. Heute hat sich für die meisten Anwendungsfälle git als Best Practice durchgesetzt. Vor allem der in git integrierte Multibranch-Mechanismus unterstützt die Zusammenarbeit in großen Projekten. In der Regel existiert ein Branch, der Master, zu jeder Zeit. Von dem Master werden erzeugen sich Entwick- ler einen Feature-Branch, auf dem neue Funktionen implementiert und getestet werden. Wenn ein Branch für produktivfähig gehalten wird, wird dieser mit dem Master vereint im sogenannten Merge. Es können beliebig viele Branches ange- legt werden und so können an beliebig vielen Features gleichzeitig gearbeitet werden. Wie oben bereits erwähnt, wird das Zusammenführen von Feature- Branch und Master aufwendiger, je länger die Zeitspanne zwischen erstellen des Branches und Mergen ist. Im Zusammenhang damit ist die nächste Verhaltensregel, dass der Master immer funktionstüchtig und fehlerfrei sein muss. Es ist zwar nicht möglich auszuschlie- Seite 10
ßen, dass nach einem Merge der Master korrumpiert ist, doch falls durch den im Kontext von Continuous Integration angestoßene Build fehlschlägt, umgehend die Integrität des Masters wieder hergestellt werden. Das verhindert, dass ein Branch auf Basis eines fehlerhaften Codestandes aufbaut. Um diesen Aspekt geht implizit hervor das Builds mittels Buildtools automatisiert sein müssen. Tests sollen soweit wie möglich automatisiert sein. Zwar ist die Automatisierung von Tests keineswegs neu in der Softwareentwicklung, jedoch lohnt es sich beim Verwenden von Continuous Integration Zeit in das Anlegen von möglichst vielen Testfällen zu investieren. Im Rahmen von CI steigt die Frequenz der Builds von wöchentlich oder täglich zu mehreren pro Tag und händisches Testen wird schnell sehr kostenintensiv. Damit durchgeführte Tests auch aussagekräftig für das Verhalten innerhalb der produktiven Umgebung sind, muss die Testumgebung der produktiven Umgebung möglichst ähnlich bzw. nachempfunden sein. Im besten Fall hält es sich bei der Testumgebung um eine Kopie der produktiven Umgebung, in der falls nötig sensi- ble Daten anonymisiert sind. Je nach Anwendungsfall sind auch mehrere Testumgebungen sinnvoll. Beispiels- weise müssen Programme für verschiedene Betriebssysteme, unterschiedliche Laufzeitumgebungen oder Internetbrowser getestet werden. 8 9 Zusammenfassend müssen folgende Bedingungen erfüllt sein, um erfolgreich Continuous Integration betreiben zu können. Programmcode wird zentral mit einem Versionskontrollsystem wie git verwaltet und ist für alle involvierten Entwickler zugänglich. Builds und Tests sind automati- siert. Testumgebungen sind der produktiven Umgebung weitestgehend nachemp- funden. Der Master-Branch ist immer lauffähig. 5.4 Nightly Build Bereits vor dem Einführen von Continuous Integration waren Entwicklern die Vor- teile von regelmäßig angestoßenen, automatisierten Builds, um Integrationsinter- valle zu verkürzen, bekannt und seien hier nicht wiederholend aufgelistet. Nightly Build beschreibt den Prozess, auf einem Build-Server zeitgesteuert, bei- spielsweise in Form eines Cronjobs, einen Build anzustoßen. 10 Da in der Regel nachts nicht an Code gearbeitet wird, findet der Build meistens nachts statt - daher der Name. Zwar gilt Nightly Build als Vorgänger von Continuous Integration, wird jedoch in der Praxis auch von Teams mit integriertem CI-Prozess verwendet. Seite 11
Im CI-Kontext dürfen Builds nicht zu lange dauern, damit für Entwickler keine War- tezeiten entstehen. Einen großen Zeitfaktor während eines Builds können Tests einnehmen und wie bereits erwähnt sollten so viele Testfälle wie möglich innerhalb des Builds durchgeführt werden. Da hier zwei Prinzipien der Continuous Integrati- on werden sich gegenseitig behindern, werden in der Praxis sehr zeit- und res- sourcenaufwendige Tests in einen Nightly Build ausgelagert. Ein weiterer Grund für die Verwendung von Nightly Builds trotz Continuous Inte- gration ist das Ausliefern von Programmversionen auf Testumgebungen. Auf Test- umgebungen könnten manuell Tests von Entwicklern, Kunden oder nicht fachli- chen Mitarbeitern. Da kann es von Vorteil sein, wenn das Programm auf der Test- umgebung tagsüber verfügbar ist und nicht mehrfach am Tag neu aufgespielt wird. Continuous Integration wird über sogenannte Runner-Tools oder Automationsser- ver, die im weiteren Verlauf vorgestellt werden, realisiert. Da diese Tools in der Regel auch zeitgesteuerte Builds unterstützen und im CI-Kontext Nightly Builds verwendet werden, werden in der Literatur teilweise Nightly Builds zu Continuous Integration- Prozessen gezählt, auch wenn das genau genommen nicht stimmt. Nightly Build bezeichnet einen Build der automatisiert zu einer bestimmten Uhrzeit läuft. Bei Continuous Integration stößt jeder Commit in dem Versionsverwaltungs- tool einen Build an. 5.5 Continuous Delivery Von Continuous Delivery spricht man, wenn anschließend an einen Continuous Integration Build automatisiert eine Auslieferung bzw. Produktivschaltung ange- stoßen wird. Nach einem erfolgreichen Build werden automatisch verschiedene Kontrollstruktu- ren angesprochen wie Kundenakzeptanztests. Nachdem von allen Instanzen die Produktivschaltung abgesegnet wurde, wird das Programm ausgeliefert. In der Literatur sind werden Continuous Integration und Continuous Delivery oft in einem Zusammenhang erwähnt als und mit CI/CD abgekürzt. In Kontext von DevOps-Teams, also der Zusammenführung von Entwicklung und Betrieb können die Grenzen zwischen Continuous Integration und Continuous De- livery fließend sein, denn bisherige Kontrollinstanzen werden ins Team integriert. 11 Im weiteren Verlauf wird nicht genauer auf spezifische Continuous Delivery Struk- turen eingegangen. Seite 12
6 Automation-Tools Es wurde bereits vorgestellt, wie Nightly Builds auf Build-Servern in Form eines zeitgesteuerten Cronjobs automatisiert werden. In diesem Kapitel wird erklärt, wie der Automationsprozess bei Continuous Integration tatsächlich implementiert wird. Zu Beginn ist ein Tool zwingend, dass folgende Bedingungen erfüllt. Das Tool benötigt Leseberechtigungen auf das verwendete Versionsverwaltungs- system. Weiter muss das Tool über Codeänderungen informiert werden. Außer- dem muss das auf Tool eine Reihe verschiedener Buildtools zugreifen können. Zudem benötigt ein Tool Schnittstellen zu den während des Builds aufgelösten Abhängigkeiten. Zuletzt sollte die Möglichkeit gegeben werden, Builds auf ver- schiedenen Testumgebungen auszuführen. Nicht zwingende, aber wünschenswerte Funktionalitäten sind Kommunikation zu Entwicklern, eine übersichtliche Benutzeroberfläche, Visualisierung der Builds und eine Benutzeradministration. In der weiteren Vorstellung verschiedener Automations-Tools wurde besonderer Fokus auf das Versionsverwaltungssystem git und den Schnittstellen zu dessen netzbasierten Diensten GitHub, GitLab und Bitbucket. Im folgenden werden verschiedene vorgestellt und an anhand folgender Kriterien verglichen. Implementierung eines Continuous Integration Projektes, Bereitstel- lung des Tools, unterstützte Sprachen, Buildtools und Versionsverwaltungssyste- men, Erweiterbarkeit, Wartung und Kosten. 6.1 Jenkins Ursprünglich wurde Jenkins unter dem Namen Hudson entwickelt. Nach einem Urheberstreit mit Oracle teilte sich das Projekt auf. Oracle entwickelte bis 2017 an Hudson. Jenkins, das zweite Projekt, aufbauend auf einem Fork, konnte sich am Markt durchsetzten. 12 Heute ist Jenkins einer der populärsten Automations-Server. Jenkins ist ein kos- tenfreies, open-source Programm. Alleine dadurch interessant für sowohl Hobby- programmierer als auch große IT-Unternehmen. Seite 13
6.1.1 Bereitstellung und Kosten Jenkins wird ausgeliefert als stand-alone Anwendung mit integriertem build-in Java Application-Server. Das hat zur Folge, dass die Jenkins WAR-File (Web applicati- on archive) auf jedem Betriebssystem oder jeder Plattform mit einer von Jenkins unterstützten Java-Version lauffähig ist. Aktuell werden Java 8 und Java 11 unter- stützt. Darüber hinaus stellt Jenkins explizit Support und Dokumentation für die Betriebssysteme Linux, macOS und Windows und die Plattformen Docker und Kubernetes bereit. 13 14 Als kostenfreies open-source Programm entstehen keine Beschaffungskosten. Es ist jedoch nicht außer Acht zu lassen, dass trotzdem Kosten bei der Bereitstel- lung der Laufzeitumgebung, Wartung, Pflege und Administration entstehen. 6.1.2 Versionsverwaltungssysteme Jenkins unterstützt das durch separate Plugins sowohl Bitbucket, GitHub als auch GitLab. Die Plugins Konfiguration der Plugins ist identisch. Für das Einbinden der Verwaltungssysteme wird ein User ein User benötigt, der Admin-Berechtigungen für das jeweilige Projekt besitzt. Hier empfiehlt sich nicht persönliche Zugangsdaten zu verwenden, sondern einen separaten User für Jenk- ins anzulegen und diesem für alle benötigten Projekte Berechtigungen zuzuwei- sen. 6.1.3 Sprachen und Buildtools Mit Jenkins werden keine Sprachen oder Buildtools ausgeliefert. Jenkins verwendet die Konsole des Servers auf dem das Tool läuft und kann dementsprechend alle Buildtools verwenden, die auf dem Server installiert wur- den. Es existiert eine große Zahl an Plugins, die in der Benutzeroberfläche das Arbeiten mit Buildtools erleichtern, zum Beispiel welche Maven-Version verwendet werden soll. Die Tools müssen jedoch trotzdem händisch bereitgestellt werden. 6.1.4 Anwendung Zum Verwenden von Jenkins als Build-Server wird in dem Repository des Projek- tes eine Groovy-Datei abgelegt. Der Name ist frei wählbar, empfohlen wird Jenk- insfile. Seite 14
Beispiel einer Jenkinsfile: pipeline { agent none options { skipStagesAfterUnstable() } stages { stage('Build') { steps { sh 'mvn -B -DskipTests clean package' } } stage('Test') { steps { sh 'mvn test' } } stage('Deliver') { steps { sh './jenkins/scripts/deliver.sh' } } } } Jenkins empfiehlt für Builds die Verwendung einer Pipeline. Pipelines bestehen aus Stages, die nacheinander abarbeitet werden und anschließend in der Jenkins- Oberfläche visualisiert werden. Das vorliegende Beispiel zeigt eine einfache Buildpipeline. agent none: Das Skript wird auf der lokalen Maschine ausgeführt. Hier kann alter- nativ auch ein Agent konfiguriert werden. Jenkins unterstützt ein Agent-Master-Konstrukt. In diesem Konstrukt existiert ein Master, der die Benutzeroberfläche und API-Endpoints bereitstellt. Agents stehen mit dem Master in Verbindung und der Master kann Aufgaben auf den Agents auf- teilen. In Kontext eines Builds kann dieser Mechanismus genutzt werden, um Last aufzuteilen oder Build auf spezifischen Zielumgebungen auszuführen. Weiter wurde im dem Beispiel eine Option skipStagesAfterUnstable definiert. Die- se Option bewirkt, dass falls ein Stage mit dem Status Unstable verlassen wird, keine weiteren Stages mehr aufgerufen werden. Ein Stage wird als Unstable mar- kiert, wenn sie nicht den Returncode 0 zurück gibt. In diesem Beispiel, wenn ein Maven Befehl nicht mit erfolgreich ist. In der ersten Stage Build wird ein Maven-Build ausgeführt und explicit die Phase Test übersprungen. Damit wird sichergestellt, dass diese Stage der Build nur fehl- schlägt bei einem Fehler während des Builds. In der nächsten Stage werden dann alle definierten Tests ausgeführt. Seite 15
Die letzte Stage deutet an, nach dem Build Software ausgeliefert werden könnte und so eine Continuous Integration Pipeline zu einer Continuous Delivery Pipeline wird. Nachdem eine solche Datei in dem Repository abgelegt ist, muss eine Pipeline in der Jenkinsoberfläche angelegt werden. In dieser Pipeline muss nun das Reposi- tory angegeben werden und der Pfad zu der Jenkinsfile. Anschließend muss nur noch der Trigger-Mechanismus ausgewählt werden. Für eine CI-Pipeline wird die Option „trigger build after push“ ausgewählt. Diese Option bewirkt, dass in dem Repository ein Webhook angelegt wird, durch den Jenkins informiert wird, wenn eine Codeänderung stattgefunden hat und diese Pipeline wird angestoßen. Möchte man zusätzlich zu einer solchen CI-Pipeline eine weitere Pipeline die zeit- lich gesteuert ist, wie für einen Nightly Build, muss lediglich eine weitere Jenkins- file angelegt werden, analog eine Pipeline erstellt werden und der Trigger-Mecha- nismus zu „Build periodically“ angepasst werden. 15 6.1.5 Skalierbarkeit Wie bereits erwähnt unterstützt Jenkins ein Master-Agent-Konstrukt und ist so stark skalierbar. Agents können dabei statisch oder dynamisch sein. Ein statischer Agent ist dabei dauerhaft erreichbar. Mit dynamischen Agents hingegen kann zu- sätzlich Bedarf ein Container in einer Containerplattform wie Kubernetes oder eine Virtuelle Maschine in einem Cloudservice wie AWS. Da Jenkins kostenfrei ist könnte zusätzlich ganze Jenkins Instanzen aufgebaut werden. 16 6.1.6 Wartung Jenkins ist ein Wartungsintensives Tool. Versionsupdates müssen eigenständig durchgeführt werden. Jenkins wird mit kaum Funktionalität ausgeliefert werden. Verwendete Plugins administriert werden. Außerdem müssen alle Benötigten Um- gebungen und Tools verwaltet werden. 6.1.7 Fazit Jenkins ist durch seine starke Erweiterbarkeit ein mächtiges Tool und kann als vollwertiger Automationsserver ein breites Spektrum an Anwendungsfällen abde- cken, die weit über die Funktionalität eines klassischen Build-Servers hinaus ge- hen. Ein weiteres Argument für das Tool ist, dass es kostenfrei ist. Andererseits ist die initiale Konfiguration, Administration und Wartung des Systems zeitintensiv und Testumgebungen müssen bereitgestellt werden. Seite 16
6.2 Travis CI Travis CI ist eine Webanwendung, die Continuous Integration für in Github liegen- de Projekte bereitstellt. Besonders an diesem Tool ist, das Travis CI für jeden Build eine separate Virtuelle Maschine hochfährt und so ein breitest Spektrum an Lauf- zeitumgebungen für verschiedene Anwendungsfälle von Haus aus bereitstellen kann. 6.2.1 Bereitstellung und Kosten Travis CI ist für open-source Projekte kostenfrei verwendbar unter der Webseite travis-ci.org. Für private Projekte muss die Webpage travis-ci.com verwendet wer- den. Zusätzlich existiert die Möglichkeit Travis CI Enterprise zu verwenden. Hier wird die Anwendung auf der eigenen Infrastructure gehostet. Travis CI Enterprise ermöglicht die Integration zu GitHub Enterprise, der self-hostet Enterprise-Version von GitHub. Nur durch Vorhandensein von Travis CI Enterprise und GitHub Enter- prise ist es möglich, dass sich Code ausschließlich auf der eigenen Infrastruktur befindet. Die kostenlose Verwendung über travis-ci.org wurde November 2020 abgekündigt. Ein Termin für die Abschaltung des Systems ist noch nicht bekannt. 17 6.2.2 Versionsverwaltungssysteme Aktuell unterstützt Travis CI Continuous Integration ausschließlich Projekte die von GitHub verwalten werden. Die Integration zu Bitbucket und Gitlab befindet sich ak- tuell in der beta-Entwicklungsphase. 6.2.3 Sprachen und Buildtools Die von Travis CI bereitgestellten virtuellen Maschinen unterstützen die Betriebs- systeme Linux, MacOS und Windows. Weiter stehen Laufzeitumgebungen und die sprachspezifischen Standard-Buildtools zu folgenden Sprachen bereit: C, C++, C#, Clojure, Crystal, D, Dart, Elixir, Erlang, F#, Go, Groovy, Haskell, Haxe, Java, JavaScript, Julia, Objective-C, Perl, PHP, Python, R, Ruby, Rust, Scala, Smalltalk, Swift und Visual Basic. 18 19 Anhang befindet sich eine default Konfiguration einer bereitgestellten virtuellen Maschine mit Linux Betriebssystem inklusive installierter Tools. Seite 17
Hervorzuheben ist, dass Travis CI zusätzlich Builds für Android- und iOS-Projekte ermöglicht. Außerdem werden zum Testen Webanwendungen verschiedene Web- browser bereitgestellt. 6.2.4 Anwendung Die Verwendung von Travis CI unterscheidet sich zwischen kostenfreien und kos- tenpflichtigen Versionen nicht. Zunächst wird ein GitHub-Account mit Besitzer-Be- rechtigungen für das gewünschte Repository benötigt. In der Travis CI Weboberfläche meldet man sich mit den GitHub Benutzerdaten an und kann nun für alle eigenen GitHub-Projekte Travis CI aktivieren. Durch das Ak- tivieren wird im GitHub-Projekt ein Webhook zu Travis CI angelegt, sodass Travis CI in Zukunft immer Informationen über Änderungen im Projekt erhält. In der Travis CI Oberfläche kann nun konfiguriert werden, ob Builds nach jedem Commit, nach jedem Merge und/oder nur händisch angestoßen werden. Bei angestoßenem Build sucht Travis CI nach einer YAML-Datei mit den Namen .travis.yml im Root-Verzeichnis des Projektes. Die .travis.yml -Datei für ein Maven Projekt kann beispielsweise so aussehen: os: linux language: java jdk: - oraclejdk8 - oraclejdk9 - openjdk8 Für jeden Build stellt Travis CI eine virtuelle Maschine bereit. Mit dem os-Tag wird definiert, welches Betriebssystem die virtuelle Maschine benutzt. Das language-Tag definiert in welcher Sprache das Projekt geschrieben ist. Für Java unterstützt Travis CI Gradle, Maven und Ant und sucht nun im Projekt Code nach zugehörigen Konfigurationsdateien. Im Falle eines Maven Projektes wird die pom.xml gefunden und Travis CI weiß, das es sich um ein Maven Projekt handelt. Mit dem jdk-Tag können die Java Development Kit Versionen ausgewählt werden, für die ein Build durchgeführt werden soll. Da im Beispiel drei Versionen angege- ben werden, werden auch drei Builds mit jeweils einer separaten virtuellen Ma- schine. Da hier nicht weiter definiert werden für den Build folgende Maven-Befehle ausge- führt. Zunächst wird „mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V“ ausgeführt. Seite 18
Dieser Befehl baut das Programm, führt jedoch keine Tests durch und generiert keine Javadoc-Dateien. Anschließend werden die Testfälle durchlaufen durch den Befehl „mvn test -B“. Status und Ergebnis des Builds können jetzt in der Travis CI Oberfläche eingese- hen werden. Bei Builds, die von einem neuen Commit angestoßen werden, sind diese Informationen von GitHub aus nicht einsehbar. Bei Pullrequests hingegen wird im Conversations-Reiter des Pullrequests der ak- tuelle Status des Builds dargestellt. Daraus folgt, dass Teams sinnvoller Weise, Änderungen auf den Master-Branch ausschließlich über Pullrequest auszurollen. 20 6.2.5 Skalierbarkeit Bedingt durch die Tatsache, das für jeden Build eine eigene virtuelle Maschine verwendet wird, laufen Builds und Tests parallel. Beim Verwenden der Travis CI Infrastruktur hängt die Menge der möglichen parallelen Builds gekoppelt an den verwendeten Tarif. Eine explizite Obergrenze wird nicht angegeben. Beim Verwenden von Travis CI Enterprise ist die Skalierbarkeit begrenzt durch die eigene Infrastruktur. 6.2.6 Wartung Beim Verwenden der Travis CI Infrastrukturen über die Webseiten travis-ci.org oder travis-ci.com fallen keine Wartungsarbeiten an. Die Wartungsarbeit beim Verwenden von Travis CI Enterprise wurden im Rahmen dieser Arbeit nicht untersucht. 6.2.7 Fazit Travis CI besticht vor allem durch seine einfache Handhabung. Das Einbinden ei- nes Testprojektes in einen vollwertigen Continuous Integration Prozess hat wenige Minuten benötigt. Außerdem ist die breite Unterstützung für Sprachen und Tools hervorzuheben. Zusätzlich fallen keine keine Wartungsarbeiten an. Im Rahmen dieser Arbeit wurde die kostenfreie Version verwendet. Hier sind hohe Wartezeiten bei der Initialisierung der virtuellen Maschinen aufgetreten. Inwieweit dies auch für kostenpflichtige Versionen gilt, wurde nicht weiter untersucht. Negativ zu erwähnen ist, das aktuell nur GitHub unterstützt wird. Außerdem ist der Informationsaustausch zwischen Travis CI und GitHub ausbaufähig. Zum einen sind ausführliche Buildinformationen nur unter Travis CI einsehbar, Sourcecode Seite 19
hingegen nur über GitHub. Zusätzlich werden zwingend Owner-Berechtigungen benötigt, um in Travis CI Buildinformationen einsehen zu können. 6.3 GitLab CI/CD 6.3.1 Bereitstellung und Kosten GitLab CI/CD ist ein in Gitlab eingebautes Continuous Integration Tool. Wenn be- reits Gitlab als Verwaltungstool verwendet wird entfällt damit die Bereitstellung ei- nes weiteren Tools. Gitlab kann auf der eigenen Infrastruktur kostenlos in der Community Edition ver- wendet werden oder mit zusätzlichem Funktionen und Support kostenpflichtig als Enterprise Edition. Zusätzlich kann GitLab unter der Webadresse gitlab.com verwendet werden. Alle Varianten unterstützten das Tool GitLab CI/CD. 21 Mit dem Tool definierten Builds werden nicht auf dem GitLab Server selbst, son- dern auf extra bereitgestellten leichtgewichtigen Agents, den sogenannten Run- nern ausgeführt. Projekte, die die GitLab Webadresse verwenden, können bereitgestellte Runner verwenden. Für alle anderen Anwendungsfälle muss mindestens ein Runner kon- figuriert werden. 22 6.3.2 Versionsverwaltungssysteme Da das Tool in GitLab integriert ist, wird als Versionsverwaltungssystem aus- schließlich GitLab unterstützt. 6.3.3 Sprachen und Buildtools Es können alle Sprachen und Buildtools verwendet werden, die dem verwendeten Runner zur Verfügung stehen. 6.3.4 Anwendung Um für ein GitLab-Projekt eine Continuous Integration Pipeline zu implementieren, muss lediglich eine YAML-Datei namens .gitlab-ci.yml. Ab diesem Moment wird nach jedem Commit oder Pullrequest eine in der Datei konfigurierten Pipeline an- gestoßen. Seite 20
Eine einfache Pipeline für den Build eines Maven-Projektes kann so aussehen: image: maven:latest build: stage: build script: - mvn install -DskipTests=true test: stage: test script: - mvn test Das zugehörige Projekt liegt verwendet die GitLab Infrastruktur unter gitlab.com und verwendet einen in dieser Umgebung bereitgestellten GitLab Runner. Diese Runner verfügen nicht über viele vorinstallierte Tools. GitLab empfiehlt zur Bereitstellung von Tools die Verwendung von Images des Containertools Docker. Mit dem ersten Befehl image: maven:latest lädt der Runner ein Image mit der ak- tuellen Maven-Version runter. Die anschließenden Builds finden innerhalb dieses Images statt. Die Pipeline ist in die beiden Stages build und test aufgeteilt. Die Funktionalität der Skripte wurde bereits erläutert. Im Anhang befindet sich ein Bildschirmfoto, dass die Integration des Tools in die Weboberfläche zeigt (siehe GitLab CI/CD WebUI). 23 6.3.5 Skalierbarkeit Gitlab CI/CD ist durch das Verwenden von Runnern gut skalierbar. Runner können analog zu Jenkins Agents statisch oder dynamisch sein (siehe Jenkins/Skalierbar- keit). 24 GitLab stellt Dokumentation zum Aufbau von Runnern in den gängigen Betriebs- systemen bereit. Hervorzuheben ist hier die Cloudkompatibilität durch das Contai- ner-Orchestrierungstool Kubernetes. 25 6.3.6 Wartung Potentiell anfallende Wartungsarbeiten sind überschaubar. Beim Verwenden der Infrastruktur GitLabs fallen nur Arbeiten, wenn ein eigener Runner verwendet wird. Seite 21
Da GitLab CI/CD in GitLab integriert ist, deckt die bisherige Pflege von GitLab auch das CI-Tool ab. Auch hier gilt, dass nur die Instandhaltung der Runner als Mehraufwand auftreten. 6.3.7 Fazit GitLab CI/CD ist ein vielseitig einsetzbares Tool für Continuous Integration und De- livery. Es ist einerseits durch die Verwendung selbstdefinierter Runner, ähnlich wie bei der Verwendung von Jenkins-Agents, für jeden Anwendungsfall konfigurierbar. Hat jedoch den Vorteil, dass das Benutzer-Oberfläche in GitLab integriert ist. Damit sind zum einen alle Informationen bzgl. Code und Buildstatus für den Entwickler innerhalb einer Weboberfläche einsehbar. Zum anderen muss, um Continuous In- tegration verwenden zu können, kein weiteres Tool neben dem Versionskontroll- tool bereitgestellt und gepflegt werden. Seite 22
7 Schlusswort Continuous Integration gilt heute nicht ohne Grund als Best Practice. Zur Verwendung von Continuous Integration in einem Team oder einem Unter- nehmen, ist initial die Umstellung gewohnter Prozesse und Arbeitsstrukturen nötig. Gegebenenfalls muss der Build-Prozess mit einem Buildtool formalisiert und zuvor händisch durchgeführte Tests automatisiert werden. Hinzu kommt das Bereitstellen eines Automationstool und dessen Konfiguration. Dieser Prozess kann von einem einmaligen Erstellen und Konfigurieren eines Kontos auf einer Webseite bis zum Aufbau einer ganzen Infrastruktur mit Schnitt- stellen zu Kubernetes-Clustern in Cloud-Umgebungen reichen, für dessen War- tung und Administration ganze Teams zuständig sind. Trotz hohem initialen Zeit- und Kostenaufwand, langfristig bringt die Continuous Integration einem Projekt Mehrwert. CI fördert das Modularisieren von Projekten. Durch die permanente Integration von Codeänderungen in das Programm ist, bekommt der Entwickler direktes Feedback. Durch kleine Codeänderung werden Fehlerquellen eingegrenzt und das Analysieren und Beheben von Fehlern beschleunigt. Außerdem erleichtern viele kleine Änderungen das Zusammenführen unterschied- licher Entwicklungsstände und die Dokumentation von Änderungen wird klein- schrittig und somit nachvollziehbarer. Weiter steht stets eine aktuelle und lauffähige Version des Programmes zur verfü- gung. Seite 23
8 Anhang 8.1 Default Configuration einer Travis CI VM Server: Engine: Version: 18.06.0-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: 0ffa825 Built: Wed Jul 18 19:09:05 2018 OS/Arch: linux/amd64 Experimental: false [34m[1mclang version[0m clang version 7.0.0 (tags/RELEASE_700/final) [34m[1mjq version[0m jq-1.5 [34m[1mbats version[0m Bats 0.4.0 [34m[1mshellcheck version[0m 0.7.0 [34m[1mshfmt version[0m v2.6.3 [34m[1mccache version[0m 3.2.4 [34m[1mcmake version[0m cmake version 3.12.4 [34m[1mheroku version[0m heroku/7.42.1 linux-x64 node-v12.16.2 [34m[1mimagemagick version[0m Version: ImageMagick 6.8.9-9 Q16 x86_64 2019-11-12 http://www.imagemagick.org [34m[1mmd5deep version[0m 4.4 [34m[1mmercurial version[0m version 4.8 [34m[1mmysql version[0m mysql Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using EditLine wrapper [34m[1mopenssl version[0m OpenSSL 1.0.2g 1 Mar 2016 [34m[1mpacker version[0m 1.3.3 [34m[1mpostgresql client version[0m psql (PostgreSQL) 10.13 (Ubuntu 10.13-1.pgdg16.04+1) [34m[1mragel version[0m Ragel State Machine Compiler version 6.8 Feb 2013 [34m[1msudo version[0m 1.8.16 [34m[1mgzip version[0m gzip 1.6 [34m[1mzip version[0m Zip 3.0 [34m[1mvim version[0m VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Mar 18 2020 14:06:17) [34m[1miptables version[0m iptables v1.6.0 [34m[1mcurl version[0m curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 li- brtmp/2.3 [34m[1mwget version[0m GNU Wget 1.17.1 built on linux-gnu. [34m[1mrsync version[0m Seite 24
rsync version 3.1.1 protocol version 31 [34m[1mgimme version[0m v1.5.4 [34m[1mnvm version[0m 0.35.3 [34m[1mperlbrew version[0m /home/travis/perl5/perlbrew/bin/perlbrew - App::perlbrew/0.88 [34m[1mphpenv version[0m rbenv 1.1.2-30-gc879cb0 [34m[1mrvm version[0m rvm 1.29.10 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io] [34m[1mdefault ruby version[0m ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux] [34m[1mCouchDB version[0m couchdb 1.6.1 [34m[1mElasticSearch version[0m 5.5.0 [34m[1mInstalled Firefox version[0m firefox 63.0.1 [34m[1mMongoDB version[0m MongoDB 4.0.19 [34m[1mPhantomJS version[0m 2.1.1 [34m[1mPre-installed PostgreSQL versions[0m 9.4.26 9.5.22 9.6.18 [34m[1mRedis version[0m redis-server 6.0.5 [34m[1mPre-installed Go versions[0m 1.11.1 [34m[1mant version[0m Apache Ant(TM) version 1.9.6 compiled on July 20 2018 [34m[1mmvn version[0m Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) [34m[1mgradle version[0m Gradle 5.1.1! [34m[1mlein version[0m Leiningen 2.9.3 on Java 11.0.2 OpenJDK 64-Bit Server VM [34m[1mPre-installed Node.js versions[0m v10.21.0 v11.0.0 v12.18.1 v4.9.1 v6.17.1 v8.12.0 v8.17.0 v8.9 [34m[1mphpenv versions[0m system 5.6 5.6.40 7.1 7.1.27 7.2 * 7.2.15 (set by /home/travis/.phpenv/version) hhvm hhvm-stable [34m[1mcomposer --version[0m Composer version 1.8.4 2019-02-11 10:52:10 [34m[1mPre-installed Ruby versions[0m ruby-2.3.8 ruby-2.4.5 ruby-2.5.3 Seite 25
8.2 Pullrequest Message mit TravisCI 8.3 GitLab CI/CD WebUI Seite 26
9 Quellen 1 vgl. Agile Sofwareentwicklung. https://de.wikipedia.org/wiki/Agile_Softwareentwicklung (Stand 5.12.2020) 2 vgl. Lukas Körfer - CI/CD & Build-Tools - was ist das eigentlich?. https://www.it-ta- lents.de/blog/it-talents/alles-ueber-den-build-prozess (Stand 4.12.2020) 3vgl. Sachin Patil - What is a Makefile and how does it work?. https://opensource.com/ article/18/8/what-how-makefile (Stand 1.12.2020) 4 vgl. Introduction to the Build Lifecycle. https://maven.apache.org/guides/introduction/ introduction-to-the-lifecycle.html (Stand 1.12.2020) 5 vgl. Gradle. https://de.wikipedia.org/wiki/Gradle (Stand 4.12.2020) 6 Kontinuierliche Integration. https://de.wikipedia.org/wiki/Kontinuierliche_Integration (Stand 1.12.2020) 7vgl. Extreme Programming. https://de.wikipedia.org/wiki/Extreme_Programming (Stand 10.12.2020) 8vgl.Kontinuierliche Integration. https://de.wikipedia.org/wiki/Kontinuierliche_Integration (Stand 1.12.2020) 9 vgl. Continuous Integration https://www.ionos.de/digitalguide/websites/web-entwick- lung/continuous-integration/ (Stand 1.12.2020) 10 vgl. Nightly Build https://de.wikipedia.org/wiki/Nightly_Build (Stand 2.12.2020) 11 vgl. il1411 - Was ist DevOps?. https://www.dev-insider.de/was-ist-devops-a-570286/ 12vgl. Jenkins (Software). https://de.wikipedia.org/wiki/Jenkins_(Software) Stand(8.12.2020) 13vgl. Jenkins (Software). https://de.wikipedia.org/wiki/Jenkins_(Software) (Stand 8.12.2020) 14 vgl. Installing Jenkins. https://www.jenkins.io/doc/book/installing/ (Stand 8.12.2020) 15vgl. Build a Java app with Maven. https://www.jenkins.io/doc/tutorials/build-a-java- app-with-maven/ (Stand 8.12.2020) 16vgl. Using Agents. https://www.jenkins.io/doc/book/using/using-agents/ (Stand 8.12.2020) 17 vgl. Travis CI. https://en.wikipedia.org/wiki/Travis_CI (Stand 14.12.2020) 18 vgl. https://docs.travis-ci.com (Stand 6.12.2020) 19 vgl. Apps, Clients and Tools. https://docs.travis-ci.com/user/apps/ (Stand 6.12.2020) 20vgl. Building a Java project. https://docs.travis-ci.com/user/languages/java/ (Stand 6.12.2020) 21 vgl. GitLab. https://de.wikipedia.org/wiki/GitLab (Stand 6.12.2020) 22vgl. Configuring runners in GitLab. https://docs.gitlab.com/ee/ci/runners/README.html (Stand 6.12.2020) Seite 27
23vgl. How to deploy Maven projects to Artifactory with GitLab CI/CD. https://docs.gitla- b.com/ee/ci/examples/artifactory_and_gitlab/ (Stand 6.12.2020) vgl. Configuring runners in GitLab. https://git.fh-aachen.de/help/ci/runners/READ- 24 ME.md (Stand 6.12.2020) 25 Kubernetes. https://de.wikipedia.org/wiki/Kubernetes (Stand 6.12.2020) Seite 28
Sie können auch lesen