bosh_job_docker 0.0.1
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.
- data/.gitignore +2 -0
- data/.travis.yml +6 -0
- data/COPYING +21 -0
- data/Gemfile +3 -0
- data/README.md +20 -0
- data/Rakefile +11 -0
- data/bin/bosh_job_docker +45 -0
- data/bosh_job_docker.gemspec +19 -0
- data/lib/bosh_job_docker.rb +5 -0
- data/lib/bosh_job_docker/bosh_job_docker_file.rb +54 -0
- data/lib/bosh_job_docker/docker_file.rb +57 -0
- data/lib/bosh_job_docker/package_dep_resolver.rb +24 -0
- data/lib/bosh_job_docker/release_tarball.rb +60 -0
- data/lib/bosh_job_docker/tar_extracter.rb +15 -0
- data/spec/bosh_job_docker/bosh_job_docker_file_spec.rb +75 -0
- data/spec/bosh_job_docker/docker_file_spec.rb +93 -0
- data/spec/bosh_job_docker/package_dep_resolver_spec.rb +58 -0
- data/spec/bosh_job_docker/tar_extracter_spec.rb +23 -0
- data/spec/support/test.tar.gz +0 -0
- metadata +114 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
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
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
[](https://travis-ci.org/mmb/bosh_job_docker) [](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
data/bin/bosh_job_docker
ADDED
@@ -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,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: []
|