momentum 0.0.14 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64ff329b5fa672c7ea3247b0a5b4a6687df752ab
4
- data.tar.gz: 3812ee59bb97d73e916bfa04a0f586cc10e30ac7
3
+ metadata.gz: 75030c1823b744f72565ac6da017851f6279e088
4
+ data.tar.gz: 5a5b48ed310ff98a0fc405a89a638fa851330947
5
5
  SHA512:
6
- metadata.gz: 2fca491068125b4ab1bc09edffd17509f549dcf0f221329cd8536516843c5f4ff91459e52b2bb7b66d31e1d9a5714e89163f1fae767b314ef79ea7ab95f95797
7
- data.tar.gz: 8c85777e49815c975aff17e7d48748ff18bde3e2a950d83080411b54ab75a1826f46e03e566296f783a2822fdb5104bfc94eb0d88d18d16239c0ddad7340a25b
6
+ metadata.gz: f59c18802d31636c5c244ca4c0cf4352a0d89dcf92b1f7ea2c08bb53bec077424da2013bcd01eb0cf40a37a9aa69a46b431f7daa65eb0afa4af89e0b3ac8d9e6
7
+ data.tar.gz: b2538f64727cbd9adcd0dee58b906cae7356200bb3ca306761563c9a0a91784951bedcf51354f2f869a5f1ecc4856a88db537b78d110242dc7a8694ae4329e4e
data/CHANGELOG.md CHANGED
@@ -1,7 +1,7 @@
1
- 0.0.14 (2017-07-14)
1
+ 0.1.0 (2016-01-18)
2
2
  ------
3
3
 
4
- * Allow user to specify remote env variables for their console session ([24](https://github.com/artsy/momentum/pull/24))
4
+ * Update momentum to use Berkshelf and load rake tasks from non-Rails projects ([#19](https://github.com/artsy/momentum/pull/19)) Breaking changes: (1) librarian-chef has been replaced by berkshelf so any Cheffile must be converted to a Berksfile (2) The expected value for `Momentum.config[:cookbooks_install_path]` includes the cookbook package filename, which must be of the type `.tgz` i.e. the default value `cookbooks.tgz`
5
5
 
6
6
  0.0.13 (2016-01-18)
7
7
  ------
data/README.md CHANGED
@@ -20,13 +20,17 @@ In your application's Rakefile, add this line above the `load_tasks` command:
20
20
  # momentum should only be installed in development
21
21
  end
22
22
 
23
- And then execute:
23
+ If you arent's using Rails / don't have access to the `load_tasks` command, you can load all rake tasks by adding `require 'momentum/rake'` to your project's Rakefile.
24
+
25
+ Finally, execute:
24
26
 
25
27
  $ bundle
26
- $ gem install librarian-chef # ideally this would be in the bundle, but has conflicts
27
- $ bundle exec rake momentum:init
28
28
 
29
29
 
30
+ ## Berkshelf
31
+
32
+ Momentum uses [Berkshelf](http://berkshelf.com/) to package application cookbooks and expects a `Berksfile` present in the top-level of your project.
33
+
30
34
  ## Naming
31
35
 
32
36
  It's assumed that stacks are named with an app name and modifier, such as _todo-production_. The modifier is usually an environment, but might also be a developer name or some other label, such _todo-joey_.
@@ -35,10 +39,6 @@ It's assumed that stacks are named with an app name and modifier, such as _todo-
35
39
 
36
40
  This gem adds a few useful rake tasks to your project. By default, the `aws_id` and `aws_secret` arguments are taken from `AWS_ID` and `AWS_SECRET` ENV variables. The `to` argument refers to the modifier mentioned above (e.g., _production_). It's appended to the configured `app_base_name` to form the stack name.
37
41
 
38
- ### momentum:init
39
-
40
- Initialize a default librarian-chef config.
41
-
42
42
  ### ow:config[to,aws_id,aws_secret]
43
43
 
44
44
  Print the custom configuration values for the given stack. E.g.:
@@ -51,7 +51,7 @@ Add the given stack's custom configuration values to the current task's ENV. Can
51
51
 
52
52
  bundle exec rake ow:config:from_env[production] some:migration
53
53
 
54
- ### ow:console[to,env,aws_id,aws_secret] [env ...]
54
+ ### ow:console[to,env,aws_id,aws_secret]
55
55
 
56
56
  Start a rails console on the given remote OpsWorks stack. Chooses an instance of the _rails-app_ layer by default, or the configured `rails_console_layer` if provided. E.g.:
57
57
 
@@ -61,13 +61,9 @@ For stacks with labels not matching the Rails environment (e.g., _reflection-joe
61
61
 
62
62
  bundle exec rake ow:console[joey,staging]
63
63
 
64
- To set environment variables for the remote process, specify them _after_ the task name like you normally would with rake tasks:
65
-
66
- bundle exec rake ow:console[production] SOME_ENV_VARIABLE=set-remotely
67
-
68
64
  ### ow:cookbooks:update[to,aws_id,aws_secret]
69
65
 
70
- Zip, upload, and propagate custom cookbooks to the given stack. Or, more concisely:
66
+ Package, upload, and propagate custom cookbooks to the given stack. Or, more concisely:
71
67
 
72
68
  bundle exec rake ow:cookbooks:update[staging]
73
69
  # or just:
@@ -99,7 +95,7 @@ SSH to an OpsWorks instance. If the `layer_or_instance` argument is a layer, an
99
95
 
100
96
  ### ow:execute_recipe[to,layer,recipe,aws_id,aws_secret]
101
97
 
102
- Execute a Chec recipe on the given layer in the given stack. By default, will execute recipes on all running instances of the _rails-app_ layer, or the list configured in `app_layers`. E.g.:
98
+ Execute a Chef recipe on the given layer in the given stack. By default, will execute recipes on all running instances of the _rails-app_ layer, or the list configured in `app_layers`. E.g.:
103
99
 
104
100
  bundle exec rake ow:execute_recipe[staging,rails-app,restart_unicorns]
105
101
  # Assuming 'restart_unicorns' is a valid Chef recipe.
@@ -109,7 +105,7 @@ Execute a Chec recipe on the given layer in the given stack. By default, will ex
109
105
 
110
106
  * **app_base_name** - Your app's name. Stacks are assumed to be named like _appbasename-env_ (e.g., _gravity-staging_ or _reflection-joey_).
111
107
  * **app_layers** - Array of OpsWorks layer names to which this rails app should be deployed. Default: `['rails-app']`
112
- * **cookbooks_install_path** - Local path where librarian-chef will install cookbooks. Default: _tmp/cookbooks_
108
+ * **cookbooks_install_path** - Local path where berkshelf will install cookbooks. Default: _tmp/cookbooks.tgz_
113
109
  * **custom_cookbooks_bucket** - Bucket to which custom cookbooks are uploaded. Default: _artsy-cookbooks_
114
110
  * **rails_console_layer** - The OpsWorks layer used for SSH-ing and starting a rails console. Default: _rails-app_
115
111
 
@@ -117,7 +113,6 @@ Execute a Chec recipe on the given layer in the given stack. By default, will ex
117
113
  ## To Do
118
114
 
119
115
  * git/branch helpers
120
- * Integrate librarian-chef as legit dependency once rails/chef conflicts resolved
121
116
  * Tests
122
117
 
123
118
 
@@ -1,7 +1,7 @@
1
1
  module Momentum::OpsWorks
2
2
 
3
3
  def self.client(aws_id, aws_secret)
4
- raise "You must specify aws_id and aws_secret!" unless aws_id.present? && aws_secret.present?
4
+ raise "You must specify aws_id and aws_secret!" if aws_id.nil? || aws_secret.nil?
5
5
  require 'aws-sdk'
6
6
  AWS::OpsWorks::Client.new(access_key_id: aws_id, secret_access_key: aws_secret)
7
7
  end
@@ -16,9 +16,9 @@ module Momentum::OpsWorks
16
16
  client.describe_apps(stack_id: stack[:stack_id])[:apps].detect { |a| a[:name] == app_name }
17
17
  end
18
18
 
19
- # apparently, public_dns is not always set, fallback to elastic_ip (if available!)
19
+ # apparently, public_dns is not always set, fallback to elastic_ip (if available!) else private_dns
20
20
  def self.get_instance_endpoint(instance)
21
- instance[:public_dns] || instance[:elastic_ip]
21
+ instance[:public_dns] || instance[:elastic_ip] || instance[:private_dns]
22
22
  end
23
23
 
24
24
  def self.get_layers(client, stack, layer_names)
@@ -3,8 +3,6 @@ class Momentum::Railtie < ::Rails::Railtie
3
3
  railtie_name :momentum
4
4
 
5
5
  rake_tasks do
6
- load 'tasks/init.rake'
7
- load 'tasks/librarian.rake'
8
6
  load 'tasks/ow-config.rake'
9
7
  load 'tasks/ow-console.rake'
10
8
  load 'tasks/ow-cookbooks.rake'
@@ -0,0 +1,2 @@
1
+ # Helper to load all rake tasks - to be required in other Rakefiles
2
+ Dir.glob(File.expand_path("../../tasks/*.rake", __FILE__)) { |file| load file }
@@ -7,17 +7,13 @@ def require_credentials!(args)
7
7
  end
8
8
 
9
9
  def cookbooks_s3_key(to)
10
- "#{stack_name(to)}.zip"
10
+ "#{stack_name(to)}.tgz"
11
11
  end
12
12
 
13
13
  def stack_name(to)
14
14
  "#{Momentum.config[:app_base_name]}-#{to}"
15
15
  end
16
16
 
17
- def cookbooks_zip
18
- "#{Momentum.config[:cookbooks_install_path]}.zip"
19
- end
20
-
21
17
  def system!(command)
22
18
  success = system(command)
23
19
  fail "Failed with status #{$?.exitstatus}" unless success
@@ -1,3 +1,3 @@
1
1
  module Momentum
2
- VERSION = "0.0.14"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/momentum.rb CHANGED
@@ -5,7 +5,7 @@ module Momentum
5
5
 
6
6
  DEFAULT_CONFIG = {
7
7
  # app_base_name: ..., # required
8
- cookbooks_install_path: 'tmp/cookbooks',
8
+ cookbooks_install_path: 'tmp/cookbooks.tgz',
9
9
  custom_cookbooks_bucket: 'artsy-cookbooks',
10
10
  rails_console_layer: 'rails-app',
11
11
  app_layers: ['rails-app'],
@@ -16,12 +16,8 @@ namespace :ow do
16
16
  endpoint = Momentum::OpsWorks.get_instance_endpoint(instance)
17
17
  raise "No online '#{Momentum.config[:rails_console_layer]}' instances found for #{name} stack!" unless endpoint
18
18
 
19
- env = ARGV.grep(/^(\w+)=(.*)$/m)
20
- env << "RAILS_ENV=#{args[:env] || args[:to]}"
21
- env << "RUBYOPT=-EUTF-8"
22
-
23
19
  $stderr.puts "Starting remote console... (use Ctrl-D to exit cleanly)"
24
- command = "'sudo su deploy -c \"cd /srv/www/#{Momentum.config[:app_base_name]}/current && env #{env.join(" ")} bundle exec rails console\"'"
20
+ command = "'sudo su deploy -c \"cd /srv/www/#{Momentum.config[:app_base_name]}/current && RAILS_ENV=#{args[:env] || args[:to]} RUBYOPT=-EUTF-8 bundle exec rails console\"'"
25
21
  sh Momentum::OpsWorks.ssh_command_to(endpoint,command)
26
22
  end
27
23
 
@@ -4,30 +4,21 @@ namespace :ow do
4
4
  require 'momentum/opsworks'
5
5
  require 'momentum/tasks'
6
6
 
7
- desc "Zip the #{Momentum.config[:cookbooks_install_path]} directory into #{Momentum.config[:cookbooks_install_path]}.zip"
8
- task :zip do
9
- raise "No cookbooks found at #{Momentum.config[:cookbooks_install_path]}! Run librarian-chef install." unless File.exists?(Momentum.config[:cookbooks_install_path])
10
- dir = File.dirname(Momentum.config[:cookbooks_install_path])
11
- base = File.basename(Momentum.config[:cookbooks_install_path])
12
- system! "rm -f #{cookbooks_zip} && pushd #{dir} && zip -r #{base} #{base} && popd"
13
- $stderr.puts "Zipped cookbooks to #{cookbooks_zip}"
14
- end
15
-
16
- desc "Upload custom cookbooks from #{cookbooks_zip} to S3 (at bucket/appname-env.zip)."
7
+ desc "Upload custom cookbooks from #{Momentum.config[:cookbooks_install_path]} to S3 (at bucket/appname-env.tgz)."
17
8
  task :upload, [:to, :aws_id, :aws_secret] => [:require_app_base_name] do |t, args|
18
9
  require_credentials!(args)
19
10
  require 'aws-sdk'
20
11
  AWS.config(access_key_id: args[:aws_id], secret_access_key: args[:aws_secret])
21
12
 
22
13
  key = cookbooks_s3_key(args[:to])
23
- File.open(cookbooks_zip) do |zip|
24
- AWS::S3.new.client.put_object bucket_name: Momentum.config[:custom_cookbooks_bucket], key: key, data: zip
14
+ File.open(Momentum.config[:cookbooks_install_path]) do |archive|
15
+ AWS::S3.new.client.put_object bucket_name: Momentum.config[:custom_cookbooks_bucket], key: key, data: archive
25
16
  end
26
- $stderr.puts "Uploaded cookbooks.zip to #{Momentum.config[:custom_cookbooks_bucket]}/#{key}."
17
+ $stderr.puts "Uploaded #{Momentum.config[:cookbooks_install_path]} to #{Momentum.config[:custom_cookbooks_bucket]}/#{key}."
27
18
  end
28
19
 
29
- desc "Install, zip and upload custom cookbooks, then trigger update_custom_cookbooks command."
30
- task :update, [:to, :aws_id, :aws_secret] => [:require_app_base_name, 'librarian:install', :zip, :upload] do |t, args|
20
+ desc "Package and upload custom cookbooks, then trigger update_custom_cookbooks command."
21
+ task :update, [:to, :aws_id, :aws_secret] => [:require_app_base_name, :berks_package, :upload] do |t, args|
31
22
  require_credentials!(args)
32
23
 
33
24
  ow = Momentum::OpsWorks.client(args[:aws_id], args[:aws_secret])
@@ -47,7 +38,7 @@ namespace :ow do
47
38
 
48
39
  namespace :update do
49
40
  %w{staging production}.each do |env|
50
- desc "Zip, upload, and propagate custom OpsWorks cookbooks to the #{env} stack."
41
+ desc "Package, upload, and propagate custom OpsWorks cookbooks to the #{env} stack."
51
42
  task(env.to_sym) { Rake::Task['ow:cookbooks:update'].invoke(env) }
52
43
  end
53
44
  end
@@ -56,5 +47,14 @@ namespace :ow do
56
47
  raise "An app_base_name must be configured!" unless Momentum.config[:app_base_name]
57
48
  end
58
49
 
50
+ task :berks_package do
51
+ require 'fileutils'
52
+ dirname = File.dirname(Momentum.config[:cookbooks_install_path])
53
+ unless File.directory?(dirname)
54
+ FileUtils.mkdir_p(dirname)
55
+ end
56
+ system! "berks package #{Momentum.config[:cookbooks_install_path]}"
57
+ end
58
+
59
59
  end
60
60
  end
data/momentum.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "aws-sdk", "~> 1.30"
22
- # spec.add_dependency "librarian-chef" # rails/chef require incompatible json versions
22
+ spec.add_dependency "berkshelf", "~> 4.3.5"
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.3"
25
25
  spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,55 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: momentum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joey Aghion
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-14 00:00:00.000000000 Z
11
+ date: 2016-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.30'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.30'
27
+ - !ruby/object:Gem::Dependency
28
+ name: berkshelf
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 4.3.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 4.3.5
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - "~>"
45
+ - - ~>
32
46
  - !ruby/object:Gem::Version
33
47
  version: '1.3'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - "~>"
52
+ - - ~>
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.3'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - '>='
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ">="
66
+ - - '>='
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  description: Utilities for working with OpsWorks apps in the style of Artsy Engineering.
@@ -59,7 +73,7 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
- - ".gitignore"
76
+ - .gitignore
63
77
  - CHANGELOG.md
64
78
  - Gemfile
65
79
  - LICENSE.txt
@@ -68,10 +82,9 @@ files:
68
82
  - lib/momentum.rb
69
83
  - lib/momentum/opsworks.rb
70
84
  - lib/momentum/railtie.rb
85
+ - lib/momentum/rake.rb
71
86
  - lib/momentum/tasks.rb
72
87
  - lib/momentum/version.rb
73
- - lib/tasks/init.rake
74
- - lib/tasks/librarian.rake
75
88
  - lib/tasks/ow-config.rake
76
89
  - lib/tasks/ow-console.rake
77
90
  - lib/tasks/ow-cookbooks.rake
@@ -90,18 +103,19 @@ require_paths:
90
103
  - lib
91
104
  required_ruby_version: !ruby/object:Gem::Requirement
92
105
  requirements:
93
- - - ">="
106
+ - - '>='
94
107
  - !ruby/object:Gem::Version
95
108
  version: '0'
96
109
  required_rubygems_version: !ruby/object:Gem::Requirement
97
110
  requirements:
98
- - - ">="
111
+ - - '>='
99
112
  - !ruby/object:Gem::Version
100
113
  version: '0'
101
114
  requirements: []
102
115
  rubyforge_project:
103
- rubygems_version: 2.5.2
116
+ rubygems_version: 2.0.14
104
117
  signing_key:
105
118
  specification_version: 4
106
119
  summary: Utilities for working with OpsWorks apps in the style of Artsy Engineering.
107
120
  test_files: []
121
+ has_rdoc:
data/lib/tasks/init.rake DELETED
@@ -1,6 +0,0 @@
1
- namespace :momentum do
2
-
3
- desc "Initialize a project with librarian-chef, etc."
4
- task :init => ['librarian:config', 'librarian:init']
5
-
6
- end
@@ -1,34 +0,0 @@
1
- namespace :librarian do
2
-
3
- LIBRARIAN_CONFIG = <<-EOF
4
- ---
5
- LIBRARIAN_CHEF_PATH: #{Momentum.config[:cookbooks_install_path]}
6
- LIBRARIAN_CHEF_INSTALL__STRIP_DOT_GIT: '1'
7
- EOF
8
-
9
- task :config do
10
- FileUtils.mkdir_p './.librarian/chef'
11
- File.open('./.librarian/chef/config', 'w+') do |f|
12
- f.write(LIBRARIAN_CONFIG)
13
- end
14
- $stderr.puts "Wrote .librarian/chef/config"
15
- end
16
-
17
- task :init => :require do
18
- # librarian-chef and rails declare incompatible json dependencies,
19
- # so librarian-chef must be installed but can't be in the bundle
20
- Bundler.with_clean_env do
21
- system! "librarian-chef init"
22
- end
23
- end
24
-
25
- task :install => :require do
26
- Bundler.with_clean_env do
27
- system! "librarian-chef install"
28
- end
29
- end
30
-
31
- task :require do
32
- raise "librarian-chef must be installed!" if `which librarian-chef`.empty?
33
- end
34
- end