deployer php. presentación para #phpsevilla

72
Despliegue de aplicaciones Symfony con DeployerPHP

Upload: innn

Post on 20-Feb-2017

199 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Deployer PHP. Presentación para #PHPSevilla

Despliegue de aplicaciones Symfony

con DeployerPHP

Page 2: Deployer PHP. Presentación para #PHPSevilla

Patrocinadores

Page 3: Deployer PHP. Presentación para #PHPSevilla

SOY ÁLEX MARTÍNHago deploys y otras #mandangas todos los días en @innnPuedes contactar conmigo en @alexdw

Page 4: Deployer PHP. Presentación para #PHPSevilla

¿QUÉ ES UN DEPLOY?

Page 5: Deployer PHP. Presentación para #PHPSevilla

Software deployment is all of the activities that make a software system available for use.

https://en.wikipedia.org/wiki/Software_deployment

Page 6: Deployer PHP. Presentación para #PHPSevilla

DEPLOY === COÑAZO

Page 7: Deployer PHP. Presentación para #PHPSevilla

Es una tarea repetitiva… y aburrida

➔ Subir ficheros

➔ Setear configuración

➔ Bajar dependencias

➔ Realizar migraciones de datos

➔ Construir assets

➔ Limpiar caché

➔ Reiniciar servidores

➔ ...

Page 8: Deployer PHP. Presentación para #PHPSevilla

Traducido a Symfony…

➔ git pull

➔ upload parameters.yml

➔ composer install

➔ doctrine:migrations

➔ assets:install && assetic:dump

➔ cache:clear

➔ apache2 reload // nginx reload

➔ ...

Page 9: Deployer PHP. Presentación para #PHPSevilla

¿CÓMO PODEMOS AUTOMATIZARLO?

Page 10: Deployer PHP. Presentación para #PHPSevilla

HERRAMIENTAS

Capistrano Magallanes

DeployerPHP

Page 11: Deployer PHP. Presentación para #PHPSevilla

HERRAMIENTAS

Capistrano Magallanes

DeployerPHP

Page 12: Deployer PHP. Presentación para #PHPSevilla

DeployerPHP

Page 13: Deployer PHP. Presentación para #PHPSevilla

Principales características

Rápido Modular Rollbacks Atómico

Page 14: Deployer PHP. Presentación para #PHPSevilla

Principales características

Page 15: Deployer PHP. Presentación para #PHPSevilla

Instalación global

wget http://deployer.org/deployer.phar

mv deployer.phar /usr/local/bin/dep

chmod +x /usr/local/bin/dep

Page 16: Deployer PHP. Presentación para #PHPSevilla

Instalación en vendors

php composer.phar require deployer/deployer:~3.0

Page 17: Deployer PHP. Presentación para #PHPSevilla

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');

Page 18: Deployer PHP. Presentación para #PHPSevilla

dep deploy prod

Page 19: Deployer PHP. Presentación para #PHPSevilla

|-- current → /home/www/releases/20140812131123

|-- releases

| `-- 20140812131123

| `-- 20140809150234

| `-- 20140801145678

`-- shared

Resultado

Page 20: Deployer PHP. Presentación para #PHPSevilla

dep rollback prod

¿Algún error?

Page 21: Deployer PHP. Presentación para #PHPSevilla

ENTREMOS EN DETALLE …

Page 22: Deployer PHP. Presentación para #PHPSevilla

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');

Page 23: Deployer PHP. Presentación para #PHPSevilla

Configuraciónservidores (tipos de conexión)

➔ Usuario y contraseña

server(...)

->user('user')

->password('pass')

Page 24: Deployer PHP. Presentación para #PHPSevilla

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)

Page 25: Deployer PHP. Presentación para #PHPSevilla

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();

Page 26: Deployer PHP. Presentación para #PHPSevilla

Configuraciónservidores (tipos de conexión)

➔ Con PEM file

server('ec2', 'host.aws.amazon.com')

->user('ec2-user')

->pemFile('~/.ssh/keys.pem');

Page 27: Deployer PHP. Presentación para #PHPSevilla

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');

Page 28: Deployer PHP. Presentación para #PHPSevilla

Configuraciónservidores (con YAML)

➔ serverList('servers.yml');

Page 29: Deployer PHP. Presentación para #PHPSevilla

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/

Page 30: Deployer PHP. Presentación para #PHPSevilla

TareasDeployerPHP

➔ Sistema basado en tareas

Page 31: Deployer PHP. Presentación para #PHPSevilla

TareasDeployerPHP

➔ Sistema basado en tareas

➔ Estas tareas pueden anidarse

Page 32: Deployer PHP. Presentación para #PHPSevilla

TareasDeployerPHP

➔ Sistema basado en tareas

➔ Estas tareas pueden anidarse:

task('deploy', [

'deploy:prepare',

'deploy:update_code',

'deploy:vendors',

'deploy:symlink',

'cleanup'

]);

Page 33: Deployer PHP. Presentación para #PHPSevilla

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

Page 34: Deployer PHP. Presentación para #PHPSevilla

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

➔ dep my_test_task

Page 35: Deployer PHP. Presentación para #PHPSevilla

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

➔ dep my_test_task

➔ dep list

Page 36: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (variables)

➔ Variables entorno

task('my_test_task', function () {

env('key');

env('key', 'value');

env('array.key');

});

Page 37: Deployer PHP. Presentación para #PHPSevilla

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');

Page 38: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', '[email protected]:user/project.git');

Page 39: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', '[email protected]:user/project.git');

➔ Rama repositorio

set('branch','master');

Page 40: Deployer PHP. Presentación para #PHPSevilla

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']);

Page 41: Deployer PHP. Presentación para #PHPSevilla

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');

Page 42: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (variables predefinidas)

➔ Copiar directorios

set('copy_dirs', ['vendor']);

before('deploy:vendors', 'deploy:copy_dirs');

Page 43: Deployer PHP. Presentación para #PHPSevilla

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);

Page 44: Deployer PHP. Presentación para #PHPSevilla

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');

Page 45: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

Page 46: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

➔ Ejecutar en local

runLocally(string $command, int $timeout = 60)

Page 47: Deployer PHP. Presentación para #PHPSevilla

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)

Page 48: Deployer PHP. Presentación para #PHPSevilla

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)

Page 49: Deployer PHP. Presentación para #PHPSevilla

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);

Page 50: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

Page 51: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

Page 52: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

➔ Escribir en una nueva línea

writeln($message)

Page 53: Deployer PHP. Presentación para #PHPSevilla

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)

Page 54: Deployer PHP. Presentación para #PHPSevilla

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?'));

Page 55: Deployer PHP. Presentación para #PHPSevilla

Creación de Tareas (hooks)

➔ After

task('deploy:done', function () {

write('Deploy done!');

});

after('deploy', 'deploy:done');

Page 56: Deployer PHP. Presentación para #PHPSevilla

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');

Page 57: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

Page 58: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

Page 59: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

➔ NewrelicNotifica a newrelic de un nuevo deploy

Page 60: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

➔ NewrelicNotifica a newrelic de un nuevo deploy

➔ RabbitPermite mandar notificación a RabbitMQ

Page 61: Deployer PHP. Presentación para #PHPSevilla

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

Page 62: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

Page 63: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

➔ ConfigurePermite configurar un vhost

Page 64: Deployer PHP. Presentación para #PHPSevilla

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

➔ ConfigurePermite configurar un vhost

➔ HipchatPermite mandar un mensaje a una sala de hipchat

Page 65: Deployer PHP. Presentación para #PHPSevilla

Otrosrecipes

➔ Symfony

➔ Symfony3

➔ Laravel

➔ CakePHP

➔ Codeigniter

➔ Yii

➔ …

Page 66: Deployer PHP. Presentación para #PHPSevilla

RecipesSymfony

➔ Definir assets

set('assets', ['web/css','web/images','web/js']);

Page 67: Deployer PHP. Presentación para #PHPSevilla

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

Page 68: Deployer PHP. Presentación para #PHPSevilla

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

Page 69: Deployer PHP. Presentación para #PHPSevilla

RecipesSymfony

➔ Variables de entorno

env('env_vars, 'SYMFONY_ENV=prod');

env('env, 'prod');

Page 70: Deployer PHP. Presentación para #PHPSevilla

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']);

Page 71: Deployer PHP. Presentación para #PHPSevilla
Page 72: Deployer PHP. Presentación para #PHPSevilla

¿PREGUNTAS? ¿CERVEZAS?Puedes encontrarme en@[email protected]