Despliegue de
aplicaciones Symfony
con DeployerPHP
Patrocinadores
SOY ÁLEX MARTÍN
Hago deploys y otras #mandangas todos los días en @innn
Puedes contactar conmigo en @alexdw
¿QUÉ ES UN
DEPLOY?
Software deployment is all
of the activities that make a
software system available
for use.
https://en.wikipedia.org/wiki/Software_deployment
DEPLOY === COÑAZO
Es una tarea repetitiva…
y aburrida
➔ Subir ficheros
➔ Setear configuración
➔ Bajar dependencias
➔ Realizar migraciones de datos
➔ Construir assets
➔ Limpiar caché
➔ Reiniciar servidores
➔ ...
Traducido a
Symfony…
➔ git pull
➔ upload parameters.yml
➔ composer install
➔ doctrine:migrations
➔ assets:install && assetic:dump
➔ cache:clear
➔ apache2 reload // nginx reload
➔ ...
¿CÓMO PODEMOS
AUTOMATIZARLO?
HERRAMIENTAS
Capistrano Magallanes
DeployerPHP
HERRAMIENTAS
Capistrano Magallanes
DeployerPHP
DeployerPHP
Principales
características
Rápido Modular Rollbacks Atómico
Principales
características
Instalación
global
wget http://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep
Instalación
en vendors
php composer.phar require deployer/deployer:~3.0
Configuración
básica
// deploy.php
<?php
require 'recipe/symfony.php';
server('prod', 'host', 22)
->user('name')
->forwardAgent()
->stage('production')
->env('deploy_path', '/your/project/path');
set('repository', 'git@github.com:org/app.git');
dep deploy prod
|-- current → /home/www/releases/20140812131123
|-- releases
| `-- 20140812131123
| `-- 20140809150234
| `-- 20140801145678
`-- shared
Resultado
dep rollback prod
¿Algún error?
ENTREMOS EN
DETALLE …
Configuración
servidores
server('prod_1', 'domain.com')
->user('user')
->password('pass')
->env('deploy_path', '/home/www')
->stage('production');
server('prod_2', 'domain.com')
->user('user')
->password('pass')
->env('deploy_path', '/home/www')
->stage('production');
Configuración
servidores (tipos de conexión)
➔ Usuario y contraseña
server(...)
->user('user')
->password('pass')
Configuración
servidores (tipos de conexión)
➔ Usuario y contraseña
server(...)
->user('user')
->password('pass')
➔ Usuario y solicitud de contraseña
server(...)
->user('user')
->password(null)
Configuración
servidores (tipos de conexión)
➔ Usuario y contraseña
server(...)
->user('user')
->password('pass')
➔ Usuario y solicitud de contraseña
server(...)
->user('user')
->password(null)
➔ Con clave privada
server(...)
->user('name')
->identityFile();
Configuración
servidores (tipos de conexión)
➔ Con PEM file
server('ec2', 'host.aws.amazon.com')
->user('ec2-user')
->pemFile('~/.ssh/keys.pem');
Configuración
servidores (tipos de conexión)
➔ Con PEM file
server('ec2', 'host.aws.amazon.com')
->user('ec2-user')
->pemFile('~/.ssh/keys.pem');
➔ Con SSH config file
server(...)
->user('name')
->configFile('/path/to/file');
Configuración
servidores (con YAML)
➔ serverList('servers.yml');
Configuración
servidores (con YAML)
➔ serverList('servers.yml');
➔ prod:
host: domain.com
user: www
identity_file: ~
stage: production
deploy_path: /home/www/
beta:
host: beta.domain.com
user: www
password: pass
stage: beta
deploy_path: /home/www/
Tareas
DeployerPHP
➔ Sistema basado en tareas
Tareas
DeployerPHP
➔ Sistema basado en tareas
➔ Estas tareas pueden anidarse
Tareas
DeployerPHP
➔ Sistema basado en tareas
➔ Estas tareas pueden anidarse:
task('deploy', [
'deploy:prepare',
'deploy:update_code',
'deploy:vendors',
'deploy:symlink',
'cleanup'
]);
Creación de
tareas
➔ task('my_test_task', function () {
//
})->desc('Doing my stuff')->onlyOn('test');
Creación de
tareas
➔ task('my_test_task', function () {
//
})->desc('Doing my stuff')->onlyOn('test');
➔ dep my_test_task
Creación de
tareas
➔ task('my_test_task', function () {
//
})->desc('Doing my stuff')->onlyOn('test');
➔ dep my_test_task
➔ dep list
Creación de
Tareas (variables)
➔ Variables entorno
task('my_test_task', function () {
env('key');
env('key', 'value');
env('array.key');
});
Creación de
Tareas (variables)
➔ Variables entorno
task('my_test_task', function () {
env('key');
env('key', 'value');
env('array.key');
});
➔ Variables globales
set('key', 'value');
get('key');
has('key');
Creación de
Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', 'git@github.com:user/project.git');
Creación de
Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', 'git@github.com:user/project.git');
➔ Rama repositorio
set('branch','master');
Creación de
Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', 'git@github.com:user/project.git');
➔ Rama repositorio
set('branch','master');
➔ Definir compartidos
set('shared_dirs', ['app/logs']);
set('shared_files', ['app/config/parameters.yml']);
Creación de
Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', 'git@github.com:user/project.git');
➔ Rama repositorio
set('branch','master');
➔ Definir compartidos
set('shared_dirs', ['app/logs']);
set('shared_files', ['app/config/parameters.yml']);
➔ Permisos de escritura
set('writable_dirs', ['app/cache', 'app/logs']);
set('http_user', 'user');
Creación de
Tareas (variables predefinidas)
➔ Copiar directorios
set('copy_dirs', ['vendor']);
before('deploy:vendors', 'deploy:copy_dirs');
Creación de
Tareas (variables predefinidas)
➔ Copiar directorios
set('copy_dirs', ['vendor']);
before('deploy:vendors', 'deploy:copy_dirs');
➔ Versiones a mantener
set('keep_releases', 5);
Creación de
Tareas (variables predefinidas)
➔ Copiar directorios
set('copy_dirs', ['vendor']);
before('deploy:vendors', 'deploy:copy_dirs');
➔ Versiones a mantener
set('keep_releases', 5);
➔ Definir ruta composer
set('composer_command', '/bin/composer.phar');
Creación de
Tareas (funciones)
➔ Ejecutar en servidor
run(string $command)
Creación de
Tareas (funciones)
➔ Ejecutar en servidor
run(string $command)
➔ Ejecutar en local
runLocally(string $command, int $timeout = 60)
Creación de
Tareas (funciones)
➔ Ejecutar en servidor
run(string $command)
➔ Ejecutar en local
runLocally(string $command, int $timeout = 60)
➔ Navegar en servidor
cd(string $path)
Creación de
Tareas (funciones)
➔ Ejecutar en servidor
run(string $command)
➔ Ejecutar en local
runLocally(string $command, int $timeout = 60)
➔ Navegar en servidor
cd(string $path)
➔ Subir al servidor
upload($file, $uploadFile)
Creación de
Tareas (funciones)
➔ Ejecutar en servidor
run(string $command)
➔ Ejecutar en local
runLocally(string $command, int $timeout = 60)
➔ Navegar en servidor
cd(string $path)
➔ Subir al servidor
upload($file, $uploadFile)
➔ Descargar del servidor
download($localFile, $deploymentFile);
Creación de
Tareas (funciones)
➔ Escribir en consola
write($message)
Creación de
Tareas (funciones)
➔ Escribir en consola
write($message)
<info>...</info>
<comment></comment>
<error></error>
Creación de
Tareas (funciones)
➔ Escribir en consola
write($message)
<info>...</info>
<comment></comment>
<error></error>
➔ Escribir en una nueva línea
writeln($message)
Creación de
Tareas (funciones)
➔ Escribir en consola
write($message)
<info>...</info>
<comment></comment>
<error></error>
➔ Escribir en una nueva línea
writeln($message)
➔ Interacción con usuario
ask($message, $default)
askConfirmation($message[,$default = false])
askHiddenResponse(string $message)
Creación de
Tareas (funciones)
➔ Escribir en consola
write($message)
<info>...</info>
<comment></comment>
<error></error>
➔ Escribir en una nueva línea
writeln($message)
➔ Interacción con usuario
ask($message, $default)
askConfirmation($message[,$default = false])
askHiddenResponse(string $message)
set('upload_parameters',
askConfirmation('¿Subir el parameters?'));
Creación de
Tareas (hooks)
➔ After
task('deploy:done', function () {
write('Deploy done!');
});
after('deploy', 'deploy:done');
Creación de
Tareas (hooks)
➔ After
task('deploy:done', function () {
write('Deploy done!');
});
after('deploy', 'deploy:done');
➔ Before
task('deploy:init, function () {
write('Begin deploy!');
});
before('deploy', 'deploy:done');
Tareas
predefinidas (Recipes)
➔ CacheTool
Permite borrar cache APC / OPCACHE
Tareas
predefinidas (Recipes)
➔ CacheTool
Permite borrar cache APC / OPCACHE
➔ Local
Permite realizar deploys locales
Tareas
predefinidas (Recipes)
➔ CacheTool
Permite borrar cache APC / OPCACHE
➔ Local
Permite realizar deploys locales
➔ Newrelic
Notifica a newrelic de un nuevo deploy
Tareas
predefinidas (Recipes)
➔ CacheTool
Permite borrar cache APC / OPCACHE
➔ Local
Permite realizar deploys locales
➔ Newrelic
Notifica a newrelic de un nuevo deploy
➔ Rabbit
Permite mandar notificación a RabbitMQ
Tareas
predefinidas (Recipes)
➔ CacheTool
Permite borrar cache APC / OPCACHE
➔ Local
Permite realizar deploys locales
➔ Newrelic
Notifica a newrelic de un nuevo deploy
➔ Rabbit
Permite mandar notificación a RabbitMQ
➔ Rsync
Permite copiar ficheros mediante Rsync
Tareas
predefinidas (Recipes)
➔ Slack
Permite mandar notificación a Slack
Tareas
predefinidas (Recipes)
➔ Slack
Permite mandar notificación a Slack
➔ Configure
Permite configurar un vhost
Tareas
predefinidas (Recipes)
➔ Slack
Permite mandar notificación a Slack
➔ Configure
Permite configurar un vhost
➔ Hipchat
Permite mandar un mensaje a una sala de hipchat
Otros
recipes
➔ Symfony
➔ Symfony3
➔ Laravel
➔ CakePHP
➔ Codeigniter
➔ Yii
➔ …
Recipes
Symfony
➔ Definir assets
set('assets', ['web/css','web/images','web/js']);
Recipes
Symfony
➔ Definir assets
set('assets', ['web/css','web/images','web/js']);
➔ Definir carpetas var y bin
set('bin_dir', 'app'); //Symfony2
set('var_dir', 'app'); // Symfony2
set('bin_dir', 'bin'); //Symfony3
set('var_dir', 'var'); // Symfony3
Recipes
Symfony
➔ Definir assets
set('assets', ['web/css','web/images','web/js']);
➔ Definir carpetas var y bin
set('bin_dir', 'app'); //Symfony2
set('var_dir', 'app'); // Symfony2
set('bin_dir', 'bin'); //Symfony3
set('var_dir', 'var'); // Symfony3
➔ Compilar assets
set('dump_assets', true); //Symfony2
Recipes
Symfony
➔ Variables de entorno
env('env_vars, 'SYMFONY_ENV=prod');
env('env, 'prod');
Recipes
Symfony
➔ Variables de entorno
env('env_vars, 'SYMFONY_ENV=prod');
env('env, 'prod');
➔ Tarea principal
task('deploy', [
'deploy:prepare',
'deploy:release,
'deploy:update_code',
'deploy:create_cache_dir,
'deploy:shared,
'deploy:assets,
'deploy:vendors',
'deploy:assetic:dump,
'deploy:cache:warmup,
'deploy:writable',
'deploy:symlink',
'cleanup'
]);
¿PREGUNTAS?
¿CERVEZAS?
Puedes encontrarme en
@alexdw
alex@alexdw.com

Deployer PHP. Presentación para #PHPSevilla