SlideShare a Scribd company logo
Improving your Drupal 8
Development Workflow
by Jesus Manuel Olivas / WeKnow
Who I am?
Jesus Manuel Olivas
jmolivas@weknowinc.com
jmolivas
jmolivas
http://drupal.org/u/jmolivas
http://jmolivas.weknowinc.com
WeGive
2,572,697
WeAre
WeKnow
Local environment
Local environment.
Isolate local machine from project dependencies.
Easy and simple to start and continue working on existing projects.
Facilitate on boarding and adding new team members.
Project scope configurations.
Shareable with the team using a code repository via git.
Mimic production environment and other temporary stages.
Local environment.
●OS Native, LAMP, Dev Desktop
●XAMPP => https://www.apachefriends.org
●MAMP => https://www.mamp.info/en/
●WAMP => http://www.wampserver.com/en/
●Vagrant => https://www.vagrantup.com/
●Docker => https://www.docker.com/
Vagrant | Docker
Local environment.
DrupalVM => https://www.drupalvm.com/
Docksal => https://docksal.io/
DDEV => https://github.com/drud/ddev
Lando => https://docs.devwithlando.io/
Outrigger => http://outrigger.sh/
Docker4Drupal => https://github.com/wodby/docker4drupal
Ahoy
Ahoy
Ahoy is command line tool that gives each of
your projects their own CLI app with with zero
code and dependencies.
http://www.ahoycli.com
.ahoy.yml
ahoyapi: v2
commands:
up:
cmd: docker-compose up -d "$@"
usage: Create and start containers.
down:
cmd: docker-compose down "$@"
usage: Stop and remove containers, networks, images, and volumes.
composer:
cmd: docker-compose exec --user=wodby php composer "$@"
usage: Run Composer commands in the php service container.
drupal:
cmd: docker-compose exec --user=wodby php vendor/bin/drupal "$@"
usage: Run Drupal Console commands in the php service container.
Download and Install
Drupal 8
Download Drupal (Composer)
● https://github.com/weknowinc/drupal-project (drupal.dev)
●# Includes configurations for Docker and DrupalConsole.
●composer create-project weknowinc/drupal-project /path/to/drupal
# Clone project using git
git clone git@github.com:weknowinc/drupal-project.git
Manage environment variables (.env.dist => .env)
# Copy env file
cp .env.dist .env
# Customize values‹
vim .env
What if this is not a new project? | How to automate this?
# Create site alias, .env, and docker-compose.yml files.
drupal dockerize (Available on 1.9.0 ETA TBD)
# This will run
drupal generate:site:alias
drupal dotenv:init
drupal docker:init
Environment variables (.env)
ENVIRONMENT=develop
DATABASE_NAME=drupal
DATABASE_USER=drupal
DATABASE_PASSWORD=drupal
DATABASE_HOST=mariadb
DATABASE_PORT=3306
HOST_NAME=drupal.develop
HOST_PORT=80
DRUPAL_ROOT=/var/www/html
SERVER_ROOT=/var/www/html/web
Ignore configuration files (.gitignore)
# External dependencies
vendor
# Drupal dependencies
web/core
web/modules/contrib
web/themes/contrib
web/profiles/contrib
web/libraries/contrib
# Files‹
web/sites/*/files
# env file
.env
# DB backups
mariadb-init
The new directory structure
drupal.develop/ web/
├── LICENSE ├── autoload.php
├── README.md ├── core
├── composer.json ├── index.php
├── composer.lock ├── modules
├── scripts ├── profiles
├── vendor ├── sites
└── web └── themes
Interact with containers
# Start containers
ahoy up
# Stop containers
ahoy down
# Show logs
ahoy logs <SERVICE_NAME>
# Stop containers destroy data
ahoy destroy
docker-compose.yml | overview
version: "2.x"
services:
mariadb:
php:
nginx:
mailhog:
traefik:
volumes:
mysqldata:
driver: "local"
Using Composer to
manage project
dependencies
Composer
● https://getcomposer.org/
Using composer within the container
Drupal 8 really takes a lot of advantages of using composer,
you can install/uninstall dependencies and apply patches.
Although it’s a good practice when using Docker, to run this
commands inside your container because if you have a PHP
version on your local machine, you could install dependencies
that are not suitable for your container instance.
Manage dependencies
ahoy composer install
ahoy composer update
ahoy composer require drupal/admin_toolbar
ahoy composer update drupal/admin_toolbar
ahoy composer update drupal/admin_toolbar --with-dependencies
ahoy composer remove drupal/admin_toolbar
Composer commands
ahoy composer why drupal/admin_toolbar
ahoy composer show [-o] [drupal/admin_toolbar]
ahoy composer check-platform-reqs
ahoy composer diagnose
How composer know about Drupal dependencies
"repositories": [
{
"type": "composer",
"url": "https://packages.drupal.org/8"
}
],
How composer know where to download dependencies
"extra": {
"installer-paths": {
"docroot/core": [
"type:drupal-core"
],
"docroot/modules/contrib/{$name}": [
"type:drupal-module"
],
"docroot/theme/contrib/{$name}": [
“type:drupal-theme"
]
}
}
Apply patches (composer.json)
"extra": {
"patches": {
"drupal/admin_toolbar": {
"Patch description": “URL/local path to patch"
}
}
}
● https://github.com/cweagans/composer-patches
Composer configuration
"minimum-stability": "dev",
"prefer-stable": true,
"config": {
"platform": {
"php": "7.0",
"sort-packages": true
}
}
Managing external
libraries and dependencies
Register a drupal-library (composer.json)
"repositories": [
{
"type": "package",
"package": {
"name": "ckeditor/codesnippet",
"description": "This plugin 
",
"type": "drupal-library",
"homepage": "https://ckeditor.com/cke4/addon/codesnippet",
"version": “4.7.3”,
"dist": {
"type": "zip",
"url": "https://download.ckeditor.com/codesnippet/releases/codesnippet_4.7.3.zip",
"reference": "master"
}
}
}
],
Download a drupal-library (composer)
composer require ckeditor/codesnippet
# composer.json
"extra": {
"installer-paths": {
"web/libraries/{$name}": [
“type:drupal-library"
],
}
}
Drupal Console
● https://drupalconsole.com
Drupal Console Launcher
https://docs.drupalconsole.com/en/getting/launcher.html
curl https://drupalconsole.com/installer -L -o drupal.phar
mv drupal.phar /usr/local/bin/drupal
chmod +x /usr/local/bin/drupal
Why do I need the Launcher?
This is a global executable that enables you to run the command, drupal, from any
directory within your site's project. Without it you will be inconvenienced by having to
run the command only from your drupal root directory.
For example, if you have Drupal root in a /web directory, and a composer.json and your
vendor directory in the directory above that, you will be able to run the drupal command
from the same directory as the composer.json file. Even better, you can run it from any
subdirectory under that as many levels deep as you would like to go.
https://docs.drupalconsole.com/en/getting/project.html
Drupal Console per-site installation
composer require drupal/console:~1.0 
--prefer-dist 
--optimize-autoloader
●https://docs.drupalconsole.com/en/getting/composer.html
Site alias
● https://docs.drupalconsole.com/en/alias/using-site-alias.html
Drupal Console allows you to run commands from your local server but being
able to execute those commands on a local, remote (VPS, PaaS) or virtual (VM,
Docker) Drupal installation using site aliases.
A site alias file use the YAML format to provide a collection of predefined
options. Once an alias is defined you can call them using a short name.
Site alias console/sites/drupal.yml (container | docker4drupal)
develop:
root: /var/www/html
extra-options: docker-compose exec --user=82 php
type: container
● https://docs.drupalconsole.com/en/alias/connecting-to-a-virtual-environment.html
Site alias console/sites/drupal.yml (ssh | drupalvm)
drupalvm:
root: /var/www/drupalvm/drupal
host: 192.168.88.88
user: vagrant
extra-options: '-o PasswordAuthentication=no -i ~/.vagrant.d/insecure_private_key'
type: ssh
● https://docs.drupalconsole.com/en/alias/connecting-to-a-virtual-environment.html
Execute Drupal Console using site alias
# Using the --target option‹
drupal --target=drupal.develop cr all
# Using the legacy @ identifier
drupal @drupal.develop cr all
Configuration Management
Managing configuration changes through the CLI.
Install Drupal and import a previously exported
configuration.
Override configuration per environment
Content synchronization.
Managing configuration
changes through the CLI.
Configuration Management
In Drupal, configuration is the collection of admin settings
that determine how the site functions, as opposed to the
content of the site.
Configuration will typically include things such as the site
name, the content types and fields, taxonomy vocabularies,
views and so on.
Configuration system
The Drupal configuration system handles configuration in a
unified manner.
By default, Drupal stores configuration data in the
database, but it can be exported to YAML files, allowing the
configuration to be managed by version control.
Configuration Management
Configuration is a mapping of keys and values.
Stored on the Database by default.
Exported as YAML for synchronization between environments.
Once a module is installed the configuration provided by the
module is owned by the site not the by the module anymore.
Exporting Configuration
drupal config:export
drupal config:export [--directory] [--tar]
drupal config:export:single [--directory] [--module]
drupal config:export:content:type
drupal config:export:view
Importing Configuration
drupal config:import
drupal config:import [--file] [--directory]
drupal config:import:single [--directory] [--file]
drupal config:import:single [--file] [--file]
Useful Configuration commands
drupal config:diff
drupal config:edit
drupal config:override
drupal config:delete
drupal debug:config
Override configuration per
environment
Configuration override system
There are cases when configuration values need to be overridden
for specific purposes as custom settings per environment.
For this cases the Drupal configuration systems provides the
configuration override system. This system allow you to override
configuration values.
https://www.drupal.org/node/1928898
Configuration override system
* Maintains these overrides as temporary layers on top of the
standard configuration values.
* Does not use overridden values for configuration forms.
* May store overrides with other configuration files for staging
and version control support.
https://www.drupal.org/node/1928898
Main web/sites/default/settings.php file


if (file_exists(__DIR__ . '/settings.environment.php')) {
include __DIR__ . '/settings.environment.php';
}
Main web/sites/default/settings.environment.php file
$env = getenv('ENVIRONMENT');
$base_path = $app_root . '/' . $site_path;
$servicesFile = $base_path . '/services.'.$env.'.yml';
$settingsFile = $base_path . '/settings.'.$env.'.php';
if (file_exists($servicesFile)) {
$settings['container_yamls'][] = $servicesFile;
}
if (file_exists($settingsFile)) {
include $settingsFile;
}
Using web/sites/default/services.develop.yml
parameters:


twig.config: { debug: true, auto_reload: true, cache: false }


services:
cache.backend.null:
class: DrupalCoreCacheNullBackendFactory
Using web/sites/default/settings.develop.php
<?php
$config['system.performance']['css']['preprocess'] = FALSE;
$config['system.performance']['js']['preprocess'] = FALSE;
require_once DRUPAL_ROOT . '/modules/contrib/devel/kint/kint/Kint.class.php';
Kint::$maxLevels = 5;
$settings['cache']['bins']['render'] = 'cache.backend.null';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';
Showing overridden configuration
# Pass the --show-overridden flag
drupal debug:config system.performance --show-overridden
Config Override Inspector
Config Override Inspector provides indicators to administrators
where form fields represent configuration that is overridden.
This module is especially useful for developers working on sites
where there are configuration overrides in place depending on the
environment. It prevents confusion that arise when changing a
form setting, but appears to not take effect.
https://www.drupal.org/project/coi
Install Drupal and import a
previously exported configuration.
Configuration Management
The Configuration Management (CM) system, is great. But
wouldn't it be even more awesome to be able to install a
site, export configuration and then re-install site from
scratch importing the previously exported configuration?
●
●
Install site and import previously exported configuration.
Not supported by Drupal out-of-the-box.
"Site UUID in source storage does not match the target
storage."
https://weknowinc.com/blog/how-install-drupal-8-existing-configuration
Why would you want to install your site from an existing configuration?
Automate the creation of reproducible build/artifacts from scratch at
any stage (Development, QA, Production) to test, launch or deploy
your site.
Simplify on-boarding for new developers to any project without the
need to obtain a database-dump. Developers will be able spin-up sites
from scratch just by installing the site and importing configuration files.
How to achieve this using Drupal Console? [ 1/2 ]
application:
...
 overrides:
   config:
     skip-validate-site-uuid: true
Simple as updating your console/conïŹg.yml adding:
How to achieve this using Drupal Console? [ 2/2 ]
drupal site:install --force —no-interaction
drupal config:import --no-interaction
Execute commands to install the site and import your previously
exported configuration:
Automate both commands
command:
 name: build:develop
 description: 'Build site by installing and importing configuration'
commands:
 # Install site
 - command: site:install
   options:
     force: true
   arguments:
     profile: standard
 # Import configurations
 - command: config:import
Using contributed modules to
improve configuration management.
Configuration Split
This module allows to define sets of configuration that will get
exported to separate directories when exporting, and get
merged together when importing.
https://www.drupal.org/project/config_split
Configuration Split | Export Configuration
# Export without development settings
drupal config:export
# Export including development settings
drupal config_split:export --split=develop
Configuration Split | Import Configuration
# Import without development settings
drupal config:import
# Import including development settings
drupal config_split:import --split=develop
Configuration Read-only mode
This module allows to lock any configuration changes done via
the Drupal admin UI. This can be useful in scenarios where for
example configuration changes should not be done on the
production environment, but only on specific environments.
https://www.drupal.org/project/config_readonly
Using web/sites/default/settings.production.php
if (PHP_SAPI !== 'cli') {
$settings['config_readonly'] = TRUE;
}
$settings['config_readonly_whitelist_patterns'] = [
‘system.site’,
‘views*',
‘blocks*',
];
Drupal hosting/deploying
alternatives PaaS
PaaS
Drupal deploy tools
Deploying site to a stage or
production server.
VPS
# 1st release
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509145325
|-- releases
| |-- 20100509145325
|-- shared
_______________________________________________________________________________
# 2nd release
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509150741
|-- releases
| |-- 20100509150741
| |-- 20100509145325
|-- shared
_______________________________________________________________________________
# 3rd release
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
| |-- 20100512131539
| |-- 20100509150741
| |-- 20100509145325
|-- shared
Deploy via ssh to a server
Deployer
Deployer is a deployment tool written in
PHP with support for popular frameworks
out of the box.
Ansistrano (Ansible + Capistrano)
ansistrano.deploy and ansistrano.rollback are Ansible
Galaxy roles to easily manage the deployment process for
scripting applications such as PHP, Python and Ruby. It's an
Ansible port for Capistrano.
Docker in production
Kubernetes
> Create the Docker File(s).
> Build the image(s).
> Create a release tag.
> Push release to a public/private registry (dockerhub, quay, googlecloud).
> Orchestration Config pods, persistent volumes, services, etc.
Thank you 
 Questions?

More Related Content

What's hot

Performance all teh things
Performance all teh thingsPerformance all teh things
Performance all teh things
Marcus Deglos
 
Hive Quick Start Tutorial
Hive Quick Start TutorialHive Quick Start Tutorial
Hive Quick Start Tutorial
Carl Steinbach
 
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
Paul McKibben
 
Speeding Up The Snail
Speeding Up The SnailSpeeding Up The Snail
Speeding Up The Snail
Marcus Deglos
 
Terminus, the Pantheon command-line interface
Terminus, the Pantheon command-line interfaceTerminus, the Pantheon command-line interface
Terminus, the Pantheon command-line interface
Jon Peck
 
Drupal, varnish, esi - Toulouse November 2
Drupal, varnish, esi - Toulouse November 2Drupal, varnish, esi - Toulouse November 2
Drupal, varnish, esi - Toulouse November 2
Marcus Deglos
 
Develop with linux containers and docker
Develop with linux containers and dockerDevelop with linux containers and docker
Develop with linux containers and docker
Fabio Fumarola
 
Hadoop single node setup
Hadoop single node setupHadoop single node setup
Hadoop single node setup
Mohammad_Tariq
 
Streamline your development environment with docker
Streamline your development environment with dockerStreamline your development environment with docker
Streamline your development environment with docker
Giacomo Bagnoli
 
Local Drupal MultiSite Set-up
Local Drupal MultiSite Set-upLocal Drupal MultiSite Set-up
Local Drupal MultiSite Set-up
Manuel Felix G. Abejo Jr.
 
Cloudera hadoop installation
Cloudera hadoop installationCloudera hadoop installation
Cloudera hadoop installation
Sumitra Pundlik
 
Drupal in 5
Drupal in 5Drupal in 5
Drupal in 5
Robert Carr
 
11. From Hadoop to Spark 2/2
11. From Hadoop to Spark 2/211. From Hadoop to Spark 2/2
11. From Hadoop to Spark 2/2
Fabio Fumarola
 
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
Dana Luther
 
Apache Hadoop & Hive installation with movie rating exercise
Apache Hadoop & Hive installation with movie rating exerciseApache Hadoop & Hive installation with movie rating exercise
Apache Hadoop & Hive installation with movie rating exercise
Shiva Rama Krishna Dasharathi
 
features+
features+features+
features+
Florian Latzel
 

What's hot (16)

Performance all teh things
Performance all teh thingsPerformance all teh things
Performance all teh things
 
Hive Quick Start Tutorial
Hive Quick Start TutorialHive Quick Start Tutorial
Hive Quick Start Tutorial
 
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
Help! I inherited a Drupal Site! - DrupalCamp Atlanta 2016
 
Speeding Up The Snail
Speeding Up The SnailSpeeding Up The Snail
Speeding Up The Snail
 
Terminus, the Pantheon command-line interface
Terminus, the Pantheon command-line interfaceTerminus, the Pantheon command-line interface
Terminus, the Pantheon command-line interface
 
Drupal, varnish, esi - Toulouse November 2
Drupal, varnish, esi - Toulouse November 2Drupal, varnish, esi - Toulouse November 2
Drupal, varnish, esi - Toulouse November 2
 
Develop with linux containers and docker
Develop with linux containers and dockerDevelop with linux containers and docker
Develop with linux containers and docker
 
Hadoop single node setup
Hadoop single node setupHadoop single node setup
Hadoop single node setup
 
Streamline your development environment with docker
Streamline your development environment with dockerStreamline your development environment with docker
Streamline your development environment with docker
 
Local Drupal MultiSite Set-up
Local Drupal MultiSite Set-upLocal Drupal MultiSite Set-up
Local Drupal MultiSite Set-up
 
Cloudera hadoop installation
Cloudera hadoop installationCloudera hadoop installation
Cloudera hadoop installation
 
Drupal in 5
Drupal in 5Drupal in 5
Drupal in 5
 
11. From Hadoop to Spark 2/2
11. From Hadoop to Spark 2/211. From Hadoop to Spark 2/2
11. From Hadoop to Spark 2/2
 
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
 
Apache Hadoop & Hive installation with movie rating exercise
Apache Hadoop & Hive installation with movie rating exerciseApache Hadoop & Hive installation with movie rating exercise
Apache Hadoop & Hive installation with movie rating exercise
 
features+
features+features+
features+
 

Similar to 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
Gerald Villorente
 
Face your fears: Drush and Aegir
Face your fears: Drush and AegirFace your fears: Drush and Aegir
Face your fears: Drush and Aegir
Iztok Smolic
 
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
Acquia
 
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
Jeff Geerling
 
Drupal 8 - Improving your development workflow
Drupal 8 - Improving your development workflowDrupal 8 - Improving your development workflow
Drupal 8 - Improving your development workflow
valuebound
 
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Aleksey Tkachenko
 
Welcome aboard the team
Welcome aboard the teamWelcome aboard the team
Welcome aboard the team
Roberto Peruzzo
 
Beginning Drush
Beginning DrushBeginning Drush
Beginning DrushMediacurrent
 
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Erich Beyrent
 
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
Nuvole
 
Composer tools and frameworks for Drupal
Composer tools and frameworks for DrupalComposer tools and frameworks for Drupal
Composer tools and frameworks for Drupal
Promet Source
 
Composer tools and frameworks for drupal.ppt
Composer tools and frameworks for drupal.pptComposer tools and frameworks for drupal.ppt
Composer tools and frameworks for drupal.ppt
Promet Source
 
Exploring composer in drupal 8 with drupal project - salva molina
Exploring composer in drupal 8 with drupal project - salva molinaExploring composer in drupal 8 with drupal project - salva molina
Exploring composer in drupal 8 with drupal project - salva molina
Salvador Molina (Slv_)
 
Modernize Your Drupal Development
Modernize Your Drupal DevelopmentModernize Your Drupal Development
Modernize Your Drupal DevelopmentChris Tankersley
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and BeyondDrupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
DrupalDay
 
5 Important Tools for Drupal Development
5 Important Tools for Drupal Development5 Important Tools for Drupal Development
5 Important Tools for Drupal Developmentjcarrig
 
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...
Ben Shell
 
Decoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
Decoupling Drupal mit dem Lupus Nuxt.js Drupal StackDecoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
Decoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
nuppla
 
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDaysLuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDaysLuis RodrĂ­guez Castromil
 
Docker4Drupal 2.1 for Development
Docker4Drupal 2.1 for DevelopmentDocker4Drupal 2.1 for Development
Docker4Drupal 2.1 for Development
Websolutions Agency
 

Similar to Improving your Drupal 8 development workflow DrupalCampLA (20)

Introduction to Drupal - Installation, Anatomy, Terminologies
Introduction to Drupal - Installation, Anatomy, TerminologiesIntroduction to Drupal - Installation, Anatomy, Terminologies
Introduction to Drupal - Installation, Anatomy, Terminologies
 
Face your fears: Drush and Aegir
Face your fears: Drush and AegirFace your fears: Drush and Aegir
Face your fears: Drush and Aegir
 
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
 
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
Drupal VM for Drupal 8 Dev - Drupal Camp STL 2017
 
Drupal 8 - Improving your development workflow
Drupal 8 - Improving your development workflowDrupal 8 - Improving your development workflow
Drupal 8 - Improving your development workflow
 
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...
 
Welcome aboard the team
Welcome aboard the teamWelcome aboard the team
Welcome aboard the team
 
Beginning Drush
Beginning DrushBeginning Drush
Beginning Drush
 
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
 
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
 
Composer tools and frameworks for Drupal
Composer tools and frameworks for DrupalComposer tools and frameworks for Drupal
Composer tools and frameworks for Drupal
 
Composer tools and frameworks for drupal.ppt
Composer tools and frameworks for drupal.pptComposer tools and frameworks for drupal.ppt
Composer tools and frameworks for drupal.ppt
 
Exploring composer in drupal 8 with drupal project - salva molina
Exploring composer in drupal 8 with drupal project - salva molinaExploring composer in drupal 8 with drupal project - salva molina
Exploring composer in drupal 8 with drupal project - salva molina
 
Modernize Your Drupal Development
Modernize Your Drupal DevelopmentModernize Your Drupal Development
Modernize Your Drupal Development
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and BeyondDrupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
 
5 Important Tools for Drupal Development
5 Important Tools for Drupal Development5 Important Tools for Drupal Development
5 Important Tools for Drupal Development
 
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...
 
Decoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
Decoupling Drupal mit dem Lupus Nuxt.js Drupal StackDecoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
Decoupling Drupal mit dem Lupus Nuxt.js Drupal Stack
 
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDaysLuisRodriguezLocalDevEnvironmentsDrupalOpenDays
LuisRodriguezLocalDevEnvironmentsDrupalOpenDays
 
Docker4Drupal 2.1 for Development
Docker4Drupal 2.1 for DevelopmentDocker4Drupal 2.1 for Development
Docker4Drupal 2.1 for Development
 

More from Jesus Manuel Olivas

Remix & GraphQL: A match made in heaven with type-safety DX
Remix & GraphQL:  A match made in heaven with type-safety DXRemix & GraphQL:  A match made in heaven with type-safety DX
Remix & GraphQL: A match made in heaven with type-safety DX
Jesus Manuel Olivas
 
Drupal 10 Party GraphQL
Drupal 10 Party GraphQLDrupal 10 Party GraphQL
Drupal 10 Party GraphQL
Jesus Manuel Olivas
 
How to use Drupal to create editorial experiences your content creators will...
How to use Drupal  to create editorial experiences your content creators will...How to use Drupal  to create editorial experiences your content creators will...
How to use Drupal to create editorial experiences your content creators will...
Jesus Manuel Olivas
 
Beyond Static: Building a Dynamic Application with Gatsby
Beyond Static: Building a Dynamic Application with GatsbyBeyond Static: Building a Dynamic Application with Gatsby
Beyond Static: Building a Dynamic Application with Gatsby
Jesus Manuel Olivas
 
Drupal, GraphQL, Views, View Modes and Gatsby for a US Gov site CMS Philly
Drupal, GraphQL, Views, View Modes  and Gatsby for a US Gov site CMS PhillyDrupal, GraphQL, Views, View Modes  and Gatsby for a US Gov site CMS Philly
Drupal, GraphQL, Views, View Modes and Gatsby for a US Gov site CMS Philly
Jesus Manuel Olivas
 
Embracing the modern web using a Headless CMS with GatsbyJS CMS Philly
Embracing the modern web  using a Headless CMS with GatsbyJS CMS PhillyEmbracing the modern web  using a Headless CMS with GatsbyJS CMS Philly
Embracing the modern web using a Headless CMS with GatsbyJS CMS Philly
Jesus Manuel Olivas
 
Embracing the modern web using a Headless CMS with GatsbyJS Stanford
Embracing the modern web using a Headless CMS with GatsbyJS StanfordEmbracing the modern web using a Headless CMS with GatsbyJS Stanford
Embracing the modern web using a Headless CMS with GatsbyJS Stanford
Jesus Manuel Olivas
 
Building a modern application using Symfony API Platform and GatsbyJS PHP QRO
Building a modern application using  Symfony API Platform and GatsbyJS PHP QROBuilding a modern application using  Symfony API Platform and GatsbyJS PHP QRO
Building a modern application using Symfony API Platform and GatsbyJS PHP QRO
Jesus Manuel Olivas
 
Building a dynamic application with GatsbyJS-Tec-Mexicali
Building a dynamic application  with GatsbyJS-Tec-MexicaliBuilding a dynamic application  with GatsbyJS-Tec-Mexicali
Building a dynamic application with GatsbyJS-Tec-Mexicali
Jesus Manuel Olivas
 
Building a modern web application in the cloud partnercon
Building a modern web application in the cloud partnerconBuilding a modern web application in the cloud partnercon
Building a modern web application in the cloud partnercon
Jesus Manuel Olivas
 
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCampEmbracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
Jesus Manuel Olivas
 
Blazing fast sites using Blaze, Hybrid CMS NYC
Blazing fast sites using Blaze, Hybrid CMS NYCBlazing fast sites using Blaze, Hybrid CMS NYC
Blazing fast sites using Blaze, Hybrid CMS NYC
Jesus Manuel Olivas
 
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYCEmbracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
Jesus Manuel Olivas
 
Writing a slack chatbot seattle
Writing a slack chatbot seattleWriting a slack chatbot seattle
Writing a slack chatbot seattle
Jesus Manuel Olivas
 
Building a Modern Web Application in the Cloud TecNerd
Building a Modern Web Application in the Cloud TecNerdBuilding a Modern Web Application in the Cloud TecNerd
Building a Modern Web Application in the Cloud TecNerd
Jesus Manuel Olivas
 
How to keep Drupal relevant in the Git-based and API-driven CMS era Florida
How to keep Drupal relevant in the Git-based and API-driven CMS era FloridaHow to keep Drupal relevant in the Git-based and API-driven CMS era Florida
How to keep Drupal relevant in the Git-based and API-driven CMS era Florida
Jesus Manuel Olivas
 
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJHow to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
Jesus Manuel Olivas
 
Tools and Projects Dec 2018 Edition
Tools and Projects Dec 2018 EditionTools and Projects Dec 2018 Edition
Tools and Projects Dec 2018 Edition
Jesus Manuel Olivas
 
Creating a modern web application using Symfony API Platform Atlanta
Creating a modern web application using  Symfony API Platform AtlantaCreating a modern web application using  Symfony API Platform Atlanta
Creating a modern web application using Symfony API Platform Atlanta
Jesus Manuel Olivas
 
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCampHow to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
Jesus Manuel Olivas
 

More from Jesus Manuel Olivas (20)

Remix & GraphQL: A match made in heaven with type-safety DX
Remix & GraphQL:  A match made in heaven with type-safety DXRemix & GraphQL:  A match made in heaven with type-safety DX
Remix & GraphQL: A match made in heaven with type-safety DX
 
Drupal 10 Party GraphQL
Drupal 10 Party GraphQLDrupal 10 Party GraphQL
Drupal 10 Party GraphQL
 
How to use Drupal to create editorial experiences your content creators will...
How to use Drupal  to create editorial experiences your content creators will...How to use Drupal  to create editorial experiences your content creators will...
How to use Drupal to create editorial experiences your content creators will...
 
Beyond Static: Building a Dynamic Application with Gatsby
Beyond Static: Building a Dynamic Application with GatsbyBeyond Static: Building a Dynamic Application with Gatsby
Beyond Static: Building a Dynamic Application with Gatsby
 
Drupal, GraphQL, Views, View Modes and Gatsby for a US Gov site CMS Philly
Drupal, GraphQL, Views, View Modes  and Gatsby for a US Gov site CMS PhillyDrupal, GraphQL, Views, View Modes  and Gatsby for a US Gov site CMS Philly
Drupal, GraphQL, Views, View Modes and Gatsby for a US Gov site CMS Philly
 
Embracing the modern web using a Headless CMS with GatsbyJS CMS Philly
Embracing the modern web  using a Headless CMS with GatsbyJS CMS PhillyEmbracing the modern web  using a Headless CMS with GatsbyJS CMS Philly
Embracing the modern web using a Headless CMS with GatsbyJS CMS Philly
 
Embracing the modern web using a Headless CMS with GatsbyJS Stanford
Embracing the modern web using a Headless CMS with GatsbyJS StanfordEmbracing the modern web using a Headless CMS with GatsbyJS Stanford
Embracing the modern web using a Headless CMS with GatsbyJS Stanford
 
Building a modern application using Symfony API Platform and GatsbyJS PHP QRO
Building a modern application using  Symfony API Platform and GatsbyJS PHP QROBuilding a modern application using  Symfony API Platform and GatsbyJS PHP QRO
Building a modern application using Symfony API Platform and GatsbyJS PHP QRO
 
Building a dynamic application with GatsbyJS-Tec-Mexicali
Building a dynamic application  with GatsbyJS-Tec-MexicaliBuilding a dynamic application  with GatsbyJS-Tec-Mexicali
Building a dynamic application with GatsbyJS-Tec-Mexicali
 
Building a modern web application in the cloud partnercon
Building a modern web application in the cloud partnerconBuilding a modern web application in the cloud partnercon
Building a modern web application in the cloud partnercon
 
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCampEmbracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
Embracing the modern web using Drupal as a Headless CMS with Gatsby BADCamp
 
Blazing fast sites using Blaze, Hybrid CMS NYC
Blazing fast sites using Blaze, Hybrid CMS NYCBlazing fast sites using Blaze, Hybrid CMS NYC
Blazing fast sites using Blaze, Hybrid CMS NYC
 
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYCEmbracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
Embracing the modern web using Drupal as Headless CMS with GatsbyJS NYC
 
Writing a slack chatbot seattle
Writing a slack chatbot seattleWriting a slack chatbot seattle
Writing a slack chatbot seattle
 
Building a Modern Web Application in the Cloud TecNerd
Building a Modern Web Application in the Cloud TecNerdBuilding a Modern Web Application in the Cloud TecNerd
Building a Modern Web Application in the Cloud TecNerd
 
How to keep Drupal relevant in the Git-based and API-driven CMS era Florida
How to keep Drupal relevant in the Git-based and API-driven CMS era FloridaHow to keep Drupal relevant in the Git-based and API-driven CMS era Florida
How to keep Drupal relevant in the Git-based and API-driven CMS era Florida
 
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJHow to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
How to keep Drupal relevant in the Git-based and API-driven CMS era DrupalCampNJ
 
Tools and Projects Dec 2018 Edition
Tools and Projects Dec 2018 EditionTools and Projects Dec 2018 Edition
Tools and Projects Dec 2018 Edition
 
Creating a modern web application using Symfony API Platform Atlanta
Creating a modern web application using  Symfony API Platform AtlantaCreating a modern web application using  Symfony API Platform Atlanta
Creating a modern web application using Symfony API Platform Atlanta
 
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCampHow to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
How to keep Drupal relevant in the Git-based and API-driven CMS era - BADCamp
 

Recently uploaded

Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 

Recently uploaded (20)

Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 

Improving your Drupal 8 development workflow DrupalCampLA

  • 1. Improving your Drupal 8 Development Workflow by Jesus Manuel Olivas / WeKnow
  • 2. Who I am? Jesus Manuel Olivas jmolivas@weknowinc.com jmolivas jmolivas http://drupal.org/u/jmolivas http://jmolivas.weknowinc.com
  • 7. Local environment. Isolate local machine from project dependencies. Easy and simple to start and continue working on existing projects. Facilitate on boarding and adding new team members. Project scope configurations. Shareable with the team using a code repository via git. Mimic production environment and other temporary stages.
  • 8. Local environment. ●OS Native, LAMP, Dev Desktop ●XAMPP => https://www.apachefriends.org ●MAMP => https://www.mamp.info/en/ ●WAMP => http://www.wampserver.com/en/ ●Vagrant => https://www.vagrantup.com/ ●Docker => https://www.docker.com/
  • 10. Local environment. DrupalVM => https://www.drupalvm.com/ Docksal => https://docksal.io/ DDEV => https://github.com/drud/ddev Lando => https://docs.devwithlando.io/ Outrigger => http://outrigger.sh/ Docker4Drupal => https://github.com/wodby/docker4drupal
  • 11. Ahoy
  • 12. Ahoy Ahoy is command line tool that gives each of your projects their own CLI app with with zero code and dependencies. http://www.ahoycli.com
  • 13. .ahoy.yml ahoyapi: v2 commands: up: cmd: docker-compose up -d "$@" usage: Create and start containers. down: cmd: docker-compose down "$@" usage: Stop and remove containers, networks, images, and volumes. composer: cmd: docker-compose exec --user=wodby php composer "$@" usage: Run Composer commands in the php service container. drupal: cmd: docker-compose exec --user=wodby php vendor/bin/drupal "$@" usage: Run Drupal Console commands in the php service container.
  • 15. Download Drupal (Composer) ● https://github.com/weknowinc/drupal-project (drupal.dev) ●# Includes configurations for Docker and DrupalConsole. ●composer create-project weknowinc/drupal-project /path/to/drupal # Clone project using git git clone git@github.com:weknowinc/drupal-project.git
  • 16. Manage environment variables (.env.dist => .env) # Copy env file cp .env.dist .env # Customize values‹ vim .env
  • 17. What if this is not a new project? | How to automate this? # Create site alias, .env, and docker-compose.yml files. drupal dockerize (Available on 1.9.0 ETA TBD) # This will run drupal generate:site:alias drupal dotenv:init drupal docker:init
  • 19. Ignore configuration files (.gitignore) # External dependencies vendor # Drupal dependencies web/core web/modules/contrib web/themes/contrib web/profiles/contrib web/libraries/contrib # Files‹ web/sites/*/files # env file .env # DB backups mariadb-init
  • 20. The new directory structure drupal.develop/ web/ ├── LICENSE ├── autoload.php ├── README.md ├── core ├── composer.json ├── index.php ├── composer.lock ├── modules ├── scripts ├── profiles ├── vendor ├── sites └── web └── themes
  • 21. Interact with containers # Start containers ahoy up # Stop containers ahoy down # Show logs ahoy logs <SERVICE_NAME> # Stop containers destroy data ahoy destroy
  • 22. docker-compose.yml | overview version: "2.x" services: mariadb: php: nginx: mailhog: traefik: volumes: mysqldata: driver: "local"
  • 23. Using Composer to manage project dependencies
  • 25.
  • 26. Using composer within the container Drupal 8 really takes a lot of advantages of using composer, you can install/uninstall dependencies and apply patches. Although it’s a good practice when using Docker, to run this commands inside your container because if you have a PHP version on your local machine, you could install dependencies that are not suitable for your container instance.
  • 27. Manage dependencies ahoy composer install ahoy composer update ahoy composer require drupal/admin_toolbar ahoy composer update drupal/admin_toolbar ahoy composer update drupal/admin_toolbar --with-dependencies ahoy composer remove drupal/admin_toolbar
  • 28. Composer commands ahoy composer why drupal/admin_toolbar ahoy composer show [-o] [drupal/admin_toolbar] ahoy composer check-platform-reqs ahoy composer diagnose
  • 29. How composer know about Drupal dependencies "repositories": [ { "type": "composer", "url": "https://packages.drupal.org/8" } ],
  • 30. How composer know where to download dependencies "extra": { "installer-paths": { "docroot/core": [ "type:drupal-core" ], "docroot/modules/contrib/{$name}": [ "type:drupal-module" ], "docroot/theme/contrib/{$name}": [ “type:drupal-theme" ] } }
  • 31. Apply patches (composer.json) "extra": { "patches": { "drupal/admin_toolbar": { "Patch description": “URL/local path to patch" } } } ● https://github.com/cweagans/composer-patches
  • 32. Composer configuration "minimum-stability": "dev", "prefer-stable": true, "config": { "platform": { "php": "7.0", "sort-packages": true } }
  • 34. Register a drupal-library (composer.json) "repositories": [ { "type": "package", "package": { "name": "ckeditor/codesnippet", "description": "This plugin 
", "type": "drupal-library", "homepage": "https://ckeditor.com/cke4/addon/codesnippet", "version": “4.7.3”, "dist": { "type": "zip", "url": "https://download.ckeditor.com/codesnippet/releases/codesnippet_4.7.3.zip", "reference": "master" } } } ],
  • 35. Download a drupal-library (composer) composer require ckeditor/codesnippet # composer.json "extra": { "installer-paths": { "web/libraries/{$name}": [ “type:drupal-library" ], } }
  • 38. Drupal Console Launcher https://docs.drupalconsole.com/en/getting/launcher.html curl https://drupalconsole.com/installer -L -o drupal.phar mv drupal.phar /usr/local/bin/drupal chmod +x /usr/local/bin/drupal
  • 39. Why do I need the Launcher? This is a global executable that enables you to run the command, drupal, from any directory within your site's project. Without it you will be inconvenienced by having to run the command only from your drupal root directory. For example, if you have Drupal root in a /web directory, and a composer.json and your vendor directory in the directory above that, you will be able to run the drupal command from the same directory as the composer.json file. Even better, you can run it from any subdirectory under that as many levels deep as you would like to go. https://docs.drupalconsole.com/en/getting/project.html
  • 40. Drupal Console per-site installation composer require drupal/console:~1.0 --prefer-dist --optimize-autoloader ●https://docs.drupalconsole.com/en/getting/composer.html
  • 41. Site alias ● https://docs.drupalconsole.com/en/alias/using-site-alias.html Drupal Console allows you to run commands from your local server but being able to execute those commands on a local, remote (VPS, PaaS) or virtual (VM, Docker) Drupal installation using site aliases. A site alias file use the YAML format to provide a collection of predefined options. Once an alias is defined you can call them using a short name.
  • 42. Site alias console/sites/drupal.yml (container | docker4drupal) develop: root: /var/www/html extra-options: docker-compose exec --user=82 php type: container ● https://docs.drupalconsole.com/en/alias/connecting-to-a-virtual-environment.html
  • 43. Site alias console/sites/drupal.yml (ssh | drupalvm) drupalvm: root: /var/www/drupalvm/drupal host: 192.168.88.88 user: vagrant extra-options: '-o PasswordAuthentication=no -i ~/.vagrant.d/insecure_private_key' type: ssh ● https://docs.drupalconsole.com/en/alias/connecting-to-a-virtual-environment.html
  • 44. Execute Drupal Console using site alias # Using the --target option‹ drupal --target=drupal.develop cr all # Using the legacy @ identifier drupal @drupal.develop cr all
  • 45. Configuration Management Managing configuration changes through the CLI. Install Drupal and import a previously exported configuration. Override configuration per environment Content synchronization.
  • 47. Configuration Management In Drupal, configuration is the collection of admin settings that determine how the site functions, as opposed to the content of the site. Configuration will typically include things such as the site name, the content types and fields, taxonomy vocabularies, views and so on.
  • 48. Configuration system The Drupal configuration system handles configuration in a unified manner. By default, Drupal stores configuration data in the database, but it can be exported to YAML files, allowing the configuration to be managed by version control.
  • 49. Configuration Management Configuration is a mapping of keys and values. Stored on the Database by default. Exported as YAML for synchronization between environments. Once a module is installed the configuration provided by the module is owned by the site not the by the module anymore.
  • 50. Exporting Configuration drupal config:export drupal config:export [--directory] [--tar] drupal config:export:single [--directory] [--module] drupal config:export:content:type drupal config:export:view
  • 51. Importing Configuration drupal config:import drupal config:import [--file] [--directory] drupal config:import:single [--directory] [--file] drupal config:import:single [--file] [--file]
  • 52. Useful Configuration commands drupal config:diff drupal config:edit drupal config:override drupal config:delete drupal debug:config
  • 54. Configuration override system There are cases when configuration values need to be overridden for specific purposes as custom settings per environment. For this cases the Drupal configuration systems provides the configuration override system. This system allow you to override configuration values. https://www.drupal.org/node/1928898
  • 55. Configuration override system * Maintains these overrides as temporary layers on top of the standard configuration values. * Does not use overridden values for configuration forms. * May store overrides with other configuration files for staging and version control support. https://www.drupal.org/node/1928898
  • 56. Main web/sites/default/settings.php file 
 if (file_exists(__DIR__ . '/settings.environment.php')) { include __DIR__ . '/settings.environment.php'; }
  • 57. Main web/sites/default/settings.environment.php file $env = getenv('ENVIRONMENT'); $base_path = $app_root . '/' . $site_path; $servicesFile = $base_path . '/services.'.$env.'.yml'; $settingsFile = $base_path . '/settings.'.$env.'.php'; if (file_exists($servicesFile)) { $settings['container_yamls'][] = $servicesFile; } if (file_exists($settingsFile)) { include $settingsFile; }
  • 58. Using web/sites/default/services.develop.yml parameters: 
 twig.config: { debug: true, auto_reload: true, cache: false } 
 services: cache.backend.null: class: DrupalCoreCacheNullBackendFactory
  • 59. Using web/sites/default/settings.develop.php <?php $config['system.performance']['css']['preprocess'] = FALSE; $config['system.performance']['js']['preprocess'] = FALSE; require_once DRUPAL_ROOT . '/modules/contrib/devel/kint/kint/Kint.class.php'; Kint::$maxLevels = 5; $settings['cache']['bins']['render'] = 'cache.backend.null'; $settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';
  • 60. Showing overridden configuration # Pass the --show-overridden flag drupal debug:config system.performance --show-overridden
  • 61. Config Override Inspector Config Override Inspector provides indicators to administrators where form fields represent configuration that is overridden. This module is especially useful for developers working on sites where there are configuration overrides in place depending on the environment. It prevents confusion that arise when changing a form setting, but appears to not take effect. https://www.drupal.org/project/coi
  • 62. Install Drupal and import a previously exported configuration.
  • 63. Configuration Management The Configuration Management (CM) system, is great. But wouldn't it be even more awesome to be able to install a site, export configuration and then re-install site from scratch importing the previously exported configuration?
  • 66. Install site and import previously exported configuration. Not supported by Drupal out-of-the-box. "Site UUID in source storage does not match the target storage." https://weknowinc.com/blog/how-install-drupal-8-existing-configuration
  • 67. Why would you want to install your site from an existing configuration? Automate the creation of reproducible build/artifacts from scratch at any stage (Development, QA, Production) to test, launch or deploy your site. Simplify on-boarding for new developers to any project without the need to obtain a database-dump. Developers will be able spin-up sites from scratch just by installing the site and importing configuration files.
  • 68. How to achieve this using Drupal Console? [ 1/2 ] application: ...  overrides:    config:      skip-validate-site-uuid: true Simple as updating your console/conïŹg.yml adding:
  • 69. How to achieve this using Drupal Console? [ 2/2 ] drupal site:install --force —no-interaction drupal config:import --no-interaction Execute commands to install the site and import your previously exported configuration:
  • 70. Automate both commands command:  name: build:develop  description: 'Build site by installing and importing configuration' commands:  # Install site  - command: site:install    options:      force: true    arguments:      profile: standard  # Import configurations  - command: config:import
  • 71. Using contributed modules to improve configuration management.
  • 72. Configuration Split This module allows to define sets of configuration that will get exported to separate directories when exporting, and get merged together when importing. https://www.drupal.org/project/config_split
  • 73. Configuration Split | Export Configuration # Export without development settings drupal config:export # Export including development settings drupal config_split:export --split=develop
  • 74. Configuration Split | Import Configuration # Import without development settings drupal config:import # Import including development settings drupal config_split:import --split=develop
  • 75. Configuration Read-only mode This module allows to lock any configuration changes done via the Drupal admin UI. This can be useful in scenarios where for example configuration changes should not be done on the production environment, but only on specific environments. https://www.drupal.org/project/config_readonly
  • 76. Using web/sites/default/settings.production.php if (PHP_SAPI !== 'cli') { $settings['config_readonly'] = TRUE; } $settings['config_readonly_whitelist_patterns'] = [ ‘system.site’, ‘views*', ‘blocks*', ];
  • 78. PaaS
  • 80. Deploying site to a stage or production server.
  • 81. VPS
  • 82. # 1st release -- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509145325 |-- releases | |-- 20100509145325 |-- shared _______________________________________________________________________________ # 2nd release -- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100509150741 |-- releases | |-- 20100509150741 | |-- 20100509145325 |-- shared _______________________________________________________________________________ # 3rd release -- /var/www/my-app.com |-- current -> /var/www/my-app.com/releases/20100512131539 |-- releases | |-- 20100512131539 | |-- 20100509150741 | |-- 20100509145325 |-- shared Deploy via ssh to a server
  • 83. Deployer Deployer is a deployment tool written in PHP with support for popular frameworks out of the box.
  • 84. Ansistrano (Ansible + Capistrano) ansistrano.deploy and ansistrano.rollback are Ansible Galaxy roles to easily manage the deployment process for scripting applications such as PHP, Python and Ruby. It's an Ansible port for Capistrano.
  • 86.
  • 87. Kubernetes > Create the Docker File(s). > Build the image(s). > Create a release tag. > Push release to a public/private registry (dockerhub, quay, googlecloud). > Orchestration Config pods, persistent volumes, services, etc.
  • 88. Thank you 
 Questions?