Tel. 06151 / 39 10 793

Drupal Installation Profiles u. Drush steigern Produktivität

Damit wir in unserer täglichen Arbeit mit Drupal zur Projektinitialisierung nicht immer die gleichen Dinge tun müssen, haben wir nun angefangen, das Aufsetzen eines Projektes zu automatisieren. Installationsprofile sind cool, Sie aktivieren die nötigen Module. Drush ist auch cool, der User muss aber auf die Command Line Zugriff haben. Besser wäre es, wenn man Installationsprofil hat und dort die Module automatisch herunterladen kann damit die Requirements des Installationsprofils zur Installtion von Drupal erfüllt sind. Unsere Idee war es nun also, Drush in die Installationsprofile zu integrieren um unsere Produktivität in der Drupal Entwicklung zu steigern. Das möchte ich hier kurz Beschreiben.

Bis vor kurzem hatten wir in unserem Intranet eine Drupal Installationsanleitung. All die dort aufgeführten Schritte wurden zu jedem Projektstart manuell abgearbeitet, was mindestens eine Stunde in Anspruch nah, wenn nicht sogar mehr (wir haben es nie genau gemessen). Es wurde lediglich in der Modulauswahl und der Konfiguration aller Einstellungen rund um Benutzer unterschieden, wenn das Projekt eine Community werden sollte. Das schreit natürlich nur so nach Automatisierung.
Wir haben also eine Drupal Development-Installation in unserer internen VMWare Cloud aufgesetzt und diese so konfiguriert, wie wir es für alle Projekte benötigen. Quasi den kleinsten gemeinsamen Nenner in der Drupal Konfiguration hergestellt.
Dann habe ich das Modul Profile Generator entdeckt und verwendet um aus der bestehenden Installation zunächst mal ein Installtionsprofil zu erstellen um zu sehen, was so möglich ist und wie solch ein Profil aussieht (ich hatte damit noch keine Erfahrung gesammelt). Wer schonmal ein eigenes Modul geschrieben hat, wird auch darin schnell zurecht finden. Dabei wurden natürlich auch alle Variablen exportiert, die Drupal ohnehin per Default in der Installation setzt, aber das sollte nicht das Problem sein. Also habe ich das Profil bereinigt, so dass nur das Nötigste darin steht, was das Installationsprofil sehr übersichtlich macht.
Dann habe ich folgende Zeile entdeckt:

function bs_profile_website_profile_modules() {
  return array(0 => 'admin_menu', 1 => 'block' ..... ),

Das sind die Module, die beim Durchlauf des Installationsprofils aktiviert werden. Nach dem diese Funktion ausgeführt wurde, wird mit dem Rückgabewert, also der Modulliste geprüft, ob auch alle Module vorhanden sind. Nun möchte ich natürlich nicht alle Module herunterladen..ok das könnte ich mit einem Drush Script oder mit Drush make machen, aber dazu habe ich wieder das oben genannte Konsolenproblem für nicht "Command Line bewanderte User". Ich möchte ja, dass User, die keine Erfahrung mit der Konsole haben, schnell die Installtion durchführen können, alle Module schon heruntergeladen, installiert und konfiguriert bekommen.

Drush dl direkt im Installation Profile ausführen

Also habe ich die oben angedeutete Funktion etwas erweitert. Voraussetzung ist, dass Drush auf dem Ziel-Server installiert ist.

function bs_profile_website_profile_modules() {   
  $modules = array ( 0 => 'admin_menu', 1 => 'block', 2 => ... 60 => 'install_profile_api');

  $extraModules = array('cck');
 
  //manche Module die aktiviert werden sollen sind submodule und somit nciht extra downloadbar!
  $drushIgnoreModules = array('content', 'content_copy', ....);
 
  foreach ($modules as $module)
  {
    if (in_array($module, $drushIgnoreModules))
      continue;  //submodule etc

//nur, wenn das Modul nicht schon da ist!
if (!file_exists("sites/all/modules/".$module) && !file_exists("modules/".$module)) //nicht als contrib module und nicht im core
{
  system('drush dl '.$module, $systemout);
}
  }
 
  foreach ($extraModules as $module)
  {
    if (in_array($module, $drushIgnoreModules))
continue;  //submodule etc

//nur, wenn das Modul nicht schon da ist!
if (!file_exists("sites/all/modules/".$module) && !file_exists("modules/".$module)) //nicht als contrib module und nicht im core
  system('drush dl '.$module, $systemout);
  }
 
  //das Modul pathauto muss noch die Datei i18n-ascii.example.txt in i18n-ascii.txt umbenennen
  $modPath = "sites/all/modules/pathauto";
  $from = $modPath."/i18n-ascii.example.txt";
  $to = $modPath."/i18n-ascii.txt";
  if (file_exists($from))
     rename($from, $to);  

  //Modifications on Rights
  system('chmown -R www-data:www-data *', $systemout);
  system('chmod -R 770 *', $systemout);
 
  return $modules;
}

Kurze Erklärung dazu. Mit dem PHP Befehl system('drush....'); führe ich drush Befehle aus, direkt im Installations-Profil. Da die Liste der zu aktivierenden Module auch Submodule enthällt, die nicht mit drush dl heruntergeladen werden können (wie z.B. content und content_copy (was ein Teil von CCK ist) habe ich eine Drush Ignore Liste erstellt. Diese Module und alle Module die sich bereits im Ordner modules oder sites/all/modules befinden werden nicht nochmal mit drush dl heruntergeladen.
Nachdem dann alle Module mit Drush heruntergeladen wurden, setze ich noch so die Rechte, dass ein www-data user (z.B. der Entwickler, der Drupal installiert) diese auch ggf. löschen kann, wenn er Sie nicht braucht.

Aegir habe ich noch nicht angeschaut, scheint mir aber eher eine Hostinglösung zu sein, als etwas, was man mal eben schnell in der Entwicklung einsetzt. Multisite verwenden wir in den Projekten auch nur selten, darauf baut Aegir aber wohl auf, wenn ich da richtig informiert bin. Aegir steht aber auch noch auf meiner Todo-Liste, ich werde mir das also auch die kommenden Tage mal ansehen.

Ausblick
Das war nun mal der Einstiegt. Ob der Ansatz gut ist, werden wir ab 2011 in der Entwicklung feststellen. Ich bin mir jedoch sicher, dass das Verwenden von Drush und Installation Profil einiges an Zeit sparen wird, gerade bei kleinen Projekten wie Unternehmenswebseiten. Das automatische Konfigurieren sollte dann auch für weniger Fehler sorgen. Immer wieder gesehen z.B. die Seite /node welche noch Testinhalte enthällt, wird durch das Modul nice frontpage behoben und niemand braucht sich mehr darum kümmern.

Ich glaube ich muss mich unbedingt einmal mit Drush und der vorgestellten Lösung beschäftigen.

Kapiere ich das richtig, daß bei Verwendung des Installationsprofils keine Kommandozeile benötigt wird und das ganze somit auch auf normalem Webspace klappt?

Übrigends würde ich die Datei "i18n-ascii.txt" nicht mehr im Modulordner ablegen. Inzwischen wird vom Modul beispielsweise auch die Möglichkeit geboten, diese im Ordner sites/default abzulegen, was meiner Meinung nach bei Updates wesentlich komfortabler ist.

Bild von pistner

Hallo Jan,

bei installtionsprofilen benötigst du keine Kommandozeile. Wenn du Drush befehle mit System integrierst, muss auf dem Host Drush installiert sein, wozu du Zugriff auf die Kommanddozeile brauchst.

Danke für den Tip mit der Datei i18n-ascii.txt, auch das könnte man ja im Installationsprofil automatisieren.

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
CAPTCHA
Diese Frage hat den Zweck zu testen, ob Sie ein menschlicher Benutzer sind und um automatisierten Spam vorzubeugen.
So finden Sie uns