GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (130)

recipe/magento2.php (1 issue)

Labels
Severity
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);
0 ignored issues
show
$themes of type Deployer\list is incompatible with the type array expected by parameter $pieces of implode(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

240
        $themes = '-t ' . implode(' -t ', /** @scrutinizer ignore-type */ $themes);
Loading history...
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