james_bond-mission_build 0.1.2
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 +7 -0
- data/README.md +1 -0
- data/lib/james_bond/mission_build/build_handler/unable_to_find_dockerfile_error.rb +11 -0
- data/lib/james_bond/mission_build/build_handler.rb +61 -0
- data/lib/james_bond/mission_build/config/invalid_file_error.rb +12 -0
- data/lib/james_bond/mission_build/config/no_config_available_error.rb +12 -0
- data/lib/james_bond/mission_build/config.rb +64 -0
- data/lib/james_bond/mission_build.rb +34 -0
- data/lib/james_bond.rb +4 -0
- metadata +97 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 73270dcac7f114beb21f46183ea8d9d43708f851
|
|
4
|
+
data.tar.gz: a89f50fe1f3d7828cb53e3d7db55ef73badf93b8
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 89ff8716c37a4f1edb7aa69d7941a0117deb0f3af854d169cb94eee6bd0d708b891e0bcf95eee9a70602f83d43e02821f033411b9a540f1b5b88a65e5d56b5f5
|
|
7
|
+
data.tar.gz: 34b51133bc12e610c1cf2ee85cd1a07e7f7b40be12fab8633ebfd1fb401a06fac944e71605c4b0716f9a7bdfebc41b54572688f07043c2d8ffffdd942c9859d1
|
data/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
## Build Mission
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require "open3"
|
|
2
|
+
require "james_bond/mission_build/build_handler/unable_to_find_dockerfile_error"
|
|
3
|
+
|
|
4
|
+
module JamesBond
|
|
5
|
+
class MissionBuild
|
|
6
|
+
class BuildHandler
|
|
7
|
+
attr_accessor :config
|
|
8
|
+
|
|
9
|
+
def initialize(command, config)
|
|
10
|
+
@command = command
|
|
11
|
+
@config = config
|
|
12
|
+
@docker_config = config.docker_config
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def run
|
|
16
|
+
image_name = build_image_name
|
|
17
|
+
dockerfile_name = build_dockerfile_name
|
|
18
|
+
raise(UnableToFindDockerfileError, dockerfile_path(dockerfile_name)) \
|
|
19
|
+
if !dockerfile_exists?(dockerfile_name)
|
|
20
|
+
|
|
21
|
+
command = "docker build -t #{image_name} -f #{dockerfile_name} ."
|
|
22
|
+
puts "Building docker image \"#{image_name}\" with #{dockerfile_name}.. "
|
|
23
|
+
Open3.popen3(command) do |stdin, stdout, stderr, thread|
|
|
24
|
+
Thread.new do
|
|
25
|
+
until (line = stdout.gets).nil? do
|
|
26
|
+
puts line
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
thread.join
|
|
31
|
+
end
|
|
32
|
+
puts "Done!"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def build_image_name
|
|
38
|
+
namespace = @docker_config["image"]["namespace"]
|
|
39
|
+
name = @docker_config["image"]["name"]
|
|
40
|
+
tag = build_tag
|
|
41
|
+
"#{namespace}/#{name}:#{tag}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def build_dockerfile_name
|
|
45
|
+
@docker_config["dockerfile"]["pattern"].gsub("$environment", @command.env)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def build_tag
|
|
49
|
+
@command.options[:tag] || "devel-#{Time.now.to_i}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def dockerfile_exists?(dockerfile_name)
|
|
53
|
+
File.file?(dockerfile_path(dockerfile_name))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def dockerfile_path(dockerfile_name)
|
|
57
|
+
File.join(Dir.pwd, dockerfile_name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module JamesBond
|
|
2
|
+
class MissionBuild
|
|
3
|
+
class Config
|
|
4
|
+
class InvalidFileError < StandardError
|
|
5
|
+
def initialize(file_path)
|
|
6
|
+
super("The configuration file for the #{JamesBond::MissionBuild::MISSION_NAME.capitalize} Mission " \
|
|
7
|
+
+ "doesn't exist or is unreachable [It should be in #{file_path}]")
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module JamesBond
|
|
2
|
+
class MissionBuild
|
|
3
|
+
class Config
|
|
4
|
+
class NoConfigAvailableError < StandardError
|
|
5
|
+
def initialize(file_path:, config_path:)
|
|
6
|
+
super("The configuration file for the #{JamesBond::MissionBuild::MISSION_NAME.capitalize} Mission [It should be in #{file_path}] " \
|
|
7
|
+
+ "doesn't have the required path: '#{config_path}'")
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require "yaml"
|
|
2
|
+
require "james_bond/mission_build/config/invalid_file_error"
|
|
3
|
+
require "james_bond/mission_build/config/no_config_available_error"
|
|
4
|
+
|
|
5
|
+
module JamesBond
|
|
6
|
+
class MissionBuild
|
|
7
|
+
class Config
|
|
8
|
+
attr_accessor :yaml_path,
|
|
9
|
+
:raw_hash,
|
|
10
|
+
:docker_config
|
|
11
|
+
|
|
12
|
+
def initialize(yaml_path:)
|
|
13
|
+
@yaml_path = yaml_path
|
|
14
|
+
extract_config_from_yaml(@yaml_path)
|
|
15
|
+
|
|
16
|
+
validate_config
|
|
17
|
+
@docker_config = @raw_hash["build"]["docker"]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def extract_config_from_yaml(yaml_path)
|
|
23
|
+
raise(self.class::InvalidFileError, yaml_path) if !file_exists?(yaml_path)
|
|
24
|
+
@raw_hash = YAML.load(File.read(yaml_path)).freeze
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def file_exists?(path)
|
|
28
|
+
File.file?(path)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def validate_config
|
|
32
|
+
build_config = (@raw_hash || {})["build"]
|
|
33
|
+
raise(self.class::NoConfigAvailableError,
|
|
34
|
+
{ file_path: yaml_path, config_path: "build" }) if !build_config
|
|
35
|
+
|
|
36
|
+
docker_config = build_config["docker"]
|
|
37
|
+
raise(self.class::NoConfigAvailableError,
|
|
38
|
+
{ file_path: yaml_path, config_path: "build.docker" }) if !docker_config
|
|
39
|
+
|
|
40
|
+
docker_image_config = docker_config["image"]
|
|
41
|
+
raise(self.class::NoConfigAvailableError,
|
|
42
|
+
{ file_path: yaml_path, config_path: "build.docker.image" }) if !docker_image_config
|
|
43
|
+
|
|
44
|
+
if !docker_image_config["namespace"]
|
|
45
|
+
raise(self.class::NoConfigAvailableError,
|
|
46
|
+
{ file_path: yaml_path, config_path: "build.docker.image.namespace" })
|
|
47
|
+
end
|
|
48
|
+
if !docker_image_config["name"]
|
|
49
|
+
raise(self.class::NoConfigAvailableError,
|
|
50
|
+
{ file_path: yaml_path, config_path: "build.docker.image.name" })
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
dockerfile_config = docker_config["dockerfile"]
|
|
54
|
+
raise(self.class::NoConfigAvailableError,
|
|
55
|
+
{ file_path: yaml_path, config_path: "build.docker.dockerfile" }) if !dockerfile_config
|
|
56
|
+
|
|
57
|
+
if !dockerfile_config["pattern"]
|
|
58
|
+
raise(self.class::NoConfigAvailableError,
|
|
59
|
+
{ file_path: yaml_path, config_path: "build.docker.dockerfile.pattern" })
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require "james_bond/core/mission"
|
|
2
|
+
require "james_bond/mission_build/config"
|
|
3
|
+
require "james_bond/mission_build/build_handler"
|
|
4
|
+
|
|
5
|
+
module JamesBond
|
|
6
|
+
class MissionBuild
|
|
7
|
+
include JamesBond::Core::Mission
|
|
8
|
+
|
|
9
|
+
MISSION_NAME = "build"
|
|
10
|
+
MISSION_MAIN_COMMANDS = ["build"]
|
|
11
|
+
CONFIGURATION_FILE_PATH = File.join(Dir.pwd, "config", "james_bond", "build.yml")
|
|
12
|
+
|
|
13
|
+
def build(config, params)
|
|
14
|
+
config.name = MISSION_NAME
|
|
15
|
+
config.main_commands = MISSION_MAIN_COMMANDS
|
|
16
|
+
arguments_parser do |parser|
|
|
17
|
+
parser.banner = "bond #{MISSION_MAIN_COMMANDS[0]} [options]"
|
|
18
|
+
parser.string "-t", "--tag",
|
|
19
|
+
"Creates a docker image with the specified tag. If omitted, a tag " + \
|
|
20
|
+
"like devel-212121 will be generated automaticaly."
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def run_build_command(command:, mission_pool:)
|
|
25
|
+
self.class::BuildHandler.new(command, config_file).run
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def config_file
|
|
31
|
+
@config_file ||= self.class::Config.new(yaml_path: CONFIGURATION_FILE_PATH)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/james_bond.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: james_bond-mission_build
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Airton Sobral
|
|
8
|
+
- Guilherme Cavalcanti
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2016-09-01 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: james_bond-core
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - '='
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: 0.1.2
|
|
21
|
+
type: :runtime
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - '='
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: 0.1.2
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: rspec
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - '='
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: 3.4.0
|
|
35
|
+
type: :development
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - '='
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: 3.4.0
|
|
42
|
+
- !ruby/object:Gem::Dependency
|
|
43
|
+
name: byebug
|
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - '='
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: 9.0.5
|
|
49
|
+
type: :development
|
|
50
|
+
prerelease: false
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - '='
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: 9.0.5
|
|
56
|
+
description: Fully building automation
|
|
57
|
+
email:
|
|
58
|
+
- airtonsobral@gmail.com
|
|
59
|
+
- guiocavalcanti@gmail.com
|
|
60
|
+
executables: []
|
|
61
|
+
extensions: []
|
|
62
|
+
extra_rdoc_files:
|
|
63
|
+
- README.md
|
|
64
|
+
files:
|
|
65
|
+
- README.md
|
|
66
|
+
- lib/james_bond.rb
|
|
67
|
+
- lib/james_bond/mission_build.rb
|
|
68
|
+
- lib/james_bond/mission_build/build_handler.rb
|
|
69
|
+
- lib/james_bond/mission_build/build_handler/unable_to_find_dockerfile_error.rb
|
|
70
|
+
- lib/james_bond/mission_build/config.rb
|
|
71
|
+
- lib/james_bond/mission_build/config/invalid_file_error.rb
|
|
72
|
+
- lib/james_bond/mission_build/config/no_config_available_error.rb
|
|
73
|
+
homepage: http://rubygemgem.org/gems/james_bond-build_mission
|
|
74
|
+
licenses:
|
|
75
|
+
- MIT
|
|
76
|
+
metadata: {}
|
|
77
|
+
post_install_message:
|
|
78
|
+
rdoc_options: []
|
|
79
|
+
require_paths:
|
|
80
|
+
- lib
|
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '2.1'
|
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
requirements: []
|
|
92
|
+
rubyforge_project:
|
|
93
|
+
rubygems_version: 2.4.8
|
|
94
|
+
signing_key:
|
|
95
|
+
specification_version: 4
|
|
96
|
+
summary: Building a new world should be easy!
|
|
97
|
+
test_files: []
|