capistrano-sozo_magento2 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +2 -0
- data/LICENSE +0 -0
- data/README.md +34 -0
- data/capistrano-sozo_magento.gemspec +23 -0
- data/lib/capistrano/sozo_magento2.rb +53 -0
- data/lib/capistrano/sozo_magento2/defaults.rb +39 -0
- data/lib/capistrano/sozo_magento2/version.rb +5 -0
- data/lib/capistrano/tasks/composer.rake +32 -0
- data/lib/capistrano/tasks/db.rake +50 -0
- data/lib/capistrano/tasks/deploy.rake +49 -0
- data/lib/capistrano/tasks/fishpig.rake +16 -0
- data/lib/capistrano/tasks/magento2.rake +247 -0
- data/lib/capistrano/tasks/provision.rake +43 -0
- data/lib/capistrano/tasks/server.rake +18 -0
- data/lib/capistrano/tasks/slack.rake +29 -0
- data/lib/capistrano/tasks/sozo.rake +143 -0
- data/lib/capistrano/tasks/sozo_magento2.rake +0 -0
- data/lib/capistrano/tasks/wordpress.rake +24 -0
- metadata +91 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c002ac19f8884287b44aadbb34cf283f58b3d601482a636f43ad2de645815608
|
4
|
+
data.tar.gz: c0f0053697d68c11921417d67f0a1ed27a193322be4b2d892db8789c41f9084b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 946959dc1c096e3eb3417791c6c9662e450632a16acb08b4119821823692b8531933c0a6c9ad6adaf1131abef3211354a4ebaf06f3610b5a779965d234706259
|
7
|
+
data.tar.gz: 9075f0fdd973e7bde74ef954dd40220642016219693b910fade75a513279845c512c8421411d49c454d93926efebc24c473c5000b0749f55ae9f44c9fe5f0207
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#Capistrano::SozoMagento2
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
It is advised to use bundler.
|
5
|
+
|
6
|
+
1. Add the following to your projects `Gemfile`
|
7
|
+
```
|
8
|
+
gem 'capistrano-sozo-magento2'
|
9
|
+
```
|
10
|
+
2. Install
|
11
|
+
```
|
12
|
+
bundle install
|
13
|
+
```
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
Make sure the following lines are added to your project's `Capfile`:
|
17
|
+
```
|
18
|
+
# Load SOZO Magento tasks
|
19
|
+
require 'capistrano/sozo-magento2'
|
20
|
+
```
|
21
|
+
We recommend putting them in the following location:
|
22
|
+
```
|
23
|
+
# Load DSL and set up stages
|
24
|
+
require 'capistrano/setup'
|
25
|
+
|
26
|
+
# Load SOZO Magento tasks
|
27
|
+
require 'capistrano/sozo-magento2'
|
28
|
+
|
29
|
+
# Include default deployment tasks
|
30
|
+
require 'capistrano/deploy'
|
31
|
+
|
32
|
+
require "capistrano/scm/git"
|
33
|
+
install_plugin Capistrano::SCM::Git
|
34
|
+
```
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "capistrano/sozo_magento2/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "capistrano-sozo_magento2"
|
8
|
+
spec.version = Capistrano::SozoMagento2::VERSION
|
9
|
+
spec.authors = ["Clive Walkden"]
|
10
|
+
spec.email = ["clive@sozodesign.co.uk"]
|
11
|
+
spec.description = %q{Magento 2 support for Capistrano 3.x in SOZO hosted environments}
|
12
|
+
spec.summary = %q{Magento 2 support for Capistrano 3.x in SOZO hosted environments}
|
13
|
+
spec.homepage = "https://github.com/sozodesign/capistrano-sozo-magento2"
|
14
|
+
spec.license = "Proprietary"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(build|test|spec|features)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "capistrano", "~> 3.9"
|
22
|
+
spec.add_dependency "dotenv", "~> 2.2"
|
23
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'dotenv'
|
3
|
+
Dotenv.load
|
4
|
+
|
5
|
+
SSHKit.config.command_map[:composer] = 'php -dmemory_limit=-1 -f /usr/local/bin/composer'
|
6
|
+
SSHKit.config.command_map[:n98magerun] = '/usr/local/bin/n98-magerun'
|
7
|
+
SSHKit.config.command_map[:magento] = "/usr/bin/env php -d memory_limit=1G -f bin/magento --"
|
8
|
+
|
9
|
+
load File.expand_path('../tasks/sozo_magento2.rake', __FILE__)
|
10
|
+
load File.expand_path('../tasks/deploy.rake', __FILE__)
|
11
|
+
load File.expand_path('../tasks/composer.rake', __FILE__)
|
12
|
+
load File.expand_path('../tasks/sozo.rake', __FILE__)
|
13
|
+
load File.expand_path('../tasks/slack.rake', __FILE__)
|
14
|
+
load File.expand_path('../tasks/db.rake', __FILE__)
|
15
|
+
load File.expand_path('../tasks/fishpig.rake', __FILE__)
|
16
|
+
load File.expand_path('../tasks/magento2.rake', __FILE__)
|
17
|
+
load File.expand_path('../tasks/provision.rake', __FILE__)
|
18
|
+
load File.expand_path('../tasks/server.rake', __FILE__)
|
19
|
+
load File.expand_path('../tasks/wordpress.rake', __FILE__)
|
20
|
+
|
21
|
+
after 'deploy:updating', 'composer:install'
|
22
|
+
after 'composer:install', 'magento:setup:permissions'
|
23
|
+
|
24
|
+
before 'deploy:updated', 'slack:deploying'
|
25
|
+
after 'slack:deploying', 'db:backup'
|
26
|
+
after 'db:backup', 'sozo:config:setup'
|
27
|
+
after 'sozo:config:setup', 'magento:maintenance:enable'
|
28
|
+
|
29
|
+
after 'deploy:updated', 'provision:setup_dir'
|
30
|
+
after 'provision:setup_dir', 'magento:setup:upgrade'
|
31
|
+
after 'magento:setup:upgrade', 'magento:setup:di:compile'
|
32
|
+
after 'magento:setup:di:compile', 'magento:setup:static-content:deploy'
|
33
|
+
after 'magento:setup:static-content:deploy', 'provision:permissions'
|
34
|
+
|
35
|
+
after 'deploy:finishing', 'sozo:symlink'
|
36
|
+
after 'sozo:symlink', 'fishpig:setup:install_theme'
|
37
|
+
after 'fishpig:setup:install_theme', 'wordpress:sozo_mu'
|
38
|
+
after 'wordpress:sozo_mu', 'wordpress:cleanup'
|
39
|
+
after 'wordpress:cleanup', 'sozo:optimise'
|
40
|
+
after 'sozo:optimise', 'server:service:restart'
|
41
|
+
after 'server:service:restart', 'magento:maintenance:disable'
|
42
|
+
|
43
|
+
after 'deploy:finished', "slack:deployed"
|
44
|
+
after 'slack:deployed', "db:cleanup"
|
45
|
+
|
46
|
+
after 'deploy:failed', "slack:failed"
|
47
|
+
after 'slack:failed', 'magento:maintenance:disable'
|
48
|
+
|
49
|
+
namespace :load do
|
50
|
+
task :defaults do
|
51
|
+
load 'capistrano/sozo_magento2/defaults.rb'
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
set :linked_files, fetch(:linked_files, []).push()
|
2
|
+
|
3
|
+
set :linked_dirs, fetch(:linked_dirs, []).push(
|
4
|
+
'magento/pub/media',
|
5
|
+
'magento/pub/sitemap',
|
6
|
+
'magento/var/amasty/geoip',
|
7
|
+
'magento/var/backups',
|
8
|
+
'magento/var/composer_home',
|
9
|
+
'magento/var/importexport',
|
10
|
+
'magento/var/import_history',
|
11
|
+
'magento/var/export',
|
12
|
+
'magento/var/log',
|
13
|
+
'magento/var/nginx',
|
14
|
+
'magento/var/report',
|
15
|
+
'magento/var/session',
|
16
|
+
'magento/var/tmp',
|
17
|
+
'magento/wp/wp-content/uploads'
|
18
|
+
)
|
19
|
+
|
20
|
+
# Composer defaults
|
21
|
+
set :composer_flags, '--no-dev --optimize-autoloader --prefer-dist --no-interaction --no-suggest'
|
22
|
+
set :composer_dev_flags, '--prefer-dist --no-interaction --no-suggest'
|
23
|
+
set :composer_require_flags, '--update-no-dev --optimize-autoloader --prefer-dist --no-suggest'
|
24
|
+
set :composer_require_dev_flags, '--optimize-autoloader --prefer-dist'
|
25
|
+
|
26
|
+
# DB defaults
|
27
|
+
set :date_path, Time.now.strftime("%Y%m%d%H%M%S")
|
28
|
+
set :backupdir, ->{ "#{fetch(:deploy_root)}/backups" }
|
29
|
+
set :backupdirdate, ->{ "#{fetch(:backupdir)}/#{fetch(:date_path)}" }
|
30
|
+
set :wp_db, ->{ ENV['WPDB_DATABASE'] }
|
31
|
+
set :wp_backup, ->{ ENV['WPDB_BACKUP'] }
|
32
|
+
set :keep_backups, ->{ ENV['CAP_KEEP_BACKUPS'] }
|
33
|
+
|
34
|
+
# Slack defaults
|
35
|
+
set :slack_channel, ENV['SLACK_CHANNEL']
|
36
|
+
set :slack_webhook, 'https://hooks.slack.com/services/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'
|
37
|
+
|
38
|
+
# Deployment defaults
|
39
|
+
set :confirm_deploy, fetch(:magento_deploy_confirm, [])
|
@@ -0,0 +1,32 @@
|
|
1
|
+
namespace :composer do
|
2
|
+
desc "Install the Composer dependencies"
|
3
|
+
task :install do
|
4
|
+
on roles :testing, :staging do
|
5
|
+
within release_path + 'magento/' do
|
6
|
+
execute :composer, "install", fetch(:composer_dev_flags)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
on roles(:production) do
|
11
|
+
within release_path + 'magento/' do
|
12
|
+
execute :composer, "install", fetch(:composer_flags)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Update the Composer dependencies"
|
18
|
+
task :update do
|
19
|
+
on roles :testing, :staging do
|
20
|
+
within release_path + 'magento/' do
|
21
|
+
execute :composer, "update", fetch(:composer_dev_flags)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
on roles(:production) do
|
26
|
+
within release_path + 'magento/' do
|
27
|
+
execute :composer, "update", fetch(:composer_flags)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Backup Magento 2 database"
|
3
|
+
task :backup do
|
4
|
+
# Backup the database with a timestamp
|
5
|
+
on roles :all do
|
6
|
+
# Check if the backup directory exists and if not create it
|
7
|
+
if test("[ ! -d #{fetch(:backupdir)} ]")
|
8
|
+
execute :mkdir, "-p", fetch(:backupdir)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Backup using n98-magerun but don't include the logs or sessions data
|
12
|
+
info "Backing up Magento database."
|
13
|
+
execute :n98magerun, 'db:dump', "--root-dir='#{fetch(:mage_root)}'",
|
14
|
+
'--compression="gzip"',
|
15
|
+
'--strip="@log @sessions"',
|
16
|
+
'--force', "#{fetch(:backupdir)}/#{fetch(:date_path)}_m2.sql.gz"
|
17
|
+
|
18
|
+
if ENV['WPDB_BACKUP'] == "true"
|
19
|
+
info "Backing up WordPress database."
|
20
|
+
execute :n98magerun, 'db:dump', "--root-dir='#{fetch(:mage_root)}'",
|
21
|
+
'--compression="gzip"',
|
22
|
+
'--connection="wordpress"',
|
23
|
+
'--force', "#{fetch(:backupdir)}/#{fetch(:date_path)}_wp.sql.gz"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Clean up old backups"
|
29
|
+
task :cleanup do
|
30
|
+
on roles :all do
|
31
|
+
backups = capture(:ls, "-x", "#{fetch(:backupdir)}").split
|
32
|
+
valid, invalid = backups.partition { |e| /^\d{14}/ =~ e }
|
33
|
+
|
34
|
+
info "Found #{valid.count} valid backups."
|
35
|
+
|
36
|
+
if (valid.count >= fetch(:keep_backups).to_i)
|
37
|
+
info "Keeping #{fetch(:keep_backups)} of #{valid.count} backups."
|
38
|
+
files = (valid - valid.last(fetch(:keep_backups).to_i)).map do |backup|
|
39
|
+
"#{fetch(:backupdir)}" + "/" + (backup).to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if files.any?
|
44
|
+
files.each_slice(100) do |files_batch|
|
45
|
+
execute :rm, "-f", *files_batch
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
namespace :deploy do
|
2
|
+
before :starting, :confirm_action do
|
3
|
+
if fetch(:magento_deploy_confirm).include? fetch(:stage).to_s
|
4
|
+
print "\e[0;31m Are you sure you want to deploy to #{fetch(:stage).to_s}? [y/n] \e[0m"
|
5
|
+
proceed = STDIN.gets[0..0] rescue nil
|
6
|
+
exit unless proceed == 'y' || proceed == 'Y'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
Rake::Task["cleanup"].clear_actions
|
12
|
+
|
13
|
+
desc "Clean up old releases"
|
14
|
+
task :cleanup do
|
15
|
+
on release_roles :all do |host|
|
16
|
+
releases = capture(:ls, "-x", releases_path).split
|
17
|
+
valid, invalid = releases.partition { |e| /^\d{14}$/ =~ e }
|
18
|
+
keep = fetch(:keep_releases).to_i
|
19
|
+
|
20
|
+
warn t(:skip_cleanup, host: host.to_s) if invalid.any?
|
21
|
+
|
22
|
+
if valid.count >= keep
|
23
|
+
info t(:keeping_releases, host: host.to_s, keep_releases: keep, releases: valid.count)
|
24
|
+
directories = (valid - valid.last(keep))
|
25
|
+
if directories.any?
|
26
|
+
directories_str = directories.map do |release|
|
27
|
+
releases_path.join(release)
|
28
|
+
end.join(" ")
|
29
|
+
execute :sudo, 'rm', "-rf", directories_str
|
30
|
+
# TODO re-symlink the old directory
|
31
|
+
else
|
32
|
+
info t(:no_old_releases, host: host.to_s, keep_releases: keep)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Rake::Task["failed"].clear_actions
|
39
|
+
|
40
|
+
desc "Failed deployment tasks"
|
41
|
+
task :failed do
|
42
|
+
on release_roles :all do |host|
|
43
|
+
on roles :production, :staging, :testing do
|
44
|
+
execute :rm, '-rf', release_path
|
45
|
+
info "Removed failed deployment"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :fishpig do
|
2
|
+
namespace :setup do
|
3
|
+
desc "Install the Wordpress Fishpig theme"
|
4
|
+
task :install_theme do
|
5
|
+
on roles :all do |host|
|
6
|
+
within release_path do
|
7
|
+
execute :mkdir, "-p", "#{release_path}/magento/wp/wp-content/themes/fishpig"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
on roles(:all) do
|
12
|
+
execute :sudo, 'cp', '-a', "#{release_path}/environments/global/wp/wp-content/themes/fishpig/.", "#{release_path}/magento/wp/wp-content/themes/fishpig/"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
namespace :magento do
|
2
|
+
|
3
|
+
namespace :cache do
|
4
|
+
desc 'Flush Magento cache storage'
|
5
|
+
task :flush do
|
6
|
+
on release_roles :all do
|
7
|
+
within release_path do
|
8
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'cache:flush'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Clean Magento cache by types'
|
14
|
+
task :clean do
|
15
|
+
on release_roles :all do
|
16
|
+
within release_path do
|
17
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'cache:clean'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Enable all Magento cache'
|
23
|
+
task :enable do
|
24
|
+
on release_roles :all do
|
25
|
+
within release_path do
|
26
|
+
if File.exist?("magento/bin/magento")
|
27
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'cache:enable', 'config layout block_html collections reflection db_ddl eav config_integration config_integration_api full_page translate config_webservice'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'Disable Magento cache'
|
34
|
+
task :disable do
|
35
|
+
on release_roles :all do
|
36
|
+
within release_path do
|
37
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'cache:disable'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'Check Magento cache enabled status'
|
43
|
+
task :status do
|
44
|
+
on release_roles :all do
|
45
|
+
within release_path do
|
46
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'cache:status'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
namespace :composer do
|
53
|
+
desc 'Run composer install'
|
54
|
+
task :install do
|
55
|
+
on release_roles :all do
|
56
|
+
within release_path + 'magento/' do
|
57
|
+
execute :composer, 'install --prefer-dist --no-interaction --no-dev 2>&1'
|
58
|
+
execute :composer, "#{fetch(:composer_requirements)}"
|
59
|
+
|
60
|
+
# Dir should be here if properly setup, but check for it anyways just in case
|
61
|
+
if test "[ -d #{release_path}/update ]"
|
62
|
+
execute :composer, 'install --prefer-dist --no-interaction --no-dev -d ./update 2>&1'
|
63
|
+
else
|
64
|
+
puts "\e[0;31m Warning: ./update dir does not exist in repository!\n\e[0m\n"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
namespace :modules do
|
72
|
+
desc 'Make sure modules are enabled'
|
73
|
+
task :enable_all do
|
74
|
+
on release_roles :staging do
|
75
|
+
within release_path + 'magento/' do
|
76
|
+
if test("[ -f #{release_path}/magento/app/etc/config.php ]")
|
77
|
+
# Exists, carry on
|
78
|
+
else
|
79
|
+
execute :php, '-dmemory_limit=-1', '-f', 'bin/magento', "module:enable", "--all"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
desc 'Disable a module'
|
86
|
+
task 'disable', :module_name do |t, args|
|
87
|
+
on release_roles :staging do
|
88
|
+
within release_path + 'magento/' do
|
89
|
+
execute :php, '-dmemory_limit=-1', '-f', 'bin/magento', "module:disable", args[:module_name]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Enable a module'
|
95
|
+
task 'enable', :module_name do |t, args|
|
96
|
+
on release_roles :staging do
|
97
|
+
within release_path + 'magento/' do
|
98
|
+
execute :php, '-dmemory_limit=-1', '-f', 'bin/magento', "module:enable", args[:module_name], '-f'
|
99
|
+
invoke 'magento:setup:upgrade'
|
100
|
+
invoke 'magento:setup:static-content:deploy'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
namespace :setup do
|
107
|
+
|
108
|
+
namespace :config do
|
109
|
+
desc 'Set a config item'
|
110
|
+
task :set do
|
111
|
+
on roles(:all) do
|
112
|
+
within release_path + 'magento/' do
|
113
|
+
ask(:parameter, '')
|
114
|
+
ask(:value, '')
|
115
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', "setup:config:set", "--#{fetch(:parameter)}=#{fetch(:value)}", "--no-interaction"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
desc 'Composer install the deployed version of the composer file'
|
122
|
+
task :deployment do
|
123
|
+
on roles(:all) do
|
124
|
+
within release_path + 'magento/' do
|
125
|
+
invoke 'composer:install'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
desc 'Run the Magento upgrade process'
|
131
|
+
task :upgrade do
|
132
|
+
on release_roles :all do
|
133
|
+
within release_path do
|
134
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'setup:upgrade', '-n'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
desc 'Sets proper permissions on application'
|
140
|
+
task :permissions do
|
141
|
+
on release_roles(:staging, :production) do
|
142
|
+
within release_path do
|
143
|
+
execute :find, release_path, '-type d -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 770'
|
144
|
+
execute :find, release_path, '-type f -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 660'
|
145
|
+
execute :chmod, '-R g+s', release_path
|
146
|
+
execute :chmod, '+x', "#{release_path}/magento/bin/magento"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
on release_roles(:testing) do
|
151
|
+
within release_path do
|
152
|
+
execute :find, release_path, '-type d -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 777'
|
153
|
+
execute :find, release_path, '-type f -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 666'
|
154
|
+
execute :chmod, '-R g+s', release_path
|
155
|
+
execute :chmod, '+x', "#{release_path}/magento/bin/magento"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
desc 'Sets proper permissions on application'
|
161
|
+
task :ownership do
|
162
|
+
on roles(:testing, :production) do
|
163
|
+
within release_path do
|
164
|
+
execute :sudo, 'chown', "#{fetch(:username)}:#{fetch(:group)}", '-R', "#{release_path}"
|
165
|
+
execute :sudo, 'chown', "#{fetch(:username)}:#{fetch(:group)}", '-R', "#{deploy_to}/shared"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
namespace :di do
|
171
|
+
desc 'Runs dependency injection compilation routine'
|
172
|
+
task :compile do
|
173
|
+
on release_roles :all do
|
174
|
+
within release_path do
|
175
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'setup:di:compile'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
namespace 'static-content' do
|
182
|
+
desc 'Deploys static view files'
|
183
|
+
task :deploy do
|
184
|
+
on release_roles :all do
|
185
|
+
within release_path do
|
186
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'setup:static-content:deploy -f en_US en_GB -j6'
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# @TODO these below functions target the current directory which may not exist on first deployment
|
194
|
+
namespace :maintenance do
|
195
|
+
desc 'Enable maintenance mode'
|
196
|
+
task :enable do
|
197
|
+
on release_roles :all do
|
198
|
+
within current_path do
|
199
|
+
if File.exist?("magento/bin/magento")
|
200
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'maintenance:enable'
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
desc 'Disable maintenance mode'
|
207
|
+
task :disable do
|
208
|
+
on release_roles :all do
|
209
|
+
within current_path do
|
210
|
+
if File.exist?("magento/bin/magento")
|
211
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'maintenance:disable'
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
desc 'Displays maintenance mode status'
|
218
|
+
task :status do
|
219
|
+
on release_roles :all do
|
220
|
+
within current_path do
|
221
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'maintenance:status'
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
desc 'Sets maintenance mode exempt IPs'
|
227
|
+
task 'allow-ips', :ip do |t, args|
|
228
|
+
on release_roles :all do
|
229
|
+
within current_path do
|
230
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'maintenance:allow-ips', args[:ip]
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
namespace :indexer do
|
237
|
+
desc 'Reindex data by all indexers'
|
238
|
+
task :reindex do
|
239
|
+
on release_roles :all do
|
240
|
+
within release_path do
|
241
|
+
execute :php, '-dmemory_limit=-1', '-f', 'magento/bin/magento', 'indexer:reindex'
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
namespace :provision do
|
2
|
+
desc "Setup the shared directory content"
|
3
|
+
task :shared do
|
4
|
+
invoke 'sozo:upload:dirs'
|
5
|
+
invoke 'sozo:upload:files'
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Setup permissions on the account"
|
9
|
+
task :permissions do
|
10
|
+
on release_roles :all do
|
11
|
+
within release_path do
|
12
|
+
execute :sudo, 'chown', "#{fetch(:username)}:#{fetch(:group)}", "#{release_path}/"
|
13
|
+
execute :sudo, "find", "#{deploy_to}/shared", '-not \(', "-name '#{fetch(:username)}' -or -group '#{fetch(:group)}'", '\) -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chown', "#{fetch(:username)}:#{fetch(:group)}"
|
14
|
+
execute :sudo, "chmod", "770 #{release_path}/"
|
15
|
+
execute :sudo, "find", "#{release_path}/magento", '-type d -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 770'
|
16
|
+
execute :sudo, "find", "#{release_path}/magento", '-type f -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chmod 660'
|
17
|
+
|
18
|
+
if test("[ -f #{release_path}/magento/bin/magento ]")
|
19
|
+
execute :sudo, "chmod", "+x", "#{release_path}/magento/bin/magento"
|
20
|
+
end
|
21
|
+
|
22
|
+
execute :sudo, "find", "#{release_path}/magento", '-print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chown', "#{fetch(:username)}:#{fetch(:group)}"
|
23
|
+
|
24
|
+
# Update symlinks permission
|
25
|
+
execute :sudo, "find", "#{release_path}/magento", '-type l', '-not \(', "-name '#{fetch(:username)}' -or -group '#{fetch(:group)}'", '\) -print0 | sudo xargs --no-run-if-empty --null --max-procs=0 chown', '-h', "#{fetch(:username)}:#{fetch(:group)}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Missing setup directory fix"
|
31
|
+
task :setup_dir do
|
32
|
+
on roles :app do
|
33
|
+
info ("Checking for setup directory - #{release_path}/magento/setup")
|
34
|
+
|
35
|
+
if test("[ -d #{release_path}/magento/setup/ ]")
|
36
|
+
else
|
37
|
+
upload! "#{fetch(:magento_dir)}/setup", "#{release_path}/magento/", recursive: true
|
38
|
+
invoke 'provision:permissions'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
namespace :server do
|
2
|
+
namespace :service do
|
3
|
+
desc "Restart the server services"
|
4
|
+
task :restart do
|
5
|
+
on roles(:gcloud, :aws, :cloud, :dedicated) do
|
6
|
+
within release_path do
|
7
|
+
execute :sudo, "systemctl", "restart", "php-fpm"
|
8
|
+
execute :sudo, "systemctl", "restart", "nginx"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
on roles(:cluster) do
|
12
|
+
within release_path do
|
13
|
+
execute :sudo, "nginx", "-s", "reload"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
namespace :slack do
|
2
|
+
desc "Post to channel that the site has been deployed"
|
3
|
+
task :deployed do
|
4
|
+
on roles(:all) do
|
5
|
+
execute :curl, "-X", "POST", "--data-urlencode", "'payload={\"channel\": \"#{fetch(:slack_channel)}\", \"username\": \"SOZO Deploy Bot\", \"pretext\": \"Deployment Successful\", \"text\": \"<#{fetch(:url)}> Deployed\", \"icon_emoji\": \":satellite:\", \"color\": \"good\", \"fields\": [{ \"title\": \"Branch\", \"value\": \"#{fetch(:branch)}\", \"short\": \"true\" },{ \"title\": \"Environment\", \"value\": \"#{fetch(:environment)}\", \"short\": \"true\" }]}'", "#{fetch(:slack_webhook)}"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Post to channel that the site is being deployed"
|
10
|
+
task :deploying do
|
11
|
+
on roles(:all) do
|
12
|
+
execute :curl, "-X", "POST", "--data-urlencode", "'payload={\"channel\": \"#{fetch(:slack_channel)}\", \"username\": \"SOZO Deploy Bot\", \"pretext\": \"Deployment Process Begun\", \"text\": \"<#{fetch(:url)}> is being Deployed\", \"icon_emoji\": \":satellite:\", \"color\": \"warning\", \"fields\": [{ \"title\": \"Branch\", \"value\": \"#{fetch(:branch)}\", \"short\": \"true\" },{ \"title\": \"Environment\", \"value\": \"#{fetch(:environment)}\", \"short\": \"true\" }]}'", "#{fetch(:slack_webhook)}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Post to channel that something is happening"
|
17
|
+
task :message do
|
18
|
+
on roles(:all) do
|
19
|
+
execute :curl, "-X", "POST", "--data-urlencode", "'payload={\"channel\": \"#{fetch(:slack_channel)}\", \"username\": \"SOZO Deploy Bot\", \"pretext\": \"Next stage\", \"text\": \"<#{fetch(:url)}> is stage change\", \"icon_emoji\": \":satellite:\", \"color\": \"good\", \"fields\": [{ \"title\": \"Branch\", \"value\": \"#{fetch(:branch)}\", \"short\": \"true\" },{ \"title\": \"Environment\", \"value\": \"#{fetch(:environment)}\", \"short\": \"true\" }]}'", "#{fetch(:slack_webhook)}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Post to channel that the site deployment has failed"
|
24
|
+
task :failed do
|
25
|
+
on roles(:all) do
|
26
|
+
execute :curl, "-X", "POST", "--data-urlencode", "'payload={\"channel\": \"#{fetch(:slack_channel)}\", \"username\": \"SOZO Deploy Bot\", \"pretext\": \"Deployment Process Failed\", \"text\": \"<#{fetch(:url)}> deployment has failed\", \"icon_emoji\": \":satellite:\", \"color\": \"warning\", \"fields\": [{ \"title\": \"Branch\", \"value\": \"#{fetch(:branch)}\", \"short\": \"true\" },{ \"title\": \"Environment\", \"value\": \"#{fetch(:environment)}\", \"short\": \"true\" }]}'", "#{fetch(:slack_webhook)}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
namespace :sozo do
|
2
|
+
|
3
|
+
desc "Fix current directory if needed"
|
4
|
+
task :fix_current do
|
5
|
+
on roles(:all) do
|
6
|
+
releases = capture(:ls, "-x", releases_path).split
|
7
|
+
valid, invalid = releases.partition { |e| /^\d{14}$/ =~ e }
|
8
|
+
|
9
|
+
info "last release #{valid.last}"
|
10
|
+
info "Creating symlink from #{fetch(:deploy_to)}/releases/#{valid.last} to #{fetch(:deploy_to)}/current"
|
11
|
+
|
12
|
+
execute :ln, "-sf", "#{fetch(:deploy_to)}/releases/#{valid.last}", "#{fetch(:deploy_to)}/current"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Move database connection files into place"
|
17
|
+
task :db_conn do
|
18
|
+
on roles(:all) do
|
19
|
+
within release_path do
|
20
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/app/etc/env.php", "#{release_path}/magento/app/etc/"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Symlink the deployment to live"
|
26
|
+
task :symlink do
|
27
|
+
on roles :all do |host|
|
28
|
+
within release_path do
|
29
|
+
execute :rm, "-rf", "#{fetch(:mage_root)}", "&&", "ln", "-s", "#{release_path}/magento/", "#{fetch(:mage_root)}"
|
30
|
+
|
31
|
+
# Setup uploads
|
32
|
+
execute :ln, "-s", "#{fetch(:deploy_to)}/shared/magento/wp/wp-content/uploads", "#{release_path}/magento/wp/wp-content"
|
33
|
+
|
34
|
+
# Sitemap
|
35
|
+
execute :ln, "-sf", "#{fetch(:deploy_to)}/shared/magento/sitemap/", "#{release_path}/magento/"
|
36
|
+
execute :ln, "-sf", "#{fetch(:deploy_to)}/shared/magento/sitemap/", "#{release_path}/magento/pub/"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
on roles :all do |host|
|
41
|
+
execute :ln, "-s", "#{fetch(:deploy_to)}/shared/magento/pub/.well-known", "#{release_path}/magento/pub/.well-known"
|
42
|
+
end
|
43
|
+
|
44
|
+
invoke! "sozo:fix_current"
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Production tasks"
|
48
|
+
task :optimise do
|
49
|
+
on roles :all do |host|
|
50
|
+
within release_path do
|
51
|
+
execute :rm, "-rf", "{.git*,*.sample,.ruby-version,*.md,Capfile,Gemfile*,deployment,dev,development,magento/*.sample}"
|
52
|
+
|
53
|
+
invoke!('provision:permissions')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
on roles :production do
|
57
|
+
within release_path do
|
58
|
+
invoke 'magento:cache:enable'
|
59
|
+
invoke 'magento:cache:flush'
|
60
|
+
invoke 'magento:indexer:reindex'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
namespace :config do
|
66
|
+
desc "Config file updates"
|
67
|
+
task :setup do
|
68
|
+
on roles(:all) do
|
69
|
+
within release_path do
|
70
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/pub/robots.txt", "#{release_path}/magento/pub/"
|
71
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/app/etc/env.php", "#{release_path}/magento/app/etc/"
|
72
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/pub/errors/local.xml", "#{release_path}/magento/pub/errors/"
|
73
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/wp/wp-config.php", "#{release_path}/magento/wp/wp-config.php"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
on roles(:staging) do
|
77
|
+
within release_path do
|
78
|
+
execute :cp, "#{release_path}/environments/#{fetch(:environment)}/.htpasswd", "#{release_path}/magento/.htpasswd"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Git Check"
|
84
|
+
task :git do
|
85
|
+
run_locally do
|
86
|
+
git = capture('git rev-parse HEAD')
|
87
|
+
last = capture('git rev-parse HEAD~1')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
desc "Check to see if the setup directory has content"
|
93
|
+
task :setup_check do
|
94
|
+
on roles(:all) do
|
95
|
+
f = "#{fetch(:deploy_to)}/.setup"
|
96
|
+
|
97
|
+
within release_path do
|
98
|
+
if test("[ -f #{f} ]")
|
99
|
+
info "First Deploy File Exists"
|
100
|
+
set :first_deploy, 1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
desc 'Upload linked files and directories'
|
107
|
+
task :upload do
|
108
|
+
invoke 'sozo:upload:dirs'
|
109
|
+
invoke 'sozo:upload:files'
|
110
|
+
end
|
111
|
+
|
112
|
+
task :upload_files do
|
113
|
+
invoke 'sozo:upload:files'
|
114
|
+
end
|
115
|
+
|
116
|
+
task :upload_dirs do
|
117
|
+
invoke 'sozo:upload:dirs'
|
118
|
+
end
|
119
|
+
|
120
|
+
namespace :upload do
|
121
|
+
|
122
|
+
task :files do
|
123
|
+
on roles :app do
|
124
|
+
fetch(:linked_files, []).each do |file|
|
125
|
+
upload! "#{file}", "#{shared_path}/#{file}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
task :dirs do
|
131
|
+
on roles :app do
|
132
|
+
fetch(:linked_dirs, []).each do |dir|
|
133
|
+
info "DIR: #{dir}"
|
134
|
+
upload! "#{dir}", "#{shared_path}/", recursive: true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
before 'sozo:upload', 'deploy:check:make_linked_dirs'
|
142
|
+
|
143
|
+
end
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
namespace :wordpress do
|
2
|
+
|
3
|
+
desc "Install the SOZO MU plugins to stop frontend output when logged into WordPress"
|
4
|
+
task :sozo_mu do
|
5
|
+
on roles(:all) do
|
6
|
+
execute :cp, '-a', "#{release_path}/environments/global/wp/wp-content/mu-plugins/.", "#{release_path}/magento/wp/wp-content/mu-plugins/"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Tidy up the installation (remove un-needed files)"
|
11
|
+
task :cleanup do
|
12
|
+
on roles :all do |host|
|
13
|
+
within release_path + "magento/wp/" do
|
14
|
+
info "Removing default unused WordPress Plugins and Themes"
|
15
|
+
execute :wp, 'plugin', 'delete', 'hello'
|
16
|
+
execute :wp, 'theme', 'delete', 'twentyseventeen'
|
17
|
+
execute :wp, 'theme', 'delete', 'twentynineteen'
|
18
|
+
execute :wp, 'theme', 'delete', 'twentytwenty'
|
19
|
+
execute :rm, '-f', 'readme.html'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-sozo_magento2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Clive Walkden
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-02-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capistrano
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.9'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dotenv
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.2'
|
41
|
+
description: Magento 2 support for Capistrano 3.x in SOZO hosted environments
|
42
|
+
email:
|
43
|
+
- clive@sozodesign.co.uk
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- capistrano-sozo_magento.gemspec
|
53
|
+
- lib/capistrano/sozo_magento2.rb
|
54
|
+
- lib/capistrano/sozo_magento2/defaults.rb
|
55
|
+
- lib/capistrano/sozo_magento2/version.rb
|
56
|
+
- lib/capistrano/tasks/composer.rake
|
57
|
+
- lib/capistrano/tasks/db.rake
|
58
|
+
- lib/capistrano/tasks/deploy.rake
|
59
|
+
- lib/capistrano/tasks/fishpig.rake
|
60
|
+
- lib/capistrano/tasks/magento2.rake
|
61
|
+
- lib/capistrano/tasks/provision.rake
|
62
|
+
- lib/capistrano/tasks/server.rake
|
63
|
+
- lib/capistrano/tasks/slack.rake
|
64
|
+
- lib/capistrano/tasks/sozo.rake
|
65
|
+
- lib/capistrano/tasks/sozo_magento2.rake
|
66
|
+
- lib/capistrano/tasks/wordpress.rake
|
67
|
+
homepage: https://github.com/sozodesign/capistrano-sozo-magento2
|
68
|
+
licenses:
|
69
|
+
- Proprietary
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.7.6
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: Magento 2 support for Capistrano 3.x in SOZO hosted environments
|
91
|
+
test_files: []
|