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 +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
|
+
[![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
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: []
|