Upload
innn
View
199
Download
1
Embed Size (px)
Citation preview
Despliegue de aplicaciones Symfony
con DeployerPHP
Patrocinadores
SOY ÁLEX MARTÍNHago deploys y otras #mandangas todos los días en @innnPuedes 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', '[email protected]: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ónservidoresserver('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ónservidores (tipos de conexión)
➔ Usuario y contraseña
server(...)
->user('user')
->password('pass')
Configuraciónservidores (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ónservidores (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ónservidores (tipos de conexión)
➔ Con PEM file
server('ec2', 'host.aws.amazon.com')
->user('ec2-user')
->pemFile('~/.ssh/keys.pem');
Configuraciónservidores (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ónservidores (con YAML)
➔ serverList('servers.yml');
Configuraciónservidores (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/
TareasDeployerPHP
➔ Sistema basado en tareas
TareasDeployerPHP
➔ Sistema basado en tareas
➔ Estas tareas pueden anidarse
TareasDeployerPHP
➔ 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', '[email protected]:user/project.git');
Creación de Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', '[email protected]:user/project.git');
➔ Rama repositorio
set('branch','master');
Creación de Tareas (variables predefinidas)
➔ Definir repositorio
set('repository', '[email protected]: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', '[email protected]: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 usuarioask($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 usuarioask($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');
Tareaspredefinidas (Recipes)
➔ CacheToolPermite borrar cache APC / OPCACHE
Tareaspredefinidas (Recipes)
➔ CacheToolPermite borrar cache APC / OPCACHE
➔ LocalPermite realizar deploys locales
Tareaspredefinidas (Recipes)
➔ CacheToolPermite borrar cache APC / OPCACHE
➔ LocalPermite realizar deploys locales
➔ NewrelicNotifica a newrelic de un nuevo deploy
Tareaspredefinidas (Recipes)
➔ CacheToolPermite borrar cache APC / OPCACHE
➔ LocalPermite realizar deploys locales
➔ NewrelicNotifica a newrelic de un nuevo deploy
➔ RabbitPermite mandar notificación a RabbitMQ
Tareaspredefinidas (Recipes)
➔ CacheToolPermite borrar cache APC / OPCACHE
➔ LocalPermite realizar deploys locales
➔ NewrelicNotifica a newrelic de un nuevo deploy
➔ RabbitPermite mandar notificación a RabbitMQ
➔ RsyncPermite copiar ficheros mediante Rsync
Tareaspredefinidas (Recipes)
➔ SlackPermite mandar notificación a Slack
Tareaspredefinidas (Recipes)
➔ SlackPermite mandar notificación a Slack
➔ ConfigurePermite configurar un vhost
Tareaspredefinidas (Recipes)
➔ SlackPermite mandar notificación a Slack
➔ ConfigurePermite configurar un vhost
➔ HipchatPermite mandar un mensaje a una sala de hipchat
Otrosrecipes
➔ Symfony
➔ Symfony3
➔ Laravel
➔ CakePHP
➔ Codeigniter
➔ Yii
➔ …
RecipesSymfony
➔ Definir assets
set('assets', ['web/css','web/images','web/js']);
RecipesSymfony
➔ 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
RecipesSymfony
➔ 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
RecipesSymfony
➔ Variables de entorno
env('env_vars, 'SYMFONY_ENV=prod');
env('env, 'prod');
RecipesSymfony
➔ 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@[email protected]