Deployer Despliegue rápido de apps
-
Upload
php-vigo -
Category
Presentations & Public Speaking
-
view
130 -
download
2
Transcript of Deployer Despliegue rápido de apps
DeployerDespliegue rápido y sencillo de aplicaciones (Web)
Meetups
@SergioCarracedoWeb developer at OPSOUPhp Developer Drupal enthusiast
@SergioCarracedo
¿Qué entendemos despliegue?
Meetups
Es la forma en la que llevamos a una o varias máquinas remotas:● El código y/o sus cambios● Los archivos de configuraciones● Los archivos binarios: Imágenes, videos, documentos● …..● Todo lo que necesitamos para hacer funcionar nuestra aplicación
¿Como podemos hacer el despliegue?
Meetups
Copiar código (a mano)Subida ● FTP / SFTP / SSH / Rsync● Modificar los archivos de configuración a mano en el destino● Borrar a mano caches● etc…
Es muy ineficiente / cansado / aburridoNo podemos hacer rollbackNecesitamos saber la lista de ficheros cambiados
¿Como podemos hacer el despliegue? 2
Meetups
Control de versiones (GIT / SVN)
Ya tenemos nuestro código en git (o deberíamos) git clone -b master
Seguimos teniendo que tocar la ficheros de configuración a mano.Es posible hacer rollback pero no es rápido (o tan rápido como puede llegar a ser)Los archivos de usuario (imágenes, videos, etc) no deberían estar en el repo.
¿Como podemos hacer el despliegue? 3
Meetups
Sistema de despliegueEs la “Solución”
Podemos hacer rollback “instantáneo” y a distintos puntos, no solo a la última versiónCreación automática de archivos de configuración para cada máquinaGestión de archivos / directorios escribiblesGestión de carpetas compartidasInstalación de vendors
Sistemas de despliegue
Meetups
Existen muchas opciones
● Capistrano http://capistranorb.com/ (Ruby)● Ansistrano https://github.com/ansistrano (Python)● Rocketeer http://rocketeer.autopergamene.eu/ (PHP)● Fabric https://get.fabric.io/ (Python)
Deployer http://deployer.org/
Deployer
Meetups
● Gestor de despliegues escrito en PHP● Modular: Permite creación de recetas personalizadas● Rollback● Despliegues consistentes en distintos servidores (entornos)
Instalaciónmv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep
ocomposer require deployer/deployer:^3.2
Estructura de directorios
Meetups
/your/project/path|--releases| |--20150513120631| |--...|--shared| |--...|--current -> /your/project/path/releases/20150513120631
Deployer
Meetups
Creamos un archivo de configuración en la raíz del proyecto con el nombre deploy.php
<?php
// All Deployer recipes are based on `recipe/common.php`.require 'recipe/common.php';require './.deployer/myrecipe.php';
task('deploy', ['deploy:prepare', 'deploy:release', 'deploy:update_code', ‘deploy:shared', 'deploy:writable', 'deploy:symlink', 'cleanup' ]);
serverList('.deployer/servers.yml');
set(‘keep_releases’, 5);
set('repository', '[email protected]:sergiocarracedo/phpvigo_deployer.git');
Deployer: Receta 1
Meetups
Creamos la receta myrecipe.php
<?php
set('shared_files', [ '.htaccess', 'settings.inc.php']);
set('shared_dirs', [ 'user_imgs', 'cache',]);
set('writable_dirs', [ 'user_img', 'cache',]);
Deployer: Permisos de escritura
Meetups
Necesitamos añadir al sudoersuser_name ALL=(ALL) NOPASSWD: /usr/bin/setfacl
ACLshttp://rm-rf.es/acl-access-control-list-en-sistemas-de-ficheros-gnulinux/
Nos permite mejor granularidad en los permisos del sistema de archivosPodemos asignar permisos a un usuario concreto incluso aunque no sea el propietario ni esté en el grupo del propietario
Si no tenemos ACLs lo podemos hacer a mano (eliminando la tarea deploy:writable)
Deployer: Receta 2
Meetups
task('cc:smarty', function () { if (askConfirmation('Are you sure to clear SMARTY cache?')) { run('cd {{deploy_path}}/cache/smarty && rm -f *'); }});
task('cc:static', function () { if (askConfirmation('Are you sure to clear STATIC cache?')) { run('cd {{deploy_path}}/cache/static && rm -f *'); }});
task('cc:all', [ 'cc:smarty', 'cc:static' ]);
task('upload_img', function () { if (askConfirmation('Are you sure to upload user imgs?')) { uploadEnv('user_imgs', '{{deploy_path}}/shared/user_imgs'); }});
Deployer: Receta 2
Meetups
task('config:generate', function () { if (askConfirmation('Are you sure to generate settings.inc.php?')) { $basepath = dirname(__FILE__); $secrets = env('settings');
//**********************************************// //Load template and replace secrets / values //***********************************************// writeln('settings.php created succesfuly');
$tmpFilename = tempnam( $basepath , 'tmp_settings_' ); file_put_contents($tmpFilename, $settings); uploadEnv($tmpFilename, '{{deploy_path}}/shared/settings.php'); unlink($tmpFilename); }});
Deployer: Server.yml
Meetups
dev: host: 127.0.0.1:15022 stage: dev forward_agent: true user: deploy password: test2012 deploy_path : /home/deploy/ branch: dev settings: user_img_dir: user_imgs base_path: localhost:9080 tpl_dir: ./assets/t tpl_cache_dir: ./cache/t tpl_compile_dir: ./cache/t_c
prod: host: 127.0.0.1:15022 stage: production …
…
Deployer: Plantilla settings
Meetups
<?php
$settings = array();$settings['user_img_dir'] = '{{user_img_dir}}';$settings['base_path'] = '{{base_path}}';$settings['tpl_dir'] = '{{tpl_dir}}';$settings['tpl_cache_dir'] = '{{tpl_cache_dir}}';$settings['tpl_compile_dir'] = '{{tpl_compile_dir}}';
Demo Time
Meetups
Otras funcionalidades
Meetups
● Triggers: Podemos definir tareas que se ejecuten antes o después de otra tarea● Tareas sólo en un entorno: Por ejemplo una tarea que solo se pueda ejecutar en dev● Agrupación de servidores por Stage lo que permite múltiples despliegues simultáneos● Ejecución remota: Por ejemplo lanzar composer en remoto
Meetups
@SergioCarracedoWeb developer at OPSOUPhp Developer Drupal enthusiast
@SergioCarracedo
echo PHP_EOF;¿Preguntas?