Kürzlich stand ich vor der Aufgabe, das Drupal-Gruppenmodul Organic Groups* auf einen neueren Versionszweig zu aktualisieren. Vor dem Upgrade hatte ich einen gewissen Respekt, denn verschiedene Beiträge auf drupal.org ließen mich vermuten, dass das Vorhaben kaum ohne technische Probleme ablaufen würde.
* Organic Groups (OG) enables users with permissions to create and manage their own groups. (...) Group subscribers communicate amongst themselves using the group home page as a focal point
Hintergrund des Upgrades war eine Sicherheitswarnung in der betroffenen Drupal-Installation, die vermeldete, der Versionszweig 7.x-1.x von OG werde aus Sicherheitsgründen nicht mehr unterstützt. Konkrete Sicherheitsprobleme in Bezug auf den Versionszweig 1.x waren zwar nicht nachvollziehbar, in der Issue Queue des Projekts hieß es jedoch, man solle in jedem Fall davon ausgehen, dass 1.x unsicher sei und deshalb auf 2.x upgraden.
Vorüberlegungen
Dass das OG-Upgrade möglicherweise nicht ganz einfach werden würde, liegt zum einen an der Natur der Sache: Im Gegensatz zu Modul-Updates, die in der Regel rückwärtskompatibel sind, kann man bei Upgrades nicht davon ausgehen, dass die im Rahmen der Modul-Nutzung entstandenen Inhalte und Einstellungen erhalten bleiben. Deshalb war es gut zu wissen, dass es in diesem Fall einen 'upgrade path' unter Verwendung des Migrate-Moduls gibt. Dennoch blieb die Angelegenheit spannend, da in der Upgrade-Anleitung von mehreren Fallstricken berichtet wird.
Probleme seien etwa zu erwarten, wenn der Name der Drupal-Datenbank einen Bindestrich enthalte – dies war bei der betroffenen Website zum Glück nicht der Fall. Zwei Kommentaren (comment-7882029 und comment-9884221) entnahm ich außerdem, dass das Upgrade offenbar nur bei Verwendung einer bestimmten Migrate-Version gelinge. So weit, so gut. Etwas beunruhigender fand ich folgenden Hinweis:
If some of your items are not migrated over, or there is an issue after migrating, try the latest dev version of OG. You can also look at:
Bei dieser Ausgangslage und bei der Komplexität eines so großen Moduls wie Organic Groups war ich mir ziemlich sicher, dass das Upgrade nicht einfach glatt durchlaufen würde. Sollte ich doch darauf verzichten und darauf vertrauen, dass trotz Sicherheitsmeldung keine konkreten Probleme in Bezug auf OG 7.x-1.x bekannt waren? Selbst beurteilen konnte ich diese Frage allerdings nicht. Außerdem hatte ich die Erwartung, dass das Modul bei einem Upgrade einem zeitgemäßen Standard und Stil der Drupal-Entwicklung ein gutes Stück näher rücken würde, und davon könnten auf Dauer auch die Gruppenfunktionen der Website profitieren. Also entschloss ich mich schließlich, das Upgrade anzugehen.
Tutorial
Um etwaige Probleme zu erkennen und in Ruhe zu beheben, führte ich das Upgrade zunächst in einer Entwicklungsumgebung durch und wiederholte es in der Live-Umgebung. Im Folgenden beschreibe ich meine Erfahrung aus beiden Umgebungen kombiniert in Form eines Tutorials.
Vorbereitung und Modul-Aktualisierung
- Sichere die Drupal-Datenbank, z.B. mit Hilfe des Moduls Backup and Migrate.
- Installiere und aktiviere Migrate 7.x-2.5 sowie die weiteren Module, die in der Upgrade-Anleitung genannt werden.
- Sichere die Datenbank erneut.
Eine wiederholte Sicherung erlaubt dir, das Upgrade im Zweifelsfall schrittweise rückgängig zu machen. - Sichere den Code der bisher verwendeten OG-Version 7.x-1.x.
- [Live-Umgebung:] Aktiviere den Wartungsmodus der Website.
- Ersetze OG 7.x-1.x im Modulverzeichnis deiner Website mit der aktuellen Version 7.x-2.x (bei mir war das 7.x-2.7.)
- Aktualisiere die Datenbank durch Aufrufen von example.org/update.php.
In meinem Fall wurden acht ausstehende Datenbank-Aktualisierungen angezeigt, drei Aktualisierungen gaben anschließend eine Meldung aus. - Sichere die Datenbank erneut.
Import der Migrationen und Neuaufbau der Zugriffsrechte
Wichtig: Entgegen einer Meldung im Drupal-Backend sollte der Neuaufbau der Zugriffsrechte erst nach dem Import der Migrationen erfolgen.
- Rufe den Pfad admin/content/migrate auf und importiere die vom Modul vorbereiteten Migrationen.
In meinem Fall waren das: OgMigrateMembership, OgMigrateRoles und OgMigrateUserRoles. Dabei wurden in OgMigrateMembership nur 416 von 423 Einträgen importiert. Vor dem Import wurden jedoch gar nicht 423, sondern nur 416 zu importierende Einträge angezeigt, so dass ich dennoch von einem kompletten Import ausgehe. - Rufe admin/reports/status/rebuild auf, und lasse die Zugriffsrechte der Website neu aufbauen.
- Sichere die Datenbank erneut.
- [Live-Umgebung:] Deaktiviere den Wartungsmodus.
Bis hierhin lief das Upgrade ohne nennenswerte Probleme, und darüber war ich recht froh, da mit der Migration der Gruppenmitgliedschaften eine wesentliche Hürde genommen war.
Testing
Was beim Testen des aktualisierten Moduls beachtet werden sollte, hängt von der Konfiguration und Nutzungsart der Gruppen ab. Einige der genannten Aspekte werden im Abschnitt Probleme lösen weiter unten näher besprochen.
- Prüfe kursorisch, ob die Gruppen der Website noch vorhanden sind und ob sie noch (die richtigen) Mitglieder haben.
- Sehe dir die Darstellung der Gruppenseiten als Test-Nutzer der Drupal-Rollen an, die bei der Gruppennutzung relevant sind.
Beispiele: Gast, Gruppenmitglied, Gruppenverwalter, ggf. auch Redakteur und Administrator - Teste die relevanten Gruppenfunktionen und damit verbundene Aktionen.
Beispiele: Gruppenbeitrag hinzufügen, neues Mitglied aufnehmen, Benachrichtigung neuer Mitglieder - Vergleiche die Gruppeneinstellungen der aktualisierten OG-Version aus der Entwicklungsumgebung mit den Einstellungen der noch nicht aktualisierten Version aus der Live-Umgebung, und dokumentiere etwaige Unterschiede.
- Prüfe die Darstellung des Benutzerkontos von Testnutzern.
- Prüfe die Drupal-Berichte unter admin/reports/status und admin/reports/dblog.
Probleme lösen
Falsch konfigurierter View
Gruppenbeiträge sollen normalerweise nur in der Gruppe angezeigt werden, für die sie geschrieben wurden. Aus mir nicht bekannten Gründen funktionierte der entsprechende Kontextfilter im View der Gruppenbeiträge nach dem Upgrade nicht mehr, und der fehlende Filter führte dazu, dass auf jeder Gruppenseite die Beiträge aller Gruppen angezeigt werden. Glücklicherweise stand mir eine neuere Website zur Verfügung, auf der von vornherein Organic Groups 7.x-2.x eingesetzt wurde. Anhand dieser Website konnte ich die korrekte Konfiguration des Views-Kontextfilters einfach rekonstruieren.
Fehlende Gruppen-Felder
Gruppenbeiträge können nicht nur für eine, sondern für mehrere Gruppen geschrieben werden. Zur Verdeutlichung werden unterhalb von Gruppenbeiträgen die zu einem Beitrag gehörigen Gruppen angezeigt. Nach dem Upgrade fehlte die Anzeige der Gruppen, da in der neueren OG-Version ein anderes Feld zur Referenz auf Gruppen verwendet wird. Die Lösung bestand darin, das neue und noch inaktive Feld in den Anzeige-Einstellungen von Gruppenbeiträgen in den Bereich der sichtbaren Felder zu verschieben.
Im Regelfall werden Gruppen, bei denen man Mitglied ist, auf dem eigenen Drupal-Benutzerkonto angezeigt. Auch hier fehlte die Anzeige nach dem Upgrade. Um den Fehler zu beheben, habe ich das Feld "Gruppen" in den Anzeige-Einstellungen des Benutzerkontos (admin/config/people/accounts/display) ebenfalls wieder in den richtigen Bereich verschoben.
Fehlende Berechtigungen
Um einen Beitrag einer Gruppe zuzuordnen, wird beim Erstellen des Beitrags eine 'Zielgruppe' genannt. Nach dem Upgrade konnten Gruppenmitglieder mit einer bestimmten Rolle keine Zielgruppe mehr angeben. Die technische Ursache für diese Änderung ist mir nicht klar, doch zur Lösung genügte es, für die betroffene Rolle in der OG-Konfiguration die Berechtigung "Create Gruppenbeitrag content" zu reaktivieren.
Beim Upgrade in der Live-Umgebung konnten zunächst sogar gar keine Nutzer eine Zielgruppe angeben. In der Konfigurationsoberfläche wurde das entsprechende Auswahlfeld og_group_ref als 'broken' angezeigt. In diesem Fall genügte es, den Drupal-Cache zu leeren ("a first step in troubleshooting"), und alles war wieder in Ordnung.
Ungültige Tokens
Wenn ein Benutzer zu einer Gruppe hinzugefügt wird, bekommt das neue Mitglied eine Benachrichtigungsmail, in der der Gruppenname und ein Link zur Gruppenseite genannt werden. Im Rules-Modul, mit dessen Hilfe der genannte Workflow konfiguriert wird, waren die bis zum Upgrade genutzten, gruppenbezogene Tokens (Platzhalter) nach der Aktualisierung nicht mehr gültig. Verschiedene Beiträge in der Issue queue von Organic Groups (vgl. drupal.org/node/1973686 und drupal.org/node/2222045) deuteten zudem darauf hin, dass Ersatz für die benötigten Gruppen-Tokens nicht ohne Weiteres zur Verfügung stehen würde. Wie bereits bei der Views-Konfiguration, half aber auch hier der Blick in eine Drupal-Website, die auf einer frischen OG-7.x-2.x-Installation basierte (und ebenfalls Rules einsetzte). Anhand der von OG mitgelieferten Rules-Workflows, die die gesuchten Tokens enthielten, ließ sich prima nachvollziehen, an welcher Stelle die Rules-Konfiguration angepasst werden musste, um im Zusammenspiel mit dem aktualisierten OG-Modul zu funktionieren.
Gruppenbeiträge nicht speicherbar
Nach dem Upgrade in der Live-Umgebung trat schließlich die missliche Situation ein, dass sich Gruppenbeiträge nicht mehr speichern ließen. Soweit ich beurteilen kann, ist die genaue Ursache für dieses Problem unklar. Auf drupal.org wird jedoch ein Workaround genannt, der im vorliegenden Fall hilfreich war: "Don't use the OG Reference widget for the Entity Reference field. Using the Select List widget works fine."
Fazit
War tatsächlich nicht ganz einfach, das Upgrade von Organic Groups, aber es hat geklappt, und dabei haben mir drei Dinge geholfen:
- die zum eigenen Problem passenden 'Issues' auf drupal.org,
- das Warmlaufen in einer Testumgebung und die Sicherheit, den Upgrade-Prozess mit der Hilfe von Backups schrittweise rückgängig machen zu können,
- der vergleichende Rückgriff auf eine Drupal-Umgebung, in der OG von vornherein im Versionszweig 7.x-2.x lief.
Vor allem der letztgenannte Punkt erwies sich als sehr hilfreich. In Zukunft werde ich wohl öfters ein frisches Drupal mit den jeweils benötigten Modulen installieren, um Konfigurationsfragen zu klären.