berkshelf 4.3.5 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -25,7 +25,9 @@ gem 'berkshelf'
25
25
 
26
26
  Or run it as a standalone:
27
27
 
28
- $ gem install berkshelf
28
+ ```shell
29
+ $ gem install berkshelf
30
+ ```
29
31
 
30
32
  ## Usage
31
33
 
@@ -33,11 +35,7 @@ See [berkshelf.com](http://berkshelf.com) for up-to-date usage instructions.
33
35
 
34
36
  ## Supported Platforms
35
37
 
36
- Berkshelf is tested on Ruby 1.9.3, 2.0, and 2.1.
37
-
38
- Ruby 1.9 mode is required on all interpreters.
39
-
40
- Ruby 1.9.1 and 1.9.2 are not officially supported. If you encounter problems, please upgrade to Ruby 2.0 or 1.9.3.
38
+ Berkshelf is tested and supported on Ruby 2.2 and 2.3.
41
39
 
42
40
  ## Configuration
43
41
 
data/Rakefile CHANGED
@@ -1,10 +1,14 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
- require "github_changelog_generator/task"
3
+ begin
4
+ require "github_changelog_generator/task"
4
5
 
5
- GitHubChangelogGenerator::RakeTask.new :changelog do |config|
6
- config.future_release = Berkshelf::VERSION
7
- config.enhancement_labels = "enhancement,Enhancement,New Feature,Feature".split(",")
8
- config.bug_labels = "bug,Bug,Improvement".split(",")
9
- config.exclude_labels = "duplicate,question,invalid,wontfix,no_changelog,Exclude From Changelog,Question,Upstream Bug,Discussion".split(",")
6
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
7
+ config.future_release = Berkshelf::VERSION
8
+ config.issues = false
9
+ config.enhancement_labels = "enhancement,Enhancement,New Feature,Feature".split(",")
10
+ config.bug_labels = "bug,Bug,Improvement".split(",")
11
+ config.exclude_labels = "duplicate,question,invalid,wontfix,no_changelog,Exclude From Changelog,Question,Upstream Bug,Discussion".split(",")
12
+ end
13
+ rescue LoadError
10
14
  end
@@ -27,36 +27,22 @@ Gem::Specification.new do |s|
27
27
  s.name = 'berkshelf'
28
28
  s.require_paths = ['lib']
29
29
  s.version = Berkshelf::VERSION
30
- s.required_ruby_version = '>= 2.0.0'
31
- s.required_rubygems_version = '>= 1.8.0'
30
+ s.required_ruby_version = '>= 2.2.0'
31
+ s.required_rubygems_version = '>= 2.0.0'
32
32
 
33
33
  s.add_dependency 'addressable', '~> 2.3', '>= 2.3.4'
34
- s.add_dependency 'berkshelf-api-client', '~> 2.0', '>= 2.0.2'
35
- s.add_dependency 'buff-config', '~> 1.0'
36
- s.add_dependency 'buff-extensions', '~> 1.0'
34
+ s.add_dependency 'berkshelf-api-client', '>= 2.0.2', '< 4.0'
35
+ s.add_dependency 'buff-config', '~> 2.0'
36
+ s.add_dependency 'buff-extensions', '~> 2.0'
37
37
  s.add_dependency 'buff-shell_out', '~> 0.1'
38
38
  s.add_dependency 'cleanroom', '~> 1.0'
39
39
  s.add_dependency 'faraday', '~> 0.9'
40
40
  s.add_dependency 'httpclient', '~> 2.7'
41
41
  s.add_dependency 'minitar', '~> 0.5', '>= 0.5.4'
42
42
  s.add_dependency 'retryable', '~> 2.0'
43
- s.add_dependency 'ridley', '~> 4.5'
44
- s.add_dependency 'solve', '~> 2.0'
43
+ s.add_dependency 'ridley', '~> 5.0'
44
+ s.add_dependency 'solve', '> 2.0', '< 4.0'
45
45
  s.add_dependency 'thor', '~> 0.19'
46
46
  s.add_dependency 'octokit', '~> 4.0'
47
- s.add_dependency 'celluloid', '= 0.16.0'
48
- s.add_dependency 'celluloid-io', '~> 0.16.1'
49
47
  s.add_dependency 'mixlib-archive', '~> 0.1'
50
-
51
- s.add_development_dependency 'aruba', '~> 0.10.0' # Lock this here to avoid problems with public API changes
52
- s.add_development_dependency 'chef-zero', '~> 4.0'
53
- s.add_development_dependency 'dep_selector', '~> 1.0'
54
- s.add_development_dependency 'fuubar', '~> 2.0'
55
- s.add_development_dependency 'rake', '~> 10.1'
56
- s.add_development_dependency 'rspec', '~> 3.0'
57
- s.add_development_dependency 'spork', '~> 0.9'
58
- s.add_development_dependency 'test-kitchen', '~> 1.2'
59
- s.add_development_dependency 'webmock', '~> 1.11'
60
- s.add_development_dependency 'yard', '~> 0.8'
61
- s.add_development_dependency 'http', '~> 0.9', '>= 0.9.8'
62
48
  end
@@ -0,0 +1,65 @@
1
+ # Berkshelf for Newcomers
2
+
3
+ Berkshelf is a tool to help manage cookbook dependencies. If your cookbook depends on other cookbooks, Berkshelf lets you do the following:
4
+
5
+ * download all cookbooks you depend on to your local machine for development and testing using `berks install`
6
+ * upload your cookbook and all dependencies to your Chef server using `berks upload`
7
+ * update your dependencies using `berks update`
8
+
9
+ The above are the main Berkshelf commands that will comprise the bulk of your workflow.
10
+
11
+ Berkshelf is included in the ChefDK (at least at v.0.10.0), and `chef generate cookbook` will set up your cookbook with the necessary files for Berkshelf usage.
12
+
13
+ ## A quick example
14
+
15
+ Suppose you have a cookbook with the following `metadata.rb`:
16
+
17
+ ```
18
+ name 'example_cookbook'
19
+ description 'Installs/Configures example_cookbook'
20
+ long_description 'Installs/Configures example_cookbook'
21
+ version '0.1.0'
22
+
23
+ depends 'apt', '~> 2.3'
24
+ ```
25
+
26
+ To work on this cookbook locally, you need to download an `apt` cookbook matching the constraints. Berkshelf handles this for you:
27
+
28
+ ```
29
+ $ berks install
30
+ Resolving cookbook dependencies...
31
+ Fetching 'example_cookbook' from source at .
32
+ Fetching cookbook index from https://supermarket.chef.io...
33
+ Using example_cookbook (0.1.0) from source at .
34
+ Using apt (2.9.2)
35
+ ```
36
+
37
+ When done your work, you need to push both your cookbook and the apt cookbook up to your Chef server. With Berkshelf:
38
+
39
+ ```
40
+ $ berks upload
41
+ Uploaded apt (2.9.2) to: 'https://your_chef_server_url'
42
+ Uploaded example_cookbook (0.1.0) to: 'your_chef_server_url'
43
+ ```
44
+
45
+ The above is a trivial example. If your cookbook has several dependencies, which in turn have dependencies, Berkshelf handles it all automatically, significantly improving your workflow.
46
+
47
+ ## What's in the background
48
+
49
+ * the cookbook's `metadata.rb` specifies the cookbook dependencies and required versions
50
+ * the [Berksfile](http://berkshelf.com/v2.0/#the-berksfile) in your cookbook's root directory tells Berkshelf where to find cookbooks. You can have multiple sources, or can pull individual cookbooks from specific locations, such as your own Supermarket, GitHub, or a file server.
51
+ * `berks install` downloads cookbooks and their dependencies to the [Berkshelf](http://berkshelf.com/v2.0/#the-berkshelf), a place on your local disk.
52
+ * a Berksfile.lock is generated on `berks install` which specifies the exact cookbook versions that were used at that point
53
+
54
+ ## Cookbook versioning
55
+
56
+ Berkshelf relies on cookbook versioning to work correctly. A cookbook's version is tracked in its `metadata.rb`, and should follow the guidelines outlined at http://semver.org/.
57
+
58
+ # Further reading
59
+
60
+ * The project homepage, http://http://berkshelf.com/v2.0/
61
+ * https://sethvargo.com/berkshelf-workflow/
62
+
63
+ --
64
+
65
+ Good luck with Berkshelf!
@@ -234,9 +234,9 @@ Feature: berks install
234
234
  | berkshelf-cookbook-fixture | 1.0.0 | 93f5768b7d14df45e10d16c8bf6fe98ba3ff809a |
235
235
  And the output should contain:
236
236
  """
237
- Fetching 'berkshelf-cookbook-fixture' from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at rel/cookbooks/berkshelf-cookbook-fixture)
237
+ Fetching 'berkshelf-cookbook-fixture' from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at rel/cookbooks/berkshelf-cookbook-fixture)
238
238
  Fetching cookbook index from http://0.0.0.0:26210...
239
- Using berkshelf-cookbook-fixture (1.0.0) from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at rel/cookbooks/berkshelf-cookbook-fixture)
239
+ Using berkshelf-cookbook-fixture (1.0.0) from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at rel/cookbooks/berkshelf-cookbook-fixture)
240
240
  """
241
241
 
242
242
  Scenario: installing a Berksfile that contains a Git location
@@ -307,9 +307,9 @@ Feature: berks install
307
307
  | berkshelf-cookbook-fixture | 0.2.0 | 70a527e17d91f01f031204562460ad1c17f972ee |
308
308
  And the output should contain:
309
309
  """
310
- Fetching 'berkshelf-cookbook-fixture' from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
310
+ Fetching 'berkshelf-cookbook-fixture' from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
311
311
  Fetching cookbook index from http://0.0.0.0:26210...
312
- Using berkshelf-cookbook-fixture (0.2.0) from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
312
+ Using berkshelf-cookbook-fixture (0.2.0) from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
313
313
  """
314
314
 
315
315
  Scenario: installing a Berksfile that contains a GitHub location
@@ -322,9 +322,9 @@ Feature: berks install
322
322
  | berkshelf-cookbook-fixture | 0.2.0 | 70a527e17d91f01f031204562460ad1c17f972ee |
323
323
  And the output should contain:
324
324
  """
325
- Fetching 'berkshelf-cookbook-fixture' from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
325
+ Fetching 'berkshelf-cookbook-fixture' from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
326
326
  Fetching cookbook index from http://0.0.0.0:26210...
327
- Using berkshelf-cookbook-fixture (0.2.0) from git://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
327
+ Using berkshelf-cookbook-fixture (0.2.0) from https://github.com/RiotGames/berkshelf-cookbook-fixture.git (at v0.2.0)
328
328
  """
329
329
 
330
330
  Scenario: running install when current project is a cookbook and the 'metadata' is specified
@@ -11,6 +11,6 @@ Feature: berks search
11
11
  * the output should contain:
12
12
  """
13
13
  berkshelf-api (1.2.2)
14
- berkshelf-api-server (2.1.1)
14
+ berkshelf-api-server (2.2.0)
15
15
  berkshelf-cookbook-fixture (1.0.0)
16
16
  """
@@ -3,7 +3,7 @@ Feature: Reading a Berkshelf configuration file
3
3
  When I successfully run `berks cookbook sparkle_motion`
4
4
  Then the resulting "sparkle_motion" Vagrantfile should contain:
5
5
  | config.omnibus.chef_version = 'latest' |
6
- | config.vm.box = 'chef/ubuntu-14.04' |
6
+ | config.vm.box = 'bento/ubuntu-14.04' |
7
7
 
8
8
  Scenario: Using a Berkshelf configuration file that sets the vagrant-omnibus plugin chef version
9
9
  Given I have a Berkshelf config file containing:
@@ -14,7 +14,7 @@ Feature: Reading a Berkshelf configuration file
14
14
  "version": "11.4.4"
15
15
  },
16
16
  "vm": {
17
- "box": "chef/ubuntu-14.04",
17
+ "box": "bento/ubuntu-14.04",
18
18
  "forward_port": {
19
19
  "12345": "54321"
20
20
  }
@@ -25,7 +25,7 @@ Feature: Reading a Berkshelf configuration file
25
25
  When I successfully run `berks cookbook sparkle_motion`
26
26
  Then the resulting "sparkle_motion" Vagrantfile should contain:
27
27
  | config.omnibus.chef_version = '11.4.4' |
28
- | config.vm.box = 'chef/ubuntu-14.04' |
28
+ | config.vm.box = 'bento/ubuntu-14.04' |
29
29
  | config.vm.network :forwarded_port, guest: 12345, host: 54321 |
30
30
  | config.vm.network :private_network, type: 'dhcp' |
31
31
  And the exit status should be 0
@@ -39,7 +39,7 @@ Feature: Reading a Berkshelf configuration file
39
39
  "version": "latest"
40
40
  },
41
41
  "vm": {
42
- "box": "chef/ubuntu-14.04",
42
+ "box": "bento/ubuntu-14.04",
43
43
  "forward_port": {
44
44
  "12345": "54321"
45
45
  }
@@ -50,7 +50,7 @@ Feature: Reading a Berkshelf configuration file
50
50
  When I successfully run `berks cookbook sparkle_motion`
51
51
  Then the resulting "sparkle_motion" Vagrantfile should contain:
52
52
  | config.omnibus.chef_version = 'latest' |
53
- | config.vm.box = 'chef/ubuntu-14.04' |
53
+ | config.vm.box = 'bento/ubuntu-14.04' |
54
54
  | config.vm.network :forwarded_port, guest: 12345, host: 54321 |
55
55
  | config.vm.network :private_network, type: 'dhcp' |
56
56
 
@@ -230,7 +230,7 @@ Feature: Creating and reading the Berkshelf lockfile
230
230
  """
231
231
  DEPENDENCIES
232
232
  berkshelf-cookbook-fixture
233
- git: git://github.com/RiotGames/berkshelf-cookbook-fixture.git
233
+ git: https://github.com/RiotGames/berkshelf-cookbook-fixture.git
234
234
  revision: 919afa0c402089df23ebdf36637f12271b8a96b4
235
235
  ref: 919afa0
236
236
 
@@ -248,7 +248,7 @@ Feature: Creating and reading the Berkshelf lockfile
248
248
  """
249
249
  DEPENDENCIES
250
250
  berkshelf-cookbook-fixture
251
- git: git://github.com/RiotGames/berkshelf-cookbook-fixture.git
251
+ git: https://github.com/RiotGames/berkshelf-cookbook-fixture.git
252
252
  revision: 93f5768b7d14df45e10d16c8bf6fe98ba3ff809a
253
253
  branch: rel
254
254
  rel: cookbooks/berkshelf-cookbook-fixture
@@ -3,7 +3,9 @@ Given /^skip\s+"([^\"]+)"$/ do |msg|
3
3
  end
4
4
 
5
5
  Then /the output from \`(.+)\` should be the same as \`(.+)\`/ do |actual, expected|
6
- run_simple(actual)
7
- run_simple(expected)
8
- expect(output_from(actual)).to eq(output_from(expected))
6
+ run(actual)
7
+ actual_output = last_command_started.stdout
8
+ run(expected)
9
+ expected_output = last_command_started.stdout
10
+ expect(actual_output).to eql(expected_output)
9
11
  end
@@ -26,7 +26,9 @@ Spork.prefork do
26
26
  end
27
27
 
28
28
  Before do
29
+
29
30
  # Legacy ENV variables until we can move over to all InProcess
31
+ Berkshelf.instance_variable_set(:@berkshelf_path, nil)
30
32
  ENV['BERKSHELF_PATH'] = berkshelf_path.to_s
31
33
  ENV['BERKSHELF_CONFIG'] = Berkshelf.config.path.to_s
32
34
  ENV['BERKSHELF_CHEF_CONFIG'] = chef_config_path.to_s
@@ -63,6 +65,7 @@ Spork.prefork do
63
65
  Before('@spawn') do
64
66
  aruba.config.command_launcher = :spawn
65
67
 
68
+ Berkshelf.instance_variable_set(:@berkshelf_path, nil)
66
69
  set_environment_variable('BERKSHELF_PATH', berkshelf_path.to_s)
67
70
  set_environment_variable('BERKSHELF_CONFIG', Berkshelf.config.path.to_s)
68
71
  set_environment_variable('BERKSHELF_CHEF_CONFIG', chef_config_path.to_s)
@@ -17,6 +17,8 @@ require_relative 'berkshelf/core_ext'
17
17
  require_relative 'berkshelf/thor_ext'
18
18
 
19
19
  module Berkshelf
20
+ Encoding.default_external = Encoding::UTF_8
21
+
20
22
  require_relative 'berkshelf/version'
21
23
  require_relative 'berkshelf/errors'
22
24
 
@@ -67,8 +69,7 @@ module Berkshelf
67
69
  #
68
70
  # @return [String]
69
71
  def berkshelf_path
70
- path = @berkshelf_path || ENV['BERKSHELF_PATH'] || '~/.berkshelf'
71
- File.expand_path(path)
72
+ @berkshelf_path ||= File.expand_path(ENV['BERKSHELF_PATH'] || '~/.berkshelf')
72
73
  end
73
74
 
74
75
  # The Berkshelf configuration.
@@ -107,7 +107,7 @@ module Berkshelf
107
107
  default: false
108
108
  attribute 'vagrant.vm.box',
109
109
  type: String,
110
- default: 'chef/ubuntu-14.04',
110
+ default: 'bento/ubuntu-14.04',
111
111
  required: true
112
112
  # @todo Deprecated, remove?
113
113
  attribute 'vagrant.vm.box_url',
@@ -135,5 +135,14 @@ module Berkshelf
135
135
  type: Array,
136
136
  default: [],
137
137
  required: false
138
+ attribute 'gitlab',
139
+ type: Array,
140
+ default: [],
141
+ required: false
142
+ attribute 'github_protocol',
143
+ # :git, :ssh, or :https
144
+ type: Symbol,
145
+ default: :https,
146
+ required: false
138
147
  end
139
148
  end
@@ -137,6 +137,40 @@ module Berkshelf
137
137
  (! filename.to_s.start_with?('.')) && (unpack_dir + filename).cookbook?
138
138
  end.first
139
139
 
140
+ (unpack_dir + cookbook_directory).to_s
141
+ when :gitlab
142
+ #Thread.exclusive { require 'octokit' unless defined?(Octokit) }
143
+
144
+ tmp_dir = Dir.mktmpdir
145
+ archive_path = Pathname.new(tmp_dir) + "#{name}-#{version}.tar.gz"
146
+ unpack_dir = Pathname.new(tmp_dir) + "#{name}-#{version}"
147
+
148
+ # Find the correct gitlab connection options for this specific cookbook.
149
+ cookbook_uri = URI.parse(remote_cookbook.location_path)
150
+ if cookbook_uri.host
151
+ options = Berkshelf::Config.instance.gitlab.detect { |opts| opts["web_endpoint"] == "#{cookbook_uri.scheme}://#{cookbook_uri.host}" }
152
+ raise ConfigurationError.new "Missing github endpoint configuration for #{cookbook_uri.scheme}://#{cookbook_uri.host}" if options == nil
153
+ end
154
+
155
+ connection ||= Faraday.new(url: options[:web_endpoint]) do |faraday|
156
+ faraday.headers[:accept] = 'application/x-tar'
157
+ faraday.response :logger, @logger unless @logger.nil?
158
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
159
+ end
160
+
161
+ resp = connection.get(cookbook_uri.request_uri + '&private_token=' + options[:private_token])
162
+ return nil unless resp.status == 200
163
+ open(archive_path, "wb") { |file| file.write(resp.body) }
164
+
165
+ tgz = Zlib::GzipReader.new(File.open(archive_path, "rb"))
166
+ Archive::Tar::Minitar.unpack(tgz, unpack_dir)
167
+
168
+ # The top level directory is inconsistant. So we unpack it and
169
+ # use the only directory created in the unpack_dir.
170
+ cookbook_directory = unpack_dir.entries.select do |filename|
171
+ (! filename.to_s.start_with?('.')) && (unpack_dir + filename).cookbook?
172
+ end.first
173
+
140
174
  (unpack_dir + cookbook_directory).to_s
141
175
  when :file_store
142
176
  tmp_dir = Dir.mktmpdir
@@ -66,9 +66,9 @@ module Berkshelf
66
66
  # Validate the scratched path is a valid cookbook
67
67
  validate_cached!(scratch_path)
68
68
 
69
- # If we got this far, we should copy
69
+ # If we got this far, we should atomically move
70
70
  FileUtils.rm_rf(install_path) if install_path.exist?
71
- FileUtils.cp_r(scratch_path, install_path)
71
+ FileUtils.mv(scratch_path, install_path)
72
72
 
73
73
  # Remove the git history
74
74
  FileUtils.rm_rf(File.join(install_path, '.git'))
@@ -1,7 +1,19 @@
1
1
  module Berkshelf
2
2
  class GithubLocation < GitLocation
3
+ HOST = 'github.com'
3
4
  def initialize(dependency, options = {})
4
- options[:git] = "git://github.com/#{options.delete(:github)}.git"
5
+ protocol = Berkshelf::Config.instance.github_protocol || :https
6
+ case protocol
7
+ when :ssh
8
+ options[:git] = "git@#{HOST}:#{options.delete(:github)}.git"
9
+ when :https
10
+ options[:git] = "https://#{HOST}/#{options.delete(:github)}.git"
11
+ when :git
12
+ options[:git] = "git://#{HOST}/#{options.delete(:github)}.git"
13
+ else
14
+ # if some bizarre value is provided, treat it as :https
15
+ options[:git] = "https://#{HOST}/#{options.delete(:github)}.git"
16
+ end
5
17
  super
6
18
  end
7
19
  end
@@ -113,7 +113,7 @@ module Berkshelf
113
113
  return false
114
114
  end
115
115
 
116
- if cookbook = dependency.cached_cookbook
116
+ if cookbook = locked.cached_cookbook
117
117
  Berkshelf.log.debug " Detected there is a cached cookbook"
118
118
 
119
119
  unless (cookbook.dependencies.keys - graphed.dependencies.keys).empty?
@@ -587,6 +587,9 @@ module Berkshelf
587
587
  end
588
588
 
589
589
  @parsed_dependencies.each do |name, options|
590
+ graph_item = @lockfile.graph.find(name)
591
+ options[:locked_version] = graph_item.version if graph_item
592
+
590
593
  dependency = Dependency.new(@berksfile, name, options)
591
594
  @lockfile.add(dependency)
592
595
  end
@@ -667,7 +670,7 @@ module Berkshelf
667
670
  # We need to make a copy of the dependency, or else we could be
668
671
  # modifying an existing object that other processes depend on!
669
672
  dependency = dependency.dup
670
- dependency.locked_version = item.version
673
+ dependency.locked_version = item.version unless dependency.locked_version
671
674
 
672
675
  hash[item.name] = dependency
673
676
  hash
@@ -1,3 +1,3 @@
1
1
  module Berkshelf
2
- VERSION = "4.3.5"
2
+ VERSION = "5.0.0"
3
3
  end