dockly 2.5.3 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,8 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- script: CI=true bundle exec rake
3
+ - 1.9
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
7
+ script:
8
+ - git fetch --tags
9
+ - CI=true bundle exec rake
6
10
  before_install:
7
11
  - sudo apt-get update -qq
8
12
  - sudo apt-get install -qq rpm
data/Rakefile CHANGED
@@ -6,6 +6,11 @@ require 'rake'
6
6
  require 'dockly'
7
7
  require 'rspec/core/rake_task'
8
8
  require 'cane/rake_task'
9
+ require 'pry'
10
+
11
+ task :shell do
12
+ Pry.start(Dockly)
13
+ end
9
14
 
10
15
  task :default => [:spec, :quality]
11
16
 
data/dockly.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |gem|
22
22
  gem.add_dependency 'foreman'
23
23
  gem.add_dependency 'fpm', '~> 1.2.0'
24
24
  gem.add_dependency 'grit'
25
+ gem.add_dependency 'rugged'
25
26
  gem.add_development_dependency 'cane'
26
27
  gem.add_development_dependency 'pry'
27
28
  gem.add_development_dependency 'rake'
data/lib/dockly.rb CHANGED
@@ -4,6 +4,7 @@ require 'dockly/util/git'
4
4
  require 'fog'
5
5
  require 'foreman/cli_fix'
6
6
  require 'foreman/export/base_fix'
7
+ require 'rugged'
7
8
 
8
9
  module Dockly
9
10
  attr_reader :instance, :git_sha
@@ -15,6 +16,7 @@ module Dockly
15
16
  autoload :BuildCache, 'dockly/build_cache'
16
17
  autoload :Docker, 'dockly/docker'
17
18
  autoload :Deb, 'dockly/deb'
19
+ autoload :History, 'dockly/history'
18
20
  autoload :Rpm, 'dockly/rpm'
19
21
  autoload :TarDiff, 'dockly/tar_diff'
20
22
 
data/lib/dockly/deb.rb CHANGED
@@ -48,6 +48,14 @@ class Dockly::Deb
48
48
  upload_to_s3
49
49
  end
50
50
 
51
+ def copy_from_s3(sha)
52
+ ensure_present! :s3_bucket
53
+ object = s3_object_name_for(sha)
54
+ info "Copying s3://#{s3_bucket}/#{object} to s3://#{s3_bucket}/#{s3_object_name}"
55
+ Dockly::AWS.s3.copy_object(s3_bucket, object, s3_bucket, s3_object_name)
56
+ info "Successfully copied s3://#{s3_bucket}/#{object} to s3://#{s3_bucket}/#{s3_object_name}"
57
+ end
58
+
51
59
  def build_path
52
60
  ensure_present! :build_dir, :deb_build_dir
53
61
  File.join(build_dir, deb_build_dir, output_filename)
@@ -59,8 +67,7 @@ class Dockly::Deb
59
67
  info "#{name}: found package: #{s3_url}"
60
68
  true
61
69
  rescue
62
- info "#{name}: could not find package: " +
63
- "#{s3_url}"
70
+ info "#{name}: could not find package: #{s3_url}"
64
71
  false
65
72
  end
66
73
 
@@ -78,7 +85,11 @@ class Dockly::Deb
78
85
  end
79
86
 
80
87
  def s3_object_name
81
- "#{package_name}/#{Dockly::Util::Git.git_sha}/#{output_filename}"
88
+ s3_object_name_for(Dockly::Util::Git.git_sha)
89
+ end
90
+
91
+ def s3_object_name_for(sha)
92
+ "#{package_name}/#{sha}/#{output_filename}"
82
93
  end
83
94
 
84
95
  def output_filename
data/lib/dockly/docker.rb CHANGED
@@ -32,6 +32,14 @@ class Dockly::Docker
32
32
  (@build_env ||= {}).tap { |env| env.merge!(hash) if hash.is_a?(Hash) }
33
33
  end
34
34
 
35
+ def copy_from_s3(sha)
36
+ return if s3_bucket.nil?
37
+ object = s3_object_for(sha)
38
+ info "Copying s3://#{s3_bucket}/#{object} to #{s3_bucket}/#{s3_object}"
39
+ Dockly::AWS.s3.copy_object(s3_bucket, object, s3_bucket, s3_object)
40
+ info "Successfully copied s3://#{s3_bucket}/#{object} to s3://#{s3_bucket}/#{s3_object}"
41
+ end
42
+
35
43
  def generate!
36
44
  image = generate_build
37
45
  export_image(image)
@@ -220,10 +228,10 @@ class Dockly::Docker
220
228
  container = image.run('true')
221
229
  info "created the container: #{container.id}"
222
230
 
223
- unless s3_bucket.nil?
224
- output = Dockly::AWS::S3Writer.new(connection, s3_bucket, s3_object)
225
- else
231
+ if s3_bucket.nil?
226
232
  output = File.open(tar_path, 'wb')
233
+ else
234
+ output = Dockly::AWS::S3Writer.new(connection, s3_bucket, s3_object)
227
235
  end
228
236
 
229
237
  gzip_output = Zlib::GzipWriter.new(output)
@@ -285,9 +293,11 @@ class Dockly::Docker
285
293
  end
286
294
 
287
295
  def s3_object
288
- output = "#{s3_object_prefix}"
289
- output << "#{Dockly::Util::Git.git_sha}/"
290
- output << "#{export_filename}"
296
+ s3_object_for(Dockly::Util::Git.git_sha)
297
+ end
298
+
299
+ def s3_object_for(sha)
300
+ [s3_object_prefix, sha, '/', export_filename].join
291
301
  end
292
302
 
293
303
  def push_to_registry(image)
@@ -0,0 +1,64 @@
1
+ # This module contains logic to find matching content hash for a given commit.
2
+ module Dockly::History
3
+ module_function
4
+
5
+ ASCII_FILE_SEP = 28.chr
6
+ ASCII_RECORD_SEP = 30.chr
7
+
8
+ TAG_PREFIX = 'dockly-'
9
+
10
+ def push_content_tag!
11
+ fail 'An SSH agent must be running to push the tag' if ENV['SSH_AGENT_PID'].nil?
12
+ refs = ["refs/tags/#{content_tag}"]
13
+ repo.remotes.each do |remote|
14
+ username = remote.url.split('@').first
15
+ creds = Rugged::Credentials::SshKeyFromAgent.new(username: username)
16
+ remote.push(refs, credentials: creds)
17
+ end
18
+ end
19
+
20
+ def write_content_tag!
21
+ repo.tags.create(content_tag, repo.head.target_id, true)
22
+ end
23
+
24
+ def duplicate_build?
25
+ !duplicate_build_sha.nil?
26
+ end
27
+
28
+ def duplicate_build_sha
29
+ return @duplicate_build_sha if @duplicate_build_sha
30
+ sha = tags[content_tag]
31
+ @duplicate_build_sha = sha unless sha == repo.head.target_id
32
+ end
33
+
34
+ def tags
35
+ @tags ||= Hash.new do |hash, key|
36
+ tag = repo.tags[key]
37
+ hash[key] = tag.target_id if tag
38
+ end
39
+ end
40
+
41
+ def content_tag
42
+ @content_tag ||= TAG_PREFIX + content_hash_for(ls_files)
43
+ end
44
+
45
+ def ls_files
46
+ repo.head.target.tree.walk(:preorder)
47
+ .map { |root, elem| [root, elem[:name]].compact.join }
48
+ .select(&File.method(:file?))
49
+ end
50
+
51
+ def content_hash_for(paths)
52
+ paths.sort.each_with_object(Digest::SHA384.new) do |path, hash|
53
+ next unless File.exist?(path)
54
+ mode = File::Stat.new(path).mode
55
+ data = File.read(path)
56
+ str = [path, mode, data].join(ASCII_RECORD_SEP.chr) + ASCII_FILE_SEP.chr
57
+ hash.update(str)
58
+ end.hexdigest
59
+ end
60
+
61
+ def repo
62
+ @repo ||= Rugged::Repository.discover('.')
63
+ end
64
+ end
@@ -56,6 +56,7 @@ namespace :dockly do
56
56
  prepare_targets = []
57
57
  upload_targets = []
58
58
  build_targets = []
59
+ copy_targets = []
59
60
 
60
61
  namespace :deb do
61
62
  Dockly.debs.values.each do |inst|
@@ -71,6 +72,12 @@ namespace :dockly do
71
72
  end
72
73
  end
73
74
 
75
+ namespace :copy do
76
+ task inst.name => 'dockly:load' do |name|
77
+ inst.copy_from_s3(Dockly::History.duplicate_build_sha[0..6])
78
+ end
79
+ end
80
+
74
81
  deb inst.name => [
75
82
  'dockly:load',
76
83
  "dockly:deb:prepare:#{inst.name}",
@@ -78,6 +85,7 @@ namespace :dockly do
78
85
  ]
79
86
  prepare_targets << "dockly:deb:prepare:#{inst.name}"
80
87
  upload_targets << "dockly:deb:upload:#{inst.name}"
88
+ copy_targets << "dockly:deb:copy:#{inst.name}"
81
89
  build_targets << "dockly:deb:#{inst.name}"
82
90
  end
83
91
  end
@@ -96,6 +104,12 @@ namespace :dockly do
96
104
  end
97
105
  end
98
106
 
107
+ namespace :copy do
108
+ task inst.name => 'dockly:load' do |name|
109
+ inst.copy_from_s3(Dockly::History.duplicate_build_sha[0..6])
110
+ end
111
+ end
112
+
99
113
  rpm inst.name => [
100
114
  'dockly:load',
101
115
  "dockly:rpm:prepare:#{inst.name}",
@@ -103,6 +117,7 @@ namespace :dockly do
103
117
  ]
104
118
  prepare_targets << "dockly:rpm:prepare:#{inst.name}"
105
119
  upload_targets << "dockly:rpm:upload:#{inst.name}"
120
+ copy_targets << "dockly:rpm:copy:#{inst.name}"
106
121
  build_targets << "dockly:rpm:#{inst.name}"
107
122
  end
108
123
  end
@@ -128,6 +143,13 @@ namespace :dockly do
128
143
  end
129
144
  end
130
145
 
146
+ namespace :copy do
147
+ task inst.name => 'dockly:load' do
148
+ Thread.current[:rake_task] = inst.name
149
+ inst.copy_from_s3(Dockly::History.duplicate_build_sha[0..6])
150
+ end
151
+ end
152
+
131
153
  docker inst.name => [
132
154
  'dockly:load',
133
155
  "dockly:docker:prepare:#{inst.name}",
@@ -138,6 +160,7 @@ namespace :dockly do
138
160
  unless inst.s3_bucket.nil?
139
161
  prepare_targets << "dockly:docker:prepare:#{inst.name}"
140
162
  upload_targets << "dockly:docker:upload:#{inst.name}"
163
+ copy_targets << "dockly:docker:copy:#{inst.name}"
141
164
  build_targets << "dockly:docker:#{inst.name}"
142
165
  end
143
166
  end
@@ -146,4 +169,15 @@ namespace :dockly do
146
169
  multitask :prepare_all => prepare_targets
147
170
  multitask :upload_all => upload_targets
148
171
  multitask :build_all => build_targets
172
+ multitask :copy_all => copy_targets
173
+
174
+ task :build_or_copy_all do
175
+ if Dockly::History.duplicate_build?
176
+ Rake::Task['dockly:copy_all'].invoke
177
+ else
178
+ Rake::Task['dockly:build_all'].invoke
179
+ Dockly::History.write_content_tag!
180
+ Dockly::History.push_content_tag!
181
+ end
182
+ end
149
183
  end
@@ -1,3 +1,3 @@
1
1
  module Dockly
2
- VERSION = '2.5.3'
2
+ VERSION = '2.6.0'
3
3
  end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dockly::History do
4
+ describe '#duplicate_build?' do
5
+ before { allow(subject).to receive(:duplicate_build_sha).and_return(sha) }
6
+
7
+ context 'when the duplicate build sha is not present' do
8
+ let(:sha) { nil }
9
+
10
+ it 'returns false' do
11
+ expect(subject).to_not be_duplicate_build
12
+ end
13
+ end
14
+
15
+ context 'when the duplicate build sha is present' do
16
+ let(:sha) { 'DEADBEEF' }
17
+
18
+ it 'returns true' do
19
+ expect(subject).to be_duplicate_build
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '#duplicate_build_sha' do
25
+ let(:content_tag) { 'dockly-FAKE-CONTENT-HASH' }
26
+
27
+ before { allow(subject).to receive(:content_tag).and_return(content_tag) }
28
+
29
+ context 'when there is not a commit with a matching content hash' do
30
+ it 'returns nil' do
31
+ expect(subject.duplicate_build_sha).to be(nil)
32
+ end
33
+ end
34
+
35
+ context 'when there is a commit with a matching content hash' do
36
+ let(:sha) { 'dockly-FAKE-SHA' }
37
+ let(:key) { content_tag }
38
+
39
+ before { subject.tags[key] = sha }
40
+ after { subject.tags.delete(key) }
41
+
42
+ it 'returns that commit' do
43
+ expect(subject.duplicate_build_sha).to eq(sha)
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '#tags' do
49
+ let(:expected) do
50
+ {
51
+ 'v1.4.0' => '708b4f1bd7846c258e2151e34f8f746b399ee6fb',
52
+ 'v1.4.2' => '20b62fa084ac903a8753cfc7939c7e31c86761d2',
53
+ 'v1.4.3' => '8eac23450975d91f0aa4c62c6985ec4f4ce7594f'
54
+ }
55
+ end
56
+
57
+ it 'returns a Hash of the git tags' do
58
+ expected.each do |tag, oid|
59
+ expect(subject.tags[tag]).to include(oid)
60
+ end
61
+ end
62
+ end
63
+
64
+ describe '#ls_files' do
65
+ let(:files) { subject.ls_files }
66
+
67
+ it 'returns the files checked into the repo' do
68
+ expect(files).to be_a(Array)
69
+ expect(files).to include('dockly.gemspec')
70
+ expect(files).to include('lib/dockly.rb')
71
+ expect(files).to include('spec/dockly/aws/s3_writer_spec.rb')
72
+ end
73
+ end
74
+
75
+ describe '#content_hash_for' do
76
+ context 'when two hashes are compared' do
77
+ let(:hash_one) { subject.content_hash_for(%w(dockly.gemspec Gemfile)) }
78
+ let(:hash_two) { subject.content_hash_for(%w(lib/dockly.rb LICENSE.txt)) }
79
+
80
+ it 'creates a unique hash for the given paths' do
81
+ expect(hash_one).to_not eq(hash_two)
82
+ end
83
+ end
84
+
85
+ context 'when the paths are in a different order' do
86
+ let(:hash_one) { subject.content_hash_for(%w(dockly.gemspec Gemfile)) }
87
+ let(:hash_two) { subject.content_hash_for(%w(Gemfile dockly.gemspec)) }
88
+
89
+ it 'still creates the same hash' do
90
+ expect(hash_one).to eq(hash_two)
91
+ end
92
+ end
93
+ end
94
+ end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dockly
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.3
4
+ version: 2.6.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Swipely, Inc.
@@ -13,6 +14,7 @@ dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: clamp
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: docker-api
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: dockly-util
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -55,6 +62,7 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: excon
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
67
  - - ! '>='
60
68
  - !ruby/object:Gem::Version
@@ -62,6 +70,7 @@ dependencies:
62
70
  type: :runtime
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
75
  - - ! '>='
67
76
  - !ruby/object:Gem::Version
@@ -69,6 +78,7 @@ dependencies:
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: fog
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
83
  - - ~>
74
84
  - !ruby/object:Gem::Version
@@ -76,6 +86,7 @@ dependencies:
76
86
  type: :runtime
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
91
  - - ~>
81
92
  - !ruby/object:Gem::Version
@@ -83,6 +94,7 @@ dependencies:
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: foreman
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
99
  - - ! '>='
88
100
  - !ruby/object:Gem::Version
@@ -90,6 +102,7 @@ dependencies:
90
102
  type: :runtime
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
107
  - - ! '>='
95
108
  - !ruby/object:Gem::Version
@@ -97,6 +110,7 @@ dependencies:
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: fpm
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
115
  - - ~>
102
116
  - !ruby/object:Gem::Version
@@ -104,6 +118,7 @@ dependencies:
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
123
  - - ~>
109
124
  - !ruby/object:Gem::Version
@@ -111,6 +126,7 @@ dependencies:
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: grit
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
131
  - - ! '>='
116
132
  - !ruby/object:Gem::Version
@@ -118,6 +134,23 @@ dependencies:
118
134
  type: :runtime
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rugged
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
121
154
  requirements:
122
155
  - - ! '>='
123
156
  - !ruby/object:Gem::Version
@@ -125,6 +158,7 @@ dependencies:
125
158
  - !ruby/object:Gem::Dependency
126
159
  name: cane
127
160
  requirement: !ruby/object:Gem::Requirement
161
+ none: false
128
162
  requirements:
129
163
  - - ! '>='
130
164
  - !ruby/object:Gem::Version
@@ -132,6 +166,7 @@ dependencies:
132
166
  type: :development
133
167
  prerelease: false
134
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
135
170
  requirements:
136
171
  - - ! '>='
137
172
  - !ruby/object:Gem::Version
@@ -139,6 +174,7 @@ dependencies:
139
174
  - !ruby/object:Gem::Dependency
140
175
  name: pry
141
176
  requirement: !ruby/object:Gem::Requirement
177
+ none: false
142
178
  requirements:
143
179
  - - ! '>='
144
180
  - !ruby/object:Gem::Version
@@ -146,6 +182,7 @@ dependencies:
146
182
  type: :development
147
183
  prerelease: false
148
184
  version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
149
186
  requirements:
150
187
  - - ! '>='
151
188
  - !ruby/object:Gem::Version
@@ -153,6 +190,7 @@ dependencies:
153
190
  - !ruby/object:Gem::Dependency
154
191
  name: rake
155
192
  requirement: !ruby/object:Gem::Requirement
193
+ none: false
156
194
  requirements:
157
195
  - - ! '>='
158
196
  - !ruby/object:Gem::Version
@@ -160,6 +198,7 @@ dependencies:
160
198
  type: :development
161
199
  prerelease: false
162
200
  version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
163
202
  requirements:
164
203
  - - ! '>='
165
204
  - !ruby/object:Gem::Version
@@ -167,6 +206,7 @@ dependencies:
167
206
  - !ruby/object:Gem::Dependency
168
207
  name: rspec
169
208
  requirement: !ruby/object:Gem::Requirement
209
+ none: false
170
210
  requirements:
171
211
  - - ~>
172
212
  - !ruby/object:Gem::Version
@@ -174,6 +214,7 @@ dependencies:
174
214
  type: :development
175
215
  prerelease: false
176
216
  version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
177
218
  requirements:
178
219
  - - ~>
179
220
  - !ruby/object:Gem::Version
@@ -181,6 +222,7 @@ dependencies:
181
222
  - !ruby/object:Gem::Dependency
182
223
  name: vcr
183
224
  requirement: !ruby/object:Gem::Requirement
225
+ none: false
184
226
  requirements:
185
227
  - - ! '>='
186
228
  - !ruby/object:Gem::Version
@@ -188,6 +230,7 @@ dependencies:
188
230
  type: :development
189
231
  prerelease: false
190
232
  version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
191
234
  requirements:
192
235
  - - ! '>='
193
236
  - !ruby/object:Gem::Version
@@ -195,6 +238,7 @@ dependencies:
195
238
  - !ruby/object:Gem::Dependency
196
239
  name: webmock
197
240
  requirement: !ruby/object:Gem::Requirement
241
+ none: false
198
242
  requirements:
199
243
  - - ! '>='
200
244
  - !ruby/object:Gem::Version
@@ -202,6 +246,7 @@ dependencies:
202
246
  type: :development
203
247
  prerelease: false
204
248
  version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
205
250
  requirements:
206
251
  - - ! '>='
207
252
  - !ruby/object:Gem::Version
@@ -241,6 +286,7 @@ files:
241
286
  - lib/dockly/docker.rb
242
287
  - lib/dockly/docker/registry.rb
243
288
  - lib/dockly/foreman.rb
289
+ - lib/dockly/history.rb
244
290
  - lib/dockly/rake_task.rb
245
291
  - lib/dockly/rpm.rb
246
292
  - lib/dockly/tar_diff.rb
@@ -270,6 +316,7 @@ files:
270
316
  - spec/dockly/docker/registry_spec.rb
271
317
  - spec/dockly/docker_spec.rb
272
318
  - spec/dockly/foreman_spec.rb
319
+ - spec/dockly/history_spec.rb
273
320
  - spec/dockly/rpm_spec.rb
274
321
  - spec/dockly/tar_diff_spec.rb
275
322
  - spec/dockly_spec.rb
@@ -285,26 +332,27 @@ files:
285
332
  homepage: https://github.com/swipely/dockly
286
333
  licenses:
287
334
  - MIT
288
- metadata: {}
289
335
  post_install_message:
290
336
  rdoc_options: []
291
337
  require_paths:
292
338
  - lib
293
339
  required_ruby_version: !ruby/object:Gem::Requirement
340
+ none: false
294
341
  requirements:
295
342
  - - ! '>='
296
343
  - !ruby/object:Gem::Version
297
344
  version: '0'
298
345
  required_rubygems_version: !ruby/object:Gem::Requirement
346
+ none: false
299
347
  requirements:
300
348
  - - ! '>='
301
349
  - !ruby/object:Gem::Version
302
350
  version: '0'
303
351
  requirements: []
304
352
  rubyforge_project:
305
- rubygems_version: 2.4.6
353
+ rubygems_version: 1.8.23.2
306
354
  signing_key:
307
- specification_version: 4
355
+ specification_version: 3
308
356
  summary: Packaging made easy
309
357
  test_files:
310
358
  - spec/dockly/aws/s3_writer_spec.rb
@@ -318,6 +366,7 @@ test_files:
318
366
  - spec/dockly/docker/registry_spec.rb
319
367
  - spec/dockly/docker_spec.rb
320
368
  - spec/dockly/foreman_spec.rb
369
+ - spec/dockly/history_spec.rb
321
370
  - spec/dockly/rpm_spec.rb
322
371
  - spec/dockly/tar_diff_spec.rb
323
372
  - spec/dockly_spec.rb
@@ -330,3 +379,4 @@ test_files:
330
379
  - spec/fixtures/test-2.tar.gz
331
380
  - spec/fixtures/test-3.tar
332
381
  - spec/spec_helper.rb
382
+ has_rdoc:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NTI4NjA5ODIxMWQzOThhZGVjMDU0NjRiNGVmNmM3NTk1MDBhNTZmZQ==
5
- data.tar.gz: !binary |-
6
- MDQyMjhmNTc3ZWM5YjYzMTJjNWRjZTgzNWNjZDc2ZmEzMzE2M2FmOA==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- NzE1YjYwZTdmNDUwYzZlZjY5N2VmOGFiNzg1YzhjNjdhMjU3Yjc4NmEyZmUw
10
- ZGQwYjJlOGQ0YTA3YWQ4YmZmYTBiNzI0NmMxMWUyYjdlNjBjZWUwMTUwMjU2
11
- YzI5Nzc4MjcwNjYxNGYyMzhlNzgyZjU0MGQ3ODk3NzE4MDMwYzg=
12
- data.tar.gz: !binary |-
13
- ZmZjNTMxMTNiMmY2ZjBiNDJhMDlmZTFlYzVhNzEzMDQ2MmIzMjhmZjY1YjA3
14
- YjdjYjFiNTJkNjcwODFmMjk0NmQ0NmJjNmIzN2RhZjllMjNiYjNmN2Q4YTRl
15
- Mjg0ZjRjMGJhYjlmOTg2Y2M4NzA0NmMxMTQyODkxNzYwZDE3ZGY=