Deploy strategies

Single server

In most cases you don't need more than one production server. It's better to build your release files (as cache, js/css bundles) on that machine as well. So your builds don't depends on your local configuration and can be deployed from everywhere. By default Deployer recipes are designed to fullfill these kind of deployments.

desc('Deploy your project');
task('deploy', [
    'deploy:prepare',
    'deploy:release',
    'deploy:update_code',
    'deploy:shared',
    'deploy:vendors',
    'deploy:symlink',
]);

Build server

If you have a lot of servers where are you going to deploy your application, or you are going to use a CI server, it's better to build your release on one server and then upload files to the application servers.

To do that create a build local task:

task('build', function () {
    run('composer install');
    run('npm install');
    run('npm run build');
    // ...
})->local();

Note, you can use a simple task definition too

task('build', '
    composer install
    npm install
    npm run build    
    ...        
');

After create an upload task:

task('upload', function () {
    upload(__DIR__, '{{release_path}}');
});

Next, create release and deploy tasks:

task('release', [
    'deploy:prepare',
    'deploy:release',
    'upload',
    'deploy:shared',
    'deploy:writable',
    'deploy:symlink',
]);

task('deploy', [
    'build',
    'release',
    'cleanup',
    'success'
]);

Now you can run the dep deploy command.

Reuse common recipe

If you want to reuse some tasks from the common recipe, make sure that you set the deploy_path before invoking tasks. All common recipe tasks rely on this parameter.

task('build', function () {
    set('deploy_path', __DIR__ . '/.build');
    invoke('deploy:prepare');
    invoke('deploy:release');
    invoke('deploy:update_code');
    invoke('deploy:vendors');
    // Add more build steps here
    invoke('deploy:symlink');
})->local();

Make sure that you set deploy_path before invoking tasks.

After create an upload task:

task('upload', function () {
    upload(__DIR__ . "/.build/current/", '{{release_path}}');
});

This task takes content from the current symlink of deploy_path from the build step and then uploads it to the application release_path path.