1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Deployer; |
4
|
|
|
|
5
|
|
|
require_once __DIR__ . '/common.php'; |
6
|
|
|
require_once __DIR__ . '/../contrib/cachetool.php'; |
7
|
|
|
|
8
|
|
|
use Deployer\Exception\ConfigurationException; |
9
|
|
|
use Deployer\Exception\GracefulShutdownException; |
10
|
|
|
use Deployer\Exception\RunException; |
11
|
|
|
use Deployer\Host\Host; |
12
|
|
|
|
13
|
|
|
const CONFIG_IMPORT_NEEDED_EXIT_CODE = 2; |
14
|
|
|
const DB_UPDATE_NEEDED_EXIT_CODE = 2; |
15
|
|
|
const MAINTENANCE_MODE_ACTIVE_OUTPUT_MSG = 'maintenance mode is active'; |
16
|
|
|
const ENV_CONFIG_FILE_PATH = 'app/etc/env.php'; |
17
|
|
|
const TMP_ENV_CONFIG_FILE_PATH = 'app/etc/env_tmp.php'; |
18
|
|
|
|
19
|
|
|
add('recipes', ['magento2']); |
20
|
|
|
|
21
|
|
|
// Configuration |
22
|
|
|
|
23
|
|
|
// By default setup:static-content:deploy uses `en_US`. |
24
|
|
|
// To change that, simply put `set('static_content_locales', 'en_US de_DE');` |
25
|
|
|
// in you deployer script. |
26
|
|
|
set('static_content_locales', 'en_US'); |
27
|
|
|
|
28
|
|
|
// Configuration |
29
|
|
|
|
30
|
|
|
// You can also set the themes to run against. By default it'll deploy |
31
|
|
|
// all themes - `add('magento_themes', ['Magento/luma', 'Magento/backend']);` |
32
|
|
|
// If the themes are set as a simple list of strings, then all languages defined in {{static_content_locales}} are |
33
|
|
|
// compiled for the given themes. |
34
|
|
|
// Alternatively The themes can be defined as an associative array, where the key represents the theme name and |
35
|
|
|
// the key contains the languages for the compilation (for this specific theme) |
36
|
|
|
// Example: |
37
|
|
|
// set('magento_themes', ['Magento/luma']); - Will compile this theme with every language from {{static_content_locales}} |
38
|
|
|
// set('magento_themes', [ |
39
|
|
|
// 'Magento/luma' => null, - Will compile all languages from {{static_content_locales}} for Magento/luma |
40
|
|
|
// 'Custom/theme' => 'en_US fr_FR' - Will compile only en_US and fr_FR for Custom/theme |
41
|
|
|
// 'Custom/another' => '{{static_content_locales}} it_IT' - Will compile all languages from {{static_content_locales}} + it_IT for Custom/another |
42
|
|
|
// ]); - Will compile this theme with every language |
43
|
|
|
set('magento_themes', [ |
44
|
|
|
|
45
|
|
|
]); |
46
|
|
|
|
47
|
|
|
// Static content deployment options, e.g. '--no-parent' |
48
|
|
|
set('static_deploy_options', ''); |
49
|
|
|
|
50
|
|
|
// Deploy frontend and adminhtml together as default |
51
|
|
|
set('split_static_deployment', false); |
52
|
|
|
|
53
|
|
|
// Use the default languages for the backend as default |
54
|
|
|
set('static_content_locales_backend', '{{static_content_locales}}'); |
55
|
|
|
|
56
|
|
|
// backend themes to deploy. Only used if split_static_deployment=true |
57
|
|
|
// This setting supports the same options/structure as {{magento_themes}} |
58
|
|
|
set('magento_themes_backend', ['Magento/backend' => null]); |
59
|
|
|
|
60
|
|
|
// Configuration |
61
|
|
|
|
62
|
|
|
// Also set the number of concurrent jobs to run. The default is 1 |
63
|
|
|
// Update using: `set('static_content_jobs', '1');` |
64
|
|
|
set('static_content_jobs', '1'); |
65
|
|
|
|
66
|
|
|
set('content_version', function () { |
67
|
|
|
return time(); |
68
|
|
|
}); |
69
|
|
|
|
70
|
|
|
// Magento directory relative to repository root. Use "." (default) if it is not located in a subdirectory |
71
|
|
|
set('magento_dir', '.'); |
72
|
|
|
|
73
|
|
|
|
74
|
|
|
set('shared_files', [ |
75
|
|
|
'{{magento_dir}}/app/etc/env.php', |
76
|
|
|
'{{magento_dir}}/var/.maintenance.ip', |
77
|
|
|
]); |
78
|
|
|
set('shared_dirs', [ |
79
|
|
|
'{{magento_dir}}/var/composer_home', |
80
|
|
|
'{{magento_dir}}/var/log', |
81
|
|
|
'{{magento_dir}}/var/export', |
82
|
|
|
'{{magento_dir}}/var/report', |
83
|
|
|
'{{magento_dir}}/var/import', |
84
|
|
|
'{{magento_dir}}/var/import_history', |
85
|
|
|
'{{magento_dir}}/var/session', |
86
|
|
|
'{{magento_dir}}/var/importexport', |
87
|
|
|
'{{magento_dir}}/var/backups', |
88
|
|
|
'{{magento_dir}}/var/tmp', |
89
|
|
|
'{{magento_dir}}/pub/sitemap', |
90
|
|
|
'{{magento_dir}}/pub/media', |
91
|
|
|
'{{magento_dir}}/pub/static/_cache', |
92
|
|
|
]); |
93
|
|
|
set('writable_dirs', [ |
94
|
|
|
'{{magento_dir}}/var', |
95
|
|
|
'{{magento_dir}}/pub/static', |
96
|
|
|
'{{magento_dir}}/pub/media', |
97
|
|
|
'{{magento_dir}}/generated', |
98
|
|
|
'{{magento_dir}}/var/page_cache', |
99
|
|
|
]); |
100
|
|
|
set('clear_paths', [ |
101
|
|
|
'{{magento_dir}}/generated/*', |
102
|
|
|
'{{magento_dir}}/pub/static/_cache/*', |
103
|
|
|
'{{magento_dir}}/var/generation/*', |
104
|
|
|
'{{magento_dir}}/var/cache/*', |
105
|
|
|
'{{magento_dir}}/var/page_cache/*', |
106
|
|
|
'{{magento_dir}}/var/view_preprocessed/*', |
107
|
|
|
]); |
108
|
|
|
|
109
|
|
|
set('bin/magento', '{{release_or_current_path}}/{{magento_dir}}/bin/magento'); |
110
|
|
|
|
111
|
|
|
set('magento_version', function () { |
112
|
|
|
// detect version |
113
|
|
|
$versionOutput = run('{{bin/php}} {{bin/magento}} --version'); |
114
|
|
|
preg_match('/(\d+\.?)+(-p\d+)?$/', $versionOutput, $matches); |
115
|
|
|
return $matches[0] ?? '2.0'; |
116
|
|
|
}); |
117
|
|
|
|
118
|
|
|
set('config_import_needed', function () { |
119
|
|
|
// detect if app:config:import is needed |
120
|
|
|
try { |
121
|
|
|
run('{{bin/php}} {{bin/magento}} app:config:status'); |
122
|
|
|
} catch (RunException $e) { |
123
|
|
|
if ($e->getExitCode() == CONFIG_IMPORT_NEEDED_EXIT_CODE) { |
124
|
|
|
return true; |
125
|
|
|
} |
126
|
|
|
|
127
|
|
|
throw $e; |
128
|
|
|
} |
129
|
|
|
return false; |
130
|
|
|
}); |
131
|
|
|
|
132
|
|
|
set('database_upgrade_needed', function () { |
133
|
|
|
// detect if setup:upgrade is needed |
134
|
|
|
try { |
135
|
|
|
run('{{bin/php}} {{bin/magento}} setup:db:status'); |
136
|
|
|
} catch (RunException $e) { |
137
|
|
|
if ($e->getExitCode() == DB_UPDATE_NEEDED_EXIT_CODE) { |
138
|
|
|
return true; |
139
|
|
|
} |
140
|
|
|
|
141
|
|
|
throw $e; |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
return false; |
145
|
|
|
}); |
146
|
|
|
|
147
|
|
|
// Deploy without setting maintenance mode if possible |
148
|
|
|
set('enable_zerodowntime', true); |
149
|
|
|
|
150
|
|
|
// Tasks |
151
|
|
|
|
152
|
|
|
// To work correctly with artifact deployment, it is necessary to set the MAGE_MODE correctly in `app/etc/config.php` |
153
|
|
|
// e.g. |
154
|
|
|
// ```php |
155
|
|
|
// 'MAGE_MODE' => 'production' |
156
|
|
|
// ``` |
157
|
|
|
desc('Compiles magento di'); |
158
|
|
|
task('magento:compile', function () { |
159
|
|
|
run("{{bin/php}} {{bin/magento}} setup:di:compile"); |
160
|
|
|
run('cd {{release_or_current_path}}/{{magento_dir}} && {{bin/composer}} dump-autoload -o'); |
161
|
|
|
}); |
162
|
|
|
|
163
|
|
|
// To work correctly with artifact deployment it is necessary to set `system/dev/js` , `system/dev/css` and `system/dev/template` |
164
|
|
|
// in `app/etc/config.php`, e.g.: |
165
|
|
|
// ```php |
166
|
|
|
// 'system' => [ |
167
|
|
|
// 'default' => [ |
168
|
|
|
// 'dev' => [ |
169
|
|
|
// 'js' => [ |
170
|
|
|
// 'merge_files' => '1', |
171
|
|
|
// 'minify_files' => '1' |
172
|
|
|
// ], |
173
|
|
|
// 'css' => [ |
174
|
|
|
// 'merge_files' => '1', |
175
|
|
|
// 'minify_files' => '1' |
176
|
|
|
// ], |
177
|
|
|
// 'template' => [ |
178
|
|
|
// 'minify_html' => '1' |
179
|
|
|
// ] |
180
|
|
|
// ] |
181
|
|
|
// ] |
182
|
|
|
// ``` |
183
|
|
|
desc('Deploys assets'); |
184
|
|
|
task('magento:deploy:assets', function () { |
185
|
|
|
$themesToCompile = ''; |
186
|
|
|
if (get('split_static_deployment')) { |
187
|
|
|
invoke('magento:deploy:assets:adminhtml'); |
188
|
|
|
invoke('magento:deploy:assets:frontend'); |
189
|
|
|
} else { |
190
|
|
|
if (count(get('magento_themes')) > 0) { |
191
|
|
|
$themes = array_is_list(get('magento_themes')) ? get('magento_themes') : array_keys(get('magento_themes')); |
192
|
|
|
foreach ($themes as $theme) { |
193
|
|
|
$themesToCompile .= ' -t ' . $theme; |
194
|
|
|
} |
195
|
|
|
} |
196
|
|
|
run("{{bin/php}} {{release_or_current_path}}/bin/magento setup:static-content:deploy -f --content-version={{content_version}} {{static_deploy_options}} {{static_content_locales}} $themesToCompile -j {{static_content_jobs}}"); |
197
|
|
|
} |
198
|
|
|
}); |
199
|
|
|
|
200
|
|
|
desc('Deploys assets for backend only'); |
201
|
|
|
task('magento:deploy:assets:adminhtml', function () { |
202
|
|
|
magentoDeployAssetsSplit('backend'); |
203
|
|
|
}); |
204
|
|
|
|
205
|
|
|
desc('Deploys assets for frontend only'); |
206
|
|
|
task('magento:deploy:assets:frontend', function () { |
207
|
|
|
magentoDeployAssetsSplit('frontend'); |
208
|
|
|
}); |
209
|
|
|
|
210
|
|
|
/** |
211
|
|
|
* @phpstan-param 'frontend'|'backend' $area |
212
|
|
|
* |
213
|
|
|
* @throws ConfigurationException |
214
|
|
|
*/ |
215
|
|
|
function magentoDeployAssetsSplit(string $area) |
216
|
|
|
{ |
217
|
|
|
if (!in_array($area, ['frontend', 'backend'], true)) { |
218
|
|
|
throw new ConfigurationException("\$area must be either 'frontend' or 'backend', '$area' given"); |
219
|
|
|
} |
220
|
|
|
|
221
|
|
|
$isFrontend = $area === 'frontend'; |
222
|
|
|
$suffix = $isFrontend |
223
|
|
|
? '' |
224
|
|
|
: '_backend'; |
225
|
|
|
|
226
|
|
|
$themesConfig = get("magento_themes$suffix"); |
227
|
|
|
$defaultLanguages = get("static_content_locales$suffix"); |
228
|
|
|
$useDefaultLanguages = array_is_list($themesConfig); |
229
|
|
|
|
230
|
|
|
/** @var list<string> $themes */ |
231
|
|
|
$themes = $useDefaultLanguages |
232
|
|
|
? array_values($themesConfig) |
233
|
|
|
: array_keys($themesConfig); |
234
|
|
|
|
235
|
|
|
$staticContentArea = $isFrontend |
236
|
|
|
? 'frontend' |
237
|
|
|
: 'adminhtml'; |
238
|
|
|
|
239
|
|
|
if ($useDefaultLanguages) { |
240
|
|
|
$themes = '-t ' . implode(' -t ', $themes); |
|
|
|
|
241
|
|
|
|
242
|
|
|
run("{{bin/php}} {{bin/magento}} setup:static-content:deploy -f --area=$staticContentArea --content-version={{content_version}} {{static_deploy_options}} $defaultLanguages $themes -j {{static_content_jobs}}"); |
243
|
|
|
return; |
244
|
|
|
} |
245
|
|
|
|
246
|
|
|
foreach ($themes as $theme) { |
247
|
|
|
$languages = parse($themesConfig[$theme] ?? $defaultLanguages); |
248
|
|
|
|
249
|
|
|
run("{{bin/php}} {{bin/magento}} setup:static-content:deploy -f --area=$staticContentArea --content-version={{content_version}} {{static_deploy_options}} $languages -t $theme -j {{static_content_jobs}}"); |
250
|
|
|
} |
251
|
|
|
} |
252
|
|
|
|
253
|
|
|
desc('Syncs content version'); |
254
|
|
|
task('magento:sync:content_version', function () { |
255
|
|
|
$timestamp = time(); |
256
|
|
|
on(select('all'), function (Host $host) use ($timestamp) { |
257
|
|
|
$host->set('content_version', $timestamp); |
258
|
|
|
}); |
259
|
|
|
})->once(); |
260
|
|
|
|
261
|
|
|
before('magento:deploy:assets', 'magento:sync:content_version'); |
262
|
|
|
|
263
|
|
|
desc('Enables maintenance mode'); |
264
|
|
|
task('magento:maintenance:enable', function () { |
265
|
|
|
// do not use {{bin/magento}} because it would be in "release" but the maintenance mode must be set in "current" |
266
|
|
|
run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/{{magento_dir}}/bin/magento maintenance:enable; fi"); |
267
|
|
|
}); |
268
|
|
|
|
269
|
|
|
desc('Disables maintenance mode'); |
270
|
|
|
task('magento:maintenance:disable', function () { |
271
|
|
|
// do not use {{bin/magento}} because it would be in "release" but the maintenance mode must be set in "current" |
272
|
|
|
run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/{{magento_dir}}/bin/magento maintenance:disable; fi"); |
273
|
|
|
}); |
274
|
|
|
|
275
|
|
|
desc('Set maintenance mode if needed'); |
276
|
|
|
task('magento:maintenance:enable-if-needed', function () { |
277
|
|
|
! get('enable_zerodowntime') || get('database_upgrade_needed') || get('config_import_needed') ? |
278
|
|
|
invoke('magento:maintenance:enable') : |
279
|
|
|
writeln('Config and database up to date => no maintenance mode'); |
280
|
|
|
}); |
281
|
|
|
|
282
|
|
|
desc('Config Import'); |
283
|
|
|
task('magento:config:import', function () { |
284
|
|
|
if (get('config_import_needed')) { |
285
|
|
|
run('{{bin/php}} {{bin/magento}} app:config:import --no-interaction'); |
286
|
|
|
} else { |
287
|
|
|
writeln('App config is up to date => import skipped'); |
288
|
|
|
} |
289
|
|
|
}); |
290
|
|
|
|
291
|
|
|
desc('Upgrades magento database'); |
292
|
|
|
task('magento:upgrade:db', function () { |
293
|
|
|
if (get('database_upgrade_needed')) { |
294
|
|
|
run("{{bin/php}} {{bin/magento}} setup:db-schema:upgrade --no-interaction"); |
295
|
|
|
run("{{bin/php}} {{bin/magento}} setup:db-data:upgrade --no-interaction"); |
296
|
|
|
} else { |
297
|
|
|
writeln('Database schema is up to date => upgrade skipped'); |
298
|
|
|
} |
299
|
|
|
})->once(); |
300
|
|
|
|
301
|
|
|
desc('Flushes Magento Cache'); |
302
|
|
|
task('magento:cache:flush', function () { |
303
|
|
|
run("{{bin/php}} {{bin/magento}} cache:flush"); |
304
|
|
|
}); |
305
|
|
|
|
306
|
|
|
desc('Magento2 deployment operations'); |
307
|
|
|
task('deploy:magento', [ |
308
|
|
|
'magento:build', |
309
|
|
|
'magento:maintenance:enable-if-needed', |
310
|
|
|
'magento:config:import', |
311
|
|
|
'magento:upgrade:db', |
312
|
|
|
'magento:maintenance:disable', |
313
|
|
|
]); |
314
|
|
|
|
315
|
|
|
desc('Magento2 build operations'); |
316
|
|
|
task('magento:build', [ |
317
|
|
|
'magento:compile', |
318
|
|
|
'magento:deploy:assets', |
319
|
|
|
]); |
320
|
|
|
|
321
|
|
|
desc('Deploys your project'); |
322
|
|
|
task('deploy', [ |
323
|
|
|
'deploy:prepare', |
324
|
|
|
'deploy:vendors', |
325
|
|
|
'deploy:clear_paths', |
326
|
|
|
'deploy:magento', |
327
|
|
|
'deploy:publish', |
328
|
|
|
]); |
329
|
|
|
|
330
|
|
|
after('deploy:symlink', 'magento:cache:flush'); |
331
|
|
|
|
332
|
|
|
after('deploy:failed', 'magento:maintenance:disable'); |
333
|
|
|
|
334
|
|
|
// Artifact deployment section |
335
|
|
|
|
336
|
|
|
// The file the artifact is saved to |
337
|
|
|
set('artifact_file', 'artifact.tar.gz'); |
338
|
|
|
|
339
|
|
|
// The directory the artifact is saved in |
340
|
|
|
set('artifact_dir', 'artifacts'); |
341
|
|
|
|
342
|
|
|
// Points to a file with a list of files to exclude from packaging. |
343
|
|
|
// The format is as with the `tar --exclude-from=[file]` option |
344
|
|
|
set('artifact_excludes_file', 'artifacts/excludes'); |
345
|
|
|
|
346
|
|
|
// If set to true, the artifact is built from a clean copy of the project repository instead of the current working directory |
347
|
|
|
set('build_from_repo', false); |
348
|
|
|
|
349
|
|
|
// Set this value if "build_from_repo" is set to true. The target to deploy must also be set with "--branch", "--tag" or "--revision" |
350
|
|
|
set('repository', null); |
351
|
|
|
|
352
|
|
|
// The relative path to the artifact file. If the directory does not exist, it will be created |
353
|
|
|
set('artifact_path', function () { |
354
|
|
|
if (!testLocally('[ -d {{artifact_dir}} ]')) { |
355
|
|
|
runLocally('mkdir -p {{artifact_dir}}'); |
356
|
|
|
} |
357
|
|
|
return get('artifact_dir') . '/' . get('artifact_file'); |
358
|
|
|
}); |
359
|
|
|
|
360
|
|
|
// The location of the tar command. On MacOS you should have installed gtar, as it supports the required settings |
361
|
|
|
set('bin/tar', function () { |
362
|
|
|
if (commandExist('gtar')) { |
363
|
|
|
return which('gtar'); |
364
|
|
|
} else { |
365
|
|
|
return which('tar'); |
366
|
|
|
} |
367
|
|
|
}); |
368
|
|
|
|
369
|
|
|
// tasks section |
370
|
|
|
|
371
|
|
|
desc('Packages all relevant files in an artifact.'); |
372
|
|
|
task('artifact:package', function () { |
373
|
|
|
if (!test('[ -f {{artifact_excludes_file}} ]')) { |
374
|
|
|
throw new GracefulShutdownException( |
375
|
|
|
"No artifact excludes file provided, provide one at artifacts/excludes or change location", |
376
|
|
|
); |
377
|
|
|
} |
378
|
|
|
run('{{bin/tar}} --exclude-from={{artifact_excludes_file}} -czf {{artifact_path}} -C {{release_or_current_path}} .'); |
379
|
|
|
}); |
380
|
|
|
|
381
|
|
|
desc('Uploads artifact in release folder for extraction.'); |
382
|
|
|
task('artifact:upload', function () { |
383
|
|
|
upload(get('artifact_path'), '{{release_path}}'); |
384
|
|
|
}); |
385
|
|
|
|
386
|
|
|
desc('Extracts artifact in release path.'); |
387
|
|
|
task('artifact:extract', function () { |
388
|
|
|
run('{{bin/tar}} -xzpf {{release_path}}/{{artifact_file}} -C {{release_path}}'); |
389
|
|
|
run('rm -rf {{release_path}}/{{artifact_file}}'); |
390
|
|
|
}); |
391
|
|
|
|
392
|
|
|
desc('Clears generated files prior to building.'); |
393
|
|
|
task('build:remove-generated', function () { |
394
|
|
|
run('rm -rf generated/*'); |
395
|
|
|
}); |
396
|
|
|
|
397
|
|
|
desc('Prepare local artifact build'); |
398
|
|
|
task('build:prepare', function () { |
399
|
|
|
if (!currentHost()->get('local')) { |
400
|
|
|
throw new GracefulShutdownException('Artifact can only be built locally, you provided a non local host'); |
401
|
|
|
} |
402
|
|
|
|
403
|
|
|
$buildDir = get('build_from_repo') ? get('artifact_dir') . '/repo' : '.'; |
404
|
|
|
set('deploy_path', $buildDir); |
405
|
|
|
set('release_path', $buildDir); |
406
|
|
|
set('current_path', $buildDir); |
407
|
|
|
|
408
|
|
|
if (!get('build_from_repo')) { |
409
|
|
|
return; |
410
|
|
|
} |
411
|
|
|
|
412
|
|
|
$repository = (string) get('repository'); |
413
|
|
|
if ($repository === '') { |
414
|
|
|
throw new GracefulShutdownException('You must specify the "repository" option.'); |
415
|
|
|
} |
416
|
|
|
|
417
|
|
|
run('rm -rf {{release_or_current_path}}'); |
418
|
|
|
run('git clone {{repository}} {{release_or_current_path}}'); |
419
|
|
|
run('git -C {{release_or_current_path}} checkout --force {{target}}'); |
420
|
|
|
}); |
421
|
|
|
|
422
|
|
|
desc('Builds an artifact.'); |
423
|
|
|
task('artifact:build', [ |
424
|
|
|
'build:prepare', |
425
|
|
|
'build:remove-generated', |
426
|
|
|
'deploy:vendors', |
427
|
|
|
'magento:compile', |
428
|
|
|
'magento:deploy:assets', |
429
|
|
|
'artifact:package', |
430
|
|
|
]); |
431
|
|
|
|
432
|
|
|
// Array of shared files that will be added to the default shared_files without overriding |
433
|
|
|
set('additional_shared_files', []); |
434
|
|
|
// Array of shared directories that will be added to the default shared_dirs without overriding |
435
|
|
|
set('additional_shared_dirs', []); |
436
|
|
|
|
437
|
|
|
|
438
|
|
|
desc('Adds additional files and dirs to the list of shared files and dirs'); |
439
|
|
|
task('deploy:additional-shared', function () { |
440
|
|
|
add('shared_files', get('additional_shared_files')); |
441
|
|
|
add('shared_dirs', get('additional_shared_dirs')); |
442
|
|
|
}); |
443
|
|
|
|
444
|
|
|
/** |
445
|
|
|
* Update cache id_prefix on deploy so that you are compiling against a fresh cache |
446
|
|
|
* Reference Issue: https://github.com/davidalger/capistrano-magento2/issues/151 |
447
|
|
|
* To use this feature, add the following to your deployer scripts: |
448
|
|
|
* ```php |
449
|
|
|
* after('deploy:shared', 'magento:set_cache_prefix'); |
450
|
|
|
* after('deploy:magento', 'magento:cleanup_cache_prefix'); |
451
|
|
|
* ``` |
452
|
|
|
**/ |
453
|
|
|
desc('Update cache id_prefix'); |
454
|
|
|
task('magento:set_cache_prefix', function () { |
455
|
|
|
//download current env config |
456
|
|
|
$tmpConfigFile = tempnam(sys_get_temp_dir(), 'deployer_config'); |
457
|
|
|
download('{{deploy_path}}/shared/' . ENV_CONFIG_FILE_PATH, $tmpConfigFile); |
458
|
|
|
$envConfigArray = include($tmpConfigFile); |
459
|
|
|
//set prefix to `alias_releasename_` |
460
|
|
|
$prefixUpdate = get('alias') . '_' . get('release_name') . '_'; |
461
|
|
|
|
462
|
|
|
//check for preload keys and update |
463
|
|
|
if (isset($envConfigArray['cache']['frontend']['default']['backend_options']['preload_keys'])) { |
464
|
|
|
$oldPrefix = $envConfigArray['cache']['frontend']['default']['id_prefix']; |
465
|
|
|
$preloadKeys = $envConfigArray['cache']['frontend']['default']['backend_options']['preload_keys']; |
466
|
|
|
$newPreloadKeys = []; |
467
|
|
|
foreach ($preloadKeys as $preloadKey) { |
468
|
|
|
$newPreloadKeys[] = preg_replace('/^' . $oldPrefix . '/', $prefixUpdate, $preloadKey); |
469
|
|
|
} |
470
|
|
|
$envConfigArray['cache']['frontend']['default']['backend_options']['preload_keys'] = $newPreloadKeys; |
471
|
|
|
} |
472
|
|
|
|
473
|
|
|
//update id_prefix to include release name |
474
|
|
|
$envConfigArray['cache']['frontend']['default']['id_prefix'] = $prefixUpdate; |
475
|
|
|
$envConfigArray['cache']['frontend']['page_cache']['id_prefix'] = $prefixUpdate; |
476
|
|
|
|
477
|
|
|
//Generate configuration array as string |
478
|
|
|
$envConfigStr = '<?php return ' . var_export($envConfigArray, true) . ';'; |
479
|
|
|
file_put_contents($tmpConfigFile, $envConfigStr); |
480
|
|
|
//upload updated config to server |
481
|
|
|
upload($tmpConfigFile, '{{deploy_path}}/shared/' . TMP_ENV_CONFIG_FILE_PATH); |
482
|
|
|
//cleanup tmp file |
483
|
|
|
unlink($tmpConfigFile); |
484
|
|
|
//delete the symlink for env.php |
485
|
|
|
run('rm {{release_or_current_path}}/' . ENV_CONFIG_FILE_PATH); |
486
|
|
|
//link the env to the tmp version |
487
|
|
|
run('{{bin/symlink}} {{deploy_path}}/shared/' . TMP_ENV_CONFIG_FILE_PATH . ' {{release_path}}/' . ENV_CONFIG_FILE_PATH); |
488
|
|
|
}); |
489
|
|
|
|
490
|
|
|
/** |
491
|
|
|
* After successful deployment, move the tmp_env.php file to env.php ready for next deployment |
492
|
|
|
*/ |
493
|
|
|
desc('Cleanup cache id_prefix env files'); |
494
|
|
|
task('magento:cleanup_cache_prefix', function () { |
495
|
|
|
run('rm {{deploy_path}}/shared/' . ENV_CONFIG_FILE_PATH); |
496
|
|
|
run('rm {{release_or_current_path}}/' . ENV_CONFIG_FILE_PATH); |
497
|
|
|
run('mv {{deploy_path}}/shared/' . TMP_ENV_CONFIG_FILE_PATH . ' {{deploy_path}}/shared/' . ENV_CONFIG_FILE_PATH); |
498
|
|
|
// Symlink shared dir to release dir |
499
|
|
|
run('{{bin/symlink}} {{deploy_path}}/shared/' . ENV_CONFIG_FILE_PATH . ' {{release_path}}/' . ENV_CONFIG_FILE_PATH); |
500
|
|
|
}); |
501
|
|
|
|
502
|
|
|
/** |
503
|
|
|
* Remove cron from crontab and kill running cron jobs |
504
|
|
|
* To use this feature, add the following to your deployer scripts: |
505
|
|
|
* ```php |
506
|
|
|
* after('magento:maintenance:enable-if-needed', 'magento:cron:stop'); |
507
|
|
|
* ``` |
508
|
|
|
*/ |
509
|
|
|
desc('Remove cron from crontab and kill running cron jobs'); |
510
|
|
|
task('magento:cron:stop', function () { |
511
|
|
|
if (has('previous_release')) { |
512
|
|
|
run('{{bin/php}} {{previous_release}}/{{magento_dir}}/bin/magento cron:remove'); |
513
|
|
|
} |
514
|
|
|
|
515
|
|
|
run('pgrep -U "$(id -u)" -f "bin/magento +(cron:run|queue:consumers:start)" | xargs -r kill'); |
516
|
|
|
}); |
517
|
|
|
|
518
|
|
|
/** |
519
|
|
|
* Install cron in crontab |
520
|
|
|
* To use this feature, add the following to your deployer scripts: |
521
|
|
|
* ```php |
522
|
|
|
* after('magento:upgrade:db', 'magento:cron:install'); |
523
|
|
|
* ``` |
524
|
|
|
*/ |
525
|
|
|
desc('Install cron in crontab'); |
526
|
|
|
task('magento:cron:install', function () { |
527
|
|
|
run('cd {{release_or_current_path}}'); |
528
|
|
|
run('{{bin/php}} {{bin/magento}} cron:install'); |
529
|
|
|
}); |
530
|
|
|
|
531
|
|
|
desc('Prepares an artifact on the target server'); |
532
|
|
|
task('artifact:prepare', [ |
533
|
|
|
'deploy:info', |
534
|
|
|
'deploy:setup', |
535
|
|
|
'deploy:lock', |
536
|
|
|
'deploy:release', |
537
|
|
|
'artifact:upload', |
538
|
|
|
'artifact:extract', |
539
|
|
|
'deploy:additional-shared', |
540
|
|
|
'deploy:shared', |
541
|
|
|
'deploy:writable', |
542
|
|
|
]); |
543
|
|
|
|
544
|
|
|
desc('Executes the tasks after artifact is released'); |
545
|
|
|
task('artifact:finish', [ |
546
|
|
|
'magento:cache:flush', |
547
|
|
|
'cachetool:clear:opcache', |
548
|
|
|
'deploy:cleanup', |
549
|
|
|
'deploy:unlock', |
550
|
|
|
'deploy:success', |
551
|
|
|
]); |
552
|
|
|
|
553
|
|
|
desc('Actually releases the artifact deployment'); |
554
|
|
|
task('artifact:deploy', [ |
555
|
|
|
'artifact:prepare', |
556
|
|
|
'magento:maintenance:enable-if-needed', |
557
|
|
|
'magento:config:import', |
558
|
|
|
'magento:upgrade:db', |
559
|
|
|
'magento:maintenance:disable', |
560
|
|
|
'deploy:symlink', |
561
|
|
|
'artifact:finish', |
562
|
|
|
]); |
563
|
|
|
|
564
|
|
|
fail('artifact:deploy', 'deploy:failed'); |
565
|
|
|
|