Date post: | 10-Feb-2017 |
Category: |
Software |
Upload: | vincenzo-di-biaggio |
View: | 55 times |
Download: | 1 times |
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 / 4
Content 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 / 5
Tassonomia 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 / 6
Vista “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 / 7
Menu 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 / 8
Replicazione delle funzionalità
Features
1. Creazione Bundle
2. Creazione Feature
3. Esportazione
https://www.drupal.org/node/2404427
Con gli esempi si fa prima / 8
Features - Creazione Bundle/admin/config/development/configuration/features/bundle
Con gli esempi si fa prima / 8
Features - 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 / 9
Features - Creazione Feature 2/admin/modules
Con gli esempi si fa prima / 9
Features - 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 / 9
Features - 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’ambiente
Assunzioni
● 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 base
https://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/