mirror of
https://github.com/deployphp/deployer.git
synced 2025-04-20 21:36:19 +02:00
Feature/magento2 artifact deployment (#3317)
* adds sticky to writable recipe chgrp for all files, chmod g+rwxs for directories, chmod g+rw for files * adds artifact deployment for magento2 recipe * Updates Documentation * removes mode that has been submitted in other MR * adds divers discussion results from PR #3317 - uses contrib/cachetool - removes task build:prepare-env - comments additional_shared_files and additonal_shared_dirs - avoids invoke() * updates docs * corrects additional shared Co-authored-by: Anton Medvedev <anton@medv.io>
This commit is contained in:
parent
492cd97945
commit
2078514738
@ -1,327 +0,0 @@
|
||||
<!-- DO NOT EDIT THIS FILE! -->
|
||||
<!-- Instead edit recipe/magento2.php -->
|
||||
<!-- Then run bin/docgen -->
|
||||
|
||||
# How to Deploy a Magento 2 Project
|
||||
|
||||
```php
|
||||
require 'recipe/magento2.php';
|
||||
```
|
||||
|
||||
[Source](/recipe/magento2.php)
|
||||
|
||||
Deployer is a free and open source deployment tool written in PHP.
|
||||
It helps you to deploy your Magento 2 application to a server.
|
||||
It is very easy to use and has a lot of features.
|
||||
|
||||
Three main features of Deployer are:
|
||||
- **Provisioning** - provision your server for you.
|
||||
- **Zero downtime deployment** - deploy your application without a downtime.
|
||||
- **Rollbacks** - rollback your application to a previous version, if something goes wrong.
|
||||
|
||||
Additionally, Deployer has a lot of other features, like:
|
||||
- **Easy to use** - Deployer is very easy to use. It has a simple and intuitive syntax.
|
||||
- **Fast** - Deployer is very fast. It uses parallel connections to deploy your application.
|
||||
- **Secure** - Deployer uses SSH to connect to your server.
|
||||
- **Supports all major PHP frameworks** - Deployer supports all major PHP frameworks.
|
||||
|
||||
You can read more about Deployer in [Getting Started](/docs/getting-started.md).
|
||||
|
||||
The [deploy](#deploy) task of **Magento 2** consists of:
|
||||
* [deploy:prepare](/docs/recipe/common.md#deployprepare) – Prepares a new release
|
||||
* [deploy:info](/docs/recipe/deploy/info.md#deployinfo) – Displays info about deployment
|
||||
* [deploy:setup](/docs/recipe/deploy/setup.md#deploysetup) – Prepares host for deploy
|
||||
* [deploy:lock](/docs/recipe/deploy/lock.md#deploylock) – Locks deploy
|
||||
* [deploy:release](/docs/recipe/deploy/release.md#deployrelease) – Prepares release
|
||||
* [deploy:update_code](/docs/recipe/deploy/update_code.md#deployupdate_code) – Updates code
|
||||
* [deploy:shared](/docs/recipe/deploy/shared.md#deployshared) – Creates symlinks for shared files and dirs
|
||||
* [deploy:writable](/docs/recipe/deploy/writable.md#deploywritable) – Makes writable dirs
|
||||
* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) – Installs vendors
|
||||
* [deploy:clear_paths](/docs/recipe/deploy/clear_paths.md#deployclear_paths) – Cleanup files and/or directories
|
||||
* [deploy:magento](/docs/recipe/magento2.md#deploymagento) – Magento2 deployment operations
|
||||
* [magento:build](/docs/recipe/magento2.md#magentobuild) – Magento2 build operations
|
||||
* [magento:compile](/docs/recipe/magento2.md#magentocompile) – Compiles magento di
|
||||
* [magento:deploy:assets](/docs/recipe/magento2.md#magentodeployassets) – Deploys assets
|
||||
* [magento:config:import](/docs/recipe/magento2.md#magentoconfigimport) – Config Import
|
||||
* [magento:upgrade:db](/docs/recipe/magento2.md#magentoupgradedb) – Upgrades magento database
|
||||
* [magento:cache:flush](/docs/recipe/magento2.md#magentocacheflush) – Flushes Magento Cache
|
||||
* [deploy:publish](/docs/recipe/common.md#deploypublish) – Publishes the release
|
||||
* [deploy:symlink](/docs/recipe/deploy/symlink.md#deploysymlink) – Creates symlink to release
|
||||
* [deploy:unlock](/docs/recipe/deploy/lock.md#deployunlock) – Unlocks deploy
|
||||
* [deploy:cleanup](/docs/recipe/deploy/cleanup.md#deploycleanup) – Cleanup old releases
|
||||
* [deploy:success](/docs/recipe/common.md#deploysuccess) –
|
||||
|
||||
|
||||
The magento2 recipe is based on the [common](/docs/recipe/common.md) recipe.
|
||||
|
||||
## Configuration
|
||||
### static_content_locales
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L20)
|
||||
|
||||
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.
|
||||
|
||||
```php title="Default value"
|
||||
'en_US'
|
||||
```
|
||||
|
||||
|
||||
### magento_themes
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L26)
|
||||
|
||||
You can also set the themes to run against. By default it'll deploy
|
||||
all themes - `add('magento_themes', ['Magento/luma', 'Magento/backend']);`
|
||||
|
||||
```php title="Default value"
|
||||
[
|
||||
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### static_content_jobs
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L34)
|
||||
|
||||
Also set the number of conccurent jobs to run. The default is 1
|
||||
Update using: `set('static_content_jobs', '1');`
|
||||
|
||||
```php title="Default value"
|
||||
'1'
|
||||
```
|
||||
|
||||
|
||||
### content_version
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L36)
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
return time();
|
||||
```
|
||||
|
||||
|
||||
### shared_files
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L40)
|
||||
|
||||
Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`.
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
[
|
||||
'app/etc/env.php',
|
||||
'var/.maintenance.ip',
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### shared_dirs
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L44)
|
||||
|
||||
Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`.
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
[
|
||||
'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',
|
||||
'pub/static/_cache'
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### writable_dirs
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L59)
|
||||
|
||||
Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`.
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
[
|
||||
'var',
|
||||
'pub/static',
|
||||
'pub/media',
|
||||
'generated',
|
||||
'var/page_cache'
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### clear_paths
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L66)
|
||||
|
||||
Overrides [clear_paths](/docs/recipe/deploy/clear_paths.md#clear_paths) from `recipe/deploy/clear_paths.php`.
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
[
|
||||
'generated/*',
|
||||
'pub/static/_cache/*',
|
||||
'var/generation/*',
|
||||
'var/cache/*',
|
||||
'var/page_cache/*',
|
||||
'var/view_preprocessed/*'
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### magento_version
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L75)
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
// detect version
|
||||
$versionOutput = run('{{bin/php}} {{release_or_current_path}}/bin/magento --version');
|
||||
preg_match('/(\d+\.?)+(-p\d+)?$/', $versionOutput, $matches);
|
||||
return $matches[0] ?? '2.0';
|
||||
```
|
||||
|
||||
|
||||
### maintenance_mode_status_active
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L82)
|
||||
|
||||
|
||||
|
||||
```php title="Default value"
|
||||
// detect maintenance mode active
|
||||
$maintenanceModeStatusOutput = run("{{bin/php}} {{release_or_current_path}}/bin/magento maintenance:status");
|
||||
return strpos($maintenanceModeStatusOutput, MAINTENANCE_MODE_ACTIVE_OUTPUT_MSG) !== false;
|
||||
```
|
||||
|
||||
|
||||
### enable_zerodowntime
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L89)
|
||||
|
||||
Deploy without setting maintenance mode if possible
|
||||
|
||||
```php title="Default value"
|
||||
true
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Tasks
|
||||
|
||||
### magento:compile
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L93)
|
||||
|
||||
Compiles magento di.
|
||||
|
||||
Tasks
|
||||
|
||||
|
||||
### magento:deploy:assets
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L100)
|
||||
|
||||
Deploys assets.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:sync:content_version
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L113)
|
||||
|
||||
Syncs content version.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:maintenance:enable
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L123)
|
||||
|
||||
Enables maintenance mode.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:maintenance:disable
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L128)
|
||||
|
||||
Disables maintenance mode.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:config:import
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L133)
|
||||
|
||||
Config Import.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:upgrade:db
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L168)
|
||||
|
||||
Upgrades magento database.
|
||||
|
||||
|
||||
|
||||
|
||||
### magento:cache:flush
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L195)
|
||||
|
||||
Flushes Magento Cache.
|
||||
|
||||
|
||||
|
||||
|
||||
### deploy:magento
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L200)
|
||||
|
||||
Magento2 deployment operations.
|
||||
|
||||
|
||||
|
||||
|
||||
This task is group task which contains next tasks:
|
||||
* [magento:build](/docs/recipe/magento2.md#magentobuild)
|
||||
* [magento:config:import](/docs/recipe/magento2.md#magentoconfigimport)
|
||||
* [magento:upgrade:db](/docs/recipe/magento2.md#magentoupgradedb)
|
||||
* [magento:cache:flush](/docs/recipe/magento2.md#magentocacheflush)
|
||||
|
||||
|
||||
### magento:build
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L208)
|
||||
|
||||
Magento2 build operations.
|
||||
|
||||
|
||||
|
||||
|
||||
This task is group task which contains next tasks:
|
||||
* [magento:compile](/docs/recipe/magento2.md#magentocompile)
|
||||
* [magento:deploy:assets](/docs/recipe/magento2.md#magentodeployassets)
|
||||
|
||||
|
||||
### deploy
|
||||
[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L214)
|
||||
|
||||
Deploys your project.
|
||||
|
||||
|
||||
|
||||
|
||||
This task is group task which contains next tasks:
|
||||
* [deploy:prepare](/docs/recipe/common.md#deployprepare)
|
||||
* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors)
|
||||
* [deploy:clear_paths](/docs/recipe/deploy/clear_paths.md#deployclear_paths)
|
||||
* [deploy:magento](/docs/recipe/magento2.md#deploymagento)
|
||||
* [deploy:publish](/docs/recipe/common.md#deploypublish)
|
||||
|
||||
|
@ -2,7 +2,10 @@
|
||||
namespace Deployer;
|
||||
|
||||
require_once __DIR__ . '/common.php';
|
||||
require_once __DIR__ . '/../contrib/cachetool.php';
|
||||
|
||||
|
||||
use Deployer\Exception\GracefulShutdownException;
|
||||
use Deployer\Exception\RunException;
|
||||
use Deployer\Host\Host;
|
||||
|
||||
@ -220,3 +223,130 @@ task('deploy', [
|
||||
]);
|
||||
|
||||
after('deploy:failed', 'magento:maintenance:disable');
|
||||
|
||||
// artifact deployment section
|
||||
// settings section
|
||||
set('artifact_file', 'artifact.tar.gz');
|
||||
set('artifact_dir', 'artifacts');
|
||||
set('artifact_excludes_file', 'artifacts/excludes');
|
||||
|
||||
set('artifact_path', function () {
|
||||
if (!test('[ -d {{artifact_dir}} ]')) {
|
||||
run('mkdir {{artifact_dir}}');
|
||||
}
|
||||
return get('artifact_dir') . '/' . get('artifact_file');
|
||||
});
|
||||
|
||||
set('bin/tar', function () {
|
||||
if (commandExist('gtar')) {
|
||||
return which('gtar');
|
||||
} else {
|
||||
return which('tar');
|
||||
}
|
||||
});
|
||||
|
||||
// tasks section
|
||||
desc('Packages all relevant files in an artifact.');
|
||||
task('artifact:package', function() {
|
||||
if (!test('[ -f {{artifact_excludes_file}} ]')) {
|
||||
throw new GracefulShutdownException(
|
||||
"No artifact excludes file provided, provide one at artivacts/excludes or change location"
|
||||
);
|
||||
}
|
||||
run('{{bin/tar}} --exclude-from={{artifact_excludes_file}} -czf {{artifact_path}} .');
|
||||
});
|
||||
|
||||
desc('Uploads artifact in release folder for extraction.');
|
||||
task('artifact:upload', function () {
|
||||
upload(get('artifact_path'), '{{release_path}}');
|
||||
});
|
||||
|
||||
desc('Extracts artifact in release path.');
|
||||
task('artifact:extract', function () {
|
||||
run('{{bin/tar}} -xzpf {{release_path}}/{{artifact_file}} -C {{release_path}}');
|
||||
run('rm -rf {{release_path}}/{{artifact_file}}');
|
||||
});
|
||||
|
||||
desc('Clears generated files prior to building.');
|
||||
task('build:remove-generated', function() {
|
||||
run('rm -rf generated/*');
|
||||
});
|
||||
|
||||
desc('Prepare local artifact build');
|
||||
task('build:prepare', function() {
|
||||
if(! currentHost()->get('local')) {
|
||||
{
|
||||
throw new GracefulShutdownException("Artifact can only be built locally, you provided a non local host");
|
||||
}
|
||||
}
|
||||
set('deploy_path', '.');
|
||||
set('release_path', '.');
|
||||
set('current_path', '.');
|
||||
});
|
||||
|
||||
desc('Builds an artifact.');
|
||||
task(
|
||||
'artifact:build',
|
||||
[
|
||||
'build:prepare',
|
||||
'build:remove-generated',
|
||||
'deploy:vendors',
|
||||
'magento:compile',
|
||||
'magento:deploy:assets',
|
||||
'artifact:package',
|
||||
]
|
||||
);
|
||||
|
||||
// Array of shared files that will be added to the default shared_files without overriding
|
||||
set('additional_shared_files', []);
|
||||
// Array of shared directories that will be added to the default shared_dirs without overriding
|
||||
set('additional_shared_dirs', []);
|
||||
|
||||
|
||||
desc('Adds additional files and dirs to the list of shared files and dirs');
|
||||
task('deploy:additional-shared', function () {
|
||||
add('shared_files', get('additional_shared_files'));
|
||||
add('shared_dirs', get('additional_shared_dirs'));
|
||||
});
|
||||
|
||||
|
||||
desc('Prepares an artifact on the target server');
|
||||
task(
|
||||
'artifact:prepare',
|
||||
[
|
||||
'deploy:info',
|
||||
'deploy:setup',
|
||||
'deploy:lock',
|
||||
'deploy:release',
|
||||
'artifact:upload',
|
||||
'artifact:extract',
|
||||
'deploy:additional-shared',
|
||||
'deploy:shared',
|
||||
'deploy:writable',
|
||||
]
|
||||
);
|
||||
|
||||
desc('Executes the tasks after artifact is released');
|
||||
task(
|
||||
'artifact:finish',
|
||||
[
|
||||
'magento:cache:flush',
|
||||
'cachetool:clear:opcache',
|
||||
'deploy:cleanup',
|
||||
'deploy:unlock',
|
||||
]
|
||||
);
|
||||
|
||||
desc('Actually releases the artifact deployment');
|
||||
task(
|
||||
'artifact:deploy',
|
||||
[
|
||||
'artifact:prepare',
|
||||
'magento:upgrade:db',
|
||||
'magento:config:import',
|
||||
'deploy:symlink',
|
||||
'artifact:finish'
|
||||
]
|
||||
);
|
||||
|
||||
fail('artifact:deploy', 'deploy:failed');
|
||||
|
Loading…
x
Reference in New Issue
Block a user