builderator 0.3.10 → 0.3.11

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
  SHA1:
3
- metadata.gz: 48baf4bb78a9121f6268913550ac1cdf5157aa1c
4
- data.tar.gz: 761c4a044264ad1109a534ab41a382076d2298bc
3
+ metadata.gz: 9f78cc9361223078843608c192a703626a438855
4
+ data.tar.gz: c1404434a5bffd2b5a4ed75e1162023cd978f04e
5
5
  SHA512:
6
- metadata.gz: 988210a27ccc466c5b0d1fa5548aae42524043b6c31fe290cbbf27e2d13d42f094b1552662befa899c7b047906b60e9153e71afb88598b3d2598ae5c337b5bbd
7
- data.tar.gz: 20a6c23658cd4e12f583319512b42609fe6aa5fb0f894d56d01283248839c9f97223aaf69a22c381d6f573de514e41a2619f5b7799c8e9706349783e37ff318b
6
+ metadata.gz: 8e337ea2b012c56e13778e3ad866636c84029a5df410bd38ff1ffc55b9ef2d5732d584277b37010ee70b9de053e2805ab476836707f548e410529f471e93a27b
7
+ data.tar.gz: a4d1dd644c7a958fbc2d08d55d226441874d51b0844ccea47c3613e5120e618da5d87904145208bc901899e6ad23e38cc5fbf089c069955bd3d86d57e85cffe5
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.10
1
+ 0.3.11
data/builderator.gemspec CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'bundler', '~> 1.7.0'
25
25
  spec.add_dependency 'berkshelf', '~> 3.2'
26
26
  spec.add_dependency 'chef', '~> 12.0'
27
+ spec.add_dependency 'ignorefile'
27
28
  spec.add_dependency 'thor', '~> 0.19.0'
28
29
  spec.add_dependency 'thor-scmversion', '1.7.0'
29
30
  end
@@ -1,5 +1,12 @@
1
+ require 'chef'
2
+ require 'chef/cookbook_site_streaming_uploader'
3
+ require 'rubygems/package'
1
4
  require 'thor'
2
5
  require 'thor/actions'
6
+ require 'thor-scmversion'
7
+ require 'zlib'
8
+
9
+ require_relative '../util'
3
10
  require_relative '../util/cookbook'
4
11
 
5
12
  module Builderator
@@ -13,22 +20,82 @@ module Builderator
13
20
  desc 'metadata [PATH]', 'Use cookbook matadata file at PATH/metadata.rb to generate PATH/matadata.json'
14
21
  def metadata(cookbook = nil)
15
22
  Util::Cookbook.path(cookbook) unless cookbook.nil?
23
+ metadata = Util::Cookbook.metadata
24
+
16
25
  invoke 'version:current', [], options if options['version']
26
+ say_status :metadata, "for cookbook #{ metadata.name }@#{ metadata.version }"
27
+ create_file Util::Cookbook.path.join('metadata.json').to_s, metadata.to_json, :force => true
17
28
 
18
- create_file File.join(Util::Cookbook.path, 'metadata.json'),
19
- Util::Cookbook.metadata.to_json, :force => true
29
+ metadata
20
30
  end
21
31
 
22
- desc 'package PATH', 'Package a cookbook into a tarball'
23
- def package(cookbook = nil)
32
+ desc 'build PATH', 'Package cookbook at PATH into a tarball'
33
+ def build(cookbook = nil)
24
34
  Util::Cookbook.path(cookbook) unless cookbook.nil?
25
35
 
36
+ ## Generate metadata.json
37
+ metadata = invoke(Tasks::Cookbook, :metadata, [], options)
38
+
39
+ ## Create a gzipped tarball and add cookbook files to it. We avoid
40
+ ## buffering this in memory (e.g. using StringIO) at all cost
41
+ ## to keep large files from gumming things up.
42
+ say_status :package, "cookbook into #{ metadata.archive }"
43
+ metadata.archive.open('wb') do |package|
44
+ Zlib::GzipWriter.wrap(package) do |gz|
45
+ Gem::Package::TarWriter.new(gz) do |tar|
46
+ metadata.files.each do |f|
47
+ f_stat = File.stat(f)
48
+
49
+ ## Add directories
50
+ next tar.mkdir(Util::Cookbook.archive_path(metadata, f).to_s, f_stat.mode) if File.directory?(f)
51
+
52
+ ## Add files
53
+ tar.add_file_simple(Util::Cookbook.archive_path(metadata, f).to_s, f_stat.mode, f_stat.size) do |entry|
54
+ f.open('rb') { |h| entry.write(h.read) }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ metadata
26
62
  end
27
63
 
28
- desc 'publish', 'Publish a cookbook to supermarket.chef.io'
29
- def publish(cookbook = nil)
64
+ desc 'push PATH', 'Publish cookbook at PATH to supermarket.chef.io'
65
+ option 'chef-config', :type => :string,
66
+ :aliases => :c,
67
+ :default => File.join(ENV['HOME'], '.chef/knife.rb')
68
+ option :site, :type => :string, :aliases => :s
69
+ option :user, :type => :string, :aliases => :u
70
+ option :key, :type => :string, :aliases => :k
71
+ def push(cookbook = nil)
72
+ Chef::Config.from_file(options['chef-config'])
30
73
  Util::Cookbook.path(cookbook) unless cookbook.nil?
31
74
 
75
+ ## Set defaults after Chef::Config is loaded
76
+ options['site'] ||= Chef::Config.knife['supermarket_site'] || 'https://supermarket.chef.io/'
77
+ options['user'] ||= Chef::Config.knife['supermarket_user'] || Chef::Config.node_name
78
+ options['key'] ||= Chef::Config.knife['supermarket_key'] || Chef::Config.client_key
79
+
80
+ ## Build the cookbook taball
81
+ metadata = invoke(Tasks::Cookbook, :build, [cookbook], options)
82
+ say_status :upload, "cookbook #{ metadata.name }@#{ metadata.version } to #{ options['site'] }"
83
+
84
+ metadata.archive.open('rb') do |c|
85
+ http_resp = Chef::CookbookSiteStreamingUploader.post(
86
+ File.join(options['site'], '/api/v1/cookbooks'),
87
+ options['user'],
88
+ options['key'],
89
+ :tarball => c,
90
+ :cookbook => { :category => '' }.to_json
91
+ )
92
+
93
+ if http_resp.code.to_i != 201
94
+ say_status :error, "Error uploading cookbook: #{ http_resp.code } #{ http_resp.message }", :red
95
+ say http_resp.body
96
+ exit(1)
97
+ end
98
+ end
32
99
  end
33
100
 
34
101
  desc 'version COOKBOOK', 'Print the current version of a vendored cookbook'
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  module Builderator
2
4
  module Util
3
5
  class << self
@@ -43,7 +45,7 @@ module Builderator
43
45
  end
44
46
 
45
47
  def working_dir(relative = '.')
46
- File.expand_path(relative, Dir.pwd)
48
+ Pathname.pwd.join(relative).expand_path
47
49
  end
48
50
  end
49
51
  end
@@ -1,5 +1,5 @@
1
1
  require 'chef/cookbook/metadata'
2
- require 'thor-scmversion'
2
+ require 'ignorefile'
3
3
 
4
4
  require_relative '../util'
5
5
 
@@ -8,28 +8,73 @@ module Builderator
8
8
  module Cookbook
9
9
  DEFAULT_VENDOR = Util.working_dir('vendor/chef/cookbooks')
10
10
 
11
+ ## Don't vendor VCS files.
12
+ ## Reference GNU tar --exclude-vcs: https://www.gnu.org/software/tar/manual/html_section/tar_49.html
13
+ ## Boosted from https://github.com/berkshelf/berkshelf/blob/master/lib/berkshelf/berksfile.rb
14
+ EXCLUDED_VCS_FILES = [
15
+ '.arch-ids', '{arch}', '.bzr', '.bzrignore', '.bzrtags',
16
+ 'CVS', '.cvsignore', '_darcs', '.git', '.hg', '.hgignore',
17
+ '.hgrags', 'RCS', 'SCCS', '.svn', '**/.git', '.temp'].freeze
18
+
19
+ class Metadata < Chef::Cookbook::Metadata
20
+ def files
21
+ return @files unless @files.nil?
22
+
23
+ @files ||= Pathname.glob(Util::Cookbook.path.join('**/{*,.*}'))
24
+ ignorefile.apply!(@files)
25
+
26
+ @files
27
+ end
28
+
29
+ def archive
30
+ Util.working_dir("#{ name }-#{ version }.tgz")
31
+ end
32
+
33
+ def chefignore
34
+ Util::Cookbook.path.join('chefignore')
35
+ end
36
+
37
+ def gitignore
38
+ Util.working_dir('.gitignore')
39
+ end
40
+
41
+ def ignorefile
42
+ return @ignorefile unless @ignorefile.nil?
43
+
44
+ ## Construct an ignorefile
45
+ @ignorefile = IgnoreFile.new(Util::Cookbook::EXCLUDED_VCS_FILES)
46
+ @ignorefile.load_file(chefignore)
47
+ @ignorefile.load_file(gitignore)
48
+ end
49
+ end
50
+
11
51
  class << self
12
52
  def path(arg = nil)
13
53
  ## Set an explicit path to a cookbook
14
- return @path = arg unless arg.nil?
54
+ return @path = Pathname.new(arg) unless arg.nil?
15
55
  return @path unless @path.nil?
16
56
 
17
57
  ## Check for an embedded cookbook? ('./cookbook')
18
- return @path = Util.working_dir('cookbook') if File.exist?(Util.working_dir('cookbook'))
58
+ return @path = Util.working_dir('cookbook') if Util.working_dir('cookbook').exist?
59
+
19
60
  @path = Util.working_dir
20
61
  end
21
62
 
63
+ def archive_path(metadata, file)
64
+ Pathname.new(metadata.name).join(Pathname.new(file).relative_path_from(path))
65
+ end
66
+
22
67
  def berksfile
23
- File.join(path, 'Berksfile')
68
+ path.join('Berksfile')
24
69
  end
25
70
 
26
71
  def metadata
27
- Chef::Cookbook::Metadata.new.tap do |c|
28
- if File.exist?(File.join(path, 'metadata.rb'))
29
- c.from_file(File.join(path, 'metadata.rb'))
72
+ Metadata.new.tap do |c|
73
+ if path.join('metadata.rb').exist?
74
+ c.from_file(path.join('metadata.rb').to_s)
30
75
 
31
- elsif File.exist?(File.join(path, 'metadata.json'))
32
- c.from_json(IO.read(File.join(path, 'metadata.json')))
76
+ elsif path.join('metadata.json').exist?
77
+ c.from_json(path.join('metadata.json').to_s)
33
78
 
34
79
  else
35
80
  fail IOError, 'Unable to read metadata.rb or metadata.json!'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: builderator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.10
4
+ version: 0.3.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Manero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-03 00:00:00.000000000 Z
11
+ date: 2015-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '12.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ignorefile
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: thor
85
99
  requirement: !ruby/object:Gem::Requirement