SlideShare una empresa de Scribd logo
1 de 85
Descargar para leer sin conexión
Automating Drupal Development:
 Makefiles, Features and Beyond

   Andrea Pescetti                  Antonio De Marco


                     http://nuvole.org
                       @nuvoleweb
Nuvole: Our Team




BELGIUM     ITALY
 Brussels   Parma
Clients in Europe and USA
Working with Drupal Distributions
Serving International Organizations
Serving International Organizations
Trainings on Code Driven Development
Automating Drupal Development

1. Automating code retrieval
2. Automating installation
3. Automating site configuration
4. Automating tests
1
Automating code retrieval
Core

              Modules
Contributed, Custom, Patched




               Themes


 External Libraries


Installation Profile


                        Drupal site building blocks
drupal.org                 github.com




             example.com
The best way to download code
        Introducing Drush Make
Drush Make

Drush make is a Drush command that
can create a ready-to-use Drupal site,
pulling sources from various
locations. In practical terms, this
means that it is possible to distribute
a complicated Drupal distribution as a
single text file.
Drush Make

 ‣   A single .info file to describe
     modules, dependencies and
     patches
 ‣   A one-line command to download
     contributed and custom code:
     libraries, modules, themes, etc...
Drush Make can download code
Minimal makefile: core only


; distro.make
; Usage:
; $ drush make distro.make [directory]
;

api = 2
core = 7.x

projects[drupal][type] = core
projects[drupal][version] = "7.7"
Minimal makefile: core only
$ drush make distro.make myproject

drupal-7.7 downloaded.

$ ls -al myproject

-rw-r--r--    1   ademarco   staff     174   May   16   20:04   .gitignore
drwxr-xr-x   49   ademarco   staff    1666   May   16   20:04   includes/
-rw-r--r--    1   ademarco   staff     529   May   16   20:04   index.php
-rw-r--r--    1   ademarco   staff     688   May   16   20:04   install.php
drwxr-xr-x   70   ademarco   staff    2380   May   16   20:04   misc/
drwxr-xr-x   43   ademarco   staff    1462   May   16   20:04   modules/
drwxr-xr-x    6   ademarco   staff     204   May   28   13:28   profiles/
-rw-r--r--    1   ademarco   staff    1561   May   16   20:04   robots.txt
drwxr-xr-x   13   ademarco   staff     442   May   16   20:04   scripts/
drwxr-xr-x    5   ademarco   staff     170   May   16   20:04   sites/
drwxr-xr-x    8   ademarco   staff     272   May   16   20:04   themes/
-rw-r--r--    1   ademarco   staff   19338   May   16   20:04   update.php
-rw-r--r--    1   ademarco   staff    2051   May   16   20:04   web.config
-rw-r--r--    1   ademarco   staff     417   May   16   20:04   xmlrpc.php
Downloading a module


; views.make
; Usage:
; $ drush make views.make --no-core .
;

api = 2
core = 7.x

projects[views][subdir] = contrib
projects[views][version] = 3.1
Downloading a module


$ drush make views.make --no-core .

views-7.x-3.1 downloaded.

$ ls -al sites/all/modules/contrib/views/

total 64
...
-rw-r--r--   1 ademarco     staff   16067 May 28 13:28 views.info
-rw-r--r--   1 ademarco     staff   20358 May 28 13:28 views.install
-rw-r--r--   1 ademarco     staff   78204 May 28 13:28 views.module
...
Drush Make can apply patches
Applying patches
; distro.make
; Usage:
; $ drush make distro.make [directory]
;

api = 2
core = 7.x

projects[drupal][type] = core
projects[drupal][version] = "7.7"

; Make system directories configurable to allow tests in profiles/[name]/modules
; http://drupal.org/node/911354
projects[drupal][patch][911354] = http://drupal.org/files/issues/911354.43.patch

; Missing drupal_alter() for text formats and filters
; http://drupal.org/node/903730
projects[drupal][patch][903730] = http://drupal.org/files/issues/drupal.filter-al

...
Applying patches



$ drush make distro.make myproject

drupal-7.7 downloaded.
drupal patched with 911354.43.patch.
drupal patched with drupal.filter-alter.82.patch.
drupal patched with 995156-5_portable_taxonomy_permissions.patch.
Generated PATCHES.txt file for drupal
Drush Make supports recursion
flexslider / flexslider.make


; Flex Slider

api = 2
core = 7.x

libraries[flexslider][download][type] = "get"
libraries[flexslider][download][url] = "https://github.com/.../zipball/master"
libraries[flexslider][directory_name] = "flexslider"
libraries[flexslider][type] = "library"
Downloading flexslider


; flexslider-module.make
; Usage:
; $ drush make flexslider-module.make --no-core .
;

api = 2
core = 7.x

projects[flexslider][subdir] = contrib
Recursive makefile parsing

$ drush make flexslider-module.make --no-core .

Project flexslider contains 4 modules: flexslider_views_slideshow,
flexslider_views, flexslider_fields, flexslider.
flexslider-7.x-1.0-rc3 downloaded.
Found makefile: flexslider.make
flexslider downloaded from https://github.com/.../zipball/master.

$ tree -l sites/all/

sites/all/
!"" libraries
#   %"" flexslider
...
%"" modules
    %"" contrib
        %"" flexslider
...
Drush Make supports inclusion
Including an external makefile

; distro.make
;
; $ drush make buildkit.make [directory]
;

api = 2
core = 7.x

; Include Build Kit distro makefile via URL
includes[] = http://drupalcode.org/project/buildkit.git/../7.x-2.x:/distro.make
Build Kit
Extendable distribution, reusable .make file
Your project: 2 make files

‣   distro.make: Drupal core with possible core
    patches and a link to download myproject.make
‣   myproject.make: includes BuildKit’s
    drupal-org.make plus project-specific modules and
    themes
drush make distro.make
Found myproject.make




drush make distro.make
Run myproject.make




Found myproject.make




drush make distro.make
2
Automating installation
Installation Profile
Installation profile components

$ tree myproject-profile

myproject-profile
!"" README.txt
!"" distro.make
!"" drushrc.php
!"" myproject.info
!"" myproject.install
!"" myproject.make
%"" myproject.profile
Profiles: just like modules

 ‣   An .info file to specify installation
     dependencies
 ‣   An .install file to perform
     installation tasks and upgrades
 ‣   Fully customizable via .profile files
 ‣   Can include makefiles and other
     stuff
myproject.info

name = Myproject
core = 7.x
description = Myproject installation profile.

; Core
dependencies[] = book
dependencies[] = field_ui
dependencies[] = file
...

; Contrib
dependencies[] = admin
dependencies[] = colorbox
dependencies[] = ds
...

; Features
dependencies[] = myproject_core
dependencies[] = myproject_blog
myproject.profile


/**
  * Implements hook_install()
  */
function myproject_install() {
   // Enable custom theme
   theme_enable(array('custom_theme'));
   variable_set('theme_default', 'custom_theme');
}
myproject.profile
/**
 * Implements hook_form_FORM_ID_alter().
 */
function myproject_form_install_configure_form_alter(&$form, $form_state) {

    $form['site_information']['site_name']
         ['#default_value'] = 'Drupalissimo';
    $form['site_information']
         ['site_mail']['#default_value'] = 'info@drupalissimo.com';

    $form['admin_account']['account']
         ['name']['#default_value'] = 'admin';
    $form['admin_account']['account']
         ['mail']['#default_value'] = 'dev@nuvole.org';

    $form['update_notifications']
         ['update_status_module']['#default_value'] = array(1 => FALSE, 2 => FALSE
}
myproject.install


/**
  * Implements hook_install_tasks()
  */
function myproject_install_tasks() {
   return array(
      'myproject_create_terms' => array(
         'display_name' => st('Create taxonomy terms'),
      ),
      ...
   );
}
myproject.install
/**
 * Implements hook_install_tasks() callback
 */
function myproject_create_terms() {
  $terms = array();
  $vocabulary = taxonomy_vocabulary_machine_name_load('category');

    $terms[] = 'Solution';
    $terms[] = 'Client';
    $terms[] = 'Use case';

    foreach ($terms as $name) {
      $term = new stdClass();
      $term->vid = $vocabulary->vid;
      $term->name = $name;
      taxonomy_term_save($term);
    }
}
Introducing Drush Bake
          A Drush command by Nuvole
to create installation profiles based on templates
Installation profile template
$ git clone git.nuvole.org:/var/git/starter-profile.git

...

$ tree starter-profile

starter-profile/
!"" README.txt
!"" distro.make
!"" drushrc.php
!"" starter.info
!"" starter.install
!"" starter.make
%"" starter.profile
Bootstrap your project in 3 steps



$ drush bake starter-profile/distro.make myproject

$ git nuvole myproject-profile

$ drush make myproject-profile/distro.make myproject
3
Automating site configuration
Features
The best way to package configuration
What is a feature?
‣   A collection of Drupal elements
    which taken together satisfy a
    certain use-case.
‣   A modular piece of functionality for
    a Drupal site.
‣   A way to export configuration into
    PHP code, in the form of a module.
‣   http://drupal.org/project/features
Configuration in Database
Packaged as Features
A feature can have a .make file too
       Drush Make operates recursively
api = 2
core = 7.x

; Modules =====================================================================

projects[colorbox][subdir] = contrib
projects[colorbox][version] = 1.0-beta4

projects[insert][subdir] = contrib
projects[insert][version] = 1.1



; Libraries ===================================================================

libraries[colorbox_library][download][type] = "get"
libraries[colorbox_library][download][url] = "http://colorpowered.com/colorbox/
libraries[colorbox_library][directory_name] = "colorbox"
libraries[colorbox_library][destination] = "libraries"




                       feature_core.make
      A feature can specify where to find its own dependencies
How to download your projects
 from any custom repository
$ cat starter-profile/starter.make

api = 2
core = 7.x

; Build Kit ===================================================================

includes[] = http://drupalcode.org/project/buildkit.git/blob_plain/refs/heads/7.x

; Modules =====================================================================

projects[libraries][subdir] = contrib
projects[libraries][version] = 1.0

; Features ====================================================================

projects[feature_core][type] = module
projects[feature_core][subdir] = features
projects[feature_core][download][type] = "git"
projects[feature_core][download][url] = git.nuvole.org:/var/git/feature_core.git

; Themes ======================================================================

projects[twist][type] = theme
projects[twist][download][type] = git
projects[twist][download][url] = git.nuvole.org:/var/git/twist.git
Introducing Feature Servers
Keep features, themes, makefiles, etc... organized.
$ cat starter-profile/starter.make

api = 2
core = 7.x

; Build Kit ===================================================================

includes[] = http://drupalcode.org/project/buildkit.git/blob_plain/refs/heads/7.x-

; Modules =====================================================================

projects[libraries][subdir] = contrib
projects[libraries][version] = 1.0

; Features ====================================================================

projects[feature_core][subdir] = features
projects[feature_core][location] = http://fserver.nuvole.org/fserver

; Themes ======================================================================

projects[twist][type] = theme
projects[twist][location] = http://fserver.nuvole.org/fserver
4
Automating tests
Don't depend on trust
 Automatically test every component
Meet Continuous Integration (CI)

Use Hudson/Jenkins to automatically test:
 1. Makefile
 2. Installation
 3. Configuration
Building a CI Job

‣   Create a job for testing your site
‣   Triggered:
    ‣   Manually
    ‣   Scheduled
    ‣   By events (git push or other jobs)
‣   A job can consist of ant scripts or simple shell
    commands (including drush)
Test #1: Makefile

‣   Clone your code from git
‣   Run drush make
‣   Test that the profile is downloaded
‣   Test that modules are placed in the expected
    folders
Test #1: Shell commands

‣   drush -y --pipe make distro.make
‣   test -d profiles/myproject
‣   test -d profiles/myproject/modules/contrib
‣   test -d profiles/myproject/modules/custom
‣   test -d profiles/myproject/modules/features
Test #2: Installation

‣   Triggered by successful completion of Test #1
‣   Run drush site-install:

    drush -y site-install ... myproject
‣   Expect successful completion
Test #3: Configuration

‣   Triggered by successful completion of Test #2
‣   Relies on simpletest
‣   Run drush test-run
‣   Expect successful completion
Thank You.

More on Code-Driven Development
http://nuvole.org/blog
http://nuvole.org/trainings

Más contenido relacionado

La actualidad más candente

Webinar - Managing Files with Puppet
Webinar - Managing Files with PuppetWebinar - Managing Files with Puppet
Webinar - Managing Files with Puppet
OlinData
 
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
Graham Dumpleton
 
2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku
ronnywang_tw
 
Nginx 0.8.x 安装手册
Nginx 0.8.x 安装手册Nginx 0.8.x 安装手册
Nginx 0.8.x 安装手册
Yiwei Ma
 

La actualidad más candente (20)

Czym jest webpack i dlaczego chcesz go używać?
Czym jest webpack i dlaczego chcesz go używać?Czym jest webpack i dlaczego chcesz go używać?
Czym jest webpack i dlaczego chcesz go używać?
 
Towards the perfect Drupal Dev Machine
Towards the perfect Drupal Dev MachineTowards the perfect Drupal Dev Machine
Towards the perfect Drupal Dev Machine
 
Webinar - Managing Files with Puppet
Webinar - Managing Files with PuppetWebinar - Managing Files with Puppet
Webinar - Managing Files with Puppet
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Contributing to WordPress Core - Peter Wilson
Contributing to WordPress Core - Peter WilsonContributing to WordPress Core - Peter Wilson
Contributing to WordPress Core - Peter Wilson
 
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
 
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)
 
Configuration Management in Drupal 8: A preview (DrupalCamp Alpe Adria 2014)
Configuration Management in Drupal 8: A preview (DrupalCamp Alpe Adria 2014)Configuration Management in Drupal 8: A preview (DrupalCamp Alpe Adria 2014)
Configuration Management in Drupal 8: A preview (DrupalCamp Alpe Adria 2014)
 
2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku2012 coscup - Build your PHP application on Heroku
2012 coscup - Build your PHP application on Heroku
 
Composer
ComposerComposer
Composer
 
GIT, RVM, FIRST HEROKU APP
GIT, RVM, FIRST HEROKU APPGIT, RVM, FIRST HEROKU APP
GIT, RVM, FIRST HEROKU APP
 
Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)Assetic (Symfony Live Paris)
Assetic (Symfony Live Paris)
 
Nginx 0.8.x 安装手册
Nginx 0.8.x 安装手册Nginx 0.8.x 安装手册
Nginx 0.8.x 安装手册
 
Ansible : what's ansible & use case by REX
Ansible :  what's ansible & use case by REXAnsible :  what's ansible & use case by REX
Ansible : what's ansible & use case by REX
 
Webinar - Windows Application Management with Puppet
Webinar - Windows Application Management with PuppetWebinar - Windows Application Management with Puppet
Webinar - Windows Application Management with Puppet
 
Efficient DBA: Gain Time by Reducing Command-Line Keystrokes
Efficient DBA: Gain Time by Reducing Command-Line KeystrokesEfficient DBA: Gain Time by Reducing Command-Line Keystrokes
Efficient DBA: Gain Time by Reducing Command-Line Keystrokes
 
Webinar - Manage user, groups, packages in windows using puppet
Webinar - Manage user, groups, packages in windows using puppetWebinar - Manage user, groups, packages in windows using puppet
Webinar - Manage user, groups, packages in windows using puppet
 
Create Development and Production Environments with Vagrant
Create Development and Production Environments with VagrantCreate Development and Production Environments with Vagrant
Create Development and Production Environments with Vagrant
 
Creating and Deploying Static Sites with Hugo
Creating and Deploying Static Sites with HugoCreating and Deploying Static Sites with Hugo
Creating and Deploying Static Sites with Hugo
 
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
Puppet Camp Phoenix 2015: Managing Files via Puppet: Let Me Count The Ways (B...
 

Destacado

Destacado (9)

[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
 
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
 
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAIDrupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
 
[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces
 
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
 
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance![drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance!
 

Similar a Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond

Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
camp_drupal_ua
 
Drush. Why should it be used?
Drush. Why should it be used?Drush. Why should it be used?
Drush. Why should it be used?
Sergei Stryukov
 

Similar a Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond (20)

[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
 
Building and Maintaining a Distribution in Drupal 7 with Features
Building and Maintaining a  Distribution in Drupal 7 with FeaturesBuilding and Maintaining a  Distribution in Drupal 7 with Features
Building and Maintaining a Distribution in Drupal 7 with Features
 
Using Composer with Drupal and Drush
Using Composer with Drupal and DrushUsing Composer with Drupal and Drush
Using Composer with Drupal and Drush
 
Hands on Docker - Launch your own LEMP or LAMP stack
Hands on Docker -  Launch your own LEMP or LAMP stackHands on Docker -  Launch your own LEMP or LAMP stack
Hands on Docker - Launch your own LEMP or LAMP stack
 
Development Setup of B-Translator
Development Setup of B-TranslatorDevelopment Setup of B-Translator
Development Setup of B-Translator
 
Lean Drupal Repositories with Composer and Drush
Lean Drupal Repositories with Composer and DrushLean Drupal Repositories with Composer and Drush
Lean Drupal Repositories with Composer and Drush
 
Zend Framework 1.9 Setup & Using Zend_Tool
Zend Framework 1.9 Setup & Using Zend_ToolZend Framework 1.9 Setup & Using Zend_Tool
Zend Framework 1.9 Setup & Using Zend_Tool
 
Secure your site
Secure your siteSecure your site
Secure your site
 
Improving your Drupal 8 development workflow DrupalCampLA
Improving your Drupal 8 development workflow DrupalCampLAImproving your Drupal 8 development workflow DrupalCampLA
Improving your Drupal 8 development workflow DrupalCampLA
 
Introduction to Drupal - Installation, Anatomy, Terminologies
Introduction to Drupal - Installation, Anatomy, TerminologiesIntroduction to Drupal - Installation, Anatomy, Terminologies
Introduction to Drupal - Installation, Anatomy, Terminologies
 
Hands on Docker - Launch your own LEMP or LAMP stack - SunshinePHP
Hands on Docker - Launch your own LEMP or LAMP stack - SunshinePHPHands on Docker - Launch your own LEMP or LAMP stack - SunshinePHP
Hands on Docker - Launch your own LEMP or LAMP stack - SunshinePHP
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
Asian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On UblAsian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On Ubl
 
Building a Drupal Distribution using Features, Drush Make, Installation Profi...
Building a Drupal Distribution using Features, Drush Make, Installation Profi...Building a Drupal Distribution using Features, Drush Make, Installation Profi...
Building a Drupal Distribution using Features, Drush Make, Installation Profi...
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
Sergei Stryukov.Drush.Why it should be used.DrupalCamp Kyiv 2011
 
Composer Tools & Frameworks for Drupal
Composer Tools & Frameworks for DrupalComposer Tools & Frameworks for Drupal
Composer Tools & Frameworks for Drupal
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Drupal 8 improvements for developer productivity php symfony and more
Drupal 8 improvements for developer productivity  php symfony and moreDrupal 8 improvements for developer productivity  php symfony and more
Drupal 8 improvements for developer productivity php symfony and more
 
Drush. Why should it be used?
Drush. Why should it be used?Drush. Why should it be used?
Drush. Why should it be used?
 

Más de DrupalDay

Más de DrupalDay (20)

[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
 
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più
 
[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders
 
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
 
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal![drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
 
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio
 
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
 
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework
 
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
Da X a Drupal 8, migra tutto e vivi sereno
Da X a Drupal 8, migra tutto e vivi serenoDa X a Drupal 8, migra tutto e vivi sereno
Da X a Drupal 8, migra tutto e vivi sereno
 
Once you go cloud you never go down
Once you go cloud you never go downOnce you go cloud you never go down
Once you go cloud you never go down
 
Tooling per il tema in Drupal 8
Tooling per il tema in Drupal 8Tooling per il tema in Drupal 8
Tooling per il tema in Drupal 8
 
Come progettare e realizzare una distribuzione in Drupal 8
Come progettare e realizzare una distribuzione in Drupal 8Come progettare e realizzare una distribuzione in Drupal 8
Come progettare e realizzare una distribuzione in Drupal 8
 
Drupal per la PA
Drupal per la PADrupal per la PA
Drupal per la PA
 
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case studyMantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
 
Invisiblefarm condivide l'esperienza DrupalGIS
Invisiblefarm condivide l'esperienza DrupalGISInvisiblefarm condivide l'esperienza DrupalGIS
Invisiblefarm condivide l'esperienza DrupalGIS
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Último (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 

Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond

  • 1. Automating Drupal Development: Makefiles, Features and Beyond Andrea Pescetti Antonio De Marco http://nuvole.org @nuvoleweb
  • 2. Nuvole: Our Team BELGIUM ITALY Brussels Parma
  • 4. Working with Drupal Distributions
  • 7. Trainings on Code Driven Development
  • 8. Automating Drupal Development 1. Automating code retrieval 2. Automating installation 3. Automating site configuration 4. Automating tests
  • 10. Core Modules Contributed, Custom, Patched Themes External Libraries Installation Profile Drupal site building blocks
  • 11. drupal.org github.com example.com
  • 12. The best way to download code Introducing Drush Make
  • 13.
  • 14. Drush Make Drush make is a Drush command that can create a ready-to-use Drupal site, pulling sources from various locations. In practical terms, this means that it is possible to distribute a complicated Drupal distribution as a single text file.
  • 15. Drush Make ‣ A single .info file to describe modules, dependencies and patches ‣ A one-line command to download contributed and custom code: libraries, modules, themes, etc...
  • 16. Drush Make can download code
  • 17. Minimal makefile: core only ; distro.make ; Usage: ; $ drush make distro.make [directory] ; api = 2 core = 7.x projects[drupal][type] = core projects[drupal][version] = "7.7"
  • 18. Minimal makefile: core only $ drush make distro.make myproject drupal-7.7 downloaded. $ ls -al myproject -rw-r--r-- 1 ademarco staff 174 May 16 20:04 .gitignore drwxr-xr-x 49 ademarco staff 1666 May 16 20:04 includes/ -rw-r--r-- 1 ademarco staff 529 May 16 20:04 index.php -rw-r--r-- 1 ademarco staff 688 May 16 20:04 install.php drwxr-xr-x 70 ademarco staff 2380 May 16 20:04 misc/ drwxr-xr-x 43 ademarco staff 1462 May 16 20:04 modules/ drwxr-xr-x 6 ademarco staff 204 May 28 13:28 profiles/ -rw-r--r-- 1 ademarco staff 1561 May 16 20:04 robots.txt drwxr-xr-x 13 ademarco staff 442 May 16 20:04 scripts/ drwxr-xr-x 5 ademarco staff 170 May 16 20:04 sites/ drwxr-xr-x 8 ademarco staff 272 May 16 20:04 themes/ -rw-r--r-- 1 ademarco staff 19338 May 16 20:04 update.php -rw-r--r-- 1 ademarco staff 2051 May 16 20:04 web.config -rw-r--r-- 1 ademarco staff 417 May 16 20:04 xmlrpc.php
  • 19. Downloading a module ; views.make ; Usage: ; $ drush make views.make --no-core . ; api = 2 core = 7.x projects[views][subdir] = contrib projects[views][version] = 3.1
  • 20. Downloading a module $ drush make views.make --no-core . views-7.x-3.1 downloaded. $ ls -al sites/all/modules/contrib/views/ total 64 ... -rw-r--r-- 1 ademarco staff 16067 May 28 13:28 views.info -rw-r--r-- 1 ademarco staff 20358 May 28 13:28 views.install -rw-r--r-- 1 ademarco staff 78204 May 28 13:28 views.module ...
  • 21. Drush Make can apply patches
  • 22. Applying patches ; distro.make ; Usage: ; $ drush make distro.make [directory] ; api = 2 core = 7.x projects[drupal][type] = core projects[drupal][version] = "7.7" ; Make system directories configurable to allow tests in profiles/[name]/modules ; http://drupal.org/node/911354 projects[drupal][patch][911354] = http://drupal.org/files/issues/911354.43.patch ; Missing drupal_alter() for text formats and filters ; http://drupal.org/node/903730 projects[drupal][patch][903730] = http://drupal.org/files/issues/drupal.filter-al ...
  • 23. Applying patches $ drush make distro.make myproject drupal-7.7 downloaded. drupal patched with 911354.43.patch. drupal patched with drupal.filter-alter.82.patch. drupal patched with 995156-5_portable_taxonomy_permissions.patch. Generated PATCHES.txt file for drupal
  • 24. Drush Make supports recursion
  • 25.
  • 26.
  • 27. flexslider / flexslider.make ; Flex Slider api = 2 core = 7.x libraries[flexslider][download][type] = "get" libraries[flexslider][download][url] = "https://github.com/.../zipball/master" libraries[flexslider][directory_name] = "flexslider" libraries[flexslider][type] = "library"
  • 28. Downloading flexslider ; flexslider-module.make ; Usage: ; $ drush make flexslider-module.make --no-core . ; api = 2 core = 7.x projects[flexslider][subdir] = contrib
  • 29. Recursive makefile parsing $ drush make flexslider-module.make --no-core . Project flexslider contains 4 modules: flexslider_views_slideshow, flexslider_views, flexslider_fields, flexslider. flexslider-7.x-1.0-rc3 downloaded. Found makefile: flexslider.make flexslider downloaded from https://github.com/.../zipball/master. $ tree -l sites/all/ sites/all/ !"" libraries #   %"" flexslider ... %"" modules %"" contrib %"" flexslider ...
  • 30. Drush Make supports inclusion
  • 31. Including an external makefile ; distro.make ; ; $ drush make buildkit.make [directory] ; api = 2 core = 7.x ; Include Build Kit distro makefile via URL includes[] = http://drupalcode.org/project/buildkit.git/../7.x-2.x:/distro.make
  • 32. Build Kit Extendable distribution, reusable .make file
  • 33.
  • 34. Your project: 2 make files ‣ distro.make: Drupal core with possible core patches and a link to download myproject.make ‣ myproject.make: includes BuildKit’s drupal-org.make plus project-specific modules and themes
  • 40.
  • 41. Installation profile components $ tree myproject-profile myproject-profile !"" README.txt !"" distro.make !"" drushrc.php !"" myproject.info !"" myproject.install !"" myproject.make %"" myproject.profile
  • 42. Profiles: just like modules ‣ An .info file to specify installation dependencies ‣ An .install file to perform installation tasks and upgrades ‣ Fully customizable via .profile files ‣ Can include makefiles and other stuff
  • 43. myproject.info name = Myproject core = 7.x description = Myproject installation profile. ; Core dependencies[] = book dependencies[] = field_ui dependencies[] = file ... ; Contrib dependencies[] = admin dependencies[] = colorbox dependencies[] = ds ... ; Features dependencies[] = myproject_core dependencies[] = myproject_blog
  • 44. myproject.profile /** * Implements hook_install() */ function myproject_install() { // Enable custom theme theme_enable(array('custom_theme')); variable_set('theme_default', 'custom_theme'); }
  • 45. myproject.profile /** * Implements hook_form_FORM_ID_alter(). */ function myproject_form_install_configure_form_alter(&$form, $form_state) { $form['site_information']['site_name'] ['#default_value'] = 'Drupalissimo'; $form['site_information'] ['site_mail']['#default_value'] = 'info@drupalissimo.com'; $form['admin_account']['account'] ['name']['#default_value'] = 'admin'; $form['admin_account']['account'] ['mail']['#default_value'] = 'dev@nuvole.org'; $form['update_notifications'] ['update_status_module']['#default_value'] = array(1 => FALSE, 2 => FALSE }
  • 46.
  • 47. myproject.install /** * Implements hook_install_tasks() */ function myproject_install_tasks() { return array( 'myproject_create_terms' => array( 'display_name' => st('Create taxonomy terms'), ), ... ); }
  • 48.
  • 49. myproject.install /** * Implements hook_install_tasks() callback */ function myproject_create_terms() { $terms = array(); $vocabulary = taxonomy_vocabulary_machine_name_load('category'); $terms[] = 'Solution'; $terms[] = 'Client'; $terms[] = 'Use case'; foreach ($terms as $name) { $term = new stdClass(); $term->vid = $vocabulary->vid; $term->name = $name; taxonomy_term_save($term); } }
  • 50.
  • 51. Introducing Drush Bake A Drush command by Nuvole to create installation profiles based on templates
  • 52. Installation profile template $ git clone git.nuvole.org:/var/git/starter-profile.git ... $ tree starter-profile starter-profile/ !"" README.txt !"" distro.make !"" drushrc.php !"" starter.info !"" starter.install !"" starter.make %"" starter.profile
  • 53. Bootstrap your project in 3 steps $ drush bake starter-profile/distro.make myproject $ git nuvole myproject-profile $ drush make myproject-profile/distro.make myproject
  • 55. Features The best way to package configuration
  • 56.
  • 57. What is a feature? ‣ A collection of Drupal elements which taken together satisfy a certain use-case. ‣ A modular piece of functionality for a Drupal site. ‣ A way to export configuration into PHP code, in the form of a module. ‣ http://drupal.org/project/features
  • 60.
  • 61. A feature can have a .make file too Drush Make operates recursively
  • 62.
  • 63. api = 2 core = 7.x ; Modules ===================================================================== projects[colorbox][subdir] = contrib projects[colorbox][version] = 1.0-beta4 projects[insert][subdir] = contrib projects[insert][version] = 1.1 ; Libraries =================================================================== libraries[colorbox_library][download][type] = "get" libraries[colorbox_library][download][url] = "http://colorpowered.com/colorbox/ libraries[colorbox_library][directory_name] = "colorbox" libraries[colorbox_library][destination] = "libraries" feature_core.make A feature can specify where to find its own dependencies
  • 64. How to download your projects from any custom repository
  • 65. $ cat starter-profile/starter.make api = 2 core = 7.x ; Build Kit =================================================================== includes[] = http://drupalcode.org/project/buildkit.git/blob_plain/refs/heads/7.x ; Modules ===================================================================== projects[libraries][subdir] = contrib projects[libraries][version] = 1.0 ; Features ==================================================================== projects[feature_core][type] = module projects[feature_core][subdir] = features projects[feature_core][download][type] = "git" projects[feature_core][download][url] = git.nuvole.org:/var/git/feature_core.git ; Themes ====================================================================== projects[twist][type] = theme projects[twist][download][type] = git projects[twist][download][url] = git.nuvole.org:/var/git/twist.git
  • 66. Introducing Feature Servers Keep features, themes, makefiles, etc... organized.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71. $ cat starter-profile/starter.make api = 2 core = 7.x ; Build Kit =================================================================== includes[] = http://drupalcode.org/project/buildkit.git/blob_plain/refs/heads/7.x- ; Modules ===================================================================== projects[libraries][subdir] = contrib projects[libraries][version] = 1.0 ; Features ==================================================================== projects[feature_core][subdir] = features projects[feature_core][location] = http://fserver.nuvole.org/fserver ; Themes ====================================================================== projects[twist][type] = theme projects[twist][location] = http://fserver.nuvole.org/fserver
  • 73. Don't depend on trust Automatically test every component
  • 74. Meet Continuous Integration (CI) Use Hudson/Jenkins to automatically test: 1. Makefile 2. Installation 3. Configuration
  • 75.
  • 76. Building a CI Job ‣ Create a job for testing your site ‣ Triggered: ‣ Manually ‣ Scheduled ‣ By events (git push or other jobs) ‣ A job can consist of ant scripts or simple shell commands (including drush)
  • 77.
  • 78. Test #1: Makefile ‣ Clone your code from git ‣ Run drush make ‣ Test that the profile is downloaded ‣ Test that modules are placed in the expected folders
  • 79. Test #1: Shell commands ‣ drush -y --pipe make distro.make ‣ test -d profiles/myproject ‣ test -d profiles/myproject/modules/contrib ‣ test -d profiles/myproject/modules/custom ‣ test -d profiles/myproject/modules/features
  • 80.
  • 81. Test #2: Installation ‣ Triggered by successful completion of Test #1 ‣ Run drush site-install: drush -y site-install ... myproject ‣ Expect successful completion
  • 82.
  • 83. Test #3: Configuration ‣ Triggered by successful completion of Test #2 ‣ Relies on simpletest ‣ Run drush test-run ‣ Expect successful completion
  • 84.
  • 85. Thank You. More on Code-Driven Development http://nuvole.org/blog http://nuvole.org/trainings