Aktualisiert am: 13. Februar 2025
16 Minuten Lesezeit
In diesem Schritt-für-Schritt-Leitfaden erfährst du, warum und wie du ganz einfach von Jenkins zu GitLab migrieren kannst.
GitLab ist die umfassendste KI-gestützte DevSecOps-Plattform. Das bedeutet, dass GitLab alles bietet, was du benötigst, um sichere Software schneller zu planen, zu entwickeln und bereitzustellen – alles in einem Tool.
Plattformen vereinfachen die Integration verschiedener Tools (DIY-DevOps), um den Software-Entwicklungsprozess (SDLC) zu unterstützen. Da Jenkins keine Plattform ist, sind zusätzliche Tools erforderlich, um den Software-Entwicklungsprozess zu vervollständigen. Dieser DIY-DevOps-Ansatz erhöht die Komplexität der Toolchain, was die folgenden Nachteile mit sich bringt:
Aus diesen Gründen erwägen viele Jenkins-Teams, zu einer DevSecOps-Plattform zu migrieren. Wer nach einer leistungsfähigeren, zuverlässigeren und sichereren Lösung sucht, sollte GitLab wählen! GitLab ist kostenlos für Einsteiger(innen) und bietet verschiedene Abonnementstufen, je nachdem, welche Anforderungen dein Unternehmen hat. Weitere Informationen zu unseren Angeboten und Funktionen findest du auf unserer Preisseite.
In diesem Blog erfährst du:
Bevor du eine Migration von einem anderen Tool zu GitLab CI/CD startest, solltest du zunächst einen Migrationsplan erstellen. Ein Migrationsplan ist ein wichtiger technischer Schritt, um Erwartungen festzulegen. CI/CD-Tools unterscheiden sich im Hinblick auf ihren Ansatz und Aufbau sowie ihre technischen Besonderheiten. Das bedeutet, dass Migrationen keine simplen, direkten Zuordnungen von Daten sind. Ein Migrationsplan bietet folgende Vorteile:
Mit einem Migrationsplan kannst du einen Prozess einrichten, bei dem du mit minimalen Unterbrechungen langsam zu GitLab migrieren kannst. Dies kann bedeuten, dass Jenkins und GitLab parallel eingesetzt werden, während bestimmte Projekte zu GitLab verschoben und von Jenkins abgezogen werden.
Der Migrationsplan sollte einen effektiven Change-Management-Prozess definieren. Entwicklungs- und IT Operations-Teams, Cloud-Administrator(inn)en sowie Sicherheits- und Qualitätsteams haben möglicherweise keine Erfahrung mit GitLab und sie wissen möglicherweise nicht, warum du oder deine Führungskraft sich entschieden haben, diesen Weg einzuschlagen.
Wer von den Veränderungen betroffen ist, muss Folgendes wissen:
Zu diesem Zweck solltest du die folgenden Schritte in Erwägung ziehen, um Veränderungen für diese funktionalen Rollen zu steuern:
Wenn du diese Elemente zu Beginn der Migration sicherstellst, stellst du die Weichen für ihren Erfolg.
Bevor du eine Migration durchführst, solltest du dir über deine Ziele im Klaren sein und wissen, wie du sie erreichen kannst. Einige Fragen, auf die du Antworten haben solltest, sind beispielsweise folgende:
Wenn du diese Fragen beantwortest, weißt du, wie du bei der Migration vorgehen solltest, wie lange sie dauert und wo du anfangen solltest. Wenn du einen Plan erstellt hast und dir die Erwartungen und möglichen Fallstricke bewusst sind, kannst du mit dem Migrationsprozess beginnen.
Sobald du einen Migrationsplan erstellt und alle Erwartungen an die Migration bedacht hast, kannst du mit der Einrichtung von GitLab beginnen. Hier sind einige empfohlene Voraussetzungen für die Migration:
Sobald du mit GitLab vertraut bist und eine Instanz konfiguriert hast, kannst du deinem Migrationsplan folgen und damit beginnen, Projekte von Jenkins zu GitLab zu verschieben. Stelle sicher, dass deine GitLab-Instanz mithilfe von bewährten Methoden für GitLab und gemäß Referenzarchitekturen (nur in englischer Sprache verfügbar) ordnungsgemäß eingerichtet wurde.
Einer der wichtigsten Nachteile von Jenkins ist, dass es keine Lösung für die Quellcodeverwaltung (SCM, Source Code Management) bietet. Wenn du Jenkins verwendest, muss dein Code in einer separaten SCM-Lösung gespeichert werden, auf die Jenkins Zugriff haben muss. Da GitLab über eine integrierte Quellcodeverwaltung verfügt, ermöglicht der Umstieg von Jenkins auch die Migration der zuvor genutzten SCM-Lösung. Dies verringert die Kosten zusätzlich.
GitLab bietet Tools, mit denen du dein Repository und seine Metadaten einfach zu GitLab verschieben kannst. Die folgenden Importer (nur in englischer Sprache verfügbar) unterstützen dich bei der Migration deiner Projekte zu GitLab:
Jeder Importer importiert unterschiedliche Daten aus einem Projekt. Lies die Dokumentation zum Import und zur Migration von Projekten (nur in englischer Sprache verfügbar), um mehr Informationen über die bereitgestellten Importer zu erhalten und zu erfahren, welche Daten zu GitLab migriert werden. Darüber hinaus kannst du den Import von Gruppen und Projekten automatisieren (nur in englischer Sprache verfügbar) und eine benutzerdefinierte Lösung erstellen, welche die Anforderungen deines Unternehmens noch besser erfüllt:
Mit unseren integrierten Importern kannst du Repositories ganz einfach zu GitLab migrieren. In diesem Beispiel erfährst du, wie du ein Repo zusammen mit seinen Ressourcen (nur in englischer Sprache verfügbar) (Tickets, Pull Requests, Meilensteine usw.) aus GitHub zu GitLab kopierst. Um ein Repository aus einem anderen GitHub zu GitLab zu migrieren, führe die folgenden Schritte aus:
1. Wähle oben in der linken Menüleiste Neu erstellen (+) aus. 2. Wähle im Abschnitt „In GitLab“ Neues Projekt/Repository aus. 3. Wähle Projekt importieren aus.
Nun sollte sich das importierte Projekt in deinem Arbeitsbereich befinden. Weitere Informationen über die Migration von GitHub zu GitLab findest du in diesem englischsprachigen Video:
Sobald du die Migration des Repositories abgeschlossen hast, kannst du deine Jenkins-Pipeline so einstellen, dass sie die Jenkins-Datei in GitLab nutzt. Lege dazu die Repository-URL für dein neu importiertes Projekt über das Jenkin-Pipeline-Konfigurationsmenü fest:
Dies ist nützlich für die anfängliche Repo-Migrationsphase und hilft dir dabei, sowohl Jenkins als auch GitLab parallel zu verwenden. So kannst du Dienstunterbrechungen vermeiden, während du die CI/CD-Funktionalität migrierst.
Darüber hinaus kannst du das GitLab-Jenkins-Plugin als Hilfestellung bei der Migration nutzen. Mit diesem Plugin kann GitLab den Status von Jenkins-Builds auslösen und abrufen.
Sobald du deine Repositories zu GitLab migriert hast, kannst du mit der Migration deiner Jenkins-Pipelines zu GitLab fortfahren. Dieser Prozess kann relativ simpel sein, du solltest dazu jedoch die Konzepte und die Syntax von Jenkins und GitLab verstehen.
Jenkins bietet zwei verschiedene Arten von Syntax für die Definition von Pipelines: Declarative und Scripted. Dieser Leitfaden behandelt die Migration von Pipelines des Typs Declarative, da diese am häufigsten vorkommen.
In diesem Tutorial wird eine Jenkins-Datei (Groovy) im Vergleich zu einer GitLab-CI/CD-Konfigurationsdatei (YAML) analysiert, die einen in Golang geschriebenen Microservice generiert, testet und bereitstellt. Anschließend werden die Pipeline in GitLab aktiviert und die Ergebnisse angezeigt. Die Pipeline wird:
Unten findest du die Pipeline-Definitionen aus Jenkins und GitLab sowie beschreibende Kommentare. Im Meow-Migrationsprojekt kannst du die Pipeline in Aktion sehen.
Schaue dir eine in Groovy geschriebene Jenkins-Datei an:
// Die höchste Ebene der Declarative-
// Pipeline.
pipeline {
// Definiert den zu verwendenden Standard-Agenten,
// sofern nicht explizit in einem Job
// definiert.
agent any
// Definiert die Staging-Phasen, die in
// numerischer Reihenfolge ausgeführt werden. Jede Staging-Phase
// führt nur einen Job aus.
stages {
// Definiert den Namen der Staging-Phase.
stage('build') {
// Definiert das Container-Image,
// das für diesen Job verwendet werden soll. Dies überschreibt
// die Standardeinstellung 'agent any'.
// Das Jenkins-Docker-Plugin
// muss konfiguriert sein, damit dies
// ausgeführt wird.
agent { docker 'golang:alpine' }
// Definiert die Abfolge von Schritten,
// die bei der Ausführung der Staging-Phase
// befolgt werden soll.
steps {
sh 'go build -o bin/meow-micro'
sh 'chmod +x bin/meow-micro'
}
// Die Schritte, die nach Abschluss der
// Staging-Phase ausgeführt werden sollen.
post {
always {
// Speichert die Artefakte der Staging-Phase,
// die zur Verwendung in einem anderen Job
// generiert wurden.
archiveArtifacts artifacts: 'bin/meow-micro'
onlyIfSuccessful: true
}
}
}
stage('test') {
agent { docker 'golang:alpine' }
steps {
sh 'go test .'
}
}
stage('deploy') {
// Definiert die Bedingungen,
// die zur Ausführung des Jobs
// erfüllt sein müssen. In diesem Fall wird der
// Bereitstellungs-Job nur auf dem
// Staging-Branch ausgeführt.
when {
branch 'staging'
}
steps {
echo 'Deploying meow-micro to staging'
// Verwendet das Artefakt, das in der
// Build-Staging-Phase gespeichert wurde.
sh './bin/meow-micro'
}
}
}
}
Schaue dir nun an, wie die gleiche Funktion in GitLab erstellt werden kann:
# Definiert das zu verwendende Standard-Image,
# sofern nicht explizit in einem Job
# angegeben.
default:
image: alpine:latest
# Definiert die Reihenfolge der auszuführenden Staging-Phasen.
# Jede Staging-Phase kann mehrere Jobs umfassen.
stages:
- build
- test
- deploy
# Definiert den Namen des Jobs.
create-binary:
# Definiert die Staging-Phase, in welcher der Job ausgeführt wird.
stage: build
# Definiert das Container-Image, das für
# diesen Job verwendet werden soll. Dies überschreibt die Standardeinstellung.
image: golang:alpine
# Definiert die Reihenfolge der Schritte,
# die bei der Ausführung des Jobs befolgt werden sollen.
script:
- go build -o bin/meow-micro
- chmod +x bin/meow-micro
# Speichert die Job-Artefakte, die zur
# Verwendung in einem anderen Job gespeichert wurden.
artifacts:
paths:
- bin/meow-micro
expire_in: 1 week
unit-tests:
stage: test
image: golang:alpine
script:
- go test .
# Definiert Befehle, die im Anschluss an den Job
# ausgeführt werden sollen.
after_script:
- echo "Tests Complete"
staging-deploy:
stage: deploy
# Definiert die Befehle, die vor dem
# eigentlichen Job ausgeführt werden sollen.
before_script:
- apk update
script:
- echo "Deploying meow-micro to staging environment"
- ./bin/meow-micro
# Definiert die Bedingungen, die zur
# Ausführung dieses Jobs erfüllt sein müssen. In
# diesem Fall wird der Bereitstellungs-Job der Staging-Phase nur
# auf dem Staging-Branch ausgeführt.
rules:
- if: $CI_COMMIT_BRANCH == 'staging'
# Erlaubt die Verwendung der Artefakte, die im
# Build-Job gespeichert wurden, in diesem Job.
artifacts:
paths:
- bin/meow-micro
Wie du vielleicht bemerkt hast, gibt es viele Gemeinsamkeiten zwischen Jenkins und GitLab im Hinblick auf die Syntax. Dies vereinfacht die Pipeline-Migration. Sieh dir die umfassende Liste der Funktions- und Konzeptvergleiche (nur in englischer Sprache verfügbar) zwischen den beiden Tools an.
Nun, da du verstehst, wie man Jenkins in GitLab abbildet, kannst du damit beginnen, eine Pipeline mit der gleichen Funktionalität in GitLab zu erstellen. Um CI/CD zu migrieren, kannst du die folgenden Schritte ausführen:
Sobald die Datei zusammengeführt wurde, wird die definierte Pipeline gestartet. Du kannst zu deinem Projekt zurückkehren und die Pipeline anzeigen (nur in englischer Sprache verfügbar), indem du sie auf der Seite deines Projekts Build > Pipelines auswählst. Da sie auf dem Main-Branch ausgeführt wurde, siehst du nur den Job create-binary sowie die „unit-test“ Jobs. Der Job staging-deploy wird nur auf dem Staging-Branch ausgeführt.
Bei der Erstellung eines Staging-Branches wird die folgende Pipeline gestartet.
Wenn du auf einen Job klickst, wird dessen Ausgabe angezeigt:
Du kannst sehen, wie das Artefakt im Job create-binary gespeichert und im Job staging-deploy verwendet wird. Und so einfach ist es, eine Pipeline von Jenkins zu GitLab zu migrieren!
Einige hilfreiche Überlegungen, die den Bereitstellungsprozess unserer Ansicht nach einfacher machen, sind folgende:
Versuche nicht, Aufgaben exakt als GitLab-Jobs zu replizieren. Nimm dir Zeit und schaue dir genauer an, was die aktuelle Pipeline bewirkt und welches Problem sie löst.
Einige Jenkins-Jobs sind möglicherweise zu komplex, um sofort zu GitLab migriert zu werden. Deshalb kann es von Vorteil sein, das GitLab-Jenkins-Plugin zu verwenden, um Jenkins-Pipelines zu starten und ihre Ergebnisse direkt in GitLab anzuzeigen. Auf diese Weise kannst du bestimmte Aktionen langsam zu GitLab migrieren, bis die gesamte Pipeline verschoben werden kann.
Implementiere Sicherheitsscanner und Codequalität (nur in englischer Sprache verfügbar) mithilfe von integrierten Vorlagen, die GitLab von Anfang an bereitstellt. So kannst du die Sicherheit im Vorfeld kontrollieren und die Gefahr eines Sicherheitsverstoßes verringern. Gestalte die CI/CD-Konfiguration nicht zu kompliziert und versuche nicht, alle Funktionsvorteile gleichzeitig zu nutzen. Modularisiere den Code und implementiere ihn in kleinen Iterationen.
Implementiere Funktionen zur Überwachung und Steuerung von Anfang an.
Bedenke, dass sich ein GitLab Runner (Go) möglicherweise anders verhält als ein Jenkins-Agent (Java). Die CPU-Auslastung und der Speicherverbrauch können unterschiedlich sein – achte darauf, sie im Laufe der Zeit miteinander zu vergleichen.
Ziehe in Erwägung, in automatische Skalierungsmechanismen zu investieren, und lege nicht benötigte Ressourcen am Wochenende oder außerhalb der Arbeitszeiten still.
Modernisiere die Anwendungsentwicklung, indem du deine Jobs containerisierst. Jenkins-Jobs laufen aktuell nicht in einem Container, sondern auf einem Jenkins-Agenten, der als VM ausgeführt wird.
Diese Liste ist nicht erschöpfend, stellt aber einen guten Ausgangspunkt für einige Überlegungen dar, die du beachten solltest. Wenn du zusätzliche Hilfe benötigst, bietet GitLab Professional Services an, um dich bei deiner Migration zu unterstützen.
Vielen Dank, dass du diesen Leitfaden gelesen hast! Ich hoffe, dass er dir dabei geholfen hat, besser zu verstehen, warum und wie du von Jenkins zu GitLab migrieren kannst. Noch nicht überzeugt? Melde dich für eine kostenlose Testversion von GitLab an und erkenne den Nutzen einer DevSecOps-Plattform!
Hier findest du einige englischsprachige Ressourcen mit weiteren Informationen zu GitLab, den Vorteilen einer DevSecOps-Plattform und der Migration aus Jenkins: