Skip to content

Instantly share code, notes, and snippets.

@mtwalsh
Last active October 20, 2021 22:17
Show Gist options
  • Save mtwalsh/e0fff3fbf804ec3e21ab2da7f58e0273 to your computer and use it in GitHub Desktop.
Save mtwalsh/e0fff3fbf804ec3e21ab2da7f58e0273 to your computer and use it in GitHub Desktop.
Deployer recipe for Laravel projects.
<?php
namespace Deployer;
require 'recipe/common.php';
// Project name
set('application', 'enovate.co.uk');
// Project repository
set('repository', '[email protected]:enovatedesign/project.git');
// Shared files/dirs between deploys
set('shared_files', [
'.env'
]);
set('shared_dirs', [
'storage'
]);
// Writable dirs by web server
set('writable_dirs', [
'storage',
'bootstrap/cache'
]);
// Set Laravel version
set('laravel_version', function () {
$result = run('{{bin/php}} {{release_path}}/artisan --version');
preg_match_all('/(\d+\.?)+/', $result, $matches);
$version = $matches[0][0] ?? 5.5;
return $version;
});
// Set the worker process user
set('http_user', 'worker');
// Set the default deploy environment to production
set('default_stage', 'production');
// Disable multiplexing
set('ssh_multiplexing', false);
// Helper Tasks
desc('Disable maintenance mode');
task('artisan:up', function () {
$output = run('if [ -f {{deploy_path}}/current/artisan ]; then {{bin/php}} {{deploy_path}}/current/artisan up; fi');
writeln('<info>' . $output . '</info>');
});
desc('Enable maintenance mode');
task('artisan:down', function () {
$output = run('if [ -f {{deploy_path}}/current/artisan ]; then {{bin/php}} {{deploy_path}}/current/artisan down; fi');
writeln('<info>' . $output . '</info>');
});
desc('Execute artisan migrate');
task('artisan:migrate', function () {
run('{{bin/php}} {{release_path}}/artisan migrate --force');
})->once();
desc('Execute artisan migrate:fresh');
task('artisan:migrate:fresh', function () {
run('{{bin/php}} {{release_path}}/artisan migrate:fresh --force');
})->once();
desc('Execute artisan migrate:rollback');
task('artisan:migrate:rollback', function () {
$output = run('{{bin/php}} {{release_path}}/artisan migrate:rollback --force');
writeln('<info>' . $output . '</info>');
})->once();
desc('Execute artisan migrate:status');
task('artisan:migrate:status', function () {
$output = run('{{bin/php}} {{release_path}}/artisan migrate:status');
writeln('<info>' . $output . '</info>');
})->once();
desc('Execute artisan db:seed');
task('artisan:db:seed', function () {
$output = run('{{bin/php}} {{release_path}}/artisan db:seed --force');
writeln('<info>' . $output . '</info>');
})->once();
desc('Execute artisan migrate:fresh --seed');
task('artisan:migrate:fresh:seed', function () {
$output = run('{{bin/php}} {{release_path}}/artisan migrate:fresh --seed');
writeln('<info>' . $output . '</info>');
})->once();
desc('Execute artisan cache:clear');
task('artisan:cache:clear', function () {
run('{{bin/php}} {{release_path}}/artisan cache:clear');
});
desc('Execute artisan config:cache');
task('artisan:config:cache', function () {
run('{{bin/php}} {{release_path}}/artisan config:cache');
});
desc('Execute artisan route:cache');
task('artisan:route:cache', function () {
run('{{bin/php}} {{release_path}}/artisan route:cache');
});
desc('Execute artisan view:clear');
task('artisan:view:clear', function () {
run('{{bin/php}} {{release_path}}/artisan view:clear');
});
desc('Execute artisan optimize');
task('artisan:optimize', function () {
$deprecatedVersion = 5.5;
$currentVersion = get('laravel_version');
if (version_compare($currentVersion, $deprecatedVersion, '<')) {
run('{{bin/php}} {{release_path}}/artisan optimize');
}
});
desc('Execute artisan queue:restart');
task('artisan:queue:restart', function () {
run('{{bin/php}} {{release_path}}/artisan queue:restart');
});
desc('Execute artisan storage:link');
task('artisan:storage:link', function () {
$needsVersion = 5.3;
$currentVersion = get('laravel_version');
if (version_compare($currentVersion, $needsVersion, '>=')) {
run('{{bin/php}} {{release_path}}/artisan storage:link');
}
});
/**
* Task deploy:public_disk support the public disk.
* To run this task automatically, please add below line to your deploy.php file
*
* before('deploy:symlink', 'deploy:public_disk');
*
* @see https://laravel.com/docs/master/filesystem#the-public-disk
*/
desc('Make symlink for public disk');
task('deploy:public_disk', function () {
// Remove from source.
run('if [ -d $(echo {{release_path}}/public/storage) ]; then rm -rf {{release_path}}/public/storage; fi');
// Create shared dir if it does not exist.
run('mkdir -p {{deploy_path}}/shared/storage/app/public');
// Symlink shared dir to release dir
run('{{bin/symlink}} {{deploy_path}}/shared/storage/app/public {{release_path}}/public/storage');
});
// Tasks
// Upload build assets
task('upload', function () {
upload(__DIR__ . "/public/js/", '{{release_path}}/public/js/');
upload(__DIR__ . "/public/css/", '{{release_path}}/public/css/');
upload(__DIR__ . "/public/mix-manifest.json", '{{release_path}}/public/mix-manifest.json');
//upload(__DIR__ . "/public/service-worker.js", '{{release_path}}/public/service-worker.js');
});
// Hosts
// Production Server(s)
host('110.164.16.59', '110.164.16.34', '110.164.16.50')
->set('deploy_path', '/sites/{{application}}')
->set('branch', 'master')
->stage('production')
->user('someuser');
// Development/Staging Server
// Note: Overrides Composer options to include development dependencies
host('192.168.16.59')
->set('deploy_path', '/sites/{{application}}')
->set('branch', 'develop')
->set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader')
->stage('staging')
->user('someuser');
// Group tasks
desc('Deploy your project');
task('deploy', [
'deploy:info',
'deploy:prepare',
'deploy:lock',
'deploy:release',
'deploy:update_code',
'upload',
'deploy:shared',
'deploy:vendors',
'deploy:writable',
'artisan:storage:link',
'artisan:view:clear',
'artisan:cache:clear',
'artisan:config:cache',
'artisan:optimize',
'deploy:symlink',
'deploy:unlock',
'cleanup',
'success'
]);
// [Optional] Run migrations
after('deploy:vendors', 'artisan:migrate');
// [Optional] If deploy fails automatically unlock
after('deploy:failed', 'deploy:unlock');
// [Optional] Symlink the public disk.
//before('deploy:symlink', 'deploy:public_disk');
// Run with '--parallel'
// dep deploy --parallel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment