-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Automatisches Setup #56
Conversation
* require system addons only to allow for demo being installed first and execute code. * move additional requires to separate config file which will be merged in later on. * additional config contains specific addon versions (fileIds) for easier package download. * additional config also contains install sequence which has to be tested against dependency conflicts! * finally, additional config contains dbimport and fileimport.
merging is not dead easy and cannot be done with one `array_merge()`. this is why we need some more lines of code to shake content back and forth. may be improved?
selects missing packages, downloads and installs them. imports database dump and files. notes: * we use fileIds to download specific package versions. This is for several reasons: 1. matching the version constraints from config currently works only with packages already available and cannot be used to check external packages. 2. the demo contains database and may cause issues with newer packages implementing new tables (as happened with redactor2 before). * we make use of a specific install sequence to avoid dependency conflicts. this is way easier than implementing some sort of auto-conflict-solver.
Gäbe es auch die Möglichkeit, Standard-Addons in einer normalen Installation automatisch herunterzuladen und zu installieren? Ohne Demo? |
Hey @alexplusde, die Möglichkeit gibt es. Aktuell ist es nur eine kleine Ergänzung für die Demos, aber man könnte es natürlich allgemeiner aufziehen und z. B. ein AddOn draus machen, mit dem man sowas wie AddOn-Presets hinterlegen kann, die dann mit einem Klick runtergeladen werden. Allerdings halte ich es für sinnvoller, wenn sowas der Installer übernehmen würde, oder wenn er sich zumindest etwas in die Richtung öffnen würde. Aktuell ist die Prüfung der Versionsbedingungen für noch zu installierende AddOns nicht vorhanden, und es gibt keine Auflösung von Konflikten. Käme der Installer zukünftig mit solchen Features, wären AddOn-Presets wie oben beschrieben vermutlich mit wenigen Zeilen Code abgehandelt. |
Falls übrigens jemand ohne viel Git-Action testen möchte, es gibt ein ZIP zum Download: https://github.com/schuer/demo_base/archive/schuer-pr-2.zip |
Ich musste Install/Uninstall nochmal erweitern. Es fehlten Prüfungen der Arrays. Nochmal mehr Code, schaut für mein Empfinden ziemlich doof aus, aber ich wüsste aktuell auch keinen eleganteren Weg. |
soweit ich mich erinnern kann soll es im installer schon möglich werden zu sagen "bitte auch alle abhängigkeiten autom. laden" anstatt diese alle manuell durchgehen zu müssen.. wie weit diese idee schon durchdacht ist weiß ich nicht. ich würde die lösung hier nur als temporäre speziallösung für die demos akzeptieren woll was meint @gharlan ..? hängt in meiner meinung nach hauptsächlich daran wie bald/spät es dieses feature nativ im installer geben wird. |
@staabm Genau, es soll aktuell nur eine Demo-Lösung sein, speziell auf die Struktur zugeschnitten, die Peter mit der Basisdemo angelegt hat, und nach der sich aktuell noch alle FOR-Demos richten. Sobald der Installer das alles drin hat, wird es vermutlich einfacher oder sogar gänzlich unnötig, dass die Demos eigenen Code für das Setup mitbringen. Aktuell halte ich es für sehr wichtig, das Feature einzubringen, weil die Demos sicherlich erster Ansatzpunkt für REDAXO-Interessierte sind, und weil der manuelle Weg bis zur fertigen Demo-Installation doch recht mühsam ist. Unser FOR-Docker-Paket kann ja eine fertige Demo in einem Klick auswerfen, aber Docker ist nun leider auch wieder nichts für Interessierte mit wenig WebDev-Erfahrung. Deshalb ist es cool, wenn die Demos sich mit einem Klick selbst einrichten können. |
Merge? Oder sind Anpassungen gewollt? |
Bei mir hat es tadellos geklappt, hat noch jemand getestet? |
install.php
Outdated
$config1 = rex_file::getConfig($this->getPath('package.yml')); | ||
$config2 = rex_file::getConfig($this->getPath('package.setup.yml')); | ||
|
||
$requires1 = $config1['requires']; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Muss man hier warnungen vermeiden wenn es den index packages nicht gibt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Erledigt, danke! Der Install flow wurde komplett überarbeitet.
pages/install.php
Outdated
foreach ($packages as $id => $fileId) { | ||
|
||
$localPackage = rex_package::get($id); | ||
if ($localPackage->isSystemPackage()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Warum werden syspackages ausgelassen? Kommentar im source bitte
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Erledigt, danke!
pages/install.php
Outdated
$errors[] = $this->i18n('package_not_available', $id); | ||
} | ||
|
||
if ($localPackage->getVersion() !== $installerPackage['version']) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
D.h. Sobald es updates von einem der abh. packages im installer gibt funktioniert das hier nicht mehr?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
D.h. Sollte dieser check auch nach semver gültige kompatible versionen ohne error zulassen?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Es wird geprüft, ob die exakt gleiche Version des benötigten AddOns bereits vorhanden ist. Wenn nicht, wird das AddOn im späteren Verlauf runtergeladen und installiert.
Auf Semver wird hier bewusst nicht geprüft aus vielen Gründen, die oben in der Description stehen. Wir arbeiten stattdessen mit explizit definierten AddOn-Versionen, die vorher von uns manuell geprüft werden, dass sie funktionieren.
pages/install.php
Outdated
try { | ||
$archivefile = rex_install_webservice::getArchive($installerPackage['path']); | ||
} catch (rex_functional_exception $e) { | ||
$errors[] = $this->i18n('package_failed_to_download', $id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
$e mit in die meldung einbauen, oder wenigstens ins syslog schreiben?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In den anderen catch blöcken auch
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Erledigt, danke!
|
||
// validate checksum | ||
if ($installerPackage['checksum'] != md5_file($archivefile)) { | ||
$errors[] = $this->i18n('package_failed_to_validate', $id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Explizitere meldung sodass der enduser eher weiß was das problem ist
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich wüsste ehrlich gesagt nicht, wie man das hilfreich formulieren könnte. Wenn die Validierung fehlschlägt, war das Package kaputt oder korrupt, und dann müsste man verdammt viel erklären ;)
Letztendlich gehe ich davon aus, dass der Fehler niemals fliegen wird.
uninstall.php
Outdated
/** @var rex_addon $this */ | ||
|
||
// read configs | ||
$config1 = rex_file::getConfig($this->getPath('package.yml')); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Statt 1/2 nen besseren bezeichner?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Erledigt, danke! Der Install flow wurde komplett überarbeitet.
@@ -2,7 +2,40 @@ | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hier ggf deine tolle PR beschreibung als kommentar in den source damit man den Hintergrund versteht
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Erledigt, danke!
Danke @staabm für die vielen Hinweise! Setze ich bei Gelegenheit um. |
* log exceptions * add comments * add error check before fetching packages
Ich habe den Install/Uninstall-Mechanismus nochmal komplett umgebaut und endlich auch vereinfachen können. Danke Markus fürs nochmal Anstupsen, sonst wäre er vermutlich so geblieben! Beim Install kommen wir nun mit einem schlichten |
Ich würde die Anpassungen jetzt noch bei den anderen beiden Demos nachziehen und mergen wollen, falls niemand mehr Einsprüche hat. |
Lädt benötigte AddOns runter und installiert sie, importiert die Datenbank und die Assets.
Ein paar Anmerkungen:
package.yml
gemerged.fileId
) der benötigten AddOns. Das deshalb, weil die Prüfung der Versionsbedingungen (matchVersionConstraints) aktuell nur mit bereits vorhandenen AddOns funktioniert, nicht aber mit solchen, die erst noch heruntergeladen werden müssen. Man kann also die vorhandenen Versionen im Installer nicht so einfach aus der Ferne prüfen. Ein weiterer Grund für die Verwendung der fileIds ist, dass die Demo einen kompletten Datenbankstand importiert und damit schnell in Gefahr läuft, mit aktuellen Versionen eines AddOns nicht richtig zu funktionieren. Das hatten wir neulich beim Redactor, der neue Datenbankfelder eingeführt hatte. Ich finde es deshalb robuster — und nebenbei auch viel einfacher —, spezifische Versionen in der Config zu hinterlegen.Ich hoffe, es funktioniert alles wie geplant. Wäre prima, wenn ein paar von euch mal draufschauen und testen könnten.