capistrano-didi 0.4.5 → 0.4.12
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 +7 -7
- data/CHANGELOG.txt +15 -0
- data/Gemfile +6 -6
- data/Gemfile.lock +5 -7
- data/Rakefile +12 -12
- data/VERSION +1 -1
- data/bin/didify +47 -17
- data/capistrano-didi.gemspec +23 -32
- data/lib/didi/recipes/didi.rb +494 -412
- metadata +87 -97
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2cc823ca1111cbb50e29452e1e1aacad82a431ad
|
4
|
+
data.tar.gz: 54bb936e4924b639284c679ddef7d4c35e5d418a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 081ae1ca0cf90dffaf9a3c656ead290f83cafedb3f525224ce33a3125efe362e1b1a129e8b58fae7d33b8b1a6e6896877d9ee284c012b7be1ccf43e915d27c4b
|
7
|
+
data.tar.gz: 0af2db40303aa683f9b64e6701405fe3c9145a5deea8f0b15cf8c14193d46eb286849c2e73f347490c1c1a7fe6f5554eab18369e543b508ab8f117e17a36ffd3
|
data/CHANGELOG.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## 0.4.12 / 22 December 2014
|
2
|
+
|
3
|
+
* PE-75: use local copy when cloning repositories
|
4
|
+
* PE-75: removed test files
|
5
|
+
* PE-75: added dev and acc environments to didify
|
6
|
+
|
7
|
+
## 0.4.11 / 28 November 2014
|
8
|
+
|
9
|
+
* added Grunt task support
|
10
|
+
* added environments module support
|
11
|
+
* added baseline module support
|
12
|
+
* added l10n_update module support
|
13
|
+
* added migrate module support
|
14
|
+
* improved cached copy settings
|
15
|
+
|
1
16
|
## 0.4.5 / 3 July 2013
|
2
17
|
|
3
18
|
* added support for private files directory, using the user_private_files flag.
|
data/Gemfile
CHANGED
@@ -6,10 +6,10 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "railsless-deploy", ">= 1.0
|
10
|
-
gem "capistrano", ">= 2.12
|
11
|
-
gem "shoulda", ">= 0"
|
12
|
-
gem "bundler", "
|
13
|
-
gem "jeweler", "
|
14
|
-
gem "rcov", ">= 0"
|
9
|
+
gem "railsless-deploy", ">= 1.0"
|
10
|
+
gem "capistrano", ">= 2.12"
|
11
|
+
gem "shoulda", ">= 3.0"
|
12
|
+
gem "bundler", ">= 1"
|
13
|
+
gem "jeweler", ">= 1.6"
|
14
|
+
#gem "rcov", ">= 0"
|
15
15
|
end
|
data/Gemfile.lock
CHANGED
@@ -22,7 +22,6 @@ GEM
|
|
22
22
|
net-ssh (>= 1.99.1)
|
23
23
|
railsless-deploy (1.0.2)
|
24
24
|
rake (0.9.2.2)
|
25
|
-
rcov (1.0.0)
|
26
25
|
shoulda (3.0.1)
|
27
26
|
shoulda-context (~> 1.0.0)
|
28
27
|
shoulda-matchers (~> 1.0.0)
|
@@ -33,9 +32,8 @@ PLATFORMS
|
|
33
32
|
ruby
|
34
33
|
|
35
34
|
DEPENDENCIES
|
36
|
-
bundler (
|
37
|
-
capistrano (>= 2.12
|
38
|
-
jeweler (
|
39
|
-
railsless-deploy (>= 1.0
|
40
|
-
|
41
|
-
shoulda
|
35
|
+
bundler (>= 1)
|
36
|
+
capistrano (>= 2.12)
|
37
|
+
jeweler (>= 1.6)
|
38
|
+
railsless-deploy (>= 1.0)
|
39
|
+
shoulda (>= 3.0)
|
data/Rakefile
CHANGED
@@ -15,14 +15,14 @@ require 'jeweler'
|
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
17
|
gem.name = "capistrano-didi"
|
18
|
-
gem.homepage = "
|
18
|
+
gem.homepage = "https://github.com/Crosscheck/didi"
|
19
19
|
gem.license = "MIT"
|
20
20
|
gem.summary = %Q{didi - drupal deployment script based on capistrano}
|
21
21
|
gem.description = %Q{didi is a collection of recipes for capistrano that allow drupal to be deployed, tested and used in a CI environment}
|
22
|
-
gem.email = "
|
23
|
-
gem.authors = ["
|
24
|
-
gem.add_dependency "capistrano", "
|
25
|
-
gem.add_dependency "railsless-deploy", "
|
22
|
+
gem.email = "support@crosscheck.be"
|
23
|
+
gem.authors = ["CrossCheck"]
|
24
|
+
#gem.add_dependency "capistrano", "~> 2.12"
|
25
|
+
#gem.add_dependency "railsless-deploy", "~> 1.0.2"
|
26
26
|
gem.post_install_message = '=> "didify" and "didi" commands installed. Try them out!'
|
27
27
|
# dependencies defined in Gemfile
|
28
28
|
end
|
@@ -35,13 +35,13 @@ Rake::TestTask.new(:test) do |test|
|
|
35
35
|
test.verbose = true
|
36
36
|
end
|
37
37
|
|
38
|
-
require 'rcov/rcovtask'
|
39
|
-
Rcov::RcovTask.new do |test|
|
40
|
-
test.libs << 'test'
|
41
|
-
test.pattern = 'test/**/test_*.rb'
|
42
|
-
test.verbose = true
|
43
|
-
test.rcov_opts << '--exclude "gems/*"'
|
44
|
-
end
|
38
|
+
#require 'rcov/rcovtask'
|
39
|
+
#Rcov::RcovTask.new do |test|
|
40
|
+
# test.libs << 'test'
|
41
|
+
# test.pattern = 'test/**/test_*.rb'
|
42
|
+
# test.verbose = true
|
43
|
+
# test.rcov_opts << '--exclude "gems/*"'
|
44
|
+
#end
|
45
45
|
|
46
46
|
task :default => :test
|
47
47
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.11
|
data/bin/didify
CHANGED
@@ -44,32 +44,62 @@ files = {
|
|
44
44
|
FILE
|
45
45
|
|
46
46
|
"config/deploy.rb" => 'set :default_stage, "staging"
|
47
|
-
set :stages, %w(staging
|
48
|
-
set :application, "
|
49
|
-
set :repository, "
|
50
|
-
set :drupal_path, "
|
47
|
+
set :stages, %w(dev acc staging prod)
|
48
|
+
set :application, "PROJECT_NAME"
|
49
|
+
set :repository, "git@gitlab.crosscheck.be:crosscheck/PROJECT_NAME"
|
50
|
+
set :drupal_path, "docroot"
|
51
|
+
set :baseline, "PROJECT_NAME_core"
|
52
|
+
set :profile, "PROJECT_NAME_kickstart"
|
53
|
+
set :domain, "PROJECT_NAME"
|
54
|
+
set :sitemail, "support@crosscheck.be"
|
55
|
+
set :adminpass, "drupal_admin_pass"
|
56
|
+
|
57
|
+
# Compile .sass files to .css
|
58
|
+
before "deploy:create_symlink", "grunt"
|
59
|
+
|
60
|
+
# Re-enable the core module so dependencies are taken care of.
|
61
|
+
before "drush:update", "drush:bl"
|
62
|
+
|
63
|
+
# Clear cache before running any update commands (e.g. to update class registry
|
64
|
+
# early).
|
65
|
+
before "drush:update", "drush:cc"
|
66
|
+
|
67
|
+
# Always trigger environment switch after deploy so the settings get updated.
|
68
|
+
after "deploy", "drush:env_switch"
|
69
|
+
|
70
|
+
# Development jobs, should not be executed after go-live.
|
71
|
+
after "deploy", "drush:migrate"
|
72
|
+
after "deploy", "drush:baseline_build"
|
73
|
+
after "deploy", "drush:l10n_update"
|
74
|
+
|
51
75
|
',
|
52
|
-
|
53
|
-
server "
|
76
|
+
"config/deploy/dev.rb" => 'set :user, "crosscheck"
|
77
|
+
server "SITE_NAME.dev.one-agency.be", :app, :web, :db, :primary => true
|
54
78
|
|
55
|
-
set :deploy_to, "
|
79
|
+
set :deploy_to, "/home/www/vhosts/projects/PROJECT_NAME/dev/http"
|
56
80
|
set :branch, "master"
|
81
|
+
set :site, "SITE_NAME.dev.one-agency.be"
|
57
82
|
|
58
83
|
set :db_type, "mysql"
|
59
|
-
set :db_name, "
|
60
|
-
set :db_username, "
|
84
|
+
set :db_name, "PROJECT_NAME_dev"
|
85
|
+
set :db_username, "PROJECT_NAME"
|
61
86
|
set :db_password, "database_password"
|
62
|
-
set :db_prefix, "
|
87
|
+
set :db_prefix, ""
|
88
|
+
',
|
89
|
+
"config/deploy/acc.rb" => 'set :user, "crosscheck"
|
90
|
+
server "SITE_NAME.acc.one-agency.be", :app, :web, :db, :primary => true
|
63
91
|
|
64
|
-
set :
|
65
|
-
set :
|
66
|
-
set :site, "
|
67
|
-
set :sitemail, "drupal_site_email_address"
|
68
|
-
set :adminpass, "drupal_admin_pass"
|
92
|
+
set :deploy_to, "/home/www/vhosts/projects/PROJECT_NAME/acc/http"
|
93
|
+
set :branch, "acc"
|
94
|
+
set :site, "SITE_NAME.acc.one-agency.be"
|
69
95
|
|
70
|
-
set :
|
96
|
+
set :db_type, "mysql"
|
97
|
+
set :db_name, "PROJECT_NAME_acc"
|
98
|
+
set :db_username, "PROJECT_NAME"
|
99
|
+
set :db_password, "database_password"
|
100
|
+
set :db_prefix, ""
|
71
101
|
',
|
72
|
-
"config/sql/
|
102
|
+
"config/sql/scrub-database.sql" => <<scrub
|
73
103
|
--
|
74
104
|
-- Scrub important information from a Drupal database.
|
75
105
|
--
|
data/capistrano-didi.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "capistrano-didi"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.12"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["
|
12
|
-
s.date = "
|
11
|
+
s.authors = ["CrossCheck"]
|
12
|
+
s.date = "2014-11-28"
|
13
13
|
s.description = "didi is a collection of recipes for capistrano that allow drupal to be deployed, tested and used in a CI environment"
|
14
|
-
s.email = "
|
15
|
-
s.executables = ["
|
14
|
+
s.email = "support@crosscheck.be"
|
15
|
+
s.executables = ["didi", "didify"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE.txt",
|
18
18
|
"README.rdoc"
|
@@ -33,44 +33,35 @@ Gem::Specification.new do |s|
|
|
33
33
|
"test/helper.rb",
|
34
34
|
"test/test_didi.rb"
|
35
35
|
]
|
36
|
-
s.homepage = "
|
36
|
+
s.homepage = "https://github.com/Crosscheck/didi"
|
37
37
|
s.licenses = ["MIT"]
|
38
38
|
s.post_install_message = "=> \"didify\" and \"didi\" commands installed. Try them out!"
|
39
39
|
s.require_paths = ["lib"]
|
40
|
-
s.rubygems_version = "
|
40
|
+
s.rubygems_version = "2.0.14"
|
41
41
|
s.summary = "didi - drupal deployment script based on capistrano"
|
42
42
|
|
43
43
|
if s.respond_to? :specification_version then
|
44
|
-
s.specification_version =
|
44
|
+
s.specification_version = 4
|
45
45
|
|
46
46
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
-
s.add_development_dependency(%q<railsless-deploy>, [">= 1.0
|
48
|
-
s.add_development_dependency(%q<capistrano>, [">= 2.12
|
49
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
|
-
s.add_development_dependency(%q<bundler>, ["
|
51
|
-
s.add_development_dependency(%q<jeweler>, ["
|
52
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
53
|
-
s.add_runtime_dependency(%q<capistrano>, [">= 2.12.0"])
|
54
|
-
s.add_runtime_dependency(%q<railsless-deploy>, [">= 1.0.2"])
|
47
|
+
s.add_development_dependency(%q<railsless-deploy>, [">= 1.0"])
|
48
|
+
s.add_development_dependency(%q<capistrano>, [">= 2.12"])
|
49
|
+
s.add_development_dependency(%q<shoulda>, [">= 3.0"])
|
50
|
+
s.add_development_dependency(%q<bundler>, [">= 1"])
|
51
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6"])
|
55
52
|
else
|
56
|
-
s.add_dependency(%q<railsless-deploy>, [">= 1.0
|
57
|
-
s.add_dependency(%q<capistrano>, [">= 2.12
|
58
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
59
|
-
s.add_dependency(%q<bundler>, ["
|
60
|
-
s.add_dependency(%q<jeweler>, ["
|
61
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
62
|
-
s.add_dependency(%q<capistrano>, [">= 2.12.0"])
|
63
|
-
s.add_dependency(%q<railsless-deploy>, [">= 1.0.2"])
|
53
|
+
s.add_dependency(%q<railsless-deploy>, [">= 1.0"])
|
54
|
+
s.add_dependency(%q<capistrano>, [">= 2.12"])
|
55
|
+
s.add_dependency(%q<shoulda>, [">= 3.0"])
|
56
|
+
s.add_dependency(%q<bundler>, [">= 1"])
|
57
|
+
s.add_dependency(%q<jeweler>, [">= 1.6"])
|
64
58
|
end
|
65
59
|
else
|
66
|
-
s.add_dependency(%q<railsless-deploy>, [">= 1.0
|
67
|
-
s.add_dependency(%q<capistrano>, [">= 2.12
|
68
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
69
|
-
s.add_dependency(%q<bundler>, ["
|
70
|
-
s.add_dependency(%q<jeweler>, ["
|
71
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
72
|
-
s.add_dependency(%q<capistrano>, [">= 2.12.0"])
|
73
|
-
s.add_dependency(%q<railsless-deploy>, [">= 1.0.2"])
|
60
|
+
s.add_dependency(%q<railsless-deploy>, [">= 1.0"])
|
61
|
+
s.add_dependency(%q<capistrano>, [">= 2.12"])
|
62
|
+
s.add_dependency(%q<shoulda>, [">= 3.0"])
|
63
|
+
s.add_dependency(%q<bundler>, [">= 1"])
|
64
|
+
s.add_dependency(%q<jeweler>, [">= 1.6"])
|
74
65
|
end
|
75
66
|
end
|
76
67
|
|
data/lib/didi/recipes/didi.rb
CHANGED
@@ -6,61 +6,71 @@ Capistrano::Configuration.instance.load do
|
|
6
6
|
# These variables MUST be set in the client capfiles. If they are not set,
|
7
7
|
# the deploy will fail with an error.
|
8
8
|
# =========================================================================
|
9
|
-
_cset(:db_type)
|
10
|
-
_cset(:db_name)
|
11
|
-
_cset(:db_username)
|
12
|
-
_cset(:db_password)
|
13
|
-
_cset(:db_prefix)
|
14
|
-
|
15
|
-
_cset(:profile)
|
16
|
-
_cset(:site)
|
17
|
-
_cset(:sitemail)
|
18
|
-
_cset(:adminpass)
|
19
|
-
_cset(:baseline)
|
20
|
-
|
9
|
+
_cset(:db_type) { abort "Please specify the Drupal database type (:db_type)." }
|
10
|
+
_cset(:db_name) { abort "Please specify the Drupal database name (:db_name)." }
|
11
|
+
_cset(:db_username) { abort "Please specify the Drupal database username (:db_username)." }
|
12
|
+
_cset(:db_password) { abort "Please specify the Drupal database password (:db_password)." }
|
13
|
+
_cset(:db_prefix) { abort "Please specify the Drupal database prefix (:db_prefix)." }
|
14
|
+
|
15
|
+
_cset(:profile) { abort "Please specify the Drupal install profile (:profile)." }
|
16
|
+
_cset(:site) { abort "Please specify the Drupal site (:site)." }
|
17
|
+
_cset(:sitemail) { abort "Please specify the Drupal site mail (:sitemail)." }
|
18
|
+
_cset(:adminpass) { abort "Please specify the Drupal admin password (:adminpass)." }
|
19
|
+
_cset(:baseline) { abort "Please specify the Baseline feature (:baseline)." }
|
20
|
+
|
21
|
+
# Added by KimKennof.
|
22
|
+
_cset(:theme) { abort "Please specify the theme name (:theme)." }
|
23
|
+
_cset(:theme_path) { abort "Please specify the theme name (:theme_path)." }
|
21
24
|
|
22
25
|
# =========================================================================
|
23
26
|
# These variables may be set in the client capfile if their default values
|
24
27
|
# are not sufficient.
|
25
28
|
# =========================================================================
|
26
|
-
set :scm,
|
27
|
-
set :deploy_via,
|
28
|
-
set :drupal_version,
|
29
|
-
set :keep_releases,
|
30
|
-
set :use_sudo,
|
31
|
-
|
32
|
-
set :domain,
|
33
|
-
set :db_host,
|
34
|
-
set :drupal_path,
|
35
|
-
set :srv_usr,
|
36
|
-
set :enable_robots,
|
37
|
-
set :no_disable,
|
38
|
-
set :local_database,
|
39
|
-
set :backup_database,
|
40
|
-
set :push_dump_enabled, false
|
41
|
-
set :make_install_profile,
|
42
|
-
set :make_file,
|
43
|
-
set :use_private_files, false
|
44
|
-
|
45
|
-
|
46
|
-
|
29
|
+
set :scm, :git
|
30
|
+
set :deploy_via, :copy
|
31
|
+
set :drupal_version, '7'
|
32
|
+
set :keep_releases, 5
|
33
|
+
set :use_sudo, false
|
34
|
+
|
35
|
+
set :domain, 'default'
|
36
|
+
set :db_host, 'localhost'
|
37
|
+
set :drupal_path, 'drupal'
|
38
|
+
set :srv_usr, 'www-data'
|
39
|
+
set :enable_robots, false
|
40
|
+
set :no_disable, true
|
41
|
+
set :local_database, nil
|
42
|
+
set :backup_database, true
|
43
|
+
set :push_dump_enabled, false
|
44
|
+
set :make_install_profile, false
|
45
|
+
set :make_file, ''
|
46
|
+
set :use_private_files, false
|
47
|
+
|
48
|
+
set :stage, 'production'
|
49
|
+
set :copy_exclude, ['.git']
|
50
|
+
set :copy_dir, File.expand_path("~/.capistrano/#{application}")
|
51
|
+
set :copy_cache, "#{copy_dir}/#{stage}"
|
52
|
+
set :assets_path, 'assets'
|
53
|
+
|
54
|
+
ssh_options[:forward_agent] = true
|
55
|
+
#ssh_options[:verbose] = :debug #FIXME
|
47
56
|
|
48
57
|
# =========================================================================
|
49
58
|
# These variables should NOT be changed unless you are very confident in
|
50
59
|
# what you are doing. Make sure you understand all the implications of your
|
51
60
|
# changes if you do decide to muck with these!
|
52
61
|
# =========================================================================
|
53
|
-
_cset :settings,
|
54
|
-
_cset :files,
|
55
|
-
_cset :private_files,
|
56
|
-
_cset :dbbackups,
|
57
|
-
_cset :drush_path,
|
58
|
-
|
59
|
-
_cset(:shared_settings)
|
60
|
-
_cset(:shared_files)
|
61
|
-
_cset(:shared_private_files)
|
62
|
-
_cset(:dbbackups_path)
|
63
|
-
_cset(:drush)
|
62
|
+
_cset :settings, 'settings.php'
|
63
|
+
_cset :files, 'files'
|
64
|
+
_cset :private_files, 'private'
|
65
|
+
_cset :dbbackups, 'db_backups'
|
66
|
+
_cset :drush_path, ''
|
67
|
+
|
68
|
+
_cset(:shared_settings) { convert_domain().map { |d| File.join(shared_path, d, settings) } }
|
69
|
+
_cset(:shared_files) { convert_domain().map { |d| File.join(shared_path, d, files) } }
|
70
|
+
_cset(:shared_private_files) { convert_domain().map { |d| File.join(shared_path, d, private_files) } }
|
71
|
+
_cset(:dbbackups_path) { convert_domain().map { |d| File.join(deploy_to, dbbackups, d) } }
|
72
|
+
_cset(:drush) { "drush -r #{current_path}" + (domain == 'default' ? '' : " -l #{domain}") } # FIXME: not in use?
|
73
|
+
|
64
74
|
|
65
75
|
# these variables are still in rails-less deploy gem
|
66
76
|
# but have been updated in the latest capistrano gem
|
@@ -68,512 +78,584 @@ _cset(:drush) { "drush -r #{current_path}" + (domain == 'defau
|
|
68
78
|
# see https://github.com/capistrano/capistrano/commit/92941e855d70a5778eb094a972fdf43c70802b95#lib/capistrano/recipes/deploy.rb
|
69
79
|
# and https://github.com/capistrano/capistrano/commit/8638f2278ebe484ebcb1a1950e157c30c2d70960#lib/capistrano/recipes/deploy.rb
|
70
80
|
# for background
|
71
|
-
set(:releases)
|
81
|
+
set(:releases) { capture("ls -x #{releases_path}", :except => {:no_release => true}).split.sort }
|
72
82
|
|
73
|
-
set(:current_revision)
|
74
|
-
set(:latest_revision)
|
75
|
-
set(:previous_revision) { capture("cat #{previous_release}/REVISION", :except => {
|
83
|
+
set(:current_revision) { capture("cat #{current_path}/REVISION", :except => {:no_release => true}).chomp }
|
84
|
+
set(:latest_revision) { capture("cat #{current_release}/REVISION", :except => {:no_release => true}).chomp }
|
85
|
+
set(:previous_revision) { capture("cat #{previous_release}/REVISION", :except => {:no_release => true}).chomp if previous_release }
|
76
86
|
# end fix
|
77
87
|
|
78
|
-
_cset(:release_settings)
|
79
|
-
_cset(:release_files)
|
80
|
-
_cset(:release_private_files)
|
81
|
-
_cset(:release_domain)
|
88
|
+
_cset(:release_settings) { convert_domain().map { |d| File.join(release_path, drupal_path, 'sites', d, settings) } }
|
89
|
+
_cset(:release_files) { convert_domain().map { |d| File.join(release_path, drupal_path, 'sites', d, files) } }
|
90
|
+
_cset(:release_private_files) { convert_domain().map { |d| File.join(release_path, drupal_path, 'sites', d, private_files) } }
|
91
|
+
_cset(:release_domain) { convert_domain().map { |d| File.join(release_path, drupal_path, 'sites', d) } }
|
92
|
+
|
93
|
+
_cset(:previous_release_settings) { releases.length > 1 ? convert_domain().map { |d| File.join(previous_release, drupal_path, 'sites', d, settings) } : nil }
|
94
|
+
_cset(:previous_release_files) { releases.length > 1 ? convert_domain().map { |d| File.join(previous_release, drupal_path, 'sites', d, files) } : nil }
|
95
|
+
_cset(:previous_release_private_files) { releases.length > 1 ? convert_domain().map { |d| File.join(previous_release, drupal_path, 'sites', d, private_files) } : nil }
|
96
|
+
_cset(:previous_release_domain) { releases.length > 1 ? convert_domain().map { |d| File.join(previous_release, drupal_path, 'sites', d) } : nil }
|
82
97
|
|
83
|
-
_cset(:
|
84
|
-
_cset(:previous_release_files) { releases.length > 1 ? domain.to_a.map { |d| File.join(previous_release, drupal_path, 'sites', d, files) } : nil }
|
85
|
-
_cset(:previous_release_private_files) { releases.length > 1 ? domain.to_a.map { |d| File.join(previous_release, drupal_path, 'sites', d, private_files) } : nil }
|
86
|
-
_cset(:previous_release_domain) { releases.length > 1 ? domain.to_a.map { |d| File.join(previous_release, drupal_path, 'sites', d) } : nil }
|
98
|
+
_cset(:is_multisite) { convert_domain().size > 1 }
|
87
99
|
|
88
|
-
_cset(:is_multisite) { domain.to_a.size > 1 }
|
89
100
|
|
90
101
|
# =========================================================================
|
91
102
|
# Extra dependency checks
|
92
103
|
# =========================================================================
|
93
|
-
depend :local,
|
94
|
-
depend :remote, :command, "#{drush_path}drush"
|
104
|
+
depend :local, :command, "drush"
|
105
|
+
depend :remote, :command, "#{drush_path}drush"
|
95
106
|
|
96
107
|
|
97
108
|
# =========================================================================
|
98
109
|
# Overwrites to the DEPLOY tasks in the capistrano library.
|
99
110
|
# =========================================================================
|
100
111
|
|
101
|
-
namespace :deploy do
|
102
|
-
|
103
|
-
desc <<-DESC
|
112
|
+
namespace :deploy do
|
113
|
+
desc <<-DESC
|
104
114
|
Deploys your Drupal site, runs drush:update. It supposes that the Setup task was already executed.
|
105
115
|
This overrides the default Capistrano Deploy task to handle database operations and backups,
|
106
116
|
all of them via Drush.
|
107
|
-
|
108
|
-
task :default do
|
109
|
-
update
|
110
|
-
manage.dbdump_previous
|
111
|
-
cleanup
|
112
|
-
end
|
113
|
-
after "deploy", "drush:update"
|
117
|
+
DESC
|
114
118
|
|
115
|
-
|
116
|
-
task :cold do
|
117
|
-
transaction do
|
118
|
-
setup
|
119
|
+
task :default do
|
119
120
|
update
|
121
|
+
manage.dbdump_previous
|
122
|
+
cleanup
|
120
123
|
end
|
121
|
-
|
122
|
-
after "deploy:cold", "drush:si"
|
124
|
+
after "deploy", "drush:update"
|
123
125
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
126
|
+
desc "Setup a drupal site from scratch"
|
127
|
+
task :cold do
|
128
|
+
transaction do
|
129
|
+
setup
|
130
|
+
update
|
131
|
+
end
|
132
|
+
end
|
133
|
+
after "deploy:cold", "drush:si"
|
134
|
+
|
135
|
+
desc "Deploys latest code and rebuild the database"
|
136
|
+
task :rebuild do
|
137
|
+
update
|
138
|
+
manage.dbdump_previous
|
139
|
+
cleanup
|
140
|
+
end
|
141
|
+
after "deploy:rebuild", "drush:si"
|
131
142
|
|
132
|
-
|
143
|
+
desc <<-DESC
|
133
144
|
Prepares one or more servers for deployment.
|
134
145
|
Creates the necessary file structure and the shared Drupal settings file.
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
run <<-CMD
|
143
|
-
mkdir -p #{dirs.join(' ')} && #{try_sudo} chown #{user}:#{srv_usr} #{shared_files.join(' ')} && #{try_sudo} chmod g+w #{shared_files.join(' ')}
|
144
|
-
CMD
|
146
|
+
DESC
|
147
|
+
|
148
|
+
task :setup, :except => {:no_release => true} do
|
149
|
+
#Create shared directories
|
150
|
+
# FIXME: chown / chmod require user to be member of
|
151
|
+
dirs = [deploy_to, releases_path, shared_path, dbbackups_path, shared_files]
|
152
|
+
dirs += convert_domain().map { |d| File.join(shared_path, d) }
|
145
153
|
|
146
|
-
# Generate private files when enabled.
|
147
|
-
if use_private_files
|
148
154
|
run <<-CMD
|
149
|
-
|
155
|
+
mkdir -p #{dirs.join(' ')} && #{try_sudo} chown #{user}:#{srv_usr} #{shared_files.join(' ')} && #{try_sudo} chmod g+w #{shared_files.join(' ')}
|
150
156
|
CMD
|
151
|
-
end
|
152
157
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
+
# Generate private files when enabled.
|
159
|
+
if use_private_files
|
160
|
+
run <<-CMD
|
161
|
+
mkdir -p #{shared_private_files} && #{try_sudo} chown #{user}:#{srv_usr} #{shared_private_files.join(' ')} && #{try_sudo} chmod g+w #{shared_private_files.join(' ')}
|
162
|
+
CMD
|
163
|
+
end
|
158
164
|
|
159
|
-
|
165
|
+
#create drupal config file
|
166
|
+
convert_domain().each_with_index do |d, i|
|
167
|
+
configuration = drupal_settings(drupal_version, d)
|
168
|
+
put configuration, shared_settings[i]
|
169
|
+
end
|
160
170
|
|
161
|
-
desc "[internal] Rebuild files and settings symlinks"
|
162
|
-
task :finalize_update, :except => { :no_release => true } do
|
163
|
-
if make_install_profile
|
164
|
-
run "cd #{current_release} && drush make #{make_file} #{drupal_path}"
|
165
171
|
end
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
172
|
+
|
173
|
+
desc "[internal] Fixing release permissions."
|
174
|
+
task :fix_permissions, :except => {:no_release => false} do
|
175
|
+
run "cd #{current_release}/../../ && chmod -R 775 releases/"
|
176
|
+
end
|
177
|
+
|
178
|
+
desc "[internal] Rebuild files and settings symlinks"
|
179
|
+
task :finalize_update, :except => {:no_release => true} do
|
180
|
+
if make_install_profile
|
181
|
+
run "cd #{current_release} && drush make #{make_file} #{drupal_path}"
|
182
|
+
end
|
183
|
+
# Specifies an on_rollback hook for the currently executing task. If this
|
184
|
+
# or any subsequent task then fails, and a transaction is active, this
|
185
|
+
# hook will be executed.
|
186
|
+
on_rollback do
|
187
|
+
if previous_release
|
188
|
+
#FIXME: won't work on mulitsite config
|
189
|
+
run ["ln -nfs #{shared_files} #{previous_release_files}",
|
190
|
+
"ln -nfs #{shared_settings} #{previous_release_settings}"].join("; ")
|
191
|
+
if use_private_files
|
192
|
+
run "ln -nfs #{shared_private_files} #{previous_release_private_files}"
|
193
|
+
end
|
194
|
+
else
|
195
|
+
logger.important "no previous release to rollback to, rollback of drupal shared data skipped."
|
175
196
|
end
|
176
|
-
else
|
177
|
-
logger.important "no previous release to rollback to, rollback of drupal shared data skipped."
|
178
197
|
end
|
179
|
-
end
|
180
198
|
|
181
|
-
|
182
|
-
|
183
|
-
|
199
|
+
release_domain.each do |rd|
|
200
|
+
run "if [ ! -d #{rd} ]; then mkdir #{rd}; fi" # in case the default folder is not versioned
|
201
|
+
end
|
184
202
|
|
185
|
-
|
186
|
-
|
187
|
-
ln -nfs #{sf} #{release_files[i]} &&
|
188
|
-
ln -nfs #{shared_settings[i]} #{release_settings[i]}
|
203
|
+
shared_files.each_with_index do |sf, i|
|
204
|
+
run <<-CMD
|
205
|
+
ln -nfs #{sf} #{release_files[i]} && ln -nfs #{shared_settings[i]} #{release_settings[i]}
|
189
206
|
CMD
|
190
|
-
|
207
|
+
end
|
191
208
|
|
192
|
-
|
193
|
-
|
194
|
-
|
209
|
+
if use_private_files
|
210
|
+
shared_private_files.each_with_index do |sf, i|
|
211
|
+
run <<-CMD
|
195
212
|
ln -nfs #{sf} #{release_private_files[i]}
|
196
213
|
CMD
|
214
|
+
end
|
197
215
|
end
|
198
216
|
end
|
199
|
-
|
217
|
+
after "deploy:finalize_update", "deploy:fix_permissions"
|
200
218
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
run <<-CMD
|
207
|
-
rm -f #{previous_release_settings[i]} &&
|
208
|
-
rm -f #{previous_release_files[i]}
|
209
|
-
CMD
|
210
|
-
if use_private_files
|
219
|
+
desc "[internal] cleanup old symlinks, must run after deploy:symlink"
|
220
|
+
task :cleanup_shared_symlinks, :except => {:no_release => true} do
|
221
|
+
if previous_release
|
222
|
+
previous_release_domain.each_with_index do |prd, i|
|
223
|
+
run "if [ -d #{prd} ]; then chmod 777 #{prd}; fi" # if drupal changed the permissions of the folder
|
211
224
|
run <<-CMD
|
212
|
-
|
225
|
+
rm -f #{previous_release_settings[i]} && rm -rf #{previous_release_files[i]}
|
213
226
|
CMD
|
227
|
+
if use_private_files
|
228
|
+
run <<-CMD
|
229
|
+
rm -rf #{previous_release_private_files[i]}
|
230
|
+
CMD
|
231
|
+
end
|
214
232
|
end
|
215
233
|
end
|
216
234
|
end
|
217
|
-
|
218
|
-
after "deploy:symlink", "deploy:cleanup_shared_symlinks"
|
235
|
+
after "deploy:symlink", "deploy:cleanup_shared_symlinks"
|
219
236
|
|
220
|
-
|
237
|
+
desc <<-DESC
|
221
238
|
Removes old releases and corresponding DB backups.
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
239
|
+
DESC
|
240
|
+
|
241
|
+
task :cleanup, :except => {:no_release => true} do
|
242
|
+
count = fetch(:keep_releases, 5).to_i
|
243
|
+
if count >= releases.length
|
244
|
+
logger.important "No old releases to clean up"
|
245
|
+
else
|
246
|
+
logger.info "keeping #{count} of #{releases.length} deployed releases"
|
247
|
+
old_releases = (releases - releases.last(count))
|
248
|
+
directories = old_releases.map { |release| File.join(releases_path, release) }.join(" ")
|
249
|
+
databases = dbbackups_path.product(old_releases.map { |release| "#{release}.sql" }).map { |p| File.join(p) }.join(" ") if backup_database
|
250
|
+
run "rm -rf #{directories} #{databases}"
|
251
|
+
end
|
233
252
|
end
|
234
|
-
end
|
235
253
|
|
236
|
-
|
254
|
+
namespace :rollback do
|
237
255
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
task :default do
|
242
|
-
revision
|
243
|
-
#db_rollback if domain.to_a.size == 1 # FIXME: not supported in multisite configuration, does not work
|
244
|
-
cleanup
|
245
|
-
end
|
256
|
+
desc <<-DESC
|
257
|
+
go back to the previous release (code and database)
|
258
|
+
DESC
|
246
259
|
|
247
|
-
|
260
|
+
task :default do
|
261
|
+
revision
|
262
|
+
#db_rollback if domain.to_a.size == 1 # FIXME: not supported in multisite configuration, does not work
|
263
|
+
cleanup
|
264
|
+
end
|
265
|
+
|
266
|
+
desc <<-DESC
|
248
267
|
[internal] Removes the most recently deployed release.
|
249
268
|
This is called by the rollback sequence, and should rarely
|
250
269
|
(if ever) need to be called directly.
|
251
|
-
|
252
|
-
task :cleanup, :except => { :no_release => true } do
|
253
|
-
# FIXME: this doesn't cleanup dbbackups
|
254
|
-
run "if [ `readlink #{current_path}` != #{current_release} ]; then rm -rf #{current_release}; fi"
|
255
|
-
end
|
270
|
+
DESC
|
256
271
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
272
|
+
task :cleanup, :except => {:no_release => true} do
|
273
|
+
# FIXME: this doesn't cleanup dbbackups
|
274
|
+
run "if [ `readlink #{current_path}` != #{current_release} ]; then rm -rf #{current_release}; fi"
|
275
|
+
end
|
276
|
+
|
277
|
+
desc <<-DESC
|
278
|
+
[internal] Points the current, files, and settings symlinks at the previous revision.
|
279
|
+
DESC
|
280
|
+
|
281
|
+
task :revision, :except => {:no_release => true} do
|
282
|
+
if previous_release
|
283
|
+
run <<-CMD
|
263
284
|
rm #{current_path};
|
264
285
|
ln -s #{previous_release} #{current_path};
|
265
|
-
|
266
|
-
|
267
|
-
|
286
|
+
CMD
|
287
|
+
shared_files.each_with_index do |sf, i|
|
288
|
+
run <<-CMD
|
268
289
|
ln -nfs #{sf} #{previous_release_files[i]} &&
|
269
290
|
ln -nfs #{shared_settings[i]} #{previous_release_settings[i]}
|
270
|
-
|
271
|
-
|
291
|
+
CMD
|
292
|
+
end
|
272
293
|
|
273
|
-
|
274
|
-
|
275
|
-
|
294
|
+
if use_private_files
|
295
|
+
shared_private_files.each_with_index do |sf, i|
|
296
|
+
run <<-CMD
|
276
297
|
ln -nfs #{sf} #{previous_release_private_files[i]}
|
277
|
-
|
298
|
+
CMD
|
299
|
+
end
|
278
300
|
end
|
301
|
+
else
|
302
|
+
abort "could not rollback the code because there is no prior release"
|
279
303
|
end
|
280
|
-
else
|
281
|
-
abort "could not rollback the code because there is no prior release"
|
282
304
|
end
|
283
|
-
end
|
284
305
|
|
285
306
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
307
|
+
desc <<-DESC
|
308
|
+
[internal] If a database backup from the previous release is found, dump the current
|
309
|
+
database and import the backup. This task should NEVER be called standalone.
|
310
|
+
DESC
|
311
|
+
|
312
|
+
task :db_rollback, :except => {:no_release => true} do
|
313
|
+
#FIXME: does not work
|
314
|
+
if previous_release
|
315
|
+
logger.info "Dumping current database and importing previous one (If one is found)."
|
316
|
+
previous_db = File.join(dbbackups_path, "#{releases[-2]}.sql")
|
317
|
+
import_cmd = "cd #{previous_release}/#{drupal_path} && drush sql-drop -y && drush sql-cli < #{previous_db} && rm #{previous_db}"
|
318
|
+
run "if [ -e #{previous_db} ]; then #{import_cmd}; fi"
|
319
|
+
else
|
320
|
+
abort "could not rollback the database because there is no prior release db backups"
|
321
|
+
end
|
299
322
|
end
|
300
|
-
end
|
301
|
-
|
302
|
-
end
|
303
323
|
|
304
|
-
namespace :web do
|
305
|
-
desc "Makes the application web-accessible again."
|
306
|
-
task :enable do
|
307
|
-
drush.ensite
|
308
324
|
end
|
309
|
-
|
310
|
-
|
311
|
-
|
325
|
+
|
326
|
+
namespace :web do
|
327
|
+
desc "Makes the application web-accessible again."
|
328
|
+
task :enable do
|
329
|
+
drush.ensite
|
330
|
+
end
|
331
|
+
desc "Present a maintenance page to visitors."
|
332
|
+
task :disable do
|
333
|
+
drush.dissite
|
334
|
+
end
|
312
335
|
end
|
313
|
-
end
|
314
336
|
|
315
|
-
end
|
337
|
+
end
|
316
338
|
|
317
339
|
# =========================
|
318
340
|
# Drush namespace tasks
|
319
341
|
# =========================
|
320
|
-
namespace :drush do
|
342
|
+
namespace :drush do
|
321
343
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
344
|
+
desc "Trigger the environment switch."
|
345
|
+
task :env_switch do
|
346
|
+
domain.each do |d|
|
347
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " env-switch --force #{stage}"
|
348
|
+
end
|
326
349
|
end
|
327
|
-
end
|
328
350
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
351
|
+
desc "Execute all migrations."
|
352
|
+
task :migrate do
|
353
|
+
domain.each do |d|
|
354
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " migrate-import --all"
|
355
|
+
end
|
333
356
|
end
|
334
|
-
end
|
335
357
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
358
|
+
desc "Import translations."
|
359
|
+
task :l10n_update do
|
360
|
+
domain.each do |d|
|
361
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " l10n-update"
|
362
|
+
end
|
340
363
|
end
|
341
|
-
end
|
342
364
|
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
365
|
+
desc "Rebuild baseline."
|
366
|
+
task :baseline_build do
|
367
|
+
domain.each do |d|
|
368
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " baseline --yes"
|
369
|
+
end
|
347
370
|
end
|
348
|
-
end
|
349
371
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
372
|
+
desc "Clear the Drupal site cache"
|
373
|
+
task :cc do
|
374
|
+
convert_domain().each do |d|
|
375
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " cache-clear all"
|
376
|
+
end
|
355
377
|
end
|
356
|
-
bl
|
357
|
-
end
|
358
378
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " pm-enable #{bl_item.gsub("%domain", d)} -y"
|
379
|
+
desc "Show features diff status"
|
380
|
+
task :fd do
|
381
|
+
convert_domain().each do |d|
|
382
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " features-diff"
|
364
383
|
end
|
365
384
|
end
|
366
|
-
cc
|
367
|
-
end
|
368
|
-
desc "[internal] Enable the simpletest feature"
|
369
|
-
task :enst do
|
370
|
-
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush pm-enable simpletest -y"
|
371
|
-
cc
|
372
|
-
end
|
373
385
|
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
else
|
379
|
-
domain.each do |d|
|
380
|
-
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " vset --always-set maintenance_mode 0"
|
386
|
+
desc "Revert all enabled feature modules on your site"
|
387
|
+
task :fra do
|
388
|
+
convert_domain().each do |d|
|
389
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " features-revert-all -y"
|
381
390
|
end
|
382
391
|
end
|
383
|
-
end
|
384
392
|
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
393
|
+
desc "Force revert all enabled feature modules on your site"
|
394
|
+
task :fraforce do
|
395
|
+
convert_domain().each do |d|
|
396
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " features-revert-all --force -y"
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
desc "Install Drupal along with modules/themes/configuration using the specified install profile"
|
401
|
+
task :si do
|
402
|
+
convert_domain().each do |d|
|
403
|
+
dburl = "#{db_type}://#{db_username}:#{db_password}@#{db_host}/#{db_name.gsub("%domain", d)}"
|
404
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush site-install #{profile} --db-url=#{dburl} --sites-subdir=#{d} --account-name=admin --account-pass=#{adminpass} --account-mail=#{sitemail} --site-mail='#{sitemail}' --site-name='#{site.gsub("%domain", d)}' -y"
|
405
|
+
end
|
406
|
+
bl
|
407
|
+
end
|
408
|
+
|
409
|
+
desc "[internal] Enable the baseline feature"
|
410
|
+
task :bl do
|
411
|
+
convert_domain().each do |d|
|
412
|
+
#baseline.to_a.each do |bl_item|
|
413
|
+
convert_baseline().each do |bl_item|
|
414
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " pm-enable #{bl_item.gsub("%domain", d)} -y"
|
415
|
+
end
|
416
|
+
end
|
417
|
+
cc
|
418
|
+
end
|
419
|
+
|
420
|
+
desc "[internal] Enable the simpletest feature"
|
421
|
+
task :enst do
|
422
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush pm-enable simpletest -y"
|
423
|
+
cc
|
424
|
+
end
|
425
|
+
|
426
|
+
desc "[internal] Disable maintenance mode, enabling the site"
|
427
|
+
task :ensite do
|
428
|
+
if drupal_version == 6
|
429
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush vset --always-set site_offline 0"
|
430
|
+
else
|
431
|
+
convert_domain().each do |d|
|
432
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " vset --always-set maintenance_mode 0"
|
433
|
+
end
|
392
434
|
end
|
393
435
|
end
|
394
|
-
end
|
395
436
|
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
437
|
+
desc "[internal] Enable maintenance mode, disabling the site"
|
438
|
+
task :dissite do
|
439
|
+
if drupal_version == 6
|
440
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush vset --always-set site_offline 1"
|
441
|
+
else
|
442
|
+
convert_domain().each do |d|
|
443
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " vset --always-set maintenance_mode 1"
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
desc "Apply any database updates required (as with running update.php)"
|
449
|
+
task :updb do
|
450
|
+
convert_domain().each do |d|
|
451
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " updatedb -y"
|
452
|
+
end
|
400
453
|
end
|
454
|
+
|
455
|
+
desc "Update via drush, runs fra, updb and cc"
|
456
|
+
task :update do
|
457
|
+
dissite unless no_disable
|
458
|
+
updb # database updates (also handles modules that have been moved around)
|
459
|
+
cc # fix for user_permissions constraint (install new modules)
|
460
|
+
fra # reverts all features
|
461
|
+
cc # clear cache (required for new menu items, hook_menu)
|
462
|
+
ensite unless no_disable
|
463
|
+
manage.block_robots unless enable_robots
|
464
|
+
end
|
465
|
+
|
401
466
|
end
|
402
467
|
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
cc # clear cache (required for new menu items, hook_menu)
|
410
|
-
ensite unless no_disable
|
411
|
-
manage.block_robots unless enable_robots
|
468
|
+
namespace :grunt do
|
469
|
+
task :default do
|
470
|
+
current_host = capture("echo $CAPISTRANO:HOST$").strip
|
471
|
+
run_locally "cd #{copy_cache}/#{theme_path} && bundle exec grunt"
|
472
|
+
run_locally "rsync -av #{copy_cache}/#{theme_path}/#{assets_path}/ #{user}@#{current_host}:#{current_path}/#{theme_path}/#{assets_path}/;"
|
473
|
+
end
|
412
474
|
end
|
413
475
|
|
414
|
-
end
|
415
476
|
|
416
477
|
# =========================
|
417
478
|
# Tests methods
|
418
479
|
# =========================
|
419
480
|
|
420
|
-
namespace :tests do
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
481
|
+
namespace :tests do
|
482
|
+
|
483
|
+
desc "Test php lint"
|
484
|
+
task :php_lint_test do
|
485
|
+
errors = []
|
486
|
+
test_files = Dir.glob(File.join(drupal_path, 'sites', '**', '*.{engine,inc,info,install,make,module,php,profile,test,theme,tpl,xtmpl}'))
|
487
|
+
if test_files.any?
|
488
|
+
test_files.each do |test_file|
|
489
|
+
begin
|
490
|
+
fail unless system("php -l '#{test_file}' > /dev/null")
|
491
|
+
rescue
|
492
|
+
errors << test_file
|
493
|
+
end
|
432
494
|
end
|
433
495
|
end
|
496
|
+
puts "Commit tests failed on files:\n" + errors.join("\n") unless errors.empty?
|
497
|
+
exit 1 unless errors.empty?
|
434
498
|
end
|
435
|
-
puts "Commit tests failed on files:\n" + errors.join( "\n" ) unless errors.empty?
|
436
|
-
exit 1 unless errors.empty?
|
437
|
-
end
|
438
499
|
|
439
|
-
|
440
|
-
|
500
|
+
desc "Core hack detection"
|
501
|
+
task :checksum_core_test do
|
441
502
|
|
442
|
-
|
503
|
+
end
|
443
504
|
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
505
|
+
desc 'Runs unit tests for given site'
|
506
|
+
task :unit do
|
507
|
+
run "mkdir -p #{current_path}/build/simpletest"
|
508
|
+
test_files = Dir.glob(File.join(drupal_path, 'sites', '**', '*.test'))
|
509
|
+
test_files.map! { |f| f.sub!(drupal_path + "/", "") }
|
510
|
+
if test_files.any?
|
511
|
+
test_files.each do |test_file|
|
512
|
+
run "cd #{current_path}/#{drupal_path} && php scripts/run-tests.sh --url http://#{site} --xml '../build/simpletest' --file '#{test_file}'" unless test_file.include?('/contrib/')
|
513
|
+
end
|
452
514
|
end
|
453
|
-
end
|
454
515
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
516
|
+
run "cd #{current_path}/build && tar czf simpletest.tgz simpletest"
|
517
|
+
system "if [ ! -d build ]; then mkdir build; fi" # create build folder locally if needed
|
518
|
+
download "#{current_path}/build/simpletest.tgz", "build/", :once => true, :via => :scp
|
519
|
+
system "tar xzf build/simpletest.tgz -C build"
|
520
|
+
|
521
|
+
end
|
522
|
+
before "tests:unit", "drush:enst"
|
459
523
|
|
460
|
-
|
461
|
-
|
524
|
+
desc 'Runs all unit tests for given site'
|
525
|
+
task :unit_all do
|
526
|
+
run "mkdir -p #{current_path}/build/simpletest"
|
527
|
+
run "cd #{current_path}/#{drupal_path} && php scripts/run-tests.sh --url http://#{site} --xml '../build/simpletest' --all"
|
462
528
|
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
529
|
+
run "cd #{current_path}/build && tar czf simpletest.tgz simpletest"
|
530
|
+
system "if [ ! -d build ]; then mkdir build; fi" # create build folder locally if needed
|
531
|
+
download "#{current_path}/build/simpletest.tgz", "build/", :once => true, :via => :scp
|
532
|
+
system "tar xzf build/simpletest.tgz -C build"
|
467
533
|
|
468
|
-
|
469
|
-
|
470
|
-
download "#{current_path}/build/simpletest.tgz", "build/", :once => true, :via => :scp
|
471
|
-
system "tar xzf build/simpletest.tgz -C build"
|
534
|
+
end
|
535
|
+
before "tests:unit_all", "drush:enst"
|
472
536
|
|
473
537
|
end
|
474
|
-
before "tests:unit_all", "drush:enst"
|
475
|
-
|
476
|
-
end
|
477
538
|
|
478
539
|
# =========================
|
479
540
|
# Manage methods
|
480
541
|
# =========================
|
481
542
|
|
482
|
-
namespace :manage do
|
543
|
+
namespace :manage do
|
483
544
|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
545
|
+
desc "Block bots via robots.txt"
|
546
|
+
task :block_robots do
|
547
|
+
put "User-agent: *\nDisallow: /", "#{current_path}/#{drupal_path}/robots.txt"
|
548
|
+
end
|
488
549
|
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
550
|
+
task :dbdump_previous do
|
551
|
+
#Backup the previous release's database
|
552
|
+
if previous_release && backup_database
|
553
|
+
convert_domain().each_with_index do |d, i|
|
554
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush" + (d == 'default' ? '' : " -l #{d}") + " sql-dump > #{ File.join(dbbackups_path[i], "#{releases[-2]}.sql") }"
|
555
|
+
end
|
494
556
|
end
|
495
557
|
end
|
496
|
-
end
|
497
558
|
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
559
|
+
desc 'Dump remote database and restore locally'
|
560
|
+
task :pull_dump do
|
561
|
+
abort("ERROR: multisite not supported") if is_multisite
|
562
|
+
abort("NO LOCAL DATABASE FOUND, set :local_database in the config file..") unless local_database
|
563
|
+
|
564
|
+
set(:runit, Capistrano::CLI.ui.ask("WARNING!! will overwrite this local database: '#{local_database}', type 'yes' to continue: "))
|
565
|
+
if runit == 'yes'
|
566
|
+
sql_file = File.join(dbbackups_path, "#{releases.last}-pull.sql")
|
567
|
+
# dump & gzip remote file
|
568
|
+
run "cd #{current_path}/#{drupal_path} && #{drush_path}drush sql-dump > #{sql_file} && gzip -f #{sql_file}"
|
569
|
+
# copy to local
|
570
|
+
system "if [ ! -d build ]; then mkdir build; fi" # create build folder locally if needed
|
571
|
+
download "#{sql_file}.gz", "build/", :once => true, :via => :scp
|
572
|
+
run "rm #{sql_file}.gz"
|
573
|
+
# extract and restore
|
574
|
+
system "gunzip -f build/#{File.basename(sql_file)}.gz && echo \"DROP DATABASE #{local_database};CREATE DATABASE #{local_database}\" | mysql && mysql #{local_database} < build/#{File.basename(sql_file)}" if local_database
|
575
|
+
# check if file sanitation sql file exists
|
576
|
+
if File.exists?("config/sql/#{stage}.sql")
|
577
|
+
puts " * executing \"config/sql/#{stage}.sql\""
|
578
|
+
system "mysql #{local_database} < config/sql/#{stage}.sql"
|
579
|
+
end
|
518
580
|
end
|
519
581
|
end
|
520
|
-
end
|
521
|
-
|
522
|
-
desc 'Dump local database and restore remote'
|
523
|
-
task :push_dump do
|
524
|
-
abort("ERROR: multisite not supported") if is_multisite
|
525
|
-
abort("NO LOCAL DATABASE FOUND, set :local_database in the config file..") unless local_database
|
526
|
-
abort("THIS STAGE: #{stage} DOES NOT SUPPORT manage:push_dump") unless push_dump_enabled
|
527
582
|
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
#
|
533
|
-
|
534
|
-
#
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
583
|
+
desc 'Dump local database and restore remote'
|
584
|
+
task :push_dump do
|
585
|
+
abort("ERROR: multisite not supported") if is_multisite
|
586
|
+
abort("NO LOCAL DATABASE FOUND, set :local_database in the config file..") unless local_database
|
587
|
+
abort("THIS STAGE: #{stage} DOES NOT SUPPORT manage:push_dump") unless push_dump_enabled
|
588
|
+
|
589
|
+
set(:runit, Capistrano::CLI.ui.ask("WARNING!! will overwrite this REMOTE database: '#{db_name}', type 'yes' to continue: "))
|
590
|
+
if runit == 'yes'
|
591
|
+
sql_file = "#{Time.now.to_i}.sql"
|
592
|
+
system "if [ ! -d build ]; then mkdir build; fi" # create build folder locally if needed
|
593
|
+
# dump & gzip local file
|
594
|
+
system "cd #{drupal_path} && drush sql-dump > ../build/#{sql_file} && gzip ../build/#{sql_file}"
|
595
|
+
# copy to remote
|
596
|
+
upload "build/#{sql_file}.gz", File.join(dbbackups_path, "#{sql_file}.gz"), :once => true, :via => :scp
|
597
|
+
system "rm build/#{sql_file}.gz"
|
598
|
+
# extract and restore
|
599
|
+
run "gunzip -f #{File.join(dbbackups_path, "#{sql_file}.gz")} && cd #{current_path}/#{drupal_path} && #{drush_path}drush sql-cli < #{File.join(dbbackups_path, "#{sql_file}")}"
|
600
|
+
run "rm #{File.join(dbbackups_path, "#{sql_file}")}"
|
601
|
+
end
|
540
602
|
end
|
541
|
-
end
|
542
603
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
604
|
+
desc 'Download files and extract locally'
|
605
|
+
task :pull_files do
|
606
|
+
abort("ERROR: multisite not supported") if is_multisite
|
607
|
+
|
608
|
+
set(:runit, Capistrano::CLI.ui.ask("Do you want to download the files? type 'yes' to continue: "))
|
609
|
+
if runit == 'yes'
|
610
|
+
run "if [ ! -d #{deploy_to}/tmp ]; then mkdir #{deploy_to}/tmp; fi" # create tmp folder if needed
|
611
|
+
# pack and remote file
|
612
|
+
file = "#{deploy_to}/tmp/#{releases.last}.tar.gz"
|
613
|
+
run "cd #{current_path}/#{drupal_path}/sites/default && tar -zcvf #{file} files/*"
|
614
|
+
# copy to local
|
615
|
+
system "if [ ! -d build ]; then mkdir build; fi" # create build folder locally if needed
|
616
|
+
download "#{file}", "build/", :once => true, :via => :scp
|
617
|
+
run "rm #{file}"
|
618
|
+
set(:extract, Capistrano::CLI.ui.ask("Do you want to extract #{File.basename(file)}? type 'yes' to continue: "))
|
619
|
+
if extract == 'yes'
|
620
|
+
# extract the files
|
621
|
+
set(:where, Capistrano::CLI.ui.ask("Where? (default: build): "))
|
622
|
+
dest = where == '' ? "build" : "#{where}"
|
623
|
+
system "tar -zxvf build/#{File.basename(file)} -C #{dest}"
|
624
|
+
end
|
563
625
|
end
|
564
626
|
end
|
565
627
|
end
|
566
|
-
end
|
567
628
|
|
568
629
|
# =========================
|
569
630
|
# Helper methods
|
570
631
|
# =========================
|
571
632
|
|
572
633
|
# Builds initial contents of the Drupal website's settings file
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
634
|
+
|
635
|
+
def convert_domain()
|
636
|
+
temp_dom = fetch(:domain)
|
637
|
+
if temp_dom.kind_of?(String)
|
638
|
+
temp_arr = [temp_dom]
|
639
|
+
return temp_arr
|
640
|
+
end
|
641
|
+
|
642
|
+
return temp_dom
|
643
|
+
end
|
644
|
+
|
645
|
+
def convert_baseline()
|
646
|
+
temp_bl = fetch(:baseline)
|
647
|
+
if temp_bl.kind_of?(String)
|
648
|
+
temp_arr = [temp_bl]
|
649
|
+
return temp_arr
|
650
|
+
end
|
651
|
+
|
652
|
+
return temp_bl
|
653
|
+
end
|
654
|
+
|
655
|
+
def drupal_settings(version, domain)
|
656
|
+
db_domain_name = db_name.gsub("%domain", domain)
|
657
|
+
if version.to_s == '6'
|
658
|
+
settings = <<-STRING
|
577
659
|
<?php
|
578
660
|
$db_url = "#{db_type}://#{db_username}:#{db_password}@#{db_host}/#{db_domain_name}";
|
579
661
|
ini_set('arg_separator.output', '&');
|
@@ -589,9 +671,9 @@ ini_set('session.use_cookies', 1);
|
|
589
671
|
ini_set('session.use_only_cookies', 1);
|
590
672
|
ini_set('session.use_trans_sid', 0);
|
591
673
|
ini_set('url_rewriter.tags', '');
|
592
|
-
|
593
|
-
|
594
|
-
|
674
|
+
STRING
|
675
|
+
elsif version == '7'
|
676
|
+
settings = <<-STRING
|
595
677
|
<?php
|
596
678
|
$databases = array ('default' => array ('default' => array (
|
597
679
|
'database' => '#{db_domain_name}',
|
@@ -614,10 +696,10 @@ if (file_exists($path)) {
|
|
614
696
|
include_once($path);
|
615
697
|
}
|
616
698
|
|
617
|
-
|
618
|
-
|
619
|
-
|
699
|
+
STRING
|
700
|
+
else
|
701
|
+
abort "Unsupported Drupal version #{version}."
|
702
|
+
end
|
620
703
|
end
|
621
|
-
end
|
622
704
|
|
623
705
|
end # Capistrano::Configuration.instance.load
|