bosh_job_docker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *-docker
2
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.1
data/COPYING ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2014 Matthew M. Boedicker
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ [![Build Status](https://travis-ci.org/mmb/bosh_job_docker.png)](https://travis-ci.org/mmb/bosh_job_docker) [![Code Climate](https://codeclimate.com/github/mmb/bosh_job_docker.png)](https://codeclimate.com/github/mmb/bosh_job_docker)
2
+
3
+ Build a Docker container with all packages from a BOSH job.
4
+
5
+ Usage:
6
+
7
+ ```
8
+ bundle exec bosh_job_docker <bosh-release-tarball> <job-name>
9
+ ```
10
+
11
+ This compiles the job's packages in the container and leaves
12
+ /var/vcap/packages in the same state it would be in on a deployed job.
13
+ It doesn't start any job processes but it might someday.
14
+
15
+ Example:
16
+
17
+ ```sh
18
+ bundle exec bosh_job_docker ~/Downloads/bosh-2605.tgz director
19
+ sudo docker build director-docker
20
+ ```
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rubocop/rake_task'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RuboCop::RakeTask.new
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task spec: :rubocop
10
+
11
+ task default: :spec
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
+
6
+ require 'bosh_job_docker/bosh_job_docker_file'
7
+ require 'bosh_job_docker/release_tarball'
8
+
9
+ require 'fileutils'
10
+ require 'logger'
11
+
12
+ if ARGV.size != 2
13
+ $stderr.puts "Usage: #{$PROGRAM_NAME} release_tarball job_name"
14
+ exit 1
15
+ end
16
+
17
+ release_tarball_path, job = ARGV
18
+
19
+ release_tarball = BoshJobDocker::ReleaseTarball.new(release_tarball_path)
20
+
21
+ logger = Logger.new($stdout)
22
+ logger.info("Building job #{job} from #{release_tarball}")
23
+
24
+ build_order = release_tarball.build_order(job)
25
+ logger.info("Package build order: #{build_order}")
26
+
27
+ work_dir = "./#{job}-docker"
28
+ FileUtils.rm_rf(work_dir)
29
+ logger.info("Cleaning #{work_dir}")
30
+ FileUtils.mkdir(work_dir)
31
+
32
+ build_dir = FileUtils.mkdir_p(File.join(work_dir, 'build'))
33
+
34
+ docker_file = BoshJobDocker::BoshJobDockerFile.new
35
+
36
+ build_order.each do |package|
37
+ logger.info("Building package #{package}")
38
+ package_build_dir = File.join(build_dir, package)
39
+ release_tarball.extract_package(package, package_build_dir)
40
+
41
+ docker_file.add_package(package)
42
+ end
43
+
44
+ docker_file.write(File.join(work_dir, 'Dockerfile'))
45
+ logger.info("Dockerfile written to #{work_dir}")
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'bosh_job_docker'
5
+ s.version = '0.0.1'
6
+ s.summary = 'Build a Docker container with all packages from a BOSH job'
7
+ s.description = s.summary
8
+ s.homepage = 'https://github.com/mmb/bosh_job_docker'
9
+ s.authors = ['Matthew M. Boedicker']
10
+ s.email = %w(matthewm@boedicker.org)
11
+ s.license = 'MIT'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.executables = %w(bosh_job_docker)
15
+
16
+ s.add_development_dependency 'rake', '~> 10.3'
17
+ s.add_development_dependency 'rubocop', '~> 0.23'
18
+ s.add_development_dependency 'rspec', '~> 3.0'
19
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+
3
+ # Top-level module.
4
+ module BoshJobDocker
5
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bosh_job_docker/docker_file'
4
+
5
+ module BoshJobDocker
6
+ # Builds a Dockerfile for a BOSH job.
7
+ class BoshJobDockerFile
8
+ def initialize
9
+ @docker_file = DockerFile.new
10
+ add_preamble
11
+ end
12
+
13
+ def add_package(package)
14
+ docker_file.comment(package)
15
+ docker_file.env('BOSH_INSTALL_TARGET', "/var/vcap/packages/#{package}")
16
+ docker_file.run('mkdir $BOSH_INSTALL_TARGET')
17
+ docker_file.run("cd /build/#{package} && bash packaging")
18
+ docker_file.blank_line
19
+ end
20
+
21
+ def write(path)
22
+ @docker_file.write(path)
23
+ end
24
+
25
+ private
26
+
27
+ def add_preamble
28
+ docker_file.from('ubuntu')
29
+ docker_file.run('apt-get update')
30
+ add_apt_gets
31
+ docker_file.add('build', '/build')
32
+ docker_file.run('mkdir -p /var/vcap/packages')
33
+ docker_file.blank_line
34
+ end
35
+
36
+ def add_apt_gets # rubocop:disable MethodLength
37
+ docker_file.apt_get(%w(
38
+ build-essential
39
+ cmake
40
+ gettext
41
+ libbz2-dev
42
+ libcap-dev
43
+ libreadline-dev
44
+ libssl-dev
45
+ libxml2-dev
46
+ libxslt1-dev
47
+ zlib1g-dev
48
+ unzip
49
+ ))
50
+ end
51
+
52
+ attr_reader :docker_file
53
+ end
54
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'stringio'
4
+
5
+ module BoshJobDocker
6
+ # Builds a Dockerfile.
7
+ class DockerFile
8
+ def initialize
9
+ @buffer = StringIO.new
10
+ end
11
+
12
+ def apt_get(packages)
13
+ packages.sort.each do |package|
14
+ run("apt-get install -y #{package}")
15
+ end
16
+ blank_line
17
+ end
18
+
19
+ def add(src, dest)
20
+ line("ADD #{src} #{dest}")
21
+ end
22
+
23
+ def env(name, value)
24
+ line("ENV #{name} #{value}")
25
+ end
26
+
27
+ def from(image)
28
+ line("FROM #{image}")
29
+ blank_line
30
+ end
31
+
32
+ def run(command)
33
+ line("RUN #{command}")
34
+ end
35
+
36
+ def blank_line
37
+ buffer << "\n"
38
+ end
39
+
40
+ def comment(text)
41
+ line("# #{text}")
42
+ end
43
+
44
+ def write(path)
45
+ open(path, 'w') { |f| f.write(buffer.string) }
46
+ end
47
+
48
+ private
49
+
50
+ def line(line)
51
+ buffer << line
52
+ buffer << "\n"
53
+ end
54
+
55
+ attr_reader :buffer
56
+ end
57
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+
3
+ module BoshJobDocker
4
+ # BOSH package dependency resolver.
5
+ class PackageDepResolver
6
+ def initialize(release_manifest)
7
+ @release_manifest = release_manifest
8
+ end
9
+
10
+ def package_deps(package_name)
11
+ package = lookup_package(package_name)
12
+ deps = package['dependencies'].map { |p| package_deps(p) }.flatten
13
+ deps << package_name
14
+ end
15
+
16
+ private
17
+
18
+ def lookup_package(package_name)
19
+ release_manifest['packages'].find { |p| p['name'] == package_name }
20
+ end
21
+
22
+ attr_reader :release_manifest
23
+ end
24
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'fileutils'
4
+ require 'tempfile'
5
+ require 'yaml'
6
+
7
+ require 'bosh_job_docker/package_dep_resolver'
8
+ require 'bosh_job_docker/tar_extracter'
9
+
10
+ module BoshJobDocker
11
+ # A BOSH release tarball.
12
+ class ReleaseTarball
13
+ def initialize(path)
14
+ @work_dir = Dir.mktmpdir
15
+ @extracter = TarExtracter.new
16
+
17
+ extracter.extract(path, work_dir)
18
+ @resolver = PackageDepResolver.new(release_manifest)
19
+ end
20
+
21
+ def release_manifest
22
+ YAML.load_file(File.join(work_dir, 'release.MF'))
23
+ end
24
+
25
+ def extract_package(package, dest)
26
+ FileUtils.mkdir_p(dest)
27
+ extracter.extract(package_tarball_path(package), dest)
28
+ end
29
+
30
+ def build_order(job)
31
+ job_packages(job).reduce([]) do |order, p|
32
+ order + resolver.package_deps(p)
33
+ end.uniq
34
+ end
35
+
36
+ private
37
+
38
+ def job_tarball_path(job)
39
+ File.join(work_dir, 'jobs', "#{job}.tgz")
40
+ end
41
+
42
+ def job_spec(job)
43
+ job_work_dir = Dir.mktmpdir
44
+ extracter.extract(job_tarball_path(job), job_work_dir)
45
+ YAML.load_file(File.join(job_work_dir, 'job.MF'))
46
+ end
47
+
48
+ def job_packages(job)
49
+ job_spec(job)['packages']
50
+ end
51
+
52
+ def package_tarball_path(package)
53
+ File.join(work_dir, 'packages', "#{package}.tgz")
54
+ end
55
+
56
+ attr_reader :extracter
57
+ attr_reader :resolver
58
+ attr_reader :work_dir
59
+ end
60
+ end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require 'English'
5
+
6
+ module BoshJobDocker
7
+ # Extract a tarball into a directory.
8
+ class TarExtracter
9
+ def extract(tarball, dir)
10
+ pid = spawn('tar', '-C', dir, '-xzf', tarball)
11
+ Process.wait(pid)
12
+ fail 'tar command failed' unless $CHILD_STATUS.success?
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'tempfile'
4
+
5
+ require 'bosh_job_docker/bosh_job_docker_file'
6
+
7
+ describe BoshJobDocker::BoshJobDockerFile do
8
+ subject(:bosh_job_docker_file) { described_class.new }
9
+
10
+ describe '#add_package' do
11
+ it 'adds the docker commands to compile a package' do
12
+ bosh_job_docker_file.add_package('test')
13
+ output = Tempfile.new('docker_file')
14
+ bosh_job_docker_file.write(output.path)
15
+ expect(File.read(output.path)).to eq <<-EOS
16
+ FROM ubuntu
17
+
18
+ RUN apt-get update
19
+ RUN apt-get install -y build-essential
20
+ RUN apt-get install -y cmake
21
+ RUN apt-get install -y gettext
22
+ RUN apt-get install -y libbz2-dev
23
+ RUN apt-get install -y libcap-dev
24
+ RUN apt-get install -y libreadline-dev
25
+ RUN apt-get install -y libssl-dev
26
+ RUN apt-get install -y libxml2-dev
27
+ RUN apt-get install -y libxslt1-dev
28
+ RUN apt-get install -y unzip
29
+ RUN apt-get install -y zlib1g-dev
30
+
31
+ ADD build /build
32
+ RUN mkdir -p /var/vcap/packages
33
+
34
+ # test
35
+ ENV BOSH_INSTALL_TARGET /var/vcap/packages/test
36
+ RUN mkdir $BOSH_INSTALL_TARGET
37
+ RUN cd /build/test && bash packaging
38
+
39
+ EOS
40
+ end
41
+ end
42
+
43
+ describe '#write' do
44
+ it 'writes the Dockerfile' do
45
+ bosh_job_docker_file.add_package('test')
46
+ output = Tempfile.new('docker_file')
47
+ bosh_job_docker_file.write(output.path)
48
+ expect(File.read(output.path)).to eq <<-EOS
49
+ FROM ubuntu
50
+
51
+ RUN apt-get update
52
+ RUN apt-get install -y build-essential
53
+ RUN apt-get install -y cmake
54
+ RUN apt-get install -y gettext
55
+ RUN apt-get install -y libbz2-dev
56
+ RUN apt-get install -y libcap-dev
57
+ RUN apt-get install -y libreadline-dev
58
+ RUN apt-get install -y libssl-dev
59
+ RUN apt-get install -y libxml2-dev
60
+ RUN apt-get install -y libxslt1-dev
61
+ RUN apt-get install -y unzip
62
+ RUN apt-get install -y zlib1g-dev
63
+
64
+ ADD build /build
65
+ RUN mkdir -p /var/vcap/packages
66
+
67
+ # test
68
+ ENV BOSH_INSTALL_TARGET /var/vcap/packages/test
69
+ RUN mkdir $BOSH_INSTALL_TARGET
70
+ RUN cd /build/test && bash packaging
71
+
72
+ EOS
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'tempfile'
4
+
5
+ require 'bosh_job_docker/docker_file'
6
+
7
+ describe BoshJobDocker::DockerFile do
8
+ subject(:dockerfile) { described_class.new }
9
+
10
+ describe '#apt_get' do
11
+ it 'adds RUN lines for installing packages' do
12
+ dockerfile.apt_get(%w(a b c))
13
+ output = Tempfile.new('docker_file')
14
+ dockerfile.write(output.path)
15
+ expect(File.read(output.path)).to eq <<-EOS
16
+ RUN apt-get install -y a
17
+ RUN apt-get install -y b
18
+ RUN apt-get install -y c
19
+
20
+ EOS
21
+ end
22
+ end
23
+
24
+ describe '#add' do
25
+ it 'adds ADD lines' do
26
+ dockerfile.add('src', 'dest')
27
+ output = Tempfile.new('docker_file')
28
+ dockerfile.write(output.path)
29
+ expect(File.read(output.path)).to eq("ADD src dest\n")
30
+ end
31
+ end
32
+
33
+ describe '#env' do
34
+ it 'adds ENV lines' do
35
+ dockerfile.env('name', 'value')
36
+ output = Tempfile.new('docker_file')
37
+ dockerfile.write(output.path)
38
+ expect(File.read(output.path)).to eq("ENV name value\n")
39
+ end
40
+ end
41
+
42
+ describe '#from' do
43
+ it 'adds FROM lines' do
44
+ dockerfile.from('image')
45
+ output = Tempfile.new('docker_file')
46
+ dockerfile.write(output.path)
47
+ expect(File.read(output.path)).to eq("FROM image\n\n")
48
+ end
49
+ end
50
+
51
+ describe '#run' do
52
+ it 'adds RUN lines' do
53
+ dockerfile.run('command arg')
54
+ output = Tempfile.new('docker_file')
55
+ dockerfile.write(output.path)
56
+ expect(File.read(output.path)).to eq("RUN command arg\n")
57
+ end
58
+ end
59
+
60
+ describe '#blank_line' do
61
+ it 'adds blank lines' do
62
+ dockerfile.blank_line
63
+ output = Tempfile.new('docker_file')
64
+ dockerfile.write(output.path)
65
+ expect(File.read(output.path)).to eq("\n")
66
+ end
67
+ end
68
+
69
+ describe '#comment' do
70
+ it 'adds comment lines' do
71
+ dockerfile.comment('comment')
72
+ output = Tempfile.new('docker_file')
73
+ dockerfile.write(output.path)
74
+ expect(File.read(output.path)).to eq("# comment\n")
75
+ end
76
+ end
77
+
78
+ describe '#write' do
79
+ it 'writes a Dockerfile' do
80
+ dockerfile.from('image')
81
+ dockerfile.comment('boom')
82
+ dockerfile.run('%0|%0')
83
+ output = Tempfile.new('docker_file')
84
+ dockerfile.write(output.path)
85
+ expect(File.read(output.path)).to eq <<-EOS
86
+ FROM image
87
+
88
+ # boom
89
+ RUN %0|%0
90
+ EOS
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bosh_job_docker/package_dep_resolver'
4
+
5
+ describe BoshJobDocker::PackageDepResolver do
6
+ subject(:package_dep_resolver) { described_class.new(release_manifest) }
7
+
8
+ describe '#package_deps' do
9
+ context 'no deps' do
10
+ let(:release_manifest) do
11
+ {
12
+ 'packages' => [
13
+ { 'name' => 'package1', 'dependencies' => [] }
14
+ ]
15
+ }
16
+ end
17
+
18
+ it 'returns a single package' do
19
+ expect(package_dep_resolver.package_deps('package1')).to eq(
20
+ %w(package1))
21
+ end
22
+ end
23
+
24
+ context 'simple dependency' do
25
+ let(:release_manifest) do
26
+ {
27
+ 'packages' => [
28
+ { 'name' => 'package1', 'dependencies' => %w(package2) },
29
+ { 'name' => 'package2', 'dependencies' => [] }
30
+ ]
31
+ }
32
+ end
33
+
34
+ it 'foo' do
35
+ expect(package_dep_resolver.package_deps('package1')).to eq(
36
+ %w(package2 package1))
37
+ end
38
+ end
39
+
40
+ context 'complicated dependency tree' do
41
+ let(:release_manifest) do
42
+ {
43
+ 'packages' => [
44
+ { 'name' => 'package1', 'dependencies' => %w(package2 package4) },
45
+ { 'name' => 'package2', 'dependencies' => %w(package3) },
46
+ { 'name' => 'package3', 'dependencies' => %w(package4) },
47
+ { 'name' => 'package4', 'dependencies' => [] }
48
+ ]
49
+ }
50
+ end
51
+
52
+ it 'foo' do
53
+ expect(package_dep_resolver.package_deps('package1')).to eq(
54
+ %w(package4 package3 package2 package4 package1))
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'tempfile'
4
+
5
+ require 'bosh_job_docker/tar_extracter'
6
+
7
+ describe BoshJobDocker::TarExtracter do
8
+ subject(:tar_extracter) { described_class.new }
9
+
10
+ describe '#extract' do
11
+ it 'extracts a tar file to a directory' do
12
+ test_tar = File.join(
13
+ File.dirname(__FILE__), '..', 'support', 'test.tar.gz')
14
+ Dir.mktmpdir do |tempdir|
15
+ tar_extracter.extract(test_tar, tempdir)
16
+ expect(File.read(File.join(tempdir, 'test', 'a'))).to eq("a\n")
17
+ expect(File.read(File.join(tempdir, 'test', 'b'))).to eq("b\n")
18
+ expect(Dir["#{tempdir}/**/*"].size).to eq(3)
19
+ end
20
+ end
21
+ end
22
+
23
+ end
Binary file
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bosh_job_docker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthew M. Boedicker
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '10.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '10.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rubocop
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.23'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.23'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ description: Build a Docker container with all packages from a BOSH job
63
+ email:
64
+ - matthewm@boedicker.org
65
+ executables:
66
+ - bosh_job_docker
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - .travis.yml
72
+ - COPYING
73
+ - Gemfile
74
+ - README.md
75
+ - Rakefile
76
+ - bin/bosh_job_docker
77
+ - bosh_job_docker.gemspec
78
+ - lib/bosh_job_docker.rb
79
+ - lib/bosh_job_docker/bosh_job_docker_file.rb
80
+ - lib/bosh_job_docker/docker_file.rb
81
+ - lib/bosh_job_docker/package_dep_resolver.rb
82
+ - lib/bosh_job_docker/release_tarball.rb
83
+ - lib/bosh_job_docker/tar_extracter.rb
84
+ - spec/bosh_job_docker/bosh_job_docker_file_spec.rb
85
+ - spec/bosh_job_docker/docker_file_spec.rb
86
+ - spec/bosh_job_docker/package_dep_resolver_spec.rb
87
+ - spec/bosh_job_docker/tar_extracter_spec.rb
88
+ - spec/support/test.tar.gz
89
+ homepage: https://github.com/mmb/bosh_job_docker
90
+ licenses:
91
+ - MIT
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 1.8.23.2
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Build a Docker container with all packages from a BOSH job
114
+ test_files: []