New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deployer configuration #19

Open
wachterjohannes opened this Issue Jul 7, 2017 · 3 comments

Comments

Projects
None yet
2 participants
@wachterjohannes
Member

wachterjohannes commented Jul 7, 2017

No description provided.

@alexander-schranz

This comment has been minimized.

Show comment
Hide comment
@alexander-schranz

alexander-schranz Nov 17, 2017

Member

Here an example with doctrine migrations, nanbando backup, multiple prod server and one stage

<?php

namespace Deployer;

use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Question\ConfirmationQuestion;

require 'vendor/deployer/deployer/recipe/symfony3.php';
require 'vendor/nanbando/deployer-recipe/recipe.php';

// options

option('force', null, InputOption::VALUE_NONE, 'Force deploy (skip tag check)');

// Configuration

set('ssh_type', 'native');
set('ssh_multiplexing', true);

set('repository', 'git@github.com:sulu/sulu-demo.git');

set('shared_dirs', ['var/indexes', 'var/sessions', 'var/sitemaps', 'var/uploads', 'web/uploads']);

set('writable_dirs',
    // FIXME var/uploads is network share and setfacl can't use there
    ['var/cache', 'var/indexes', 'var/logs', 'var/sessions', 'web/uploads']
);

set('http_user', 'www-data');
set('http_group', 'www-data');

set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader --apcu-autoloader');

# backup over nanbando
set('bin/nanbando', '/usr/local/bin/nanbando');
set('nanbando_push', false);
set('nanbando_backup_options', '{{release_name}} --process database');

set('tasks', true);

// Servers

//stage
host('stage.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/stage.example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'develop';
    })
    ->set('nanbando', false)
    ->stage('stage');

// web01 prod
host('node01.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'master';
    })
    ->stage('prod');

// web02 prod
host('node02.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'master';
    })
    ->stage('prod');

// Tasks
desc('Check requirements');
task('deploy:check', function () {
    if (!input()->hasArgument('stage') || !input()->hasOption('tag') || !input()->hasOption('force')) {
        return;
    }

    $stage = input()->getArgument('stage');
    if (false === strpos($stage, ':prod') || input()->getOption('tag')) {
        return;
    }

    if (input()->getOption('tag')) {
        return;
    }

    if (input()->getOption('force')) {
        $question = new ConfirmationQuestion('Do you really want to deploy to "prod" without tag? [y, N] ', false);

        $helper = new QuestionHelper();
        $result = $helper->ask(input(), output(), $question);

        if (!$result) {
            throw new \Exception('You have aborted the deploy.');
        }

        return;
    }

    throw new \Exception('Tag options is required for stage "prod".');
});
before('deploy', 'deploy:check');

desc('Restart PHP-FPM service');
task('php-fpm:restart', function () {
    // The user must have rights for restart service
    run('sudo service php7.0-fpm restart');
});
after('deploy:symlink', 'php-fpm:restart');

desc('Reload nginx configuration');
task('nginx:reload', function () {
    // The user must have rights for reload nginx configuration
    run('sudo service nginx reload');
});
after('deploy:symlink', 'nginx:reload');

// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// Migrate database before symlink new release.
before('deploy:symlink', 'database:migrate');

desc('Schedule schedule-tasks');
task('task:schedule:system-tasks', function () {
    if (!get('tasks')) {
        return;
    }

    run('{{bin/php}} {{bin/console}} task:schedule:system-tasks {{console_options}}');
});
after('database:migrate', 'task:schedule:system-tasks');
Member

alexander-schranz commented Nov 17, 2017

Here an example with doctrine migrations, nanbando backup, multiple prod server and one stage

<?php

namespace Deployer;

use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Question\ConfirmationQuestion;

require 'vendor/deployer/deployer/recipe/symfony3.php';
require 'vendor/nanbando/deployer-recipe/recipe.php';

// options

option('force', null, InputOption::VALUE_NONE, 'Force deploy (skip tag check)');

// Configuration

set('ssh_type', 'native');
set('ssh_multiplexing', true);

set('repository', 'git@github.com:sulu/sulu-demo.git');

set('shared_dirs', ['var/indexes', 'var/sessions', 'var/sitemaps', 'var/uploads', 'web/uploads']);

set('writable_dirs',
    // FIXME var/uploads is network share and setfacl can't use there
    ['var/cache', 'var/indexes', 'var/logs', 'var/sessions', 'web/uploads']
);

set('http_user', 'www-data');
set('http_group', 'www-data');

set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader --apcu-autoloader');

# backup over nanbando
set('bin/nanbando', '/usr/local/bin/nanbando');
set('nanbando_push', false);
set('nanbando_backup_options', '{{release_name}} --process database');

set('tasks', true);

// Servers

//stage
host('stage.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/stage.example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'develop';
    })
    ->set('nanbando', false)
    ->stage('stage');

// web01 prod
host('node01.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'master';
    })
    ->stage('prod');

// web02 prod
host('node02.example.org')
    ->user('deployer')
    ->forwardAgent()
    ->set('deploy_path', '/var/www/example.org')
    ->set('branch', function () {
        return input()->getOption('branch') ?: 'master';
    })
    ->stage('prod');

// Tasks
desc('Check requirements');
task('deploy:check', function () {
    if (!input()->hasArgument('stage') || !input()->hasOption('tag') || !input()->hasOption('force')) {
        return;
    }

    $stage = input()->getArgument('stage');
    if (false === strpos($stage, ':prod') || input()->getOption('tag')) {
        return;
    }

    if (input()->getOption('tag')) {
        return;
    }

    if (input()->getOption('force')) {
        $question = new ConfirmationQuestion('Do you really want to deploy to "prod" without tag? [y, N] ', false);

        $helper = new QuestionHelper();
        $result = $helper->ask(input(), output(), $question);

        if (!$result) {
            throw new \Exception('You have aborted the deploy.');
        }

        return;
    }

    throw new \Exception('Tag options is required for stage "prod".');
});
before('deploy', 'deploy:check');

desc('Restart PHP-FPM service');
task('php-fpm:restart', function () {
    // The user must have rights for restart service
    run('sudo service php7.0-fpm restart');
});
after('deploy:symlink', 'php-fpm:restart');

desc('Reload nginx configuration');
task('nginx:reload', function () {
    // The user must have rights for reload nginx configuration
    run('sudo service nginx reload');
});
after('deploy:symlink', 'nginx:reload');

// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// Migrate database before symlink new release.
before('deploy:symlink', 'database:migrate');

desc('Schedule schedule-tasks');
task('task:schedule:system-tasks', function () {
    if (!get('tasks')) {
        return;
    }

    run('{{bin/php}} {{bin/console}} task:schedule:system-tasks {{console_options}}');
});
after('database:migrate', 'task:schedule:system-tasks');
@wachterjohannes

This comment has been minimized.

Show comment
Hide comment
@wachterjohannes

wachterjohannes Nov 20, 2017

Member

@alexander-schranz we should add some examples directly to the repository:

  • `deployer.minimum.php´: single server with database-migration
  • deployer.php: single server + single stage with database-migration and backup
  • deployer.advanced.php: multiple servers + single stage with database-migration, backup and tag deployment (could be a open-source recipe in a own repository)
Member

wachterjohannes commented Nov 20, 2017

@alexander-schranz we should add some examples directly to the repository:

  • `deployer.minimum.php´: single server with database-migration
  • deployer.php: single server + single stage with database-migration and backup
  • deployer.advanced.php: multiple servers + single stage with database-migration, backup and tag deployment (could be a open-source recipe in a own repository)
@alexander-schranz

This comment has been minimized.

Show comment
Hide comment
@alexander-schranz

alexander-schranz Apr 13, 2018

Member

In some projects it maybe also make sense to add bin/adminconsole doctrine:cache:clear-metadata to it where the metadata cache is for example in redis

Member

alexander-schranz commented Apr 13, 2018

In some projects it maybe also make sense to add bin/adminconsole doctrine:cache:clear-metadata to it where the metadata cache is for example in redis

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment