Ich bin ziemlich neu für Jenkins und habe eine Art Verständnis, aber ich brauche weiter Anleitung.
Ich habe eine PHP-Anwendung in einem Git-Repo, die Composer verwendet, Assets besitzt, Benutzer Media-Dateien hochgeladen hat, Memcache / Redis verwendet, einige Agents / Workers hat und Migrationsdateien hat.
Bisher habe ich verstanden, dass ich in Jenkins zwei Jobs schaffen muss.
Job 1 = Build
Job 2 = Bereitstellen
Im Job Build
habe ich den Git Repo als Quelle eingerichtet, und ich habe ein Post Shell Skript eingerichtet, das eine einzelne Zeile composer update
hat.
1) Meine erste Frage bezieht sich darauf, wie / wo die Dateien geklont wurden. Ich verstehe, dass es einen Arbeitsbereich gibt, und jedes Mal wird dort kloniert, oder nur neue Dinge werden gezogen.
2) Composer-Update lädt immer wieder das gleiche Zeug und sieht so aus, als ob es nicht mit mehreren Builds zwischengespeichert wird. Ich würde gerne die Meinung hier hören, aber ich erwartete auf dem nächsten Build wird es nach Änderungen suchen und nur das diff bekommen. Ein vollständiges Composer-Update dauert einige Minuten.
Im Job Deploy
möchte ich einen Prozess einrichten, der den letzten stabilen Build verwendet und die Dateien in einen dedizierten Ordner wie releases2
verschiebt. Dann wird ein Provisionsscripting ausgeführt und am Ende wird der Symlink / htdocs-Ordner auf den neuen releases2
-Ordner aktualisiert, sodass der Webserver beginnt, von diesem Ordner aus die Website zu bedienen.
3) Wie bekomme ich den neuesten Build (im Build-Ordner habe ich nur ein paar Log- und XML-Dateien gesehen, konnte die Dateien von git nicht finden) und gehe zu einem neuen Ziel.
4) Wie soll ich das Ziel einrichten, so dass ich Media Files zwischen verschiedenen Deploys halten kann.
5) Wann soll ich mit den Assets (wie Veröffentlichung in einem CDN) nach dem erfolgreichen Build und vor der Bereitstellung fertig werden? Soll dies ein Pre / Post-Hook oder ein anderer Job sein.
6) Wann soll ich die Caches löschen (Memcache, Redis).
7) Wie kann ich zu früheren Versionen zurückkehren? Und wie kann ich die letzten 5 erfolgreichen Releases verwalten?
8) Wie kann ich eine E-Mail von fehlgeschlagenen Builds und fehlgeschlagenen E-Mail-Benachrichtigungen erhalten?
9) Wie können Operationen nach einer erfolgreichen Bereitstellung per E-Mail eine Liste von aktuellen Commit-Nachrichten erhalten?
Ich habe bemerkt, dass Jenkins viele Plugins hat. Nicht sicher, ob diese von diesen Plugins gehandhabt werden, aber fühlen Sie sich frei, irgendetwas zu empfehlen, das diese erledigt. Ich habe auch über Phing gelesen, aber ich bin mir nicht sicher, was ist und wo soll ich es verwenden.
Ich verstehe, dass es viele Fragen in diesem Thema gibt, aber wenn Sie die Antwort für einige von ihnen kennen, schreiben Sie bitte als Antwort
Warnung tl; tr
Ok - Sie wollen alles. Viele Fragen - lange Geschichte.
Jenkis ist "nur" ein kontinuierlicher Integrationsserver.
Kontinuierliche Integration bedeutet im Grunde, dass Sie keinen Kompilierungs- und Komponententest-Schritt auf dem Entwicklungscomputer ausführen müssen, sondern dies auf einen zentralen Server übertragen, richtig? Da das Kompilieren und Verknüpfen jetzt auf einem zentralen Server erfolgt, hat der Entwickler mehr Zeit für die Entwicklung, anstatt darauf zu warten, dass die Kompilierung abgeschlossen wird. So begann dieses CI-Ding.
Nun, wenn man sich PHP-Projekte ansieht, ist kein Kompilierungs- oder Verknüpfungsprozess beteiligt. Die Aufgabe einer Continous Integration, die an PHP-Projekten arbeitet, besteht darin, nur die Komponententests durchzuführen und vielleicht einige Berichte zu generieren. Das sieht man deutlich, wenn man sich Hilfsprojekte wie Jenkins-PHP anschaut, die ein Template-Setup für PHP-Projekte auf Jenkins bereitstellen - Ссылка
Der Ausgangspunkt ist "Jenkins macht etwas, nachdem du die Quelle festgelegt hast". Sie haben bereits eine Konfiguration für Ihr Git-Repository. Es wird überwacht und wann immer ein neues Commit eintrifft, wird ein neuer "Build-Prozess" ausgelöst.
Was ist das "Build-Prozess"?
Der Build-Prozess kann teilweise in der Jenkis GUI konfiguriert werden. Teilweise bedeutet dies, dass der Fokus auf der Konfiguration von "Triggern" und "Benachrichtigungen" sowie auf der "Berichterstellung" liegt. Berichterstellung bedeutet, dass bestimmte Build-Tools ihre Jobs beendet haben und ihre Protokolldateien verarbeitet und in ein besseres Format umgewandelt wurden.
z. Wenn phpunit seinen Job beendet hat, ist es möglich, das Code-Coverage-Protokoll zu verwenden, um es in eine nette HTML-Seite umzuwandeln und es zur öffentlichen Ansicht in den Ordner / www zu verschieben.)
Aber , die meiste echte Arbeit dieses Build-Prozesses wird in einer Build-Konfigurationsdatei beschrieben. Hier kommen Build Tools wie "Phing", "ant" (der große Bruder von phing) und "nant" (win) ins Spiel.
Das Build-Tool bietet die Grundlage für Skriptaufgaben. Hier passiert Ihre Automatisierung! Sie müssen die Automatisierungsschritte selbst programmieren. Jenkins ist nur noch eine GUI, die einige Schaltflächen zur Anzeige von Build.log und Berichten und zum erneuten Starten eines Builds bietet, richtig.
Oder mit anderen Worten: Sie können Jenkins und Ihr PHP-Projekt nicht einfach zusammenhalten, in der Hoffnung, dass Sie Ihren Build- und Deployment-Prozess zusammen auf der GUI klicken können. Wir sind noch nicht dort! Die Werkzeuge werden besser, aber es ist ein langer Weg.
Lasst uns für eine Weile über Jenkis nachdenken. Konzentrieren wir uns auf die Build-Schritte.
Wie würden Sie Ihr Projekt erstellen und bereitstellen, wenn Sie nur auf dem CLI sind? TU es! Vielleicht möchten Sie alle Befehle und Schritte in eine einfache Textdatei schreiben. Machen Sie diese Schritte nun zu Automatisierungsschritten. Erstellen Sie eine "build.xml" im Stammordner Ihres Projekts.
%Vor%Jetzt brauchen wir einige Build-Schritte. Build-Tools beziehen sich auf sie als "Ziel" s. Ein Buildziel gruppiert Aufgaben. Sie können jedes Ziel für sich selbst ausführen und Sie können sie auch verketten.
%Vor%Regel: Behalte Ziele klein - maximal 5-7 cli Befehle in einem Ziel.
Nun wollen wir eine Zielverkettung mit Abhängigkeiten einführen.
Nehmen wir an, dass Ihre Aufgabe "build" vorher "phpunit" ausführen soll.
Auf der CLI würden Sie einfach phpunit
und dann Ihre Build-Befehle ausführen.
Innerhalb einer Build-Konfiguration müssen Sie Aufrufe in die exec
-Tasks umbrechen.
Sie erstellen also ein "phunit" -Ziel und fügen dieses als Abhängigkeit zum Ziel "build" hinzu.
Abhängigkeiten werden vor dem Ziel ausgeführt, das sie spezifiziert.
Ein Build-Tool wie Phing bietet viele Kernaufgaben wie chown, mkdir, delete, kopieren, verschieben, exec (...) und zusätzliche Aufgaben (für git, svn, notify). Bitte beachten Sie die Dokumentation von Phing Ссылка oder Ant Ссылка
Eine gute Sache mit Phing ist die Möglichkeit, AdhocTasks in PHP innerhalb der Build-Konfigurationsdatei zu schreiben und sie auszuführen. Dies ist auch mit ant möglich, erstellen Sie einfach eine exec-Task, die PHP und das Skript ausführt.
Ok - Vorwärtsspulen: Sie haben die vollständigen Build- und Deployment-Prozeduren innerhalb dieser Build-Konfiguration neu erstellt. Sie sind jetzt in der Lage, die Zielbefehle eigenständig zu verwenden. Jetzt wechseln wir zurück zu Jenkins CI oder einem anderen CI-Server und konfigurieren es, um das Build-Tool mit den Zielaufgaben auszuführen. Normalerweise hätten Sie ein Standardziel namens main
oder build
, das alle Ihre Ziele (Schritte) zusammenfasst.
Wenn nun ein neues Commit eintrifft, startet Jenkins den Build-Prozess, indem er das Build-Skript ausführt.
Angesichts dieser Informationen darüber, wie Jenkins mit einem Build-Tool interagiert, einige Ihrer Fragen sind selbsterklärend. Sie müssen nur die Schritte erstellen, um fertig zu werden, was Sie wollen ...
Beginnen wir die Q & A-Runde:
Q1: Jenkins Arbeitsbereich-Ordner
Workspace ist der Ort, an dem die Projekte leben. Neue Commits kommen dort an. Unter "Erweitert" wählen Sie ein Arbeitsverzeichnis für die Projekte, ohne das Jenkins Home-Verzeichnis zu ändern. Aktivieren Sie das Kontrollkästchen "Benutzerdefinierten Arbeitsbereich verwenden" und legen Sie das Verzeichnis fest, in das Jenkins den Code ziehen und einbinden soll. Es ist auch möglich, die Build-Ordner dort und die Anzahl der zu speichernden Builds zu konfigurieren.
Q2: Komponist
Composer behält einen lokalen Cache - er lebt in $COMPOSER_HOME/cache
. Der lokale Cache wird verwendet, wenn dieselben Abhängigkeiten verwendet werden. Dies verhindert, dass sie erneut heruntergeladen werden. Wenn eine neue Abhängigkeit eingeführt oder die Version geändert wird, werden diese Dinge abgerufen und wiederverwendet, in composer install
und composer update
.
Composer Installationen / Updates sind immer frisch aus dem Netz oder dem Cache. Der Herstellerordner wird nicht beibehalten. Die Abhängigkeit wird gelöscht und erneut installiert. Wenn es lange dauert, dauert es lange. Ende der Geschichte.
Wenn es zu lange dauert, verwenden Sie Composer einmalig und fügen Sie dann neue Build-Ziele "zip-copy-vendor-folder" und "copy-unzip-vendor-folder" hinzu. Ich denke, Sie können sich vorstellen, was diese Dinge tun. Nun müssen Sie eine if-Prüfung für die gezippte Herstellerdatei einleiten. Wenn die Hersteller-Zip-Datei existiert, überspringen Sie das Composer-Installationsziel und fahren mit "Copy-Unzip .." fort. Ok, Sie haben es verstanden. Dies ist ein Tweak .. Tun Sie dies nur, wenn Ihre Abhängigkeiten ziemlich stabil sind und sich oft nicht ändern.
Im Allgemeinen benötigen Sie ein Build-Ziel "get-dependencies-with-composer", das composer install
ausführt. Cache wird automatisch von Composer verwendet.
F3: Erhalte die neueste Version und bewege dich an ein neues Ziel
Der neueste Build befindet sich im Build-Ordner - oder, wenn Sie einen Schritt zum Verschieben der Datei definiert haben, befindet er sich bereits im gewünschten Ordner.
F4: So erhalten Sie Mediendateien in
Fügen Sie einfach ein Build-Ziel hinzu, um die Medienordner in das Projekt zu kopieren.
F5: Fügen Sie Build-Ziele für die Asset-Handhabung hinzu
Du kennst die Position bereits: es ist "after build". Das bedeutet, dass es sich um einen Deployment-Schritt handelt, oder? Fügen Sie ein neues Ziel hinzu, um Ihren Ordner über FTP auf Ihr CDN zu laden.
F6: wann soll ich die Caches löschen (memcache, redis)
Ich schlage vor, mit einer einfachen: "deploy - bush cache - rewarm caches" -Strategie.
Das Hotswapping von PHP-Anwendungen ist kompliziert. Sie müssen eine PHP-Klasse haben, die die Änderung der zugrunde liegenden Komponenten unterstützt, während das System zwei Versionen ausführt. Die alten Versionen blenden den Cache aus, die neuen Versionen werden eingeblendet. Bitte stelle diese Frage alleine! Das ist nicht so einfach wie man denken würde. Es ist kompliziert und auch eines der geliebten Themen von Rasmus Lerdorf.
F7.1: Wie kann ich zu früheren Versionen zurückkehren?
Durch Ausführen des Bereitstellungsziels / der Aufgaben im Ordner der vorherigen Version.
F7.2: Und wie kann ich die letzten 5 erfolgreichen Versionen beibehalten?
Jenkins hat eine Einstellung für "wie viele Builds zu behalten" im Build-Ordner. Setze es auf 5.
F8: Wie kann ich E-Mails mit fehlgeschlagenen Builds und fehlgeschlagenen E-Mail-Benachrichtigungen erhalten?
Automatisch. E-Mail-Benachrichtigungen sind Standard. Wenn ich falsch liege, schaue in die Benachrichtigung "E-Mail".
** F9: Wie können Operationen nach einer erfolgreichen Bereitstellung per E-Mail eine Liste von aktuellen Commit-Nachrichten erhalten? **
Fügen Sie ein Build-Ziel "send-git-log-via-email-to-operations" hinzu.
Ich fühle mich, als hätte ich heute ein Buch geschrieben ...
Ich habe keine Antworten auf alle, aber wenige, die ich habe:
1) Meine erste Frage bezieht sich darauf, wie / wo die Dateien geklont wurden. Ich verstehe, dass es einen Arbeitsbereich gibt, und jedes Mal dort geklont wird, oder nur neue Dinge gezogen werden.
Sie haben richtig verstanden, dass Dateien im Arbeitsbereich geklont werden. Wenn Sie möchten, können Sie jedoch Ihren eigenen benutzerdefinierten Arbeitsbereich festlegen, indem Sie ihn in
Advanced Project Options
(enableUse custom workspace
) einrichten, was oberhalb 'Quellcodeverwaltung' ist.
2) Das Composer-Update scheint immer wieder dasselbe zu laden und sieht so aus, als ob es nicht mit mehreren Builds zwischengespeichert wird. Ich würde gerne die Meinung hier hören, aber ich erwartete auf dem nächsten Build wird es nach Änderungen suchen und nur das diff bekommen. Ein vollständiges Composer-Update dauert einige Minuten.
Ich habe keine Ahnung von Composer, aber wenn dieses Ding auch von Git ausgecheckt wird, dann ist
Shallow clone
vielleicht das, wonach du suchst. Dies ist vorhanden unter:Source Code Management section > Git > Additional Behaviours > Advanced clone behaviours
Im Deploy-Job würde ich gerne einen Prozess einrichten, der den letzten stabilen Build verwendet und die Dateien in einen dedizierten Ordner wie Releases2 verschiebt. Dann wird ein Provisionsskript ausgeführt und am Ende wird der Symlink des Verzeichnisses / htdocs auf den neuen Ordner releases2 aktualisiert, so dass der Webserver beginnt, aus diesem Ordner die Website zu bedienen.
Ich bin mir nicht sicher, warum Sie einen separaten Job für die Bereitstellung benötigen. Alles, was Sie oben gesagt haben, kann in der gleichen Arbeit durchgeführt werden, denke ich. Im Abschnitt
Build
(direkt über Post-Build-Aktionen ) können Sie Ihr Skript (Win batch / bash / perl / ...) angeben, das alle für den Stable erforderlichen Aktionen ausführt Build, der gerade erstellt wurde.
3) Wie bekomme ich den neuesten Build (im Build-Ordner habe ich nur ein paar Log- und XML-Dateien gesehen, konnte die Dateien von git nicht finden) und gehe zu einem neuen Ziel.
%Vor%Nach deiner Beschreibung bin ich mir fast sicher, dass du keinen Master-Slave für Jenkins hast. In diesem Fall ist es am einfachsten, den Speicherort der von Git abgerufenen Dateien zu ermitteln, indem Sie die Konsolenausgabe des letzten Builds (oder eines Builds) überprüfen. In den ersten zwei bis drei Zeilen der Konsolenausgabe sehen Sie den Pfad zu Ihrem Build-Arbeitsbereich. Zum Beispiel in meinem Fall ist es so etwas wie:
4) Wie soll ich das Ziel einrichten, so dass ich Mediendateien zwischen verschiedenen Bereitstellungen halten kann.
Ich bin mir nicht sicher, wonach Sie suchen. Sieht aus wie etwas, das von Ihrem Skript gehandhabt werden muss. Bitte erläutern.
5) Wann soll ich mit den Assets (wie Veröffentlichung in einem CDN) nach dem erfolgreichen Build und vor der Bereitstellung fertig werden? Soll dies ein Pre / Post-Hook oder ein anderer Job sein.
Wenn Sie Artefakte meinen, sollten Sie "Post-Build-Aktionen" aktivieren. Es bietet verschiedene Optionen wie 'Archivieren der Artefakte', '[Artefaktbereitstellung] - Bereitstellen von Artefakten vom Arbeitsbereich in entfernte Repositories' usw. Die Anzahl der Optionen, die Sie in diesem Abschnitt sehen, hängt von der Anzahl der installierten Plugins ab.
Ein nützliches artefaktbezogenes Plugin ist Ссылка
6) Wann soll ich die Caches löschen (Memcache, redis).
Tut mir leid, keine Ahnung davon.
7) Wie kann ich zu früheren Versionen zurückkehren? Und wie kann ich mich darauf einstellen, die letzten 5 erfolgreichen Versionen zu behalten?
Vorherige Version von was? Build wird immer im Arbeitsbereich überschrieben; Nur die Protokolle vergangener Builds werden angezeigt. Sie müssen explizit einen Mechanismus (Skript) einsetzen, um Backups von Builds zu erstellen. Überprüfen Sie auch diesen Abschnitt
Discard Old Builds
oben auf der Projektkonfigurationsseite. Es gibt auch einige Plugins, die Sie installieren können. Diese werden Ihnen helfen, Builds zu konfigurieren, um sie zu behalten, zu löschen usw.
8) Wie kann ich eine E-Mail mit fehlgeschlagenen Builds und fehlgeschlagenen E-Mail-Benachrichtigungen erhalten?
Diese Option ist in
Post-build Actions
verfügbar. Es gibt eine "E-Mail-Benachrichtigung", die grundlegende Funktionen bereitstellt. Wenn Sie bessere Funktionen benötigen, schlage ich vor, dass Sie das Plugin Email-ext installieren.
Sie können aus Hunderten von Plugins suchen, indem Sie zu Jenkins > Manage Jenkins > Manage Plugins > Available
tab
9) Wie können Operationen nach einer erfolgreichen Bereitstellung per E-Mail eine Liste von aktuellen Commit-Nachrichten erhalten.
Diese Funktionalität ist möglicherweise nicht direkt über das Plugin verfügbar. Ein bisschen Skriptaufwand wird benötigt, denke ich. Dies könnte für Sie hilfreich sein: Wie man git changelog in Jenkins einbaut E-Mails?
Tags und Links php git jenkins continuous-integration deployment