capistrano-cul 0.0.17 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +0 -1
- data/VERSION +1 -1
- data/capistrano-cul.gemspec +1 -0
- data/lib/capistrano/cul/wp.rb +3 -0
- data/lib/capistrano/tasks/cul.cap +24 -0
- data/lib/capistrano/tasks/wp/deploy.cap +88 -0
- data/lib/capistrano/tasks/wp/install.cap +35 -0
- data/lib/capistrano/tasks/wp/migrate-old.cap +268 -0
- data/lib/capistrano/tasks/wp/migrate.cap +209 -169
- data/lib/capistrano/tasks/wp/setup.cap +73 -0
- data/lib/capistrano/tasks/wp-old.cap +250 -0
- data/lib/capistrano/tasks/wp.cap +31 -218
- metadata +21 -2
@@ -0,0 +1,250 @@
|
|
1
|
+
CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME = 'cul-allowed-upload-types'
|
2
|
+
CUL_ALLOWED_UPLOAD_TYPES_REPO_URL = "https://github.com/cul/#{CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME}"
|
3
|
+
|
4
|
+
# Set cul_allowed_upload_types_version here so it can be overridden by env config
|
5
|
+
set :cul_allowed_upload_types_version, 'v0.5.0'
|
6
|
+
|
7
|
+
namespace :cul do
|
8
|
+
namespace :wp do
|
9
|
+
|
10
|
+
before 'deploy:starting', 'cul:wp:require_deploy_params'
|
11
|
+
|
12
|
+
before 'deploy:starting', 'cul:wp:display_maintenance_mode_warning'
|
13
|
+
after 'deploy:starting', 'cul:wp:enable_maintenance_mode'
|
14
|
+
after 'deploy:starting', 'cul:wp:update_cul_allowed_upload_types_plugin'
|
15
|
+
after :deploy, 'cul:wp:symlink_custom_plugins_and_themes'
|
16
|
+
after :deploy, 'cul:wp:disable_maintenance_mode'
|
17
|
+
|
18
|
+
|
19
|
+
task :require_deploy_params do
|
20
|
+
require_cap_variables!([:branch, :wp_version, :wp_docroot, :wp_content_path])
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Displays a message to the deploying user about how to disable maintenance mode"
|
24
|
+
task :display_maintenance_mode_warning do
|
25
|
+
puts color_text("WARNING: Starting a deployment will set WordPress to maintenance mode. If you cancel deployment mid-way through, you'll need to manually disable maintenance mode by running: cap [env] cul:wp:disable_maintenance_mode")
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Enables maintenance mode for the WordPress site in the deploy environment"
|
29
|
+
task :enable_maintenance_mode do
|
30
|
+
path_to_maintenance_file = maintenance_file_path # save path to local variable because we can't call method inside `on roles(:web)`
|
31
|
+
on roles(:web) do
|
32
|
+
within fetch(:wp_docroot) do
|
33
|
+
# Set maintenance $upgrading value to current time.
|
34
|
+
# Note that WordPress will ignore maintenance mode file
|
35
|
+
# after 10 minutes have passed after the maintenance time
|
36
|
+
# we set in the file.
|
37
|
+
execute :echo, "'<?php $upgrading = #{Time.now.to_i};'", '>', path_to_maintenance_file
|
38
|
+
end
|
39
|
+
end
|
40
|
+
puts color_text("Maintenance mode enabled!")
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Disable maintenance mode for the WordPress site in the deploy environment"
|
44
|
+
task :disable_maintenance_mode do
|
45
|
+
path_to_maintenance_file = maintenance_file_path # save path to local variable because we can't call method inside `on roles(:web)`
|
46
|
+
on roles(:web) do
|
47
|
+
within fetch(:wp_docroot) do
|
48
|
+
if test("[ -f #{path_to_maintenance_file} ]")
|
49
|
+
execute :rm, path_to_maintenance_file
|
50
|
+
else
|
51
|
+
puts "No maintenance file found, so there's nothing to delete."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
puts color_text("Maintenance mode disabled!")
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Creates symlinks for custom plugins and themes as part of a WordPress deployment. Generally run as an `after :deploy` hook."
|
59
|
+
task :symlink_custom_plugins_and_themes do
|
60
|
+
symlink_custom_plugins_and_themes
|
61
|
+
end
|
62
|
+
|
63
|
+
# Runs normal deploy task, downloads new copy of WP, sets up docroot, runs
|
64
|
+
# deploy command, sets up symlinks. Does not run WP install and does not
|
65
|
+
# create any wp users.
|
66
|
+
desc "Sets up a WordPress docroot and runs deployment; does not install wordpress and does not create any users"
|
67
|
+
task :setup do
|
68
|
+
puts "Deploying repo branch: #{fetch(:branch)}"
|
69
|
+
|
70
|
+
set :wp_version, ask('WordPress version to download:', 'latest')
|
71
|
+
# Printing out wp_version here because the `set` command above only runs
|
72
|
+
# the first time its associated symbol is referenced, and we want to
|
73
|
+
# capture version before running any other commands.
|
74
|
+
puts "Setting up wp_version: #{fetch(:wp_version)}"
|
75
|
+
|
76
|
+
require_cap_variables!([:branch, :wp_version, :wp_docroot, :wp_content_path])
|
77
|
+
|
78
|
+
on roles(:web) do
|
79
|
+
wp_docroot_wp_config_file_path = File.join(fetch(:wp_docroot), 'wp-config.php')
|
80
|
+
wp_docroot_robots_txt_file_path = File.join(fetch(:wp_docroot), 'robots.txt')
|
81
|
+
wp_docroot_wp_content_path = File.join(fetch(:wp_docroot), 'wp-content')
|
82
|
+
|
83
|
+
shared_wp_config_file_path = shared_path.join('wp-config.php')
|
84
|
+
shared_robots_txt_file_path = shared_path.join('robots.txt')
|
85
|
+
|
86
|
+
wp_content_path = fetch(:wp_content_path)
|
87
|
+
|
88
|
+
# Create nginx logs directory if it doesn't already exist
|
89
|
+
execute :mkdir, '-p', deploy_path.join('logs')
|
90
|
+
|
91
|
+
# Make full path to wp_docroot directory if not exist
|
92
|
+
execute :mkdir, '-p', fetch(:wp_docroot)
|
93
|
+
|
94
|
+
# Make full path to wp_content_path if not exist
|
95
|
+
execute :mkdir, '-p', wp_content_path
|
96
|
+
|
97
|
+
invoke 'deploy' # Deploy before doing setup
|
98
|
+
|
99
|
+
# If wp_docroot/wp-includes does not exist, do wordpress download
|
100
|
+
unless test("[ -d #{File.join(fetch(:wp_docroot), 'wp-includes')} ]")
|
101
|
+
# Download and unpack new WP instance to wp_docroot
|
102
|
+
execute :wp, 'core', ['download', "--version=#{fetch(:wp_version)}", "--path=#{fetch(:wp_docroot)}"]
|
103
|
+
end
|
104
|
+
|
105
|
+
# Check for wp-config.php file in shared. Create if it doesn't exist.
|
106
|
+
unless test("[ -f #{shared_wp_config_file_path} ]")
|
107
|
+
# If no wp-config.php file is found in the 'shared' directory, copy WordPress built-in wp-config-sample.php to there
|
108
|
+
execute :cp, File.join(fetch(:wp_docroot), 'wp-config-sample.php'), shared_wp_config_file_path
|
109
|
+
end
|
110
|
+
|
111
|
+
# Delete original wp-sample-config.php
|
112
|
+
execute :rm, '-f', File.join(fetch(:wp_docroot), 'wp-config-sample.php')
|
113
|
+
# Create symlink for wp_document_root wp-config.php to 'shared' version.
|
114
|
+
execute :ln, '-sf', shared_wp_config_file_path, wp_docroot_wp_config_file_path
|
115
|
+
|
116
|
+
# Check for robots.txt file in shared. Create if it doesn't exist.
|
117
|
+
unless test("[ -f #{shared_robots_txt_file_path} ]")
|
118
|
+
execute "echo -e \"User-agent: *\nDisallow: /\" > #{shared_robots_txt_file_path}"
|
119
|
+
end
|
120
|
+
# Create symlink for wp_document_root robots.txt to 'shared' version.
|
121
|
+
execute :ln, '-sf', shared_robots_txt_file_path, wp_docroot_robots_txt_file_path
|
122
|
+
|
123
|
+
# Check for actual wp-content directory at wp_content_path. Create if it doesn't exist.
|
124
|
+
unless test("[ -d #{wp_content_path} ]")
|
125
|
+
# If no wp-config.php file is found in the 'shared' directory, copy WordPress built-in wp-config-sample.php to there
|
126
|
+
execute :cp, '-r', wp_docroot_wp_content_path, wp_content_path
|
127
|
+
end
|
128
|
+
# Delete original wp-content directory
|
129
|
+
execute :rm, '-rf', wp_docroot_wp_content_path
|
130
|
+
# Create symlink for wp_document_root wp-content to wp_content_path
|
131
|
+
execute :ln, '-sf', wp_content_path, wp_docroot_wp_content_path
|
132
|
+
end
|
133
|
+
symlink_custom_plugins_and_themes
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
def self.symlink_custom_plugins_and_themes
|
139
|
+
on roles(:web) do
|
140
|
+
wp_content_path = fetch(:wp_content_path)
|
141
|
+
wp_content_plugin_path = File.join(wp_content_path, 'plugins')
|
142
|
+
wp_content_mu_plugin_path = File.join(wp_content_path, 'mu-plugins')
|
143
|
+
wp_content_themes_path = File.join(wp_content_path, 'themes')
|
144
|
+
|
145
|
+
if test("[ -d #{wp_content_path} ]")
|
146
|
+
|
147
|
+
### Create necessary directories
|
148
|
+
execute :mkdir, '-p', wp_content_plugin_path
|
149
|
+
execute :mkdir, '-p', wp_content_mu_plugin_path
|
150
|
+
execute :mkdir, '-p', wp_content_themes_path
|
151
|
+
|
152
|
+
### Remove old symlinks
|
153
|
+
[wp_content_plugin_path, wp_content_mu_plugin_path, wp_content_themes_path].each do |dir|
|
154
|
+
execute :find, dir, '-maxdepth 1', '-type l', '-exec rm {} \;'
|
155
|
+
end
|
156
|
+
|
157
|
+
### Add latest symlinks
|
158
|
+
fetch(:wp_custom_plugins, {}).each do |plugin, repo_relative_path|
|
159
|
+
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_plugin_path, plugin)
|
160
|
+
end
|
161
|
+
|
162
|
+
fetch(:wp_custom_mu_plugins, {}).each do |mu_plugin, repo_relative_path|
|
163
|
+
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_mu_plugin_path, mu_plugin)
|
164
|
+
end
|
165
|
+
|
166
|
+
fetch(:wp_custom_themes, {}).each do |theme, repo_relative_path|
|
167
|
+
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_themes_path, theme)
|
168
|
+
end
|
169
|
+
|
170
|
+
### Also symlink to cul-allowed-upload-types plugin files
|
171
|
+
within deploy_path do
|
172
|
+
cul_allowed_upload_types_plugin_top_level_files_and_dirs = capture(:find, CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME, '-mindepth', '2', '-maxdepth', '2').split("\n")
|
173
|
+
# Symlink all plugin files and directories
|
174
|
+
cul_allowed_upload_types_plugin_top_level_files_and_dirs.each do |plugin_file_or_directory_path|
|
175
|
+
#puts 'Run: ' + [:ln, '-sf', File.join(deploy_path, plugin_file_or_directory_path), File.join(wp_content_mu_plugin_path, File.basename(plugin_file_or_directory_path))].join(' ')
|
176
|
+
execute :ln, '-sf', File.join(deploy_path, plugin_file_or_directory_path), File.join(wp_content_mu_plugin_path, File.basename(plugin_file_or_directory_path))
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
desc "Downloads the latest version of the cul-allowed-upload-types plugin"
|
185
|
+
task :update_cul_allowed_upload_types_plugin do
|
186
|
+
# Download plugin to deploy_path
|
187
|
+
on roles(:web) do
|
188
|
+
within deploy_path do
|
189
|
+
# Clear out old plugin directory if it exists
|
190
|
+
execute :rm, '-rf', CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME
|
191
|
+
# Re-create plugin directory and temp dir inside of it
|
192
|
+
allowed_upload_types_tempdir = File.join(CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME, 'tmp')
|
193
|
+
execute :mkdir, '-p', allowed_upload_types_tempdir
|
194
|
+
|
195
|
+
# Download and unzip plugin
|
196
|
+
allowed_upload_types_temp_zipfile = File.join(allowed_upload_types_tempdir, 'plugin.zip')
|
197
|
+
zip_file_name = "#{fetch(:cul_allowed_upload_types_version)}.zip"
|
198
|
+
execute :curl, '-L', '--silent', '-o', allowed_upload_types_temp_zipfile, "#{CUL_ALLOWED_UPLOAD_TYPES_REPO_URL}/archive/#{zip_file_name}"
|
199
|
+
execute :unzip, allowed_upload_types_temp_zipfile, '-d', CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME
|
200
|
+
|
201
|
+
# Delete temp dir after unzip
|
202
|
+
execute :rm, '-rf', allowed_upload_types_tempdir
|
203
|
+
|
204
|
+
# Remove .gitignore file from plugin directory so we don't symlink to it later
|
205
|
+
execute :find, CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME, '-name', '.gitignore', '-delete'
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
desc "Runs a search and replace operation on the tables in a WordPress installation"
|
211
|
+
task :searchreplace do
|
212
|
+
on roles(:web) do
|
213
|
+
within fetch(:wp_docroot) do
|
214
|
+
set :search_string, ask("search string")
|
215
|
+
set :replacement_string, ask("replacement string")
|
216
|
+
puts "Are you sure you want to replace all occurrences of \"#{fetch(:search_string)}\" with \"#{fetch(:replacement_string)}\"?"
|
217
|
+
set :confirm, ask('"y" or "yes" to continue')
|
218
|
+
|
219
|
+
unless ['y', 'yes'].include?(fetch(:confirm))
|
220
|
+
puts 'Search and replace operation has been cancelled because neither "y" nor "yes" were entered.'
|
221
|
+
next
|
222
|
+
end
|
223
|
+
|
224
|
+
puts 'Running search and replace. This may take a while for large databases...'
|
225
|
+
start_time = Time.now
|
226
|
+
|
227
|
+
if fetch(:multisite, false)
|
228
|
+
puts "Since this is a multisite, you'll need to specify the source multisite instance domain to continue:"
|
229
|
+
set :multisite_url, ask('source multisite instance domain (e.g. blogs.cul.columbia.edu)')
|
230
|
+
|
231
|
+
execute :wp, "--url=#{fetch(:multisite_url)}", 'search-replace', "'#{fetch(:search_string)}'", "'#{fetch(:replacement_string)}'", '--all-tables', '--skip-columns=guid'
|
232
|
+
else
|
233
|
+
execute :wp, 'search-replace', "'#{fetch(:search_string)}'", "'#{fetch(:replacement_string)}'", '--skip-columns=guid'
|
234
|
+
end
|
235
|
+
|
236
|
+
puts "Search and replace complete (took #{(Time.now - start_time).to_s} seconds)"
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
def self.cul_allowed_upload_types_plugin_path
|
242
|
+
File.join('mu-plugins', CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME)
|
243
|
+
end
|
244
|
+
|
245
|
+
def self.maintenance_file_path
|
246
|
+
File.join(fetch(:wp_docroot), '.maintenance')
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
end
|
data/lib/capistrano/tasks/wp.cap
CHANGED
@@ -1,32 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Set cul_allowed_uplaod_types_version here so it can be overridden by env config
|
5
|
-
set :cul_allowed_uplaod_types_version, 'v0.5.0'
|
1
|
+
set :cul_allowed_upload_types_version, 'v0.5.0' # can be overridden by an app's deploy.rb file
|
2
|
+
set :cul_allowed_upload_types_plugin_name, 'cul-allowed-upload-types'
|
3
|
+
set :cul_allowed_upload_types_downloaded_plugin_path, ->{current_path.join(fetch(:cul_allowed_upload_types_plugin_name))} # can be overridden by an app's deploy.rb file
|
6
4
|
|
7
5
|
namespace :cul do
|
8
6
|
namespace :wp do
|
9
|
-
before 'deploy:starting', 'cul:wp:display_maintenance_mode_warning'
|
10
|
-
after 'deploy:starting', 'cul:wp:enable_maintenance_mode'
|
11
|
-
after 'deploy:starting', 'cul:wp:update_cul_allowed_upload_types_plugin'
|
12
|
-
after :deploy, 'cul:wp:symlink_custom_plugins_and_themes'
|
13
|
-
after :deploy, 'cul:wp:disable_maintenance_mode'
|
14
7
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
set :maintenance_file_path, ->{
|
9
|
+
require_cap_variables!([:wp_docroot])
|
10
|
+
File.join(fetch(:wp_docroot), '.maintenance')
|
11
|
+
}
|
19
12
|
|
20
13
|
desc "Enables maintenance mode for the WordPress site in the deploy environment"
|
21
14
|
task :enable_maintenance_mode do
|
22
|
-
path_to_maintenance_file = maintenance_file_path # save path to local variable because we can't call method inside `on roles(:web)`
|
23
15
|
on roles(:web) do
|
24
16
|
within fetch(:wp_docroot) do
|
25
17
|
# Set maintenance $upgrading value to current time.
|
26
18
|
# Note that WordPress will ignore maintenance mode file
|
27
19
|
# after 10 minutes have passed after the maintenance time
|
28
20
|
# we set in the file.
|
29
|
-
execute :echo, "'<?php $upgrading = #{Time.now.to_i};'", '>',
|
21
|
+
execute :echo, "'<?php $upgrading = #{Time.now.to_i};'", '>', fetch(:maintenance_file_path)
|
30
22
|
end
|
31
23
|
end
|
32
24
|
puts color_text("Maintenance mode enabled!")
|
@@ -34,11 +26,10 @@ namespace :cul do
|
|
34
26
|
|
35
27
|
desc "Disable maintenance mode for the WordPress site in the deploy environment"
|
36
28
|
task :disable_maintenance_mode do
|
37
|
-
path_to_maintenance_file = maintenance_file_path # save path to local variable because we can't call method inside `on roles(:web)`
|
38
29
|
on roles(:web) do
|
39
30
|
within fetch(:wp_docroot) do
|
40
|
-
if test("[ -f #{
|
41
|
-
execute :rm,
|
31
|
+
if test("[ -f #{fetch(:maintenance_file_path)} ]")
|
32
|
+
execute :rm, fetch(:maintenance_file_path)
|
42
33
|
else
|
43
34
|
puts "No maintenance file found, so there's nothing to delete."
|
44
35
|
end
|
@@ -47,205 +38,25 @@ namespace :cul do
|
|
47
38
|
puts color_text("Maintenance mode disabled!")
|
48
39
|
end
|
49
40
|
|
50
|
-
desc "
|
51
|
-
task :
|
52
|
-
symlink_custom_plugins_and_themes
|
53
|
-
end
|
54
|
-
|
55
|
-
# Runs normal deploy task, downloads new copy of WP, sets up docroot, runs
|
56
|
-
# deploy command, sets up symlinks. Does not run WP install and does not
|
57
|
-
# create any wp users.
|
58
|
-
desc "Sets up a WordPress docroot and runs deployment; does not install wordpress and does not create any users"
|
59
|
-
task :setup do
|
60
|
-
puts "Deploying repo branch: #{fetch(:branch)}"
|
61
|
-
|
62
|
-
set :wp_version, ask('WordPress version to download:', 'latest')
|
63
|
-
# Printing out wp_version here because the `set` command above only runs
|
64
|
-
# the first time its associated symbol is referenced, and we want to
|
65
|
-
# capture version before running any other commands.
|
66
|
-
puts "Setting up wp_version: #{fetch(:wp_version)}"
|
67
|
-
|
68
|
-
require_cap_params!([:branch, :wp_version, :wp_docroot, :wp_content_path])
|
69
|
-
|
70
|
-
on roles(:web) do
|
71
|
-
wp_docroot_wp_config_file_path = File.join(fetch(:wp_docroot), 'wp-config.php')
|
72
|
-
wp_docroot_robots_txt_file_path = File.join(fetch(:wp_docroot), 'robots.txt')
|
73
|
-
wp_docroot_wp_content_path = File.join(fetch(:wp_docroot), 'wp-content')
|
74
|
-
|
75
|
-
shared_wp_config_file_path = shared_path.join('wp-config.php')
|
76
|
-
shared_robots_txt_file_path = shared_path.join('robots.txt')
|
77
|
-
|
78
|
-
wp_content_path = fetch(:wp_content_path)
|
79
|
-
|
80
|
-
# Create nginx logs directory if it doesn't already exist
|
81
|
-
execute :mkdir, '-p', deploy_path.join('logs')
|
82
|
-
|
83
|
-
# Make full path to wp_docroot directory if not exist
|
84
|
-
execute :mkdir, '-p', fetch(:wp_docroot)
|
85
|
-
|
86
|
-
# Make full path to wp_content_path if not exist
|
87
|
-
execute :mkdir, '-p', wp_content_path
|
88
|
-
|
89
|
-
invoke 'deploy' # Deploy before doing setup
|
90
|
-
|
91
|
-
# If wp_docroot/wp-includes does not exist, do wordpress download
|
92
|
-
unless test("[ -d #{File.join(fetch(:wp_docroot), 'wp-includes')} ]")
|
93
|
-
# Download and unpack new WP instance to wp_docroot
|
94
|
-
execute :wp, 'core', ['download', "--version=#{fetch(:wp_version)}", "--path=#{fetch(:wp_docroot)}"]
|
95
|
-
end
|
96
|
-
|
97
|
-
# Check for wp-config.php file in shared. Create if it doesn't exist.
|
98
|
-
unless test("[ -f #{shared_wp_config_file_path} ]")
|
99
|
-
# If no wp-config.php file is found in the 'shared' directory, copy WordPress built-in wp-config-sample.php to there
|
100
|
-
execute :cp, File.join(fetch(:wp_docroot), 'wp-config-sample.php'), shared_wp_config_file_path
|
101
|
-
end
|
102
|
-
|
103
|
-
# Delete original wp-sample-config.php
|
104
|
-
execute :rm, '-f', File.join(fetch(:wp_docroot), 'wp-config-sample.php')
|
105
|
-
# Create symlink for wp_document_root wp-config.php to 'shared' version.
|
106
|
-
execute :ln, '-sf', shared_wp_config_file_path, wp_docroot_wp_config_file_path
|
107
|
-
|
108
|
-
# Check for robots.txt file in shared. Create if it doesn't exist.
|
109
|
-
unless test("[ -f #{shared_robots_txt_file_path} ]")
|
110
|
-
execute "echo -e \"User-agent: *\nDisallow: /\" > #{shared_robots_txt_file_path}"
|
111
|
-
end
|
112
|
-
# Create symlink for wp_document_root robots.txt to 'shared' version.
|
113
|
-
execute :ln, '-sf', shared_robots_txt_file_path, wp_docroot_robots_txt_file_path
|
114
|
-
|
115
|
-
# Check for actual wp-content directory at wp_content_path. Create if it doesn't exist.
|
116
|
-
unless test("[ -d #{wp_content_path} ]")
|
117
|
-
# If no wp-config.php file is found in the 'shared' directory, copy WordPress built-in wp-config-sample.php to there
|
118
|
-
execute :cp, '-r', wp_docroot_wp_content_path, wp_content_path
|
119
|
-
end
|
120
|
-
# Delete original wp-content directory
|
121
|
-
execute :rm, '-rf', wp_docroot_wp_content_path
|
122
|
-
# Create symlink for wp_document_root wp-content to wp_content_path
|
123
|
-
execute :ln, '-sf', wp_content_path, wp_docroot_wp_content_path
|
124
|
-
end
|
125
|
-
symlink_custom_plugins_and_themes
|
126
|
-
end
|
127
|
-
|
128
|
-
desc "Runs a WordPress installation for a newly set up instance and creates a new admin user"
|
129
|
-
task :install do
|
130
|
-
puts "Please provide administrative credentials:"
|
131
|
-
ask(:admin_user, "Admin username:")
|
132
|
-
ask(:admin_password, "Admin password:", echo: false)
|
133
|
-
ask(:admin_email, "Admin email:")
|
134
|
-
|
135
|
-
require_cap_params!([:url, :title, :admin_user, :admin_password, :admin_email])
|
136
|
-
|
137
|
-
on roles(:web) do
|
138
|
-
within fetch(:wp_docroot) do
|
139
|
-
execute :wp, 'core', fetch(:multisite) ? 'multisite-install' : 'install',
|
140
|
-
"--url='#{fetch(:url)}'",
|
141
|
-
"--title='#{fetch(:title)}'",
|
142
|
-
"--admin_user='#{fetch(:admin_user)}'",
|
143
|
-
"--admin_password='#{fetch(:admin_password)}'",
|
144
|
-
"--admin_email='#{fetch(:admin_email)}'"
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def self.require_cap_params!(vars)
|
150
|
-
validate vars do |key, value|
|
151
|
-
if value.nil? || value.empty?
|
152
|
-
raise Capistrano::ValidationError, "Missing required parameter #{key}"
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
def self.symlink_custom_plugins_and_themes
|
158
|
-
on roles(:web) do
|
159
|
-
wp_content_path = fetch(:wp_content_path)
|
160
|
-
wp_content_plugin_path = File.join(wp_content_path, 'plugins')
|
161
|
-
wp_content_mu_plugin_path = File.join(wp_content_path, 'mu-plugins')
|
162
|
-
wp_content_themes_path = File.join(wp_content_path, 'themes')
|
163
|
-
|
164
|
-
if test("[ -d #{wp_content_path} ]")
|
165
|
-
|
166
|
-
### Create necessary directories
|
167
|
-
execute :mkdir, '-p', wp_content_plugin_path
|
168
|
-
execute :mkdir, '-p', wp_content_mu_plugin_path
|
169
|
-
execute :mkdir, '-p', wp_content_themes_path
|
170
|
-
|
171
|
-
### Remove old symlinks
|
172
|
-
[wp_content_plugin_path, wp_content_mu_plugin_path, wp_content_themes_path].each do |dir|
|
173
|
-
execute :find, dir, '-maxdepth 1', '-type l', '-exec rm {} \;'
|
174
|
-
end
|
175
|
-
|
176
|
-
### Add latest symlinks
|
177
|
-
fetch(:wp_custom_plugins, {}).each do |plugin, repo_relative_path|
|
178
|
-
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_plugin_path, plugin)
|
179
|
-
end
|
180
|
-
|
181
|
-
fetch(:wp_custom_mu_plugins, {}).each do |mu_plugin, repo_relative_path|
|
182
|
-
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_mu_plugin_path, mu_plugin)
|
183
|
-
end
|
184
|
-
|
185
|
-
fetch(:wp_custom_themes, {}).each do |theme, repo_relative_path|
|
186
|
-
execute :ln, '-sf', File.join(current_path, repo_relative_path), File.join(wp_content_themes_path, theme)
|
187
|
-
end
|
188
|
-
|
189
|
-
### Also symlink to cul-allowed-upload-types plugin files
|
190
|
-
within deploy_path do
|
191
|
-
cul_allowed_upload_types_plugin_top_level_files_and_dirs = capture(:find, CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME, '-mindepth', '2', '-maxdepth', '2').split("\n")
|
192
|
-
# Symlink all plugin files and directories
|
193
|
-
cul_allowed_upload_types_plugin_top_level_files_and_dirs.each do |plugin_file_or_directory_path|
|
194
|
-
#puts 'Run: ' + [:ln, '-sf', File.join(deploy_path, plugin_file_or_directory_path), File.join(wp_content_mu_plugin_path, File.basename(plugin_file_or_directory_path))].join(' ')
|
195
|
-
execute :ln, '-sf', File.join(deploy_path, plugin_file_or_directory_path), File.join(wp_content_mu_plugin_path, File.basename(plugin_file_or_directory_path))
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
desc "Downloads the latest version of the cul-allowed-upload-types plugin"
|
204
|
-
task :update_cul_allowed_upload_types_plugin do
|
205
|
-
# Download plugin to deploy_path
|
206
|
-
on roles(:web) do
|
207
|
-
within deploy_path do
|
208
|
-
# Clear out old plugin directory if it exists
|
209
|
-
execute :rm, '-rf', CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME
|
210
|
-
# Re-create plugin directory and temp dir inside of it
|
211
|
-
allowed_upload_types_tempdir = File.join(CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME, 'tmp')
|
212
|
-
execute :mkdir, '-p', allowed_upload_types_tempdir
|
213
|
-
|
214
|
-
# Download and unzip plugin
|
215
|
-
allowed_upload_types_temp_zipfile = File.join(allowed_upload_types_tempdir, 'plugin.zip')
|
216
|
-
zip_file_name = "#{fetch(:cul_allowed_uplaod_types_version)}.zip"
|
217
|
-
execute :curl, '-L', '--silent', '-o', allowed_upload_types_temp_zipfile, "#{CUL_ALLOWED_UPLOAD_TYPES_REPO_URL}/archive/#{zip_file_name}"
|
218
|
-
execute :unzip, allowed_upload_types_temp_zipfile, '-d', CUL_ALLOWED_UPLOAD_TYPES_PLUGIN_NAME
|
41
|
+
desc "Runs a search and replace operation on the tables in a WordPress installation"
|
42
|
+
task :searchreplace do
|
219
43
|
|
220
|
-
|
221
|
-
|
44
|
+
set :search_string, ask("search string")
|
45
|
+
set :replacement_string, ask("replacement string")
|
222
46
|
|
223
|
-
|
224
|
-
|
225
|
-
|
47
|
+
unless enter_y_to_continue(color_text("This will replace all occurrences of \"#{fetch(:search_string)}\" with \"#{fetch(:replacement_string)}\"."))
|
48
|
+
puts 'Search and replace cancelled because "y" was not entered.'
|
49
|
+
next
|
226
50
|
end
|
227
|
-
end
|
228
51
|
|
229
|
-
desc "Runs a search and replace operation on the tables in a WordPress installation"
|
230
|
-
task :searchreplace do
|
231
52
|
on roles(:web) do
|
232
53
|
within fetch(:wp_docroot) do
|
233
|
-
set :search_string, ask("search string")
|
234
|
-
set :replacement_string, ask("replacement string")
|
235
|
-
puts "Are you sure you want to replace all occurrences of \"#{fetch(:search_string)}\" with \"#{fetch(:replacement_string)}\"?"
|
236
|
-
set :confirm, ask('"y" or "yes" to continue')
|
237
|
-
|
238
|
-
unless ['y', 'yes'].include?(fetch(:confirm))
|
239
|
-
puts 'Search and replace operation has been cancelled because neither "y" nor "yes" were entered.'
|
240
|
-
next
|
241
|
-
end
|
242
|
-
|
243
54
|
puts 'Running search and replace. This may take a while for large databases...'
|
244
55
|
start_time = Time.now
|
245
56
|
|
246
57
|
if fetch(:multisite, false)
|
247
|
-
puts "Since this is a multisite, you'll need to specify the
|
248
|
-
set :multisite_url, ask('
|
58
|
+
puts "Since this is a multisite, you'll need to specify the original multisite instance domain to continue:"
|
59
|
+
set :multisite_url, ask('original multisite instance domain (e.g. blogs.cul.columbia.edu)')
|
249
60
|
|
250
61
|
execute :wp, "--url=#{fetch(:multisite_url)}", 'search-replace', "'#{fetch(:search_string)}'", "'#{fetch(:replacement_string)}'", '--all-tables', '--skip-columns=guid'
|
251
62
|
else
|
@@ -257,18 +68,20 @@ namespace :cul do
|
|
257
68
|
end
|
258
69
|
end
|
259
70
|
|
260
|
-
def self.
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
71
|
+
def self.require_dest_wp_domain_if_multisite!
|
72
|
+
if(fetch(:multisite))
|
73
|
+
puts "Since this is a multisite, you'll need to specify the DESTINATION instance domain to continue:"
|
74
|
+
set :dest_multisite_domain, ask('destination multisite instance domain (e.g. blogs-dev.cul.columbia.edu)')
|
75
|
+
require_cap_variables!([:dest_multisite_domain])
|
76
|
+
end
|
266
77
|
end
|
267
78
|
|
268
|
-
def self.
|
269
|
-
|
270
|
-
|
271
|
-
|
79
|
+
def self.require_src_wp_domain_if_multisite!
|
80
|
+
if(fetch(:multisite))
|
81
|
+
puts "Since this is a multisite, you'll need to specify the SOURCE instance domain to continue:"
|
82
|
+
set :src_multisite_domain, ask('source multisite instance domain (e.g. blogs.cul.columbia.edu)')
|
83
|
+
require_cap_variables!([:src_multisite_domain])
|
84
|
+
end
|
272
85
|
end
|
273
86
|
|
274
87
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-cul
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carla Galarza
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-02-
|
12
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '3.1'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: capistrano-git-with-submodules
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '2.0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '2.0'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: bundler
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,8 +72,13 @@ files:
|
|
58
72
|
- lib/capistrano/cul/tasks.rb
|
59
73
|
- lib/capistrano/cul/wp.rb
|
60
74
|
- lib/capistrano/tasks/cul.cap
|
75
|
+
- lib/capistrano/tasks/wp-old.cap
|
61
76
|
- lib/capistrano/tasks/wp.cap
|
77
|
+
- lib/capistrano/tasks/wp/deploy.cap
|
78
|
+
- lib/capistrano/tasks/wp/install.cap
|
79
|
+
- lib/capistrano/tasks/wp/migrate-old.cap
|
62
80
|
- lib/capistrano/tasks/wp/migrate.cap
|
81
|
+
- lib/capistrano/tasks/wp/setup.cap
|
63
82
|
- lib/capistrano/tasks/wp/update.cap
|
64
83
|
homepage: https://github.com/cul/capistrano-cul
|
65
84
|
licenses:
|