Wie starte ich eine App über Docker bei jeder Pull-Anfrage?

8

Ich lasse Jenkins laufen und meine App ist dockerisiert, d. h., wenn ich den Container starte, wird der Port 3000 freigegeben und ich kann meinen Browser dorthin führen. Auf jedem Github PR möchte ich diesen Git-Commit irgendwo in einem laufenden Container deployen und Jenkins zurück zum PR schicken lassen, wo er erreichbar ist. Bei jeder PR-Aktualisierung wird es automatisch neu bereitgestellt und bei PR-Schließen / Auflösen wird es abgerissen.

Ich habe Kubernetes und einen kleinen Rancher angeschaut, aber was ist der einfachste Weg, um das in Gang zu setzen, vorausgesetzt, ich kann nur in einer Box bereitstellen?

    
tesserakt 01.03.2017, 19:55
quelle

3 Antworten

3

Es gibt ein jenkins plugin github-pullrequest kann Ihr Problem lösen.

Voraussetzungen:

  1. Sie haben einen jenkins-Server, auf den Sie über das Internet zugreifen können, wenn Sie Ihren Build über einen Webhook auslösen möchten.
  2. Sie haben ein Github-API-Token, um auf Ihr Git-Repository zuzugreifen. Es kann selbst in Einstellungen generiert werden.

Bitte befolgen Sie die Anleitung Konfiguration , um Ihre jenkins-Integration einzurichten Github.

Nach der Konfiguration:

  • Sie können Ihren Build durch PR-Ereignisse auslösen: geöffnet / committen geändert / closed oder Kommentar mit spezifischem Muster stark>.
  • Sie können einen PR-Status über die Umgebungsvariable $ {GITHUB_PR_STATE} erhalten, sodass Sie einen Container mit einem bestimmten Wert starten oder stoppen können.
  • Sie können einen Kommentar in einem PR veröffentlichen, um die Adresse Ihres Web-Service nach dem Start des Andock-Containers anzugeben.

Über den Port von cotainer mit multi PR kann man Container mit -p 3000 ausführen, es wird automatisch ein Port in einem Bereich auf dem Docker Host angezeigt, docker port <container> zeigt die spezifische Portnummer an, also zum Beispiel:

  • container1 mit der Adresse <host>:32667 für PR1
  • container2 mit der Adresse <host>:35989 für PR2
Shawyeok 20.03.2017 16:55
quelle
1

Ich denke, die einfachste Lösung wäre, zwei verschiedene Jenkins-Jobs zu erstellen, einen, der sich ausschaltet, und den anderen, der ihn aufarbeitet. Der Auslöser hierfür können 2 Webhooks in GitHub eins für PR-Erstellung und eine für PR-Auflösung gesetzt werden.

    
Jeel 16.03.2017 18:44
quelle
1

Wie Sylvain GIROD sagte:

Mit nur einem Feld zum Ausführen der Anwendung müssen Sie den freigelegten Port ändern. Wenn ein GitHub PR auftritt, stellen Sie Ihre Anwendung bereit (docker run -p newport: containerport). Wenn Sie Dienste bereitstellen, ändern Sie den Zielport.

Dann senden Sie den Link mit diesem Port zurück an den Benutzer (E-Mail?).

Zusätzlich benötigen Sie einen Schlüsselwertspeicher, um sich zu merken, welcher Pod für welche Benutzer erstellt wurde, damit Sie sich für einen neuen PR entscheiden können, ob die alten Container zerstört werden sollen.

Ich würde auch vorschlagen, den Diensten eine Zeit zu geben, zu leben und regelmäßig alte Container / Dienstleistungen aufzuräumen.

    
herm 20.03.2017 16:04
quelle