deployer/recipe/magento2.php
Unai Lopez d9340bd7f6
Magento 2 Zero downtime deployment (#2262)
* Magento2: look for database migrations in order to get zero downtime deployments when changes are not needed
- also keep maintenance status active in case it was already previously activated

* Magento2: adjust shared dirs

* Magento2: dump autoload before setup di compile
- fix for magento 2.4 deployments https://github.com/magento/magento2/issues/23251

* Magento2: force static content deploy
- avoids deployment failure when magento production mode is not set

* Magento2: update change log

* Magento2: update recipe docs

* Revert "Magento2: force static content deploy"

This reverts commit 45de3337a5a3e524685c422be3fbc6957fe6b480.

* Magento2: detect configuration changes, launch config import

* Magento2: refactor recipe
- make all tasks compatible with any magento 2 version (skip command execution if still does not exist in certain version)
- remove duplicated check on maintenance status
- remove catch for processFailedException

Co-authored-by: Unai Lopez <unai.lopez@vdshop.es>
Co-authored-by: Peter Jaap Blaakmeer <peterjaap@blaakmeer.com>
2020-11-11 01:36:38 +03:00

176 lines
4.9 KiB
PHP

<?php
namespace Deployer;
require_once __DIR__ . '/common.php';
use Deployer\Exception\RunException;
const CONFIG_IMPORT_NEEDED_EXIT_CODE = 2;
const DB_UPDATE_NEEDED_EXIT_CODE = 2;
const MAINTENANCE_MODE_ACTIVE_OUTPUT_MSG = 'maintenance mode is active';
add('recipes', ['magento2']);
// Configuration
// By default setup:static-content:deploy uses `en_US`.
// To change that, simply put set('static_content_locales', 'en_US de_DE');`
// in you deployer script.
set('static_content_locales', 'en_US');
set('shared_files', [
'app/etc/env.php',
'var/.maintenance.ip',
]);
set('shared_dirs', [
'var/composer_home',
'var/log',
'var/export',
'var/report',
'var/import',
'var/import_history',
'var/session',
'var/importexport',
'var/backups',
'var/tmp',
'pub/sitemap',
'pub/media'
]);
set('writable_dirs', [
'var',
'pub/static',
'pub/media',
'generated'
]);
set('clear_paths', [
'generated/*',
'pub/static/_cache/*',
'var/generation/*',
'var/cache/*',
'var/page_cache/*',
'var/view_preprocessed/*'
]);
set('magento_version', function () {
// detect version
$versionOutput = run('{{bin/php}} {{release_path}}/bin/magento --version');
preg_match('/(\d+\.?)+$/', $versionOutput, $matches);
return $matches[0] ?? "2.0";
});
set('maintenance_mode_status_active', function () {
// detect maintenance mode active
$maintenanceModeStatusOutput = run("{{bin/php}} {{current_path}}/bin/magento maintenance:status");
return strpos($maintenanceModeStatusOutput, MAINTENANCE_MODE_ACTIVE_OUTPUT_MSG) !== false;
});
// Tasks
desc('Compile magento di');
task('magento:compile', function () {
run('cd {{release_path}} && {{bin/composer}} dump-autoload -o');
run("{{bin/php}} {{release_path}}/bin/magento setup:di:compile");
run('cd {{release_path}} && {{bin/composer}} dump-autoload -o');
});
desc('Deploy assets');
task('magento:deploy:assets', function () {
run("{{bin/php}} {{release_path}}/bin/magento setup:static-content:deploy {{static_content_locales}}");
});
desc('Enable maintenance mode');
task('magento:maintenance:enable', function () {
run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/bin/magento maintenance:enable; fi");
});
desc('Disable maintenance mode');
task('magento:maintenance:disable', function () {
run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/bin/magento maintenance:disable; fi");
});
desc('Config Import');
task('magento:config:import', function () {
$configImportNeeded = false;
if(version_compare(get('magento_version'), '2.2.0', '<')) {
//app:config:import command does not exist in 2.0.x and 2.1.x branches
$configImportNeeded = false;
} elseif(version_compare(get('magento_version'), '2.2.4', '<')) {
//app:config:status command does not exist until 2.2.4, so proceed with config:import in every deploy
$configImportNeeded = true;
} else {
try {
run('{{bin/php}} {{release_path}}/bin/magento app:config:status');
} catch (RunException $e) {
if ($e->getExitCode() == CONFIG_IMPORT_NEEDED_EXIT_CODE) {
$configImportNeeded = true;
} else {
throw $e;
}
}
}
if ($configImportNeeded) {
if (!get('maintenance_mode_status_active')) {
invoke('magento:maintenance:enable');
}
run('{{bin/php}} {{release_path}}/bin/magento app:config:import --no-interaction');
if (!get('maintenance_mode_status_active')) {
invoke('magento:maintenance:disable');
}
}
});
desc('Upgrade magento database');
task('magento:upgrade:db', function () {
$databaseUpgradeNeeded = false;
try {
run('{{bin/php}} {{release_path}}/bin/magento setup:db:status');
} catch (RunException $e) {
if ($e->getExitCode() == DB_UPDATE_NEEDED_EXIT_CODE) {
$databaseUpgradeNeeded = true;
} else {
throw $e;
}
}
if ($databaseUpgradeNeeded) {
if (!get('maintenance_mode_status_active')) {
invoke('magento:maintenance:enable');
}
run("{{bin/php}} {{release_path}}/bin/magento setup:upgrade --keep-generated");
if (!get('maintenance_mode_status_active')) {
invoke('magento:maintenance:disable');
}
}
});
desc('Flush Magento Cache');
task('magento:cache:flush', function () {
run("{{bin/php}} {{release_path}}/bin/magento cache:flush");
});
desc('Magento2 deployment operations');
task('deploy:magento', [
'magento:compile',
'magento:deploy:assets',
'magento:config:import',
'magento:upgrade:db',
'magento:cache:flush'
]);
desc('Deploy your project');
task('deploy', [
'deploy:prepare',
'deploy:vendors',
'deploy:clear_paths',
'deploy:magento',
'deploy:publish',
]);
after('deploy:failed', 'magento:maintenance:disable');