Adlib Updater Bundle
Ein schlankes Symfony-Bundle zum Prüfen und Ausführen von Updates in bestehenden Symfony-Projekten.
Installation (manuell, ohne Flex-Recipe)
- Das Repository in der
composer.jsondeines Zielprojekts hinzufügen:
"repositories": [
{
"type": "vcs",
"url": "https://github.com/Odido/programname.git"
}
],
- Vorab-Konfiguration anlegen (Wichtig!):
Damit die Installation ohne Fehler durchläuft (wegen des automatischencache:clear), erstelle zuerst die Dateiconfig/packages/adlib_updater.yamlin deinem Projekt:
adlib_updater:
# MANDATORY: Die URL zu deinem GitHub Repository
update_url: 'https://github.com/Odido/project-url'
# OPTIONAL: GitHub Token für private Repositories
github_token: '%env(GITHUB_TOKEN)%'
# OPTIONAL: Pfade (Standardwerte werden hier gezeigt)
target_dir: '%kernel.project_dir%'
temp_dir: '%kernel.project_dir%/var/updater'
Die update_url ist die URL zu dem Projekt, das upgedated werden soll.
- Bundle installieren:
composer require adlib/updater-bundle
- Bundle registrieren (falls keine Auto-Discovery/Flex):
// config/bundles.php
return [
Adlib\UpdaterBundle\AdlibUpdaterBundle::class => ['all' => true],
];
Twig in deinem Template nutzen (Beispiel Header/Banner):
{% if updater_has_update() %}
<div class="alert alert-warning">
Es ist eine neue Version {{ updater_remote_version() }} verfügbar.
<form action="{{ path('adlib_updater_run') }}" method="post" style="display:inline;">
<button class="btn btn-sm btn-primary">Update jetzt ausführen</button>
</form>
</div>
{% endif %}
Funktionsweise (GitHub-Integration)
- Version-Check: Das Bundle fragt die GitHub API (
api.github.com/repos/.../tags) ab und vergleicht den neuesten Tag (z.B.v1.2.3) mit deinerVERSIONin der.env. - Download: Bei einem Update wird das ZIP-Archiv des Tags von GitHub heruntergeladen (
/archive/refs/tags/v{version}.zip). - Backup: Vor der Installation werden die Ordner
src,templates,config,public,translationsundassetssowie die.envin einen Zeitstempel-Ordner untervar/updater/backup_...gesichert. - Installation: Das ZIP wird entpackt und der Inhalt (Source-Code) über deine bestehenden Dateien drüberkopiert.
- Rollback: Tritt beim Entpacken oder Kopieren ein Fehler auf, wird automatisch der Zustand aus dem Backup wiederhergestellt. Bei einem totalen Systemausfall kann das Rollback auch manuell über die Konsole gestartet werden:
php bin/console adlib:updater:rollback.
Wie funktioniert’s?
- Beim erfolgreichen Login löst
UpdateCheckSubscribereine Abfrage der Remote-Version aus (via GitHub API/tags). - Ist die Remote-Version (der neueste Tag) größer als
VERSIONaus deiner.env, wird in der Session ein Flag gesetzt. - Über die Twig-Extension kannst du den Status abfragen und einen Button anzeigen.
- Der
UpdateControllerstartet den Update-Prozess (UpdateManager). Bei Fehlern wird automatisch ein Rollback versucht und alles geloggt.
Console-Befehle
Rollback (Manuell)
Sollte die Anwendung nach einem Update nicht mehr erreichbar sein, kann ein Rollback über die Kommandozeile durchgeführt werden.
php bin/console adlib:updater:rollback
Verhalten:
- Ohne weitere Optionen sucht der Befehl automatisch nach dem aktuellsten Backup im konfigurierten
temp_dir(Standard:var/updater/backup_...). - Es wird eine Sicherheitsabfrage angezeigt, bevor die Dateien wiederhergestellt werden.
Optionen:
--backup-dir=/pfad/zum/backup: Ermöglicht die Angabe eines spezifischen Backup-Ordners, falls nicht das aktuellste Backup verwendet werden soll.
Logging
Das Bundle nutzt den Standard-Logger von Symfony und verwendet einen eigenen Kanal namens updater. Dieser Kanal wird vom Bundle automatisch registriert.
Das symfony/monolog-bundle ist als Abhängigkeit definiert und wird automatisch mitinstalliert.
Konfiguration (Beispiel)
Um alle Meldungen des Updaters in eine separate Datei zu schreiben, kannst du in deiner config/packages/monolog.yaml einen neuen Handler hinzufügen. Achte hierbei auf den when@level:
monolog:
handlers:
updater:
type: stream
path: "%kernel.logs_dir%/updater.log"
level: info
channels: ["updater"]
Falls du keine separate Datei möchtest, stelle sicher, dass deine Standard-Handler den Kanal updater nicht ausschließen und das Log-Level auf info (oder niedriger) steht, besonders in der prod-Umgebung. Die Logdateien finden sich, wenn die Standardeinstellungen in config/packages/monolog.yaml nicht geändert wurden, unter var/log.
TODO / Erweiterungen
- Implementierung des echten Download/Backup/Rollback-Flows (Tar/Zip), Checksummen, Wartungsmodus.
- Ratenbegrenzung der Update-Prüfung (z.B. 1x pro Prozessstart o. Session).
- Ausgelagerter Update-Status (Cache/DB) anstatt Session, wenn gewünscht.