capistrano-opscomplete 0.6.1 → 0.6.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6bc31c81dbbf351fcb3670d1a496b65815149a0e06ef61ad0b80c0700e8183f5
4
- data.tar.gz: 9ffe2b98d9601f4b44634aab0d95076abdfc645c0746548ff32ca7a2518578ef
3
+ metadata.gz: ed8a513cbd0320e4dcc3e13764c70c5dbb8752a489f3a26b1d0c8d1aa480d142
4
+ data.tar.gz: fd3b323ce020ed6e69da74094ac4fe8feb8d88531ad7f03475c99054f7cf238c
5
5
  SHA512:
6
- metadata.gz: 79864388a7142e25ecdcfffde243c61bde9702f08a276c7b99a3d343c1f2ff2a70ee20e0a68f7fed7782ca9235b5c4b371fd20905f8ef3c20f89eec5dc9246c4
7
- data.tar.gz: 3a0044c57cbc5e56e6ac3b92f716b5ec2f497d539dce256cbab0e7d71093e04747f06354fc30ea71a204c3187262004c16fc5e8b46c0e67d3df3559ec880ca7b
6
+ metadata.gz: a2504a842b191d5384183c14b90f74cb762eb530bd2ed36541486420d615c1ee2c347fc88c2896ffe981741a21d4c1e72c58bbecbc3fbd514bf0d280831d0340
7
+ data.tar.gz: 5d3aa33cadda83cc57c45248b46c0b0e7f96856aa8c51d8f3dce79cc93b7a5c7efa5e290499482cdafabc6f8ae6e6cdddc4518d1a26f03230f27e1544282cc65
@@ -1,7 +1,41 @@
1
- ## Unreleased
1
+ ## [0.6.6] - 2020-12-08
2
+
3
+ ### Fixed
4
+ - Fix the error `undefined method 'after' for main:Object (NoMethodError)` when starting the rails application with capistrano-opscomplete required
5
+
6
+ ## [0.6.5] - 2020-11-20
7
+
8
+ ### Fixed
9
+ - Correct warning message for `opscomplete:ruby:broken_gems_warning`
10
+
11
+ ## [0.6.4] - 2020-11-19
12
+
13
+ ### Added
14
+ - You can now manage the Node.js version which needs to be installed
15
+ - Add two new capistrano tasks (`opscomplete:ruby:broken_gems_warning`, `opscomplete:ruby:reset`) which help to mitigate problems when a deployment fails (described in: [#19](https://github.com/makandra/capistrano-opscomplete/issues/19))
16
+
17
+ ### Fixed
18
+ - Added missing namespace for code example
19
+
20
+ ## [0.6.3] - 2020-07-23
21
+
22
+ ### Fixed
23
+ - regression after ([#18](https://github.com/makandra/capistrano-opscomplete/issues/18)) was merged
24
+
25
+ ## [0.6.2] - 2020-07-23
26
+
27
+ ### Fixed
28
+ - rbenv-build changed behaviour of `--list` ([#20](https://github.com/makandra/capistrano-opscomplete/issues/20))
29
+
30
+ ### Changed
31
+ - Bumped rack dependency from 2.1.1 to 2.2.3
32
+
33
+ ## [0.6.1] - 2020-04-16
34
+ ### Added
35
+ - Use Ruby 2.6 for development
2
36
 
3
37
  ### Changed
4
- - Upgrade rake dependency to ~>13.0
38
+ - Add rake as a runtime dependency
5
39
 
6
40
  ## [0.6.0] - 2020-01-13
7
41
  ### Added
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- capistrano-opscomplete (0.6.1)
4
+ capistrano-opscomplete (0.6.6)
5
5
  capistrano (>= 3.0, < 4.0.0)
6
6
  rake
7
7
 
@@ -17,7 +17,7 @@ GEM
17
17
  rake (>= 10.0.0)
18
18
  sshkit (>= 1.9.0)
19
19
  concurrent-ruby (1.1.6)
20
- i18n (1.8.2)
20
+ i18n (1.8.4)
21
21
  concurrent-ruby (~> 1.0)
22
22
  jaro_winkler (1.5.4)
23
23
  makandra-rubocop (4.2.0)
@@ -29,7 +29,7 @@ GEM
29
29
  parallel (1.19.1)
30
30
  parser (2.7.0.2)
31
31
  ast (~> 2.4.0)
32
- rack (2.1.1)
32
+ rack (2.2.3)
33
33
  rainbow (3.0.0)
34
34
  rake (13.0.1)
35
35
  rubocop (0.76.0)
data/README.md CHANGED
@@ -36,7 +36,13 @@ An example configuration could look like this:
36
36
  after 'deploy:updating', 'opscomplete:ruby:ensure'
37
37
  ```
38
38
 
39
- and in case you enabled [`Procfile support`](https://makandracards.com/opscomplete/67829-procfile-support) you can use the following tasks:
39
+ If you want to handle the ruby version for rollbacks too, you should add:
40
+
41
+ ```ruby
42
+ after 'deploy:reverting', 'opscomplete:ruby:ensure'
43
+ ```
44
+
45
+ And in case you enabled [`Procfile support`](https://makandracards.com/opscomplete/67829-procfile-support) you can use the following tasks:
40
46
 
41
47
  opscomplete:supervisor:gen_config
42
48
  opscomplete:supervisor:restart_procs
@@ -151,6 +157,24 @@ There are many hooks available in the [default deploy flow](https://capistranorb
151
157
  after 'deploy:updating', 'opscomplete:ruby:ensure'
152
158
  ```
153
159
 
160
+ ## Managing your nodejs version with `capistrano-opscomplete`
161
+
162
+ You can manage NodeJS also with `capistrano-opscomplete`. It will check the `.nvmrc`, `.node-version` and `.tool-versions` in the release direcotry (in this order) or you can configure it with `:opscomplete_nodejs_version` in your capistrano configuration.
163
+
164
+ Include the gem in your applications Gemfile:
165
+
166
+ ```ruby
167
+ gem 'capistrano-opscomplete'
168
+ ```
169
+
170
+ Now, add some [hooks](#using-capistrano-hooks) in your capistrano configuration (e.g. `deploy.rb`).
171
+ An example configuration could look like this:
172
+
173
+ ```ruby
174
+ # After unpacking your release, before bundling, compiling assets, ...
175
+ after 'deploy:updating', 'opscomplete:nodejs:ensure'
176
+ ```
177
+
154
178
  ## Contributing
155
179
 
156
180
  Bug reports and pull requests are welcome. Don't hesitate to [open a new issue](https://github.com/makandra/capistrano-opscomplete/issues/new).
File without changes
@@ -24,17 +24,17 @@ module Capistrano
24
24
  # 1) Get version from capistrano configuration (highest precedence, 'override')
25
25
  if fetch(:opscomplete_ruby_version)
26
26
  debug("Using version from :opscomplete_ruby_version setting: #{fetch(:opscomplete_ruby_version)}.")
27
- return fetch(:opscomplete_ruby_version)
27
+ fetch(:opscomplete_ruby_version)
28
28
 
29
29
  # 2) Get version from .ruby-version in release dir (after deploy:updating, before deploy:updated)
30
30
  elsif test("[ -f #{release_ruby_version_file_path} ]")
31
31
  debug("Using version from server's release_dir/.ruby-version file: #{capture(:cat, release_ruby_version_file_path)}")
32
- return capture(:cat, release_ruby_version_file_path)
32
+ capture(:cat, release_ruby_version_file_path)
33
33
 
34
34
  # 3) Get version from local checkout/cwd
35
35
  elsif File.readable?('.ruby-version')
36
36
  debug("Using version from local (cwd) .ruby-version file: #{File.read('.ruby-version').strip}")
37
- return File.read('.ruby-version').strip
37
+ File.read('.ruby-version').strip
38
38
 
39
39
  # FAIL: We have no idea which version to use
40
40
  else
@@ -65,7 +65,7 @@ module Capistrano
65
65
  end
66
66
 
67
67
  def rbenv_installable_rubies
68
- rbenv_installable_rubies = capture(:rbenv, :install, '--list').split("\n")
68
+ rbenv_installable_rubies = capture(:rbenv, :install, '--list-all').split("\n")
69
69
  rbenv_installable_rubies.map!(&:strip)
70
70
  rbenv_installable_rubies.delete('Available version:')
71
71
  rbenv_installable_rubies
@@ -108,6 +108,38 @@ module Capistrano
108
108
  def rubygems_install(version)
109
109
  rbenv_exec("gem update --no-document --system '#{version}'")
110
110
  end
111
+
112
+ def managed_nodejs?
113
+ test("[ -f ${HOME}/.nodejs_managed_by_makandra ]")
114
+ end
115
+
116
+ def app_nodejs_version
117
+
118
+ # 1) Get version from capistrano configuration (highest precedence, 'override')
119
+ if fetch(:opscomplete_nodejs_version)
120
+ debug("Using version from :opscomplete_nodejs_version setting: #{fetch(:opscomplete_nodejs_version)}.")
121
+ fetch(:opscomplete_nodejs_version)
122
+
123
+ # 2) Get version from version file in release dir (after deploy:updating, before deploy:updated)
124
+ elsif capture(:nodejs_get_version, release_path)
125
+ debug("Using version from server's release_dir/.nvmrc, .node-version or .tool-versions file: #{capture(:nodejs_get_version, release_path)}")
126
+ capture(:nodejs_get_version, release_path)
127
+
128
+ else
129
+ raise Capistrano::ValidationError, 'Could not find application\'s Node.js version. Consider setting opscomplete_ruby_version.'
130
+ end
131
+ end
132
+
133
+ def nodejs_installable_versions
134
+ nodejs_installable_versions = capture(:nodejs_installable_versions).split("\n")
135
+ nodejs_installable_versions.map!(&:strip)
136
+ nodejs_installable_versions
137
+ end
138
+
139
+ def nodejs_installed_versions
140
+ nodejs_installed_versions = capture(:nodejs_installed_versions).split("\n")
141
+ nodejs_installed_versions.map!(&:strip)
142
+ end
111
143
  end
112
144
  end
113
145
  end
@@ -4,5 +4,6 @@ require 'capistrano/opscomplete/version'
4
4
  require 'rake'
5
5
 
6
6
  load File.expand_path('opscomplete/ruby.rake', __dir__)
7
+ load File.expand_path('opscomplete/nodejs.rake', __dir__)
7
8
  load File.expand_path('opscomplete/supervisor.rake', __dir__)
8
- load File.expand_path('opscomplete/deploy.rake', __dir__)
9
+ load File.expand_path('../opscomplete/hooks.rb', __FILE__)
@@ -0,0 +1 @@
1
+ after 'deploy:failed', 'opscomplete:ruby:broken_gems_warning'
@@ -0,0 +1,53 @@
1
+ # vim: filetype=ruby
2
+ require 'capistrano/dsl/opscomplete'
3
+
4
+ namespace :opscomplete do
5
+ include Capistrano::DSL::Opscomplete
6
+ # desc 'Validate opscomplete specific configuration'
7
+ task :validate do
8
+ invoke('opscomplete:nodejs:check')
9
+ end
10
+
11
+ namespace :nodejs do
12
+ desc 'Check if nodejs version is set according to application\'s .node-version or .nvmrc (in this order).'
13
+ task :check do
14
+ on roles fetch(:nodejs_roles, :all) do |host|
15
+ warn("#{host}: Managed Node.js environment! Won't do any changes to nodejs version.") if managed_nodejs?
16
+ unless capture(:nodejs_current_version) == app_nodejs_version
17
+ raise Capistrano::ValidationError,
18
+ "#{host}: Node.js version is not set according to application\'s .node-version or .nvmrc file. Use cap opscomplete:nodejs:ensure."
19
+ end
20
+ info("#{host}: Node.js #{app_nodejs_version} is installed.")
21
+ end
22
+ end
23
+
24
+ desc 'Update Node.js version management tool'
25
+ task :update_nodejs_build do
26
+ on roles fetch(:nodejs_roles, :all) do
27
+ execute :nodejs_update_management_tool
28
+ end
29
+ end
30
+
31
+ desc 'Install and configure NodeJS according to applications .nvmrc, .node-version or .tool-versions.'
32
+ task :ensure do
33
+ invoke('opscomplete:nodejs:update_nodejs_build')
34
+ on roles fetch(:nodejs_roles, :all) do |host|
35
+ if managed_nodejs?
36
+ raise Capistrano::ValidationError, "#{host}: Managed Node.js environment! Won't do any changes to Node.js version."
37
+ end
38
+ if nodejs_installed_versions.include?(app_nodejs_version)
39
+ info("#{host}: Node.js #{app_nodejs_version} is installed.")
40
+ elsif nodejs_installable_versions.include?(app_nodejs_version)
41
+ info("#{host}: Configured Node.js version is not installed, but available for installation.")
42
+ with tmpdir: fetch(:tmp_dir) do
43
+ execute(:nodejs_install_version, "'#{app_nodejs_version}'")
44
+ end
45
+ else
46
+ raise Capistrano::ValidationError,
47
+ "#{host}: Configured Node.js version is neither installed nor installable."
48
+ end
49
+ execute(:nodejs_set_version, "'#{app_nodejs_version}'")
50
+ end
51
+ end
52
+ end
53
+ end
@@ -106,12 +106,52 @@ namespace :opscomplete do
106
106
  raise Capistrano::ValidationError,
107
107
  "#{host}: Configured Ruby version is neither installed nor installable using ruby-install."
108
108
  end
109
- execute(:rbenv, :global, "'#{app_ruby_version}'") unless capture(:rbenv, :global) == app_ruby_version
109
+ unless capture(:rbenv, :global) == app_ruby_version
110
+ set :ruby_modified, true
111
+ execute(:rbenv, :global, "'#{app_ruby_version}'")
112
+ end
110
113
  end
111
114
  invoke('opscomplete:ruby:install_rubygems')
112
115
  invoke('opscomplete:ruby:install_bundler')
113
116
  invoke('opscomplete:ruby:install_geordi')
114
117
  invoke('opscomplete:ruby:rehash') if fetch(:rbenv_needs_rehash, false)
115
118
  end
119
+
120
+ desc 'resets the global ruby version and gems to Gemfile and .ruby-version in current_path.'
121
+ task :reset do
122
+ on roles fetch(:rbenv_roles, :all) do |host|
123
+ within current_path do
124
+ current_ruby_version_file_path = current_path.join('.ruby-version').to_s
125
+ if test("[ -f #{current_ruby_version_file_path} ]")
126
+ execute(:rbenv, :global, capture(:cat, current_ruby_version_file_path))
127
+ else
128
+ raise Capistrano::ValidationError,
129
+ "#{host}: Missing .ruby-version in #{current_path}. Won't set a new global version."
130
+ end
131
+ if test("[ -f '#{current_path}/.bundle/config' ]")
132
+ debug("#{host}: Found #{current_path}/.bundle/config, running bundle pristine.")
133
+ set :bundle_gemfile, -> { current_path.join('Gemfile') }
134
+ execute(:bundle, :pristine)
135
+ else
136
+ raise Capistrano::ValidationError,
137
+ "Unable to find #{current_path}/.bundle/config, won't run bundle pristine."
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ desc 'Set the old ruby version before the change and invoke bundle pristine.'
144
+ task :broken_gems_warning do
145
+ on roles fetch(:rbenv_roles, :all) do |host|
146
+ if fetch(:ruby_modified, false)
147
+ warn("Deploy failed and the ruby version has been modified in this deploy.")
148
+ warn("If this was a minor ruby version upgrade your running application may run into issues with native gem extensions.")
149
+ warn("If your deploy failed before deploy:symlink:release you may run bundle exec `cap #{fetch(:stage)} opscomplete:ruby:reset`.")
150
+ warn("Please refer https://makandracards.com/makandra/477884-bundler-in-deploy-mode-shares-gems-between-patch-level-ruby-versions")
151
+ else
152
+ debug("#{host}: Ruby not modified in current deploy.")
153
+ end
154
+ end
155
+ end
116
156
  end
117
157
  end
@@ -27,7 +27,7 @@ namespace :opscomplete do
27
27
  end
28
28
  end
29
29
  end
30
-
30
+
31
31
  # Can be used for example to quiet sidekiq with a task like this:
32
32
  #
33
33
  # namespace :sidekiq do
@@ -36,12 +36,12 @@ namespace :opscomplete do
36
36
  # on roles :cron do
37
37
  # # The TSTP signal tells sidekiq to quiet all workers.
38
38
  # # see: https://github.com/mperham/sidekiq/wiki/Signals#tstp
39
- # invoke('supervisor:signal_procs', 'TSTP', 'sidekiq')
39
+ # invoke('opscomplete:supervisor:signal_procs', 'TSTP', 'sidekiq')
40
40
  # end
41
41
  # end
42
42
  # end
43
43
  desc 'Sends the signal (e.g. USR1 or TSTP) to all programs or if specified to program_name.'
44
- task :signal_procs, :signal, :program_name do |task_name, args|
44
+ task :signal_procs, :signal, :program_name do |_task_name, args|
45
45
  signal = args.fetch(:signal)
46
46
  program_name = args.fetch(:program_name, nil)
47
47
 
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Opscomplete
3
- VERSION = '0.6.1'.freeze
3
+ VERSION = '0.6.6'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-opscomplete
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Makandra Operations
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-16 00:00:00.000000000 Z
11
+ date: 2020-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: makandra-rubocop
@@ -89,9 +89,11 @@ files:
89
89
  - bin/console
90
90
  - bin/setup
91
91
  - capistrano-opscomplete.gemspec
92
+ - lib/capistrano-opscomplete.rb
92
93
  - lib/capistrano/dsl/opscomplete.rb
93
94
  - lib/capistrano/opscomplete.rb
94
- - lib/capistrano/opscomplete/deploy.rake
95
+ - lib/capistrano/opscomplete/hooks.rb
96
+ - lib/capistrano/opscomplete/nodejs.rake
95
97
  - lib/capistrano/opscomplete/ruby.rake
96
98
  - lib/capistrano/opscomplete/supervisor.rake
97
99
  - lib/capistrano/opscomplete/version.rb
@@ -118,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
120
  - !ruby/object:Gem::Version
119
121
  version: 2.0.1
120
122
  requirements: []
121
- rubygems_version: 3.1.2
123
+ rubygems_version: 3.0.3
122
124
  signing_key:
123
125
  specification_version: 4
124
126
  summary: Capistrano tasks for easy deployment to a makandra opscomplete environment.
@@ -1,10 +0,0 @@
1
- namespace :deploy do
2
- desc 'Show deployed revision'
3
- task :revision do
4
- on roles :app do
5
- within current_path do
6
- info "Revision: #{capture(:cat, 'REVISION')}"
7
- end
8
- end
9
- end
10
- end