appscrolls 0.10.1 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # ChangeLog
2
2
 
3
+ ## v0.11
4
+
5
+ * `sidekiq` - adds sidekiq gem & web dashboard (hidden via secret string); can deploy worker to Cloud Foundry
6
+
3
7
  ## v0.10
4
8
 
5
9
  * `puma` - added basic support for Puma; also Cloud Foundry will use Puma automatically
data/scrolls/cf.rb CHANGED
@@ -2,13 +2,16 @@
2
2
  # * http://blog.cloudfoundry.com/2012/03/15/using-cloud-foundry-services-with-ruby-part-2-run-time-support-for-ruby-applications/
3
3
  # * http://blog.cloudfoundry.com/2012/04/19/deploying-jruby-on-rails-applications-on-cloud-foundry/
4
4
 
5
- vmc_version = '0.3.23'
5
+ require "yaml"
6
6
 
7
+ @vmc_version = '0.3.23'
7
8
  @name = File.basename(File.expand_path("."))
9
+ @cf_ruby_runtime = "ruby19" # might change later in scrolls
8
10
 
9
- gem 'vmc', "~> #{vmc_version}"
11
+ gem 'vmc', "~> #{@vmc_version}"
10
12
  gem 'cf-runtime'
11
13
 
14
+ known_services = %w[postgresql mysql redis mongodb]
12
15
  required_dbs = %w[mysql postgresql]
13
16
 
14
17
  selected_db = required_dbs.find { |db| scroll? db }
@@ -17,7 +20,7 @@ unless selected_db
17
20
  exit_now = true
18
21
  end
19
22
 
20
- manifest = {"applications"=>
23
+ $cf_manifest = {"applications"=>
21
24
  {"."=>
22
25
  {"name"=>@name,
23
26
  "framework"=>
@@ -25,26 +28,24 @@ manifest = {"applications"=>
25
28
  "info"=>
26
29
  {"mem"=>"256M", "description"=>"Rails Application", "exec"=>nil}},
27
30
  "url"=>"${name}.${target-base}",
31
+ "runtime"=>@cf_ruby_runtime,
28
32
  "mem"=>"256M",
29
33
  "instances"=>1,
30
34
  "services"=>{}}}}
31
35
 
32
- case selected_db.to_sym
33
- when :postgresql
34
- manifest["applications"]["."]["services"]["#{@name}-postgresql"] = {"type"=>"postgresql"}
35
- db_username = config['pg_username'] || 'root'
36
- db_password = config['pg_password'] || ''
37
- when :mysql
38
- manifest["applications"]["."]["services"]["#{@name}-mysql"] = {"type"=>"mysql"}
36
+ known_services.each do |service|
37
+ if scroll? service
38
+ $cf_manifest["applications"]["."]["services"]["#{@name}-#{service}"] = {"type"=>service}
39
+ end
39
40
  end
40
41
 
41
- require "yaml"
42
- create_file "manifest.yml", manifest.to_yaml
42
+ db_username = config['pg_username'] || 'root'
43
+ db_password = config['pg_password'] || ''
43
44
 
44
45
  exit 1 if exit_now
45
46
 
46
47
  after_bundler do
47
- run %Q{vmc _#{vmc_version}_ apps | grep "\\b#{@name}\\b" && vmc _#{vmc_version}_ delete #{@name}}
48
+ cf_delete_app @name
48
49
 
49
50
  # Desirable to vendor everything
50
51
  run "bundle package"
@@ -63,15 +64,39 @@ after_bundler do
63
64
  end
64
65
 
65
66
  after_everything do
67
+ create_file "manifest.yml", $cf_manifest.to_yaml
68
+
66
69
  run "rake assets:precompile"
67
70
  if jruby?
68
71
  run "warble"
69
72
  run "mkdir -p deploy"
70
73
  run "cp #{project_name}.war deploy/"
71
74
  end
72
- run "vmc _#{vmc_version}_ push #{project_name} --runtime ruby19 --path . --no-start"
73
- run "vmc _#{vmc_version}_ env-add #{project_name} BUNDLE_WITHOUT=assets:test:development"
74
- run "vmc _#{vmc_version}_ start #{project_name}"
75
+ run "vmc _#{@vmc_version}_ push #{project_name} --runtime #{@cf_ruby_runtime} --path . --no-start"
76
+ run "vmc _#{@vmc_version}_ env-add #{project_name} BUNDLE_WITHOUT=assets:test:development"
77
+ run "vmc _#{@vmc_version}_ start #{project_name}"
78
+ end
79
+
80
+ def cf_delete_app(name)
81
+ run %Q{vmc _#{@vmc_version}_ apps | grep "\\b#{name}\\b" && vmc _#{@vmc_version}_ delete #{name}}
82
+ end
83
+
84
+ def cf_standalone_command(key, name, command, services={})
85
+ cf_manifest = {"applications"=>
86
+ {"."=>
87
+ {"name"=>name,
88
+ "framework"=>
89
+ {"name"=>"standalone",
90
+ "info"=>
91
+ {"mem"=>"64M", "description"=>"Standalone Application", "exec"=>nil}},
92
+ "url"=>nil,
93
+ "runtime"=>@cf_ruby_runtime,
94
+ "command"=>command,
95
+ "mem"=>"256M",
96
+ "instances"=>1,
97
+ "services"=>services}}}
98
+ create_file "manifest.#{key}.yml", cf_manifest.to_yaml
99
+ "manifest.#{key}.yml"
75
100
  end
76
101
 
77
102
  __END__
data/scrolls/redis.rb CHANGED
@@ -1,7 +1,23 @@
1
1
  gem 'redis'
2
2
 
3
3
  initializer "redis.rb", <<-RUBY
4
- REDIS = Redis.new
4
+ if ENV['VCAP_SERVICES']
5
+ $vcap_services ||= JSON.parse(ENV['VCAP_SERVICES'])
6
+ redis_service_name = $vcap_services.keys.find { |svc| svc =~ /redis/i }
7
+ redis_service = $vcap_services[redis_service_name].first
8
+ $redis_config = {
9
+ host: redis_service['credentials']['host'],
10
+ port: redis_service['credentials']['port'],
11
+ password: redis_service['credentials']['password']
12
+ }
13
+ else
14
+ $redis_config = {
15
+ host: '127.0.0.1',
16
+ port: 6379
17
+ }
18
+ end
19
+
20
+ $redis = Redis.new($redis_config)
5
21
  RUBY
6
22
 
7
23
  if scroll? "eycloud_recipes_on_deploy"
@@ -0,0 +1,63 @@
1
+ gem "sidekiq"
2
+ # slim/sinatra are used for the sidekiq monitoring UI at /sidekiq/SECRET
3
+ gem "slim"
4
+ gem "sinatra", ">= 1.3.0", require: false
5
+
6
+ initializer "sidekiq.rb", <<-RUBY
7
+ if $redis_config[:password]
8
+ redis_url = "redis://:\#{$redis_config[:password]}@\#{$redis_config[:host]}:\#{$redis_config[:port]}/sidekiq"
9
+ else
10
+ redis_url = "redis://\#{$redis_config[:host]}:\#{$redis_config[:port]}/sidekiq"
11
+ end
12
+ Rails.logger.info "Setting sidekiq redis: \#{{ url: redis_url, namespace: 'sidekiq' }.inspect}"
13
+ Sidekiq.redis = { url: redis_url, namespace: 'sidekiq' }
14
+ RUBY
15
+
16
+ if scroll? "eycloud_recipes_on_deploy"
17
+ gem "eycloud-recipe-sidekiq", :group => :eycloud
18
+
19
+ append_file "deploy/cookbooks/main/recipes/default.rb", <<-RUBY
20
+
21
+ require_recipe "sidekiq"
22
+ RUBY
23
+ end
24
+
25
+ directory "app/workers"
26
+ create_file "app/workers/.gitkeep", ""
27
+
28
+ after_bundler do
29
+ route <<-RUBY
30
+ require "sidekiq/web"
31
+ mount Sidekiq::Web, at: "/sidekiq/#{config['sidekiq_admin_secret']}"
32
+ require "sidekiq/api"
33
+ match "queue-status" => proc { [200, {"Content-Type" => "text/plain"}, [Sidekiq::Queue.new.size < 100 ? "OK" : "UHOH" ]] }
34
+ RUBY
35
+ end
36
+
37
+ after_everything do
38
+ if scroll? "cf"
39
+ worker_name = "#{@name}-worker"
40
+ services = $cf_manifest["applications"]["."]["services"]
41
+ manifest_file = cf_standalone_command("worker", worker_name, "bundle exec sidekiq -e production", services)
42
+ cf_delete_app worker_name
43
+ run "vmc _#{@vmc_version}_ push #{worker_name} --runtime #{@cf_ruby_runtime} --path . --manifest #{manifest_file}"
44
+ end
45
+ end
46
+
47
+ __END__
48
+
49
+ name: Sidekiq
50
+ description: Simple, efficient message processing for your Rails 3 application
51
+ author: drnic
52
+
53
+ exclusive: worker
54
+ category: worker
55
+ tags: [worker,background-tasks]
56
+
57
+ requires: [redis]
58
+ run_after: [redis, eycloud_recipes_on_deploy, cf]
59
+
60
+ config:
61
+ - sidekiq_admin_secret:
62
+ type: string
63
+ prompt: "Enter a secret string for the route /sidekiq/SECRET:"
data/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module AppScrollsScrolls
2
- VERSION = "0.10.1"
2
+ VERSION = "0.11.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appscrolls
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.11.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-03-30 00:00:00.000000000 Z
13
+ date: 2013-03-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -230,6 +230,7 @@ files:
230
230
  - scrolls/redis.rb
231
231
  - scrolls/resque.rb
232
232
  - scrolls/rspec.rb
233
+ - scrolls/sidekiq.rb
233
234
  - scrolls/simple_form.rb
234
235
  - scrolls/split.rb
235
236
  - scrolls/sqlite3.rb
@@ -276,7 +277,6 @@ files:
276
277
  - scrolls/untested/sequel.rb
277
278
  - scrolls/untested/settingslogic.rb
278
279
  - scrolls/untested/shoulda_matchers.rb
279
- - scrolls/untested/sidekiq.rb
280
280
  - scrolls/untested/slim.rb
281
281
  - scrolls/untested/spork.rb
282
282
  - scrolls/untested/thinking_sphinx.rb
@@ -308,7 +308,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
308
308
  version: '0'
309
309
  segments:
310
310
  - 0
311
- hash: -3286780568142603210
311
+ hash: 4286488136917017513
312
312
  required_rubygems_version: !ruby/object:Gem::Requirement
313
313
  none: false
314
314
  requirements:
@@ -317,7 +317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
317
317
  version: '0'
318
318
  segments:
319
319
  - 0
320
- hash: -3286780568142603210
320
+ hash: 4286488136917017513
321
321
  requirements: []
322
322
  rubyforge_project:
323
323
  rubygems_version: 1.8.25
@@ -1,23 +0,0 @@
1
- gem "sidekiq"
2
-
3
- if scroll? "eycloud_recipes_on_deploy"
4
- gem "eycloud-recipe-sidekiq", :group => :eycloud
5
-
6
- append_file "deploy/cookbooks/main/recipes/default.rb", <<-RUBY
7
-
8
- require_recipe "sidekiq"
9
- RUBY
10
- end
11
-
12
- __END__
13
-
14
- name: Sidekiq
15
- description: Simple, efficient message processing for your Rails 3 application
16
- author: drnic
17
-
18
- exclusive: worker
19
- category: worker
20
- tags: [worker,background-tasks]
21
-
22
- requires: [redis]
23
- run_after: [redis, eycloud_recipes_on_deploy]