So verschieben Sie Jenkins von einem PC auf einen anderen

154

Ich verwende derzeit Jenkins auf meinem Entwicklungs-PC. Ich habe es auf meinem Entwicklungs-PC installiert, da ich nur begrenzte Kenntnisse über dieses Tool hatte. Also habe ich es in meinem Entwicklungs-PC getestet. Jetzt fühle ich mich mit Jenkins als meinem langfristigen "Partner" im Erstellungsprozess wohl und möchte diese Jenkins auf einen dedizierten Server "verschieben".

Vorher habe ich nur wenige Builds durchgeführt und die Artefakte von jedem Build archiviert. Insbesondere die Build-Nummer ist mir für die Versionskontrolle sehr wichtig.

Wie kann ich alle Jenkins-Informationen von meinem aktuellen PC auf meinen neuen Server exportieren?

huahsin68
quelle
6
Ich habe das gerade gemacht. Ich folgte den Schritten von Cédric Juliens Antwort, stellte jedoch fest, dass ich unter Windows eine Reparaturinstallation ausführen musste, bevor Jenkins nach dem Umzug erfolgreich gestartet werden konnte. Nach der Reparatur ist alles in Ordnung.
Smurph269

Antworten:

175

Wenn Sie dem Jenkins-Wiki folgen , müssen Sie:

  • Installieren Sie eine neue Jenkins-Instanz auf dem neuen Server
  • Stellen Sie sicher, dass die alte und die neue Jenkins-Instanz gestoppt sind
  • Archivieren Sie den gesamten Inhalt von JENKINS_HOME der alten Jenkins-Instanz
  • Extrahieren Sie das Archiv in das neue Verzeichnis JENKINS_HOME
  • Starten Sie die neue Jenkins-Instanz
  • Vergessen Sie nicht, die Dokumentation / Links zu Ihrer neuen Instanz von Jenkins zu ändern :)
  • Vergessen Sie nicht, den Besitzer der neuen Jenkins-Dateien zu ändern: chown -R jenkins:jenkins $JENKINS_HOME

JENKINS_HOME befindet sich standardmäßig in ~/.jenkinseiner Linux-Installation. Um jedoch genau zu ermitteln, wo es sich befindet, rufen Sie die Seite http: // your_jenkins_url / configure auf und überprüfen Sie den Wert des ersten Parameters : Home directory; Dies ist das JENKINS_HOME.

Cédric Julien
quelle
1
Wenn ich meine neuen Jenkins gestartet habe, werden meine Knoten angezeigt, was korrekt ist. Aber wenn ich auf einen Knoten geklickt habe, zeigen die dortigen URLs auf alte Jenkins wie folgt: Von der Slave-Befehlszeile ausführen: Javaws Old-Jenkins-Server: 8080 / Computer / SlaveMachine1 / Slave-Agent.jnlp Oder wenn der Slave kopflos ist: Java -jar Slave.jar -jnlpUrl alter-Jenkins-Server: 8080 / Computer / SlaveMachine1 / Slave-Agent.jnlp Wie soll ich diese URLs für jeden Knoten so erstellen, dass er auf New -Jenkins-Server verweist ?
Merlachandra
13
Ich habe die Lösung für mein Problem erhalten, die in meinem vorherigen Kommentar erwähnt wurde: Gehe zu Jenkins verwalten> System konfigurieren. Ändern Sie hier im Abschnitt "Jenkins-Speicherort" im Feld "Jenkins-URL" die URL, um sie auf einen neuen Jenkins-Server zu verweisen.
Merlachandra
3
Stellen Sie sicher, dass Sie auch die versteckten Ordner kopieren!
Mohi
7
haha +1 für "Vergessen Sie nicht, die Dokumentation / Links zu Ihrer neuen Instanz von Jenkins zu ändern"
Iain Smith
2
Ich hatte Probleme mit den korrekten Dateiberechtigungen und dem Besitz. Um dieses
Problem
53

Wenn Ihr JENKINS_HOME-Verzeichnis zum Kopieren zu groß ist und Sie nur dieselben Jobs, Jenkins-Plugins und Jenkins-Konfigurationen einrichten müssen (und keine alten Job-Artefakte und -Berichte benötigen), können Sie das ThinBackup-Plugin verwenden :

  1. Installieren Sie ThinBackup sowohl auf dem Quell- als auch auf dem Ziel-Jenkins-Server
  2. Konfigurieren Sie das Sicherungsverzeichnis auf beiden (unter Jenkins verwalten -> ThinBackup -> Einstellungen)

  3. Gehen Sie auf Sourse Jenkins zu ThinBackup -> Backup Now

  4. Kopieren Sie aus dem Jenkins Source Backup-Verzeichnis in das Jenkins Target Backup-Verzeichnis
  5. Gehen Sie auf Ziel-Jenkins zu ThinBackup -> Wiederherstellen und starten Sie den Jenkins-Dienst neu.
  6. Wenn einige Plugins oder Jobs fehlen, kopieren Sie den Sicherungsinhalt direkt in das Ziel JENKINS_HOME.

  7. Wenn Sie eine Benutzerauthentifizierung für die Quell-Jenkins hatten und jetzt für die Ziel-Jenkins gesperrt sind, bearbeiten Sie die Jenkins-Datei config.xml, setzen Sie sie <useSecurity>auf false und starten Sie Jenkins neu.

Noam Manos
quelle
2
Warum sollte das Verzeichnis JENKINS_HOME jemals zu groß zum Kopieren sein? Über welche Größen sprechen wir?
Wotanii
9
Mein jenkins_home ist 100 GB oder so, ich möchte das nicht auf einen neuen Server kopieren, da es meistens
weggeworfen wird
3
Mein Jenkins_home ist ~ 4 TB groß, daher ist eine dünne Kopie, die nur die Konfiguration und keinen der Build-Historien oder / usercontent enthält, nützlich.
VolleyJosh
Genial, Plugins ... Wirklich viel Zeit gespart ...
Hunderte
11

Dies funktionierte für mich, um von Ubuntu 12.04 (Jenkins Version 1.628) zu Ubuntu 16.04 (Jenkins Version 1.651.2) zu wechseln. Ich habe Jenkins zuerst aus den Repositories installiert .

  1. Stoppen Sie beide Jenkins-Server
  2. Kopieren Sie JENKINS_HOME(z. B. / var / lib / jenkins) vom alten Server auf den neuen. Von einer Konsole auf dem neuen Server:

    rsync -av username@old-server-IP:/var/lib/jenkins/ /var/lib/jenkins/

  3. Starten Sie Ihren neuen Jenkins-Server

Das brauchst du vielleicht nicht, aber ich musste

  • Manage Jenkinsund Reload Configuration from Disk.
  • Trennen Sie alle Slaves und verbinden Sie sie erneut.
  • Überprüfen Sie, ob in der Configure System > Jenkins Location, die Jenkins URLkorrekt mit dem neuen Jenkins - Server zugewiesen wird.
Katu
quelle
Hatten die neuen Jenkins die gleiche Version wie die alten?
Jakub Czaplicki
@JakubCzaplicki - Beide Jenkins waren 1.6, aber nicht genau die gleiche Version. Antwort aktualisiert. Ich habe dann Ubuntu 16.04 auf Jenkins 2.6 aktualisiert und die Datei jenkins.war ersetzt, und es hat gut funktioniert. stackoverflow.com/questions/11062335/…
Katu
Nachdem ich das oben genannte getan und besucht /configureSecurityhabe, bekomme ichjava.lang.AssertionError: InstanceIdentity is missing its singleton
maxisme
@maxisme, spät, aber dieser Thread legt nahe, dass das von Ihnen erwähnte Problem mit der Java-Version zusammenhängt. Issues.jenkins-ci.org/browse/JENKINS-46182
Katu
1

Jenkins Server Automation:

Schritt 1:

Richten Sie ein Repository ein, um die Jenkins-Startseite (Jobs, Konfigurationen, Plugins usw.) in einem lokalen GitLab-Repository oder in einem privaten GitHub-Repository zu speichern, und halten Sie es regelmäßig auf dem neuesten Stand, indem Sie neue Änderungen an Jenkins-Jobs, Plugins usw. vornehmen.

Schritt 2:

Konfigurieren Sie eine Puppet -Hostgruppe / -Rolle für Jenkins, mit der neue Jenkins-Server hochgefahren werden können. Führen Sie die gesamte Grundkonfiguration in einem Puppet-Rezept durch und stellen Sie sicher, dass die neueste Version von Jenkins installiert und ein separates Verzeichnis / Mount für eingerichtet wird JENKINS_HOME.

Schritt 3:

Drehen Sie eine neue Maschine mit der obigen Jenkins-Puppenkonfiguration hoch. Wenn alles installiert ist, holen / klonen Sie die Jenkins-Konfiguration aus dem Git-Repository in die Jenkins-Home-Direcotry und starten Sie Jenkins neu.

Schritt 4:

Gehen Sie zur Jenkins-URL, Jenkins verwaltenPlugins verwalten und aktualisieren Sie alle Plugins, für die ein Update erforderlich ist.

Getan

Sie können Docker Swarm oder Kubernetes verwenden, um die Slave-Knoten automatisch zu skalieren.

Ijaz Ahmad Khan
quelle
1

Manchmal haben wir möglicherweise keinen Zugriff auf einen Jenkins-Computer, um einen Ordner direkt in eine andere Jenkins-Instanz zu kopieren. Deshalb habe ich ein menügesteuertes Dienstprogramm geschrieben, das Jenkins-REST-API-Aufrufe verwendet, um Plugins und Jobs von einer Jenkins-Instanz zur anderen zu installieren.

Für die Plugin-Migration:

  1. GET request: Hier {SOURCE_JENKINS_SERVER}/pluginManager/api/json?depth=1erhalten Sie eine Liste der Plugins, die mit ihrer Version installiert wurden.
  2. Sie können eine POST-Anfrage mit den folgenden Parametern senden, um diese Plugins zu installieren.

    final_url=`{DESTINATION_JENKINS_SERVER}/pluginManager/installNecessaryPlugins`
    
    data=`<jenkins><install plugin="{PLUGIN_NAME}@latest"/></jenkins>` (where, latest will fetch the latest version of the plugin_name)
    
    auth=`(destination_jenkins_username, destination_jenkins_password)`
    
    header=`{crumb_field:crumb_value,"Content-Type":"application/xml”}` (where crumb_field=Jenkins-Crumb and get crumb value using API call {DESTINATION_JENKINS_SERVER}/crumbIssuer/api/json
    

Für die Jobmigration:

  1. Sie können die Liste der auf {SOURCE_JENKINS_URL} installierten Jobs mit einem REST-Aufruf abrufen. {SOURCE_JENKINS_URL}/view/All/api/json
  2. Anschließend können Sie jede Datei config.xml aus den Jobs unter {SOURCE_JENKINS_URL} unter Verwendung der Job-URL abrufen {SOURCE_JENKINS_URL}/job/{JOB_NAME}.
  3. Verwenden Sie diese Datei config.xml, um den Inhalt der XML-Datei auf {DESTINATION_JENKINS_URL} zu POSTEN. Dadurch wird ein Job auf {DESTINATION_JENKINS_URL} erstellt.

Ich habe in Python ein menügesteuertes Dienstprogramm erstellt, das den Benutzer auffordert, das Plugin oder die Jenkins-Migration zu starten, und dazu Jenkins REST-API-Aufrufe verwendet.

Sie können die JenkinsMigration.docx von dieser URL aus referenzieren

psalvi21
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link- Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Vich