poise-application-ruby 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.kitchen.travis.yml +9 -0
- data/.kitchen.yml +10 -0
- data/.travis.yml +21 -0
- data/.yardopts +3 -0
- data/Berksfile +35 -0
- data/CHANGELOG.md +82 -0
- data/Gemfile +37 -0
- data/LICENSE +201 -0
- data/README.md +271 -0
- data/Rakefile +17 -0
- data/SUPPORTERS.md +81 -0
- data/chef/templates/database.yml.erb +3 -0
- data/chef/templates/secrets.yml.erb +3 -0
- data/lib/poise_application_ruby.rb +24 -0
- data/lib/poise_application_ruby/app_mixin.rb +92 -0
- data/lib/poise_application_ruby/cheftie.rb +17 -0
- data/lib/poise_application_ruby/error.rb +25 -0
- data/lib/poise_application_ruby/resources.rb +24 -0
- data/lib/poise_application_ruby/resources/bundle_install.rb +54 -0
- data/lib/poise_application_ruby/resources/rackup.rb +70 -0
- data/lib/poise_application_ruby/resources/rails.rb +260 -0
- data/lib/poise_application_ruby/resources/ruby.rb +57 -0
- data/lib/poise_application_ruby/resources/ruby_execute.rb +89 -0
- data/lib/poise_application_ruby/resources/ruby_gem.rb +46 -0
- data/lib/poise_application_ruby/resources/thin.rb +64 -0
- data/lib/poise_application_ruby/resources/unicorn.rb +87 -0
- data/lib/poise_application_ruby/service_mixin.rb +66 -0
- data/lib/poise_application_ruby/version.rb +19 -0
- data/poise-application-ruby.gemspec +45 -0
- data/test/cookbooks/application_ruby_test/attributes/default.rb +17 -0
- data/test/cookbooks/application_ruby_test/metadata.rb +20 -0
- data/test/cookbooks/application_ruby_test/recipes/default.rb +66 -0
- data/test/cookbooks/application_ruby_test/recipes/rails.rb +41 -0
- data/test/cookbooks/application_ruby_test/recipes/sinatra.rb +29 -0
- data/test/gemfiles/chef-12.gemfile +19 -0
- data/test/gemfiles/master.gemfile +27 -0
- data/test/integration/default/serverspec/default_spec.rb +44 -0
- data/test/integration/default/serverspec/rails_spec.rb +41 -0
- data/test/integration/default/serverspec/sinatra_spec.rb +40 -0
- data/test/spec/resources/ruby_execute_spec.rb +46 -0
- data/test/spec/spec_helper.rb +20 -0
- metadata +202 -0
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise_boiler/rakefile'
|
data/SUPPORTERS.md
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# Supporters
|
2
|
+
|
3
|
+
This cookbook wouldn't have been possible without the generous support of my
|
4
|
+
Kickstarter backers. Thanks so much to every one of you!
|
5
|
+
|
6
|
+
* @kcunning
|
7
|
+
* Alberto Lorenzo Pulido
|
8
|
+
* Alex Gaynor
|
9
|
+
* Alexander Myasnikov
|
10
|
+
* Brooke Schreier Ganz
|
11
|
+
* Bryan McLellan
|
12
|
+
* Charles Johnson
|
13
|
+
* Chef Software, Inc.
|
14
|
+
* Chris Adams
|
15
|
+
* Christopher Petrilli
|
16
|
+
* David Thornton
|
17
|
+
* Derek Murawsky
|
18
|
+
* Fast Robot, LLC
|
19
|
+
* Fatty McAwesome Pants (Kate Heddleston)
|
20
|
+
* Greg Albrecht
|
21
|
+
* JD Harrington
|
22
|
+
* Jake Plimack
|
23
|
+
* Jason Cook
|
24
|
+
* Jeff Byrnes
|
25
|
+
* Jeff Forcier
|
26
|
+
* Jeff Lindsay
|
27
|
+
* Jennifer Davis
|
28
|
+
* John Fitch
|
29
|
+
* Jon Stacks
|
30
|
+
* Joshua SS Miller
|
31
|
+
* Julian Dunn
|
32
|
+
* Julien Phalip
|
33
|
+
* Kennon Kwok
|
34
|
+
* Kevin Duane
|
35
|
+
* Krzysztof Wilczynski
|
36
|
+
* Linda Goldstein
|
37
|
+
* Manny Toledo
|
38
|
+
* Marco A Morales
|
39
|
+
* Marcus Morris
|
40
|
+
* Mark Luntzel
|
41
|
+
* Martin B. Smith
|
42
|
+
* Mathieu Sauve-Frankel
|
43
|
+
* Matt Good
|
44
|
+
* Matt Juszczak
|
45
|
+
* Matt Ray
|
46
|
+
* Matt Stratton
|
47
|
+
* Michael Burns
|
48
|
+
* Miguel Landaeta
|
49
|
+
* Mike Schueler
|
50
|
+
* Nathan L Smith
|
51
|
+
* Nathen Harvey
|
52
|
+
* Paul Welch
|
53
|
+
* Peter Kropf
|
54
|
+
* Phil Mocek
|
55
|
+
* Practice Fusion Inc
|
56
|
+
* Ranjib
|
57
|
+
* Richard Jones
|
58
|
+
* Robert J. Berger
|
59
|
+
* Robin Levin
|
60
|
+
* Roland Moriz
|
61
|
+
* Ruben Orduz
|
62
|
+
* Russell Keith-Magee
|
63
|
+
* Ryan Hass
|
64
|
+
* Sam Clements
|
65
|
+
* Sean OMeara
|
66
|
+
* Seva Feldman
|
67
|
+
* Soo Choi
|
68
|
+
* Steven Danna
|
69
|
+
* Symonds & Son
|
70
|
+
* Todd Michael Bushnell
|
71
|
+
* Tracy Osborn
|
72
|
+
* Troy Ready
|
73
|
+
* Tyler Ball
|
74
|
+
* Vicky Tuite
|
75
|
+
* Ying Li
|
76
|
+
* Yvo van Doorn
|
77
|
+
* Zac Stevens
|
78
|
+
* lvh
|
79
|
+
* oolongtea
|
80
|
+
* smeuser
|
81
|
+
* tmonk42
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
|
18
|
+
module PoiseApplicationRuby
|
19
|
+
autoload :AppMixin, 'poise_application_ruby/app_mixin'
|
20
|
+
autoload :Error, 'poise_application_ruby/error'
|
21
|
+
autoload :Resources, 'poise_application_ruby/resources'
|
22
|
+
autoload :ServiceMixin, 'poise_application_ruby/service_mixin'
|
23
|
+
autoload :VERSION, 'poise_application_ruby/version'
|
24
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise/backports'
|
18
|
+
require 'poise/utils'
|
19
|
+
require 'poise_application/app_mixin'
|
20
|
+
require 'poise_ruby/ruby_command_mixin'
|
21
|
+
|
22
|
+
|
23
|
+
module PoiseApplicationRuby
|
24
|
+
# A helper mixin for Ruby application resources and providers.
|
25
|
+
#
|
26
|
+
# @since 4.0.0
|
27
|
+
module AppMixin
|
28
|
+
include Poise::Utils::ResourceProviderMixin
|
29
|
+
|
30
|
+
# A helper mixin for Ruby application resources.
|
31
|
+
module Resource
|
32
|
+
include PoiseApplication::AppMixin::Resource
|
33
|
+
include PoiseRuby::RubyCommandMixin::Resource
|
34
|
+
|
35
|
+
# @!attribute parent_ruby
|
36
|
+
# Override the #parent_ruby from RubyCommandMixin to grok the
|
37
|
+
# application level parent as a default value.
|
38
|
+
# @return [PoiseRuby::Resources::RubyRuntime::Resource, nil]
|
39
|
+
parent_attribute(:ruby, type: :ruby_runtime, optional: true, default: lazy { app_state_ruby.equal?(self) ? nil : app_state_ruby })
|
40
|
+
|
41
|
+
# @!attribute parent_bundle
|
42
|
+
# Parent bundle install context.
|
43
|
+
# @return [PoiseRuby::Resources::BundleInstall::Resource, nil]
|
44
|
+
parent_attribute(:bundle, type: :ruby_runtime, optional: true, auto: false, default: lazy { app_state_bundle.equal?(self) ? nil : app_state_bundle })
|
45
|
+
|
46
|
+
# @attribute app_state_ruby
|
47
|
+
# The application-level Ruby parent.
|
48
|
+
# @return [PoiseRuby::Resources::RubyRuntime::Resource, nil]
|
49
|
+
def app_state_ruby(ruby=Poise::NOT_PASSED)
|
50
|
+
unless ruby == Poise::NOT_PASSED
|
51
|
+
app_state[:ruby] = ruby
|
52
|
+
end
|
53
|
+
app_state[:ruby]
|
54
|
+
end
|
55
|
+
|
56
|
+
# @attribute app_state_bundle
|
57
|
+
# The application-level Bundle parent.
|
58
|
+
# @return [PoiseRuby::Resources::BundleInstall::Resource, nil]
|
59
|
+
def app_state_bundle(bundle=Poise::NOT_PASSED)
|
60
|
+
unless bundle == Poise::NOT_PASSED
|
61
|
+
app_state[:bundle] = bundle
|
62
|
+
end
|
63
|
+
app_state[:bundle]
|
64
|
+
end
|
65
|
+
|
66
|
+
# A merged hash of environment variables for both the application state
|
67
|
+
# and parent ruby.
|
68
|
+
#
|
69
|
+
# @return [Hash<String, String>]
|
70
|
+
def app_state_environment_ruby
|
71
|
+
env = app_state_environment
|
72
|
+
env = env.merge(parent_ruby.ruby_environment) if parent_ruby
|
73
|
+
env['BUNDLE_GEMFILE'] = parent_bundle.gemfile_path if parent_bundle
|
74
|
+
env
|
75
|
+
end
|
76
|
+
|
77
|
+
# Update ruby_from_parent to transfer {#parent_bundle} too.
|
78
|
+
#
|
79
|
+
# @param resource [Chef::Resource] Resource to inherit from.
|
80
|
+
# @return [void]
|
81
|
+
def ruby_from_parent(resource)
|
82
|
+
super
|
83
|
+
parent_bundle(resource.parent_bundle) if resource.parent_bundle
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# A helper mixin for Ruby application providers.
|
88
|
+
module Provider
|
89
|
+
include PoiseApplication::AppMixin::Provider
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise_application_ruby/resources'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise_application/error'
|
18
|
+
|
19
|
+
module PoiseApplicationRuby
|
20
|
+
# Base exception class for poise-application-ruby errors.
|
21
|
+
#
|
22
|
+
# @since 4.0.0
|
23
|
+
class Error < PoiseApplication::Error
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise_application_ruby/resources/bundle_install'
|
18
|
+
require 'poise_application_ruby/resources/rackup'
|
19
|
+
require 'poise_application_ruby/resources/rails'
|
20
|
+
require 'poise_application_ruby/resources/ruby'
|
21
|
+
require 'poise_application_ruby/resources/ruby_execute'
|
22
|
+
require 'poise_application_ruby/resources/ruby_gem'
|
23
|
+
require 'poise_application_ruby/resources/thin'
|
24
|
+
require 'poise_application_ruby/resources/unicorn'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'poise_ruby/resources/bundle_install'
|
18
|
+
|
19
|
+
require 'poise_application_ruby/app_mixin'
|
20
|
+
|
21
|
+
|
22
|
+
module PoiseApplicationRuby
|
23
|
+
module Resources
|
24
|
+
# (see BundleInstall::Resource)
|
25
|
+
# @since 4.0.0
|
26
|
+
module BundleInstall
|
27
|
+
# An `application_bundle_install` resource to install a
|
28
|
+
# [Bundler](http://bundler.io/) Gemfile in a web application.
|
29
|
+
#
|
30
|
+
# @note
|
31
|
+
# This resource is not idempotent itself, it will always run `bundle
|
32
|
+
# install`.
|
33
|
+
# @example
|
34
|
+
# application '/srv/my_app' do
|
35
|
+
# bundle_install
|
36
|
+
# end
|
37
|
+
class Resource < PoiseRuby::Resources::BundleInstall::Resource
|
38
|
+
include PoiseApplicationRuby::AppMixin
|
39
|
+
provides(:application_bundle_install)
|
40
|
+
subclass_providers!
|
41
|
+
|
42
|
+
# Set this resource as the app_state's parent bundle.
|
43
|
+
#
|
44
|
+
# @api private
|
45
|
+
def after_created
|
46
|
+
super.tap do |val|
|
47
|
+
app_state_bundle(self)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'chef/provider'
|
18
|
+
require 'chef/resource'
|
19
|
+
|
20
|
+
require 'poise_application_ruby/service_mixin'
|
21
|
+
|
22
|
+
|
23
|
+
module PoiseApplicationRuby
|
24
|
+
module Resources
|
25
|
+
# (see Rackup::Resource)
|
26
|
+
# @since 4.0.0
|
27
|
+
module Rackup
|
28
|
+
class Resource < Chef::Resource
|
29
|
+
include PoiseApplicationRuby::ServiceMixin
|
30
|
+
provides(:application_rackup)
|
31
|
+
|
32
|
+
# @!attribute port
|
33
|
+
# TCP port to listen on. Defaults to 80.
|
34
|
+
# @return [String, Integer]
|
35
|
+
attribute(:port, kind_of: [String, Integer], default: 80)
|
36
|
+
end
|
37
|
+
|
38
|
+
class Provider < Chef::Provider
|
39
|
+
include PoiseApplicationRuby::ServiceMixin
|
40
|
+
provides(:application_rackup)
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# Find the path to the config.ru. If the resource path was to a
|
45
|
+
# directory, apparent /config.ru.
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
def configru_path
|
49
|
+
@configru_path ||= if ::File.directory?(new_resource.path)
|
50
|
+
::File.join(new_resource.path, 'config.ru')
|
51
|
+
else
|
52
|
+
new_resource.path
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Set up service options for rackup.
|
57
|
+
#
|
58
|
+
# @param resource [PoiseService::Resource] Service resource.
|
59
|
+
# @return [void]
|
60
|
+
def service_options(resource)
|
61
|
+
super
|
62
|
+
resource.ruby_command("rackup --port #{new_resource.port}")
|
63
|
+
resource.directory(::File.dirname(configru_path))
|
64
|
+
# Older versions of rackup ignore all signals.
|
65
|
+
resource.stop_signal('KILL')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,260 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2015, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require 'chef/provider'
|
18
|
+
require 'chef/resource'
|
19
|
+
|
20
|
+
require 'poise_application_ruby/app_mixin'
|
21
|
+
|
22
|
+
|
23
|
+
module PoiseApplicationRuby
|
24
|
+
module Resources
|
25
|
+
# (see Rails::Resource)
|
26
|
+
module Rails
|
27
|
+
# An `application_rails` resource to configure Ruby on Rails applications.
|
28
|
+
#
|
29
|
+
# @since 4.0.0
|
30
|
+
# @provides application_rails
|
31
|
+
# @action deploy
|
32
|
+
# @example
|
33
|
+
# application '/srv/myapp' do
|
34
|
+
# git '...'
|
35
|
+
# bundle_install
|
36
|
+
# rails do
|
37
|
+
# database do
|
38
|
+
# host node['rails_host']
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
# unicorn do
|
42
|
+
# port 8080
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
class Resource < Chef::Resource
|
46
|
+
include PoiseApplicationRuby::AppMixin
|
47
|
+
provides(:application_rails)
|
48
|
+
actions(:deploy)
|
49
|
+
|
50
|
+
# @!attribute database
|
51
|
+
# Option collector attribute for Rails database configuration.
|
52
|
+
# @return [Hash]
|
53
|
+
# @example Setting via block
|
54
|
+
# database do
|
55
|
+
# adapter 'postgresql'
|
56
|
+
# database 'blog'
|
57
|
+
# end
|
58
|
+
# @example Setting via URL
|
59
|
+
# database 'postgresql://localhost/blog'
|
60
|
+
attribute(:database, option_collector: true, parser: :parse_database_url)
|
61
|
+
# @!attribute database_config
|
62
|
+
# Template content attribute for the contents of database.yml.
|
63
|
+
# @todo Redo this doc to cover the actual attributes created.
|
64
|
+
# @return [Poise::Helpers::TemplateContent]
|
65
|
+
attribute(:database_config, template: true, default_source: 'database.yml.erb', default_options: lazy { default_database_options })
|
66
|
+
# @!attribute migrate
|
67
|
+
# Run database migrations. This is a bad idea for real apps. Please
|
68
|
+
# do not use it.
|
69
|
+
# @return [Boolean]
|
70
|
+
attribute(:migrate, equal_to: [true, false], default: false)
|
71
|
+
# @!attribute precompile_assets
|
72
|
+
# Set to true to run rake assets:precompile. By default will try to
|
73
|
+
# auto-detect if Sprockets is in use by looking at config/initializers.
|
74
|
+
# @see #default_precompile_assets
|
75
|
+
# @return [Boolean]
|
76
|
+
attribute(:precompile_assets, equal_to: [true, false], default: lazy { default_precompile_assets })
|
77
|
+
# @!attribute rails_env
|
78
|
+
# Rails environment name. Defaults to the Chef environment name or
|
79
|
+
# `production` if none is set.
|
80
|
+
# @see #default_rails_env
|
81
|
+
# @return [String]
|
82
|
+
attribute(:rails_env, kind_of: String, default: lazy { default_rails_env })
|
83
|
+
# @!attribute secret_token
|
84
|
+
# Secret token for Rails session verification and other purposes. On
|
85
|
+
# Rails 4.2 this will be used for secret_key_base. If not set, no
|
86
|
+
# secrets configuration is written.
|
87
|
+
# @return [String]
|
88
|
+
attribute(:secret_token, kind_of: [String, FalseClass])
|
89
|
+
# @!attribute secrets_config
|
90
|
+
# Template content attribute for the contents of secrets.yml. Only
|
91
|
+
# used when secrets_mode is :yaml.
|
92
|
+
# @todo Redo this doc to cover the actual attributes created.
|
93
|
+
# @return [Poise::Helpers::TemplateContent]
|
94
|
+
attribute(:secrets_config, template: true, default_source: 'secrets.yml.erb', default_options: lazy { default_secrets_options })
|
95
|
+
# @!attribute secrets_mode
|
96
|
+
# Secrets configuration mode. Set to `:yaml` to generate a Rails 4.2
|
97
|
+
# secrets.yml. Set to `:initializer` to update
|
98
|
+
# `config/initializers/secret_token.rb`. If unspecified this is
|
99
|
+
# auto-detected based on what files exist.
|
100
|
+
# @return [Symbol]
|
101
|
+
attribute(:secrets_mode, equal_to: [:yaml, :initializer], default: lazy { default_secrets_mode })
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# Check if we should run the precompile by default. Looks for the
|
106
|
+
# assets initializer because that is not present with --skip-sprockets.
|
107
|
+
#
|
108
|
+
# @return [Boolean]
|
109
|
+
def default_precompile_assets
|
110
|
+
::File.exists?(::File.join(path, 'config', 'initializers', 'assets.rb'))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Check the default environment name.
|
114
|
+
#
|
115
|
+
# @return [String]
|
116
|
+
def default_rails_env
|
117
|
+
node.chef_environment == '_default' ? 'production' : node.chef_environment
|
118
|
+
end
|
119
|
+
|
120
|
+
# Format a single URL for the database.yml
|
121
|
+
#
|
122
|
+
# @return [Hash]
|
123
|
+
def parse_database_url(url)
|
124
|
+
{'url' => url}
|
125
|
+
end
|
126
|
+
|
127
|
+
# Default template variables for the database.yml.
|
128
|
+
#
|
129
|
+
# @return [Hash<Symbol, Object>]
|
130
|
+
def default_database_options
|
131
|
+
db_config = {'encoding' => 'utf8', 'reconnect' => true, 'pool' => 5}.merge(database)
|
132
|
+
{
|
133
|
+
config: {
|
134
|
+
rails_env => db_config
|
135
|
+
},
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
# Check which secrets configuration mode is in use based on files.
|
140
|
+
#
|
141
|
+
# @return [Symbol]
|
142
|
+
def default_secrets_mode
|
143
|
+
::File.exists?(::File.join(path, 'config', 'initializers', 'secret_token.rb')) ? :initialize : :yaml
|
144
|
+
end
|
145
|
+
|
146
|
+
# Default template variables for the secrets.yml.
|
147
|
+
#
|
148
|
+
# @return [Hash<Symbol, Object>]
|
149
|
+
def default_secrets_options
|
150
|
+
{
|
151
|
+
config: {
|
152
|
+
rails_env => {
|
153
|
+
'secret_key_base' => secret_token,
|
154
|
+
}
|
155
|
+
},
|
156
|
+
}
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Provider for `application_rails`.
|
161
|
+
#
|
162
|
+
# @since 4.0.0
|
163
|
+
# @see Resource
|
164
|
+
# @provides application_rails
|
165
|
+
class Provider < Chef::Provider
|
166
|
+
include PoiseApplicationRuby::AppMixin
|
167
|
+
provides(:application_rails)
|
168
|
+
|
169
|
+
# `deploy` action for `application_rails`. Ensure all configuration
|
170
|
+
# files are created and other deploy tasks resolved.
|
171
|
+
#
|
172
|
+
# @return [void]
|
173
|
+
def action_deploy
|
174
|
+
set_state
|
175
|
+
notifying_block do
|
176
|
+
write_database_yml unless new_resource.database.empty?
|
177
|
+
write_secrets_config if new_resource.secret_token
|
178
|
+
precompile_assets if new_resource.precompile_assets
|
179
|
+
run_migrations if new_resource.migrate
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
# Set app_state variables for future services et al.
|
186
|
+
def set_state
|
187
|
+
new_resource.app_state_environment[:RAILS_ENV] = new_resource.rails_env
|
188
|
+
new_resource.app_state_environment[:DATABASE_URL] = new_resource.database['url'] if new_resource.database['url']
|
189
|
+
end
|
190
|
+
|
191
|
+
# Create a database.yml config file.
|
192
|
+
def write_database_yml
|
193
|
+
file ::File.join(new_resource.path, 'config', 'database.yml') do
|
194
|
+
user new_resource.parent.owner
|
195
|
+
group new_resource.parent.group
|
196
|
+
mode '640'
|
197
|
+
content new_resource.database_config_content
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Dispatch to the correct config writer based on the mode.
|
202
|
+
def write_secrets_config
|
203
|
+
case new_resource.secrets_mode
|
204
|
+
when :yaml
|
205
|
+
write_secrets_yml
|
206
|
+
when :initializer
|
207
|
+
write_secrets_initializer
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Write a Rails 4.2-style secrets.yml.
|
212
|
+
def write_secrets_yml
|
213
|
+
file ::File.join(new_resource.path, 'config', 'secrets.yml') do
|
214
|
+
user new_resource.parent.owner
|
215
|
+
group new_resource.parent.group
|
216
|
+
mode '640'
|
217
|
+
content new_resource.secrets_config_content
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
# In-place update a config/initializers/secret_token.rb file.
|
222
|
+
def write_secrets_initializer
|
223
|
+
# @todo Implement initalizer-style secret support.
|
224
|
+
raise NotImplementedError.new('Sorry, intializer-style secrets loading is not yet supported.')
|
225
|
+
end
|
226
|
+
|
227
|
+
# Precompile assets using the rake task.
|
228
|
+
def precompile_assets
|
229
|
+
# Currently this will always run so the resource will always update :-/
|
230
|
+
# Better fix would be to shell_out! and parse the output?
|
231
|
+
ruby_execute 'rake assets:precompile' do
|
232
|
+
command %w{rake assets:precompile}
|
233
|
+
user new_resource.parent.owner
|
234
|
+
group new_resource.parent.group
|
235
|
+
cwd new_resource.parent.path
|
236
|
+
environment new_resource.app_state_environment
|
237
|
+
ruby_from_parent new_resource
|
238
|
+
parent_bundle new_resource.parent_bundle if new_resource.parent_bundle
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Run database migrations using the rake task.
|
243
|
+
def run_migrations
|
244
|
+
# Currently this will always run so the resource will always update :-/
|
245
|
+
# Better fix would be to shell_out! and parse the output?
|
246
|
+
ruby_execute 'rake db:migrate' do
|
247
|
+
command %w{rake db:migrate}
|
248
|
+
user new_resource.parent.owner
|
249
|
+
group new_resource.parent.group
|
250
|
+
cwd new_resource.parent.path
|
251
|
+
environment new_resource.app_state_environment
|
252
|
+
ruby_from_parent new_resource
|
253
|
+
parent_bundle new_resource.parent_bundle if new_resource.parent_bundle
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|