13 Stimmen

Kann ein Master-Jenkins Aufträge auf einem entfernten Jenkins ausführen?

Wir migrieren von CruiseControl.NET zu Jenkins, nur um mit einem Partner synchron zu sein, damit wir nicht zwei verschiedene CI-Skripte haben. Wir versuchen, Jenkins so einzurichten, dass es etwas Ähnliches tut wie CruiseControl, bei dem ein zentraler Server Projekte (Jobs in Jenkins) auf entfernten Build-Maschinen aufruft.

Wir haben mehrere Build-Maschinen zu einem einzigen Projekt zugeordnet, so dass, wenn wir das Projekt von der zentralen CI-Server bauen würde es die Projekte auf den Remote-CI-Servern aufrufen. Die entfernten CI-Server würden die Version vom zentralen CI-Server-Projekt abrufen.

In CruiseCruise Control haben wir ein Projekt eingerichtet, das eine forceBuild zu den entfernten Projekten. Die Projekte auf den Build-Maschinen verwendeten eine remoteProjectLabeller um die Versionsnummer abzurufen, so dass sie immer auf dem gleichen Stand sind.

So rufen Sie die Master-Build-Nummer ab:

<labeller type="remoteProjectLabeller">
  <project>MainProject</project>
  <serverUri>tcp://central-server:21234/CruiseManager.rem</serverUri>
</labeller>

Um die entfernten Projekte aufzurufen:

<forcebuild>
    <project>RemoteBuildMachineA</project>
    <serverUri>tcp://remote-server:21234/CruiseManager.rem</serverUri>
    <integrationStatus>Success</integrationStatus>
</forcebuild>

Bisher habe ich in Jenkins einen sekundären Server als Slave mit dem Java-Web-Start eingerichtet, aber ich weiß nicht, wie ich den Master-Jenkins haben würde, um die Projekte auf den Slaves einzurichten.

Kann ich Jenkins so einrichten, dass es Projekte (Jobs) auf Slaves aufruft?

Kann ich die Slaves dazu bringen, die Versionsnummer vom Master zu beziehen?

EDIT -

Lassen Sie mich noch einige Informationen hinzufügen.

  • Der Master- und der Remote-Build-Maschine-Slave laufen alle unter Windows.
  • Wir haben den zentralen Master CruiseControl die Remote-Projekte zur gleichen Zeit starten lassen, so dass sie gleichzeitig liefen, und würden gerne dasselbe mit Jenkins haben, wenn möglich.

10voto

skolima Punkte 30692

Jenkins hat das Konzept der Agenten bauen was vielleicht besser zu Ihrem Szenario passen könnte - es gibt einen Master, der den Build auslöst, und Slaves, die ihn durchführen. Ein Build kann dann auf einige Kategorien von Slaves beschränkt werden (z. B. wenn er von einer bestimmten Software abhängt, die nicht auf allen Agenten vorhanden ist). Alle Daten werden zentral vom Master verwaltet, und ich glaube, das ist es, was Sie zu erreichen versuchen.

5voto

sti Punkte 10993

In Jenkins ist es nicht möglich, einen Build auf einem Slave auszulösen, d.h. wo ein Build läuft, wird nicht von demjenigen kontrolliert, der ihn auslöst. Es wird durch die Einstellungen des Jobs selbst gesteuert. Jeder Job hat eine Einstellung namens "Restrict where this job can run".

In Ihrem Fall würden Sie wahrscheinlich zwei Jobs haben: A und B. A wäre auf die Ausführung auf "master" beschränkt und B wäre für die Ausführung auf "slavename" konfiguriert. Dann bräuchte A nur noch B auszulösen.

Aber Sie hatten weitere Einschränkungen: A und B sollen die gleiche Version aus der Versionskontrolle auschecken und A und B sollen parallel laufen. Es gibt viele Möglichkeiten, dies zu erreichen, aber die einfachste ist wahrscheinlich, einen Multikonfigurationsauftrag zu definieren.

Es gibt keine Möglichkeit, einen bestehenden Free-Style-Auftrag in einen Multikonfigurationsauftrag umzuwandeln, Sie müssen also einen neuen Auftrag erstellen.

  • Neuen Auftrag auswählen
  • Wählen Sie Neues Multi-Konfigurationsprojekt erstellen. Fügen Sie einen Namen hinzu.
  • Öffnen Sie unter Konfigurationsmatrix das Dropdown-Menü "Achse hinzufügen".
  • Sklaven auswählen
  • Kontrolle des Masters und des Slaves
  • Fügen Sie die SCM-Informationen und den/die Build-Schritt(e) hinzu.

Wenn der Auftrag ausgeführt wird, läuft er sowohl auf dem Master als auch auf dem Slave. Jenkins stellt sicher, dass beide aus der gleichen Quellversion erstellt werden.

0voto

Edwin Buck Punkte 67237

Über die URL /jenkins/computer können Sie "Knoten" hinzufügen, entfernen und neu konfigurieren, die entweder lokale oder entfernte "Build-Agenten" sind.

Die Aufträge können dann auf bestimmte Build-Agenten beschränkt werden oder verschiedenen Regeln folgen, um den geeigneten Build-Agenten aus den verfügbaren Agenten auszuwählen.

0voto

Andy Arismendi Punkte 47876

Ich dachte bei Jenkins zu sehr an CruiseControl, wo der Auftrag auf dem entfernten Rechner definiert wird. In Jenkins werden die Remote-Projekte also auf dem Master definiert und über einen Agenten an einen Remote-Rechner delegiert.

Ich habe den Java Web Start Agent verwendet, der als Windows-Dienst auf den entfernten Rechnern installiert ist. Um bestimmte Aufträge auf bestimmten entfernten Rechnern laufen zu lassen, habe ich jeden entfernten Knoten mit einem eindeutigen Label in seiner Slave-Konfiguration definiert. Um bestimmte Aufträge an bestimmte Slaves zu binden, verwendete ich die Bezeichnung des Slaves in jeder Auftragskonfiguration ("Einschränkung, wo dieses Projekt ausgeführt werden kann").

Um die Aufträge mit einem einzigen Masterauftrag auszulösen, habe ich einen Auftrag im freien Stil erstellt, der nur auf "Andere Projekte erstellen" eingestellt ist und eine durch Kommata getrennte Liste von Projektnamen enthält. Dieser Auftrag baut die nachgelagerten Aufträge parallel auf.

Ich bin immer noch auf der Suche nach einer Möglichkeit, eine Master-Build-Nummer an die nachgelagerten Aufträge zu senden, um sie immer synchron zu halten. (Dies wird für die Versionierung von DLLs und dergleichen verwendet).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X