Drupal 8: dal download del core alla pubblicazione in produzioneCos’è cambiato rispetto a Drupal 7
Chi sono
Vincenzo Di Biaggio@vincenzodb
Software Developer @SparkFabrik - MilanoDrupal Social Club https://www.facebook.com/sparkfabrik/
Software: https://github.com/vincenzodibiaggioVideogiochi: http://steamcommunity.com/id/vincenzodb/Foto: https://500px.com/vincenzodbMusica: http://www.last.fm/it/user/vincenzodb
Scaletta
- La “rivoluzione” Drupal 8 ha portato con se- La gestione del Core di Drupal come dipendenza - Il Configuration Management System- I Moduli espongono le proprie configurazioni nativamente su file di testo
Configurazione?
“A configuration is neither cache or content, but everything that is left”
@alexpott
Scaletta
- La “rivoluzione” Drupal 8 ha portato con se - Il Configuration Management System- I Moduli espongono le proprie configurazioni nativamente su file di testo
- Come cambiano le nostre Feature- Il nostro modulo non conterrà più le configurazioni dei moduli- Le feature organizzeranno le configurazioni- Mediante i bundle potremo pubblicare un set di funzionalità replicabili
Scaletta
- La “rivoluzione” Drupal 8 ha portato con se - Il Configuration Management System- I Moduli espongono le proprie configurazioni nativamente su file di testo
- Come cambiano le nostre Feature- Il nostro modulo non conterrà più le configurazioni dei moduli- Le feature organizzeranno le configurazioni- Mediante i bundle potremo pubblicare un set di funzionalità replicabili
- Organizzazione degli ambienti e replicazione della configurazione- Organizzazione delle dipendenze applicative con Docker- Sistema di build- Automatizzazione della pubblicazione
La “rivoluzione” Drupal 8
Il Configuration Management System
● Esportazione / Importazione configurazione● Esportazione / Importazione singoli componenti● Gestione degli override della configurazione
CMS - File di configurazioneuuid: 2f915dc3-f384-4e14-a700-d06c3f8e47d7langcode: enstatus: truedependencies: { }id: authenticatedlabel: 'Authenticated user'weight: 1is_admin: falsepermissions: - 'access content' - 'use text format basic_html' - 'access comments' - 'post comments' - 'skip comment approval' - 'access site-wide contact form' - 'access shortcuts' - 'search content'
user.role.authenticated.yml
Con gli esempi si fa prima
Modulo: Drupal Day 2015
Content type: Drupal Day Article
● Title● Body● Image● Category - Taxonomy Vocabulary Drupal Day Taxonomy
Con gli esempi si fa prima / 2
Modulo: Drupal Day 2015
● View ○ Last Entries ○ Content Type: Drupal Day Article
● Menu Item○ Last Entries
Premesse
● Replicazione delle funzionalità su vari ambienti● Facilità di pubblicazione
Gestione della configurazione
Drupal 7
● Configurazione nel Database● Nessuna gestione della configurazione per poterla esportare / importare /
replicare● Ripetizione delle azioni di configurazione del core e dei moduli in stage /
produzione per poter replicare le funzionalità
Modulo Features
Drupal 7
● Esportazione dei valori di configurazione dei componenti del core● Esportazione dei valori di configurazione dei componenti dei moduli contrib o
custom che espongono la propria configurazione● Organizzazione delle configurazioni esportate all’interno di moduli custom● Abilitazione del modulo contenente le feature = replicazione delle feature
Gestione della configurazione
Drupal 8
● Gestisce la configurazione di una installazione Drupal ○ Proprietà dei componenti○ Variabili○ Override dei valori
● Esportazione / Importazione configurazione● Sincronizzazione della configurazione● Gli sviluppatori non devono far altro che dichiarare le configurazioni di un modulo
(obbligatorio comunque per falo funzionare)● Esportazione + importazione in remoto = replicazione delle feature
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
DEFAULT SU DATABASE
Gestione della configurazione
Drupal 8
sites/default/services.yml
services: config.storage: class: Drupal\Core\Config\CachedStorage arguments: ['@config.storage.active', '@cache.config'] config.storage.active: class: Drupal\Core\Config\FileStorage factory: Drupal\Core\Config\FileStorageFactory::getActive
Gestione della configurazione
Drupal 8
sites/default/settings.php
$config_directories = array( CONFIG_ACTIVE_DIRECTORY => './../config/active/', CONFIG_SYNC_DIRECTORY => './../config/sync/',);
$settings['bootstrap_config_storage'] = array( 'Drupal\Core\Config\BootstrapConfigStorageFactory', 'getFileStorage');
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Variabili
# Drupal 7variable_set('var', 'Value');variable_get('var', 'Default value');variable_del('var');
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Overrides / 1
# settings.php# $config[NOME_FILE][VARIABILE]$config['system.maintenance']['message'] = 'Sorry, our site is down now.';
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Overrides / 2
// Remember original language before this operation.$original_language = \Drupal::configFactory()->getLanguage();$language = language_load($account->getPreferredLangcode());\Drupal::configFactory()->setLanguage($language);$mail_config = \Drupal::config('user.mail');// Now send email based on $mail_config which is in the proper language.// Set back the language to the prior value.\Drupal::configFactory()->setLanguage($original_language);
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Overrides / 3
# Valori originali della configurazione$site_name = \Drupal::config('system.site')->getOriginal('name', FALSE);
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Overrides / 4
# Overrides permanentipublic function loadOverrides($names) { $overrides = array(); if (in_array('system.site', $names)) { $overrides['system.site'] = ['name' => 'Overridden site name!']; }
return $overrides;}
Gestione della configurazione
Drupal 8
Gestisce la configurazione di una installazione Drupal
Overrides / 5
# Documentazionehttps://www.drupal.org/node/1928898
Gestione della configurazione
Drupal 8
Esportazione / Importazione della configurazione
# Drush - http://www.drushcommands.com/drush-7x/config//bin/drush config-export/bin/drush config-import
# Drupal Console - http://drupalconsole.com//bin/console config:export/bin/console config:import
Gestione della configurazione
Drupal 8
Esportazione / Importazione della configurazione /
# Interfaccia/admin/config/development/configuration/full/export/admin/config/development/configuration/full/import
Gestione della configurazione
Drupal 8
Sincronizzazione della configurazione
# Interfaccia/admin/config/development/configuration
Differenze tra la configurazione active e quella presente nella directory sync
Modulo Features
Drupal 8
● (Dato che) Drupal 8 si occupa del lavoro di replicazione delle funzionalità● Il modulo Features si occupa dell’organizzazione delle funzionalità per poterle
gestire attraverso i moduli● Creazione e gestione di bundle per replicare le funzionalità utilizzando un set
di configurazioni
Con gli esempi si fa prima / 3
Modulo: Drupal Day 2015
● Creazione - Esportazione Content Type Drupal Day Article● Creazione - Esportazione Tassonomia Drupal Day Taxonomy● Creazione - Esportazione Vista “Last Entries”● Creazione - Esportazione Menu Item “Last Entries”
Con gli esempi si fa prima / 4Content Type Drupal Day Articlenode.type.drupal_day_article.yml
uuid: 3005e153-6382-4173-920c-1232ba898c9dlangcode: enstatus: truedependencies: ....name: 'Drupal Day Article'type: drupal_day_articledescription: ''help: ''new_revision: falsepreview_mode: 1display_submitted: true
Con gli esempi si fa prima / 5Tassonomia Drupal Day Taxonomytaxonomy.vocabulary.drupal_day_2015_taxonomy.yml
uuid: 09f00b65-1880-47d1-b001-1e42cadf8c43langcode: enstatus: truedependencies: { }name: 'Drupal Day 2015 Taxonomy'vid: drupal_day_2015_taxonomydescription: 'Drupal Day 2015 Taxonomy'hierarchy: 0weight: 0
Con gli esempi si fa prima / 6Vista “Last Entries”views.view.last_entries_drupal_day_2015.yml
uuid: eefbb1b8-9b34-4590-a000-de4247c4c335langcode: enstatus: truedependencies: config:
- core.entity_view_mode.node.teaser- node.type.drupal_day_article- system.menu.main
module:- node- user
id: last_entries_drupal_day_2015label: 'Last Entries Drupal Day 2015'module: views
base_table: node_field_database_field: niddisplay: default:
display_plugin: defaultid: defaultdisplay_title: Masteraccess:type: permoptions:
perm: 'access content' [....] items_per_page: 10
Con gli esempi si fa prima / 7Menu Item “Last Entries”views.view.last_entries_drupal_day_2015.yml
page_1: display_plugin: page id: page_1 display_title: Page position: 1 path: last-entries-drupal-day-2015 menu: type: normal title: 'Last Entries Drupal Day 2015' menu_name: main
Con gli esempi si fa prima / 8Replicazione delle funzionalità
Features
1. Creazione Bundle2. Creazione Feature3. Esportazione
https://www.drupal.org/node/2404427
Con gli esempi si fa prima / 8Features - Creazione Bundle/admin/config/development/configuration/features/bundle
Con gli esempi si fa prima / 8Features - Creazione Feature/admin/config/development/configuration/features
Drush support
features-add features-components features-diff features-export features-import features-list-packages features-status
https://www.drupal.org/node/2624004
Con gli esempi si fa prima / 9Features - Creazione Feature 2/admin/modules
Con gli esempi si fa prima / 9Features - Esportazione Feature/modules/custom/drupal_day_2015_drupal_day_article
modules/custom/drupal_day_2015_drupal_day_article ▶ tree├── config│ ├── install│ │ ├── core.entity_form_display.node.drupal_day_article.default.yml│ │ ├── core.entity_view_display.node.drupal_day_article.default.yml│ │ ├── core.entity_view_display.node.drupal_day_article.teaser.yml│ │ ├── field.field.node.drupal_day_article.body.yml│ │ ├── field.field.node.drupal_day_article.field_category.yml│ │ ├── field.field.node.drupal_day_article.field_image_dd.yml│ │ └── node.type.drupal_day_article.yml│ └── optional│ └── views.view.last_entries_drupal_day_2015.yml└── drupal_day_2015_drupal_day_article.info.yml
3 directories, 9 files
Con gli esempi si fa prima / 9Features - Contenuto Feature/modules/custom/drupal_day_2015_drupal_day_article/config/install
modules/custom/drupal_day_2015_drupal_day_article/config/install ▶ cat node.type.drupal_day_article.ymllangcode: enstatus: truedependencies: module:
- menu_uithird_party_settings: menu_ui:
available_menus:- mainparent: 'main:'
name: 'Drupal Day Article'type: drupal_day_articledescription: ''
help: ''new_revision: falsepreview_mode: 1display_submitted: true
… replichiamo per N volte ...
Organizzazione dell’ambienteAssunzioni
● Team con ambienti eterogenei● Differenti dipendenze applicative a seconda degli ambienti
(versione PHP/Mysql - Apache/NGINX, ecc)
Risolvere questo tipo di problemi non è il mio lavoro
Organizzazione con Docker
Docker
https://www.docker.com
Organizzazione dell’ambiente con Docker
Docker-composehttps://docs.docker.com/compose/
data: image: sparkfabrik/docker-drupal-data hostname: data volumes:
- /data- /var/lib/mysql
mysql: image: sparkfabrik/docker-mysql hostname: mysql environment:
- MYSQL_ROOT_PASSWORD=root
Utilizzo di immagini “preconfezionate”
https://github.com/sparkfabrikhttps://hub.docker.com/
Organizzazione dell’ambiente con Docker
Docker-compose / 2cat docker-compose.yml
data: extends:
file: docker-common-services.ymlservice: data
mysql: extends:
file: docker-common-services.ymlservice: mysql
ports:- "13306:3306"
volumes_from:- data
Differenti immagini = ● Differenti versioni dei software● “Switch” tra le versioni in tempo 0● Coesistenza di differenti versioni dello stesso
applicativo
Sistema di build
Phing
https://www.phing.info/
PHing Is Not GNU make; it's a PHP project build system or build tool
Sistema di build
Phing
<target name="generate-ci-settings" if="env"> <loadfile property="settings.${env}" file="base_files/${env}.settings.php.dist"/> <echo msg="${settings.${env}}" file="web/sites/${settings.directory.destination}/settings.php" append="true" /> <copy file="web/sites/${settings.directory.destination}/settings.php" tofile="web/sites/${settings.directory.destination}/settings.php.temp" /> <exec command="rm web/sites/${settings.directory.destination}/settings.php" /> <copy file="web/sites/${settings.directory.destination}/settings.php.temp" tofile="web/sites/${settings.directory.destination}/settings.php"> <filterchain> <replacetokens begintoken="%%" endtoken="%%"> <token key="SETTINGS_INSTALL_PROFILE" value="${site.profile}" /> <token key="DB_NAME" value="${db.name}" /> </replacetokens> </filterchain> </copy> <exec command="rm web/sites/${settings.directory.destination}/settings.php.temp" passthru="true"/></target>
Sistema di pubblicazione
Capistrano
http://capistranorb.com/
A remote server automation and deployment tool written in Ruby.
Sistema di pubblicazione
Capistrano
namespace :build do desc "Install app" task :do do on roles(:app) do
invoke 'deploy' invoke 'drushistrano:composer:install' invoke 'drushistrano:phing:build' end end
end
# cap stage build:do
Perchè automatizzare● Maggiore è l’intervento manuale, maggiori sono le possibilità di errore● I rilasci possono essere eseguiti da tutti (con le dovute accortezze)● I rilasci possono essere automatizzati
○ Commit branch feature○ Merge request branch feature verso develop○ Build automatica
■ Test● Test OK
○ Merge in develop■ Test
● Test OK○ Pubblicazione automatica in stage
Progetto Drupal 8 basehttps://github.com/vincenzodibiaggio/drupal8_base
● Servono tester● Chiunque può contribuire
Se ti piace l’idea ma pensi di non “essere in grado” contattami!
Grazie
Vincenzo Di Biaggio@vincenzodb
Software Developer @SparkFabrik - MilanoDrupal Social Club https://www.facebook.com/sparkfabrik/