Skip to content
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

Merged
merged 12 commits into from
Sep 14, 2017
Merged

Automatisches Setup #56

merged 12 commits into from
Sep 14, 2017

Conversation

schuer
Copy link
Member

@schuer schuer commented Sep 7, 2017

Lädt benötigte AddOns runter und installiert sie, importiert die Datenbank und die Assets.

Ein paar Anmerkungen:

  1. Damit die Demo installiert werden kann, noch bevor alle benötigten AddOns installiert worden sind, ist es notwendig, die Dependencies auszuschalten. Deshalb wurden die Dependencies in eine separate Config ausgelagert und werden erst bei der Installation der Demo in deren package.yml gemerged.
  2. In der neuen Config befinden sich Angaben zu konkreten Versionen (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.
  3. In der Config muss außerdem die Installationsreihenfolge der AddOns angegeben werden, um Konflikte zu vermeiden. Diese muss manuell geprüft werden. Macht es wiederum deutlich einfacher und robuster, als wenn wir einen Auto-Konfliktlöser hätten implementieren müssen.

Ich hoffe, es funktioniert alles wie geplant. Wäre prima, wenn ein paar von euch mal draufschauen und testen könnten.

setup

* 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.
@alxndr-w
Copy link
Member

alxndr-w commented Sep 7, 2017

Gäbe es auch die Möglichkeit, Standard-Addons in einer normalen Installation automatisch herunterzuladen und zu installieren? Ohne Demo?

@schuer
Copy link
Member Author

schuer commented Sep 7, 2017

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.

@schuer
Copy link
Member Author

schuer commented Sep 7, 2017

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

@schuer
Copy link
Member Author

schuer commented Sep 8, 2017

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.

@staabm
Copy link
Member

staabm commented Sep 8, 2017

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.

@schuer
Copy link
Member Author

schuer commented Sep 8, 2017

@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.

@schuer
Copy link
Member Author

schuer commented Sep 12, 2017

Merge? Oder sind Anpassungen gewollt?

@polarpixel
Copy link
Member

Bei mir hat es tadellos geklappt, hat noch jemand getestet?
Sonst tendieren ich zum Mergen.

install.php Outdated
$config1 = rex_file::getConfig($this->getPath('package.yml'));
$config2 = rex_file::getConfig($this->getPath('package.setup.yml'));

$requires1 = $config1['requires'];
Copy link
Member

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?

Copy link
Member Author

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.

foreach ($packages as $id => $fileId) {

$localPackage = rex_package::get($id);
if ($localPackage->isSystemPackage()) {
Copy link
Member

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

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Erledigt, danke!

$errors[] = $this->i18n('package_not_available', $id);
}

if ($localPackage->getVersion() !== $installerPackage['version']) {
Copy link
Member

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?

Copy link
Member

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?

Copy link
Member Author

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.

try {
$archivefile = rex_install_webservice::getArchive($installerPackage['path']);
} catch (rex_functional_exception $e) {
$errors[] = $this->i18n('package_failed_to_download', $id);
Copy link
Member

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?

Copy link
Member

@staabm staabm Sep 12, 2017

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

Copy link
Member Author

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);
Copy link
Member

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

Copy link
Member Author

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'));
Copy link
Member

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?

Copy link
Member Author

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 @@

Copy link
Member

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

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Erledigt, danke!

@schuer
Copy link
Member Author

schuer commented Sep 12, 2017

Danke @staabm für die vielen Hinweise! Setze ich bei Gelegenheit um.

* log exceptions
* add comments
* add error check before fetching packages
@schuer
Copy link
Member Author

schuer commented Sep 14, 2017

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 array_replace_recursive aus. Beim Uninstall wird das Gegenteil benötigt, nämlich ein array_diff_recursive, und weil PHP das nicht mitbringt, habe ich eine Helferfunktion dazu gesteckt. Funktioniert prima und macht den Code um ein Vielfaches kleiner und verständlicher.

@schuer
Copy link
Member Author

schuer commented Sep 14, 2017

Ich würde die Anpassungen jetzt noch bei den anderen beiden Demos nachziehen und mergen wollen, falls niemand mehr Einsprüche hat.

@schuer schuer merged commit 37aaa08 into FriendsOfREDAXO:master Sep 14, 2017
@schuer schuer deleted the schuer-pr-2 branch September 14, 2017 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants