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:
Wilfried Wolf 2023-01-08 21:46:15 +01:00 committed by GitHub
parent 492cd97945
commit 2078514738
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 130 additions and 327 deletions

View File

@ -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)

View File

@ -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');