+ All Categories
Home > Technology > Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambiato rispetto a Drupal...

Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambiato rispetto a Drupal...

Date post: 12-Apr-2017
Category:
Upload: drupalday
View: 212 times
Download: 0 times
Share this document with a friend
53
Transcript

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/


Recommended