kameleon-builder 2.2.5 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.rst +21 -0
- data/{templates → contrib}/steps/bootstrap/debian/debootstrap_arm.yaml +1 -1
- data/{templates → contrib}/steps/export/clean_appliance.yaml +0 -0
- data/{templates → contrib}/steps/export/compact_qcow_img.yaml +0 -0
- data/{templates → contrib}/steps/setup/archlinux/configure_ruby.yaml +0 -0
- data/{templates → contrib}/steps/setup/archlinux/install_dev_tools.yaml +0 -0
- data/{templates → contrib}/steps/setup/archlinux/install_gnome.yaml +0 -0
- data/{templates → contrib}/steps/setup/archlinux/install_yaourt.yaml +0 -0
- data/{templates → contrib}/steps/setup/centos/6.5/configure_repo.yaml +0 -0
- data/{templates → contrib}/steps/setup/debian/install_gnome.yaml +0 -0
- data/{templates → contrib}/steps/setup/debian/install_kde.yaml +0 -0
- data/{templates → erb}/extend.erb +2 -2
- data/erb/userconf.erb +5 -0
- data/kameleon-builder.gemspec +6 -1
- data/lib/kameleon.rb +53 -3
- data/lib/kameleon/cli.rb +146 -99
- data/lib/kameleon/engine.rb +20 -8
- data/lib/kameleon/environment.rb +11 -10
- data/lib/kameleon/persistent_cache.rb +1 -9
- data/lib/kameleon/recipe.rb +52 -24
- data/lib/kameleon/repository.rb +46 -0
- data/lib/kameleon/utils.rb +49 -0
- data/{templates → tests/recipes}/steps/aliases/defaults.yaml +0 -0
- data/tests/recipes/steps/bootstrap/linux/bootstrap.yaml +2 -0
- data/tests/recipes/steps/checkpoints/test.yaml +14 -0
- data/tests/recipes/steps/enable_something.yaml +2 -0
- data/tests/recipes/steps/export/save_appliance.yaml +10 -0
- data/tests/recipes/steps/setup/linux/software_install.yaml +7 -0
- data/tests/recipes/test_recipe.yaml +41 -0
- data/version.txt +1 -1
- metadata +34 -139
- data/templates/COPYRIGHT +0 -21
- data/templates/chroot/debian7-amd64.yaml +0 -119
- data/templates/docker/debian7.yaml +0 -107
- data/templates/grid5000/debian7.yaml +0 -97
- data/templates/qemu/archlinux-desktop-i686.yaml +0 -25
- data/templates/qemu/archlinux-desktop-x86_64.yaml +0 -25
- data/templates/qemu/archlinux-i686.yaml +0 -25
- data/templates/qemu/archlinux-x86_64.yaml +0 -109
- data/templates/qemu/centos6.5-x86_64.yaml +0 -122
- data/templates/qemu/centos7-x86_64.yaml +0 -122
- data/templates/qemu/debian7-amd64.yaml +0 -134
- data/templates/qemu/debian7-desktop-amd64.yaml +0 -24
- data/templates/qemu/debian7-kameleon-amd64.yaml +0 -40
- data/templates/qemu/debian7-oar-amd64.yaml +0 -51
- data/templates/qemu/debian8-amd64.yaml +0 -25
- data/templates/qemu/fedora20-desktop-x86_64.yaml +0 -21
- data/templates/qemu/fedora20-x86_64.yaml +0 -119
- data/templates/qemu/ubuntu-12.04-amd64.yaml +0 -132
- data/templates/qemu/ubuntu-12.04-desktop-amd64.yaml +0 -25
- data/templates/qemu/ubuntu-14.04-amd64.yaml +0 -25
- data/templates/qemu/ubuntu-14.04-desktop-amd64.yaml +0 -27
- data/templates/steps/bootstrap/archlinux/arch_bootstrap.yaml +0 -211
- data/templates/steps/bootstrap/centos/6.5/yum_bootstrap.yaml +0 -67
- data/templates/steps/bootstrap/debian/debootstrap.yaml +0 -20
- data/templates/steps/bootstrap/fedora/init_pxeboot.yaml +0 -13
- data/templates/steps/bootstrap/fedora/yum_bootstrap.yaml +0 -45
- data/templates/steps/bootstrap/g5k_reserv.yaml +0 -70
- data/templates/steps/bootstrap/initialize_disk.yaml +0 -16
- data/templates/steps/bootstrap/initialize_disk_chroot.yaml +0 -80
- data/templates/steps/bootstrap/install_requirements.yaml +0 -3
- data/templates/steps/bootstrap/prepare_chroot.yaml +0 -126
- data/templates/steps/bootstrap/prepare_docker.yaml +0 -51
- data/templates/steps/bootstrap/prepare_qemu.yaml +0 -41
- data/templates/steps/bootstrap/prepare_virtualbox.yaml +0 -67
- data/templates/steps/bootstrap/start_chroot.yaml +0 -51
- data/templates/steps/bootstrap/start_docker.yaml +0 -16
- data/templates/steps/bootstrap/start_qemu.yaml +0 -74
- data/templates/steps/bootstrap/start_virtualbox.yaml +0 -38
- data/templates/steps/bootstrap/switch_context_qemu.yaml +0 -84
- data/templates/steps/bootstrap/switch_context_virtualbox.yaml +0 -86
- data/templates/steps/breakpoint.yaml +0 -3
- data/templates/steps/checkpoints/docker.yaml +0 -17
- data/templates/steps/checkpoints/qcow2.yaml +0 -40
- data/templates/steps/checkpoints/qemu.yaml +0 -33
- data/templates/steps/checkpoints/virtualbox.yaml +0 -21
- data/templates/steps/disable_checkpoint.yaml +0 -3
- data/templates/steps/enable_checkpoint.yaml +0 -5
- data/templates/steps/export/qemu_save_appliance.yaml +0 -52
- data/templates/steps/export/save_appliance_from_g5k.yaml +0 -47
- data/templates/steps/export/vagrant_save_appliance.yaml +0 -14
- data/templates/steps/export/virtualbox_save_appliance.yaml +0 -61
- data/templates/steps/setup/archlinux/configure_keyboard.yaml +0 -9
- data/templates/steps/setup/archlinux/configure_network.yaml +0 -9
- data/templates/steps/setup/archlinux/configure_system.yaml +0 -20
- data/templates/steps/setup/archlinux/install_bootloader.yaml +0 -23
- data/templates/steps/setup/archlinux/install_software.yaml +0 -9
- data/templates/steps/setup/autologin.yaml +0 -16
- data/templates/steps/setup/centos/6.5/configure_network.yaml +0 -33
- data/templates/steps/setup/centos/6.5/configure_system.yaml +0 -46
- data/templates/steps/setup/centos/6.5/minimal_install.yaml +0 -3
- data/templates/steps/setup/centos/6.5/setup_vagrant_box.yaml +0 -77
- data/templates/steps/setup/create_group.yaml +0 -12
- data/templates/steps/setup/create_user.yaml +0 -11
- data/templates/steps/setup/debian/configure_apt.yaml +0 -73
- data/templates/steps/setup/debian/configure_kernel.yaml +0 -13
- data/templates/steps/setup/debian/configure_keyboard.yaml +0 -10
- data/templates/steps/setup/debian/configure_network.yaml +0 -30
- data/templates/steps/setup/debian/configure_system.yaml +0 -12
- data/templates/steps/setup/debian/install_bootloader.yaml +0 -36
- data/templates/steps/setup/debian/install_software.yaml +0 -2
- data/templates/steps/setup/debian/oar/oar_debian_config_frontend.yaml +0 -8
- data/templates/steps/setup/debian/oar/oar_debian_config_node.yaml +0 -5
- data/templates/steps/setup/debian/oar/oar_debian_config_server.yaml +0 -5
- data/templates/steps/setup/debian/oar/oar_prereq_install.yaml +0 -16
- data/templates/steps/setup/debian/setup_vagrant_box.yaml +0 -80
- data/templates/steps/setup/debian/upgrade_system.yaml +0 -10
- data/templates/steps/setup/fedora/configure_kernel.yaml +0 -9
- data/templates/steps/setup/fedora/configure_keyboard.yaml +0 -12
- data/templates/steps/setup/fedora/configure_network.yaml +0 -38
- data/templates/steps/setup/fedora/configure_system.yaml +0 -52
- data/templates/steps/setup/fedora/install_bootloader.yaml +0 -53
- data/templates/steps/setup/fedora/install_software.yaml +0 -3
- data/templates/steps/setup/fedora/minimal_install.yaml +0 -3
- data/templates/steps/setup/fedora/update_system.yaml +0 -16
- data/templates/steps/setup/oar/oar_config_devel.yaml +0 -21
- data/templates/steps/setup/oar/oar_config_frontend.yaml +0 -38
- data/templates/steps/setup/oar/oar_config_node.yaml +0 -4
- data/templates/steps/setup/oar/oar_config_server.yaml +0 -25
- data/templates/steps/setup/oar/oar_config_system.yaml +0 -34
- data/templates/steps/setup/oar/oar_devel_prereq_install.yaml +0 -5
- data/templates/steps/setup/oar/oar_git_install.yaml +0 -21
- data/templates/steps/setup/ubuntu/configure_apt.yaml +0 -62
- data/templates/virtualbox/archlinux-desktop-i686.yaml +0 -25
- data/templates/virtualbox/archlinux-desktop-x86_64.yaml +0 -28
- data/templates/virtualbox/archlinux-i686.yaml +0 -28
- data/templates/virtualbox/archlinux-x86_64.yaml +0 -108
- data/templates/virtualbox/centos6.5-i386.yaml +0 -39
- data/templates/virtualbox/centos6.5-vagrant-x86_64.yaml +0 -33
- data/templates/virtualbox/centos6.5-x86_64.yaml +0 -121
- data/templates/virtualbox/centos7-x86_64.yaml +0 -118
- data/templates/virtualbox/debian7-amd64.yaml +0 -128
- data/templates/virtualbox/debian7-desktop-amd64.yaml +0 -25
- data/templates/virtualbox/debian7-i386.yaml +0 -31
- data/templates/virtualbox/debian7-kameleon-amd64.yaml +0 -38
- data/templates/virtualbox/debian7-oar-amd64.yaml +0 -51
- data/templates/virtualbox/debian7-vagrant-amd64.yaml +0 -32
- data/templates/virtualbox/debian8-amd64.yaml +0 -25
- data/templates/virtualbox/debian8-i386.yaml +0 -31
- data/templates/virtualbox/fedora20-x86_64.yaml +0 -118
- data/templates/virtualbox/ubuntu-12.04-amd64.yaml +0 -128
- data/templates/virtualbox/ubuntu-12.04-desktop-amd64.yaml +0 -25
- data/templates/virtualbox/ubuntu-14.04-amd64.yaml +0 -25
- data/templates/virtualbox/ubuntu-14.04-desktop-amd64.yaml +0 -27
- data/tests/recipes/dummy_recipe.yaml +0 -48
- data/tests/recipes/steps/bootstrap/dummy_distro/dummy_bootstrap_static.yaml +0 -4
- data/tests/recipes/steps/export/dummy_save_appliance.yaml +0 -9
- data/tests/recipes/steps/setup/default/dummy_root_passwd.yaml +0 -8
- data/tests/recipes/steps/setup/dummy_distro/dummy_software_install.yaml +0 -7
data/lib/kameleon/engine.rb
CHANGED
@@ -13,9 +13,9 @@ module Kameleon
|
|
13
13
|
@recipe = recipe
|
14
14
|
@cleaned_sections = []
|
15
15
|
@cwd = @recipe.global["kameleon_cwd"]
|
16
|
-
@build_recipe_path = File.join(@cwd, "
|
16
|
+
@build_recipe_path = File.join(@cwd, ".build_recipe")
|
17
17
|
|
18
|
-
@recipe.global["persistent_cache"] = @options[:
|
18
|
+
@recipe.global["persistent_cache"] = @options[:enable_cache] ? "true" : "false"
|
19
19
|
|
20
20
|
build_recipe = load_build_recipe
|
21
21
|
# restore previous build uuid
|
@@ -24,7 +24,7 @@ module Kameleon
|
|
24
24
|
@recipe.global[key] = build_recipe["global"][key]
|
25
25
|
end
|
26
26
|
end
|
27
|
-
@enable_checkpoint = @options[:
|
27
|
+
@enable_checkpoint = @options[:enable_checkpoint]
|
28
28
|
# Check if the recipe have checkpoint entry
|
29
29
|
if @enable_checkpoint && @recipe.checkpoint.nil?
|
30
30
|
fail BuildError, "Checkpoint is unavailable for this recipe"
|
@@ -32,12 +32,12 @@ module Kameleon
|
|
32
32
|
|
33
33
|
@recipe.resolve!
|
34
34
|
|
35
|
-
if @options[:
|
35
|
+
if @options[:enable_cache] || @options[:from_cache] then
|
36
36
|
@cache = Kameleon::Persistent_cache.instance
|
37
37
|
@cache.cwd = @cwd
|
38
38
|
@cache.polipo_path = @options[:proxy_path]
|
39
39
|
@cache.name = @recipe.name
|
40
|
-
@cache.mode = @options[:
|
40
|
+
@cache.mode = @options[:enable_cache] ? :build : :from
|
41
41
|
@cache.cache_path = @options[:from_cache]
|
42
42
|
@cache.recipe_files = @recipe.files + @recipe.base_recipes_files# I'm passing the Pathname objects
|
43
43
|
@cache.recipe_path = @recipe.path
|
@@ -93,6 +93,12 @@ module Kameleon
|
|
93
93
|
:fail_silently => fail_silently)
|
94
94
|
end
|
95
95
|
|
96
|
+
def reload_contexts
|
97
|
+
[@local_context, @out_context, @in_context].each do |ctx|
|
98
|
+
ctx.reload if ctx.shell.started?
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
96
102
|
def saving_steps_files
|
97
103
|
@recipe.files.each do |file|
|
98
104
|
Kameleon.ui.info("File #{file} loaded from the recipe")
|
@@ -182,13 +188,18 @@ module Kameleon
|
|
182
188
|
end
|
183
189
|
end
|
184
190
|
else
|
191
|
+
begin
|
185
192
|
Kameleon.ui.info("--> Running the step...")
|
186
193
|
microstep.commands.each do |cmd|
|
187
194
|
safe_exec_cmd(cmd)
|
188
195
|
end
|
196
|
+
rescue SystemExit, Interrupt
|
197
|
+
reload_contexts
|
198
|
+
breakpoint(nil)
|
199
|
+
end
|
189
200
|
end
|
190
|
-
end
|
191
201
|
Kameleon.ui.info("Step #{macrostep.name} took: #{Time.now.to_i-macrostep_time} secs")
|
202
|
+
end
|
192
203
|
end
|
193
204
|
@cleaned_sections.push(section.name)
|
194
205
|
end
|
@@ -198,7 +209,8 @@ module Kameleon
|
|
198
209
|
begin
|
199
210
|
exec_cmd(cmd, kwargs)
|
200
211
|
finished = true
|
201
|
-
rescue ExecError
|
212
|
+
rescue SystemExit, Interrupt, ExecError
|
213
|
+
reload_contexts
|
202
214
|
finished = rescue_exec_error(cmd)
|
203
215
|
end until finished
|
204
216
|
end
|
@@ -350,7 +362,7 @@ module Kameleon
|
|
350
362
|
end
|
351
363
|
end
|
352
364
|
end
|
353
|
-
@cache.stop_web_proxy if @options[:
|
365
|
+
@cache.stop_web_proxy if @options[:enable_cache] ## stopping polipo
|
354
366
|
end
|
355
367
|
|
356
368
|
def build
|
data/lib/kameleon/environment.rb
CHANGED
@@ -4,36 +4,37 @@ module Kameleon
|
|
4
4
|
# this environment
|
5
5
|
class Environment
|
6
6
|
|
7
|
-
attr_accessor :workspace
|
8
|
-
attr_accessor :templates_path
|
9
|
-
attr_accessor :build_path
|
10
|
-
attr_accessor :cache_path
|
11
|
-
attr_accessor :debug
|
12
|
-
|
13
7
|
def script?
|
14
8
|
@script
|
15
9
|
end
|
16
10
|
|
17
11
|
def initialize(options = {})
|
18
12
|
# symbolify commandline options
|
19
|
-
options = options.inject({}) {|result,(key,value)| result.update({key.to_sym => value})}
|
13
|
+
options = options.inject({}) {|result,(key, value)| result.update({key.to_sym => value})}
|
20
14
|
workspace = File.expand_path(Dir.pwd)
|
21
|
-
templates_path = File.expand_path(options[:templates_path] || Kameleon.default_templates_path)
|
15
|
+
# templates_path = File.expand_path(options[:templates_path] || Kameleon.default_templates_path)
|
22
16
|
build_path = File.expand_path(options[:build_path] || File.join(workspace, "build"))
|
23
17
|
cache_path = File.expand_path(options[:cache_path] || File.join(build_path, "cache"))
|
24
|
-
|
18
|
+
repositories_path = File.expand_path(Kameleon.default_values[:repositories_path])
|
19
|
+
env_options = {
|
25
20
|
:workspace => Pathname.new(workspace),
|
26
|
-
:templates_path => Pathname.new(templates_path),
|
21
|
+
# :templates_path => Pathname.new(templates_path),
|
27
22
|
:build_path => Pathname.new(build_path),
|
28
23
|
:cache_path => Pathname.new(cache_path),
|
24
|
+
:repositories_path => Pathname.new(repositories_path),
|
29
25
|
}
|
26
|
+
options = Kameleon.default_values.merge(options).merge(env_options)
|
30
27
|
Kameleon.ui.debug("Environment initialized (#{self})")
|
31
28
|
# Injecting all variables of the options and assign the variables
|
32
29
|
options.each do |key, value|
|
30
|
+
self.class.__send__(:attr_accessor, "#{key}")
|
33
31
|
instance_variable_set("@#{key}".to_sym, options[key])
|
34
32
|
Kameleon.ui.debug(" @#{key} : #{options[key]}")
|
35
33
|
end
|
36
34
|
@debug = true if ENV['KAMELEON_DEBUG']
|
35
|
+
|
36
|
+
Dir.mkdir(@repositories_path.to_path) unless File.exists?(@repositories_path.to_path)
|
37
|
+
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
@@ -75,7 +75,7 @@ module Kameleon
|
|
75
75
|
|
76
76
|
def check_polipo_binary
|
77
77
|
|
78
|
-
@polipo_path ||= which("polipo")
|
78
|
+
@polipo_path ||= Utils.which("polipo")
|
79
79
|
|
80
80
|
if @polipo_path.nil? then
|
81
81
|
Kameleon.ui.error("Polipo binary not found, make sure it is in your current PATH")
|
@@ -236,14 +236,6 @@ module Kameleon
|
|
236
236
|
process.wait
|
237
237
|
end
|
238
238
|
|
239
|
-
def which(cmd)
|
240
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
241
|
-
exe = File.join(path, "#{cmd}")
|
242
|
-
return path if File.executable? exe
|
243
|
-
end
|
244
|
-
return nil
|
245
|
-
end
|
246
|
-
|
247
239
|
def common_prefix(paths)
|
248
240
|
return '' if paths.empty?
|
249
241
|
return paths.first.split('/').slice(0...-1).join('/') if paths.length <= 1
|
data/lib/kameleon/recipe.rb
CHANGED
@@ -38,6 +38,7 @@ module Kameleon
|
|
38
38
|
@files = []
|
39
39
|
Kameleon.ui.debug("Initialize new recipe (#{path})")
|
40
40
|
@base_recipes_files = [@path]
|
41
|
+
@steps_dirs = []
|
41
42
|
load! :strict => false
|
42
43
|
end
|
43
44
|
|
@@ -48,12 +49,22 @@ module Kameleon
|
|
48
49
|
unless File.file? @path
|
49
50
|
yaml_recipe = YAML.load_file @path
|
50
51
|
unless yaml_recipe.kind_of? Hash
|
51
|
-
fail RecipeError, "Invalid yaml error"
|
52
|
+
fail RecipeError, "Invalid yaml error : #{@path}"
|
52
53
|
end
|
53
54
|
# Load entended recipe variables
|
54
55
|
yaml_recipe = load_base_recipe(yaml_recipe, @path)
|
55
56
|
yaml_recipe.delete("extend")
|
56
57
|
|
58
|
+
# Where we can find steps
|
59
|
+
@steps_dirs = @base_recipes_files.map do |recipe_path|
|
60
|
+
dirname = File.dirname(recipe_path)
|
61
|
+
[ File.expand_path(File.join(dirname, 'steps')),
|
62
|
+
File.expand_path(File.join(dirname, '.steps')),
|
63
|
+
File.expand_path(File.join(dirname, '..', 'steps')),
|
64
|
+
File.expand_path(File.join(dirname, '..', '.steps')),
|
65
|
+
]
|
66
|
+
end.flatten(1)
|
67
|
+
|
57
68
|
# Load Global variables
|
58
69
|
@global.merge!(yaml_recipe.fetch("global", {}))
|
59
70
|
# Resolve dynamically-defined variables !!
|
@@ -64,23 +75,17 @@ module Kameleon
|
|
64
75
|
# Loads checkpoint configuration
|
65
76
|
load_checkpoint_config(yaml_recipe)
|
66
77
|
|
67
|
-
#Find and load steps
|
68
|
-
steps_dirs = [
|
69
|
-
File.join(File.dirname(@path), 'steps'),
|
70
|
-
File.expand_path(File.join(File.dirname(@path), '..', 'steps')),
|
71
|
-
]
|
72
78
|
resolved_global['include_steps'] ||= []
|
73
79
|
resolved_global['include_steps'].push ''
|
74
80
|
resolved_global['include_steps'].flatten!
|
75
81
|
resolved_global['include_steps'].compact!
|
76
82
|
@sections.values.each do |section|
|
77
83
|
dir_to_search = resolved_global['include_steps'].map do |path|
|
78
|
-
steps_dirs.map do |steps_dir|
|
84
|
+
@steps_dirs.map do |steps_dir|
|
79
85
|
[File.join(steps_dir, section.name, path),
|
80
86
|
File.join(steps_dir, path)]
|
81
87
|
end
|
82
|
-
end
|
83
|
-
dir_to_search.flatten!
|
88
|
+
end.flatten
|
84
89
|
if yaml_recipe.key? section.name
|
85
90
|
yaml_section = yaml_recipe.fetch(section.name)
|
86
91
|
next unless yaml_section.kind_of? Array
|
@@ -157,7 +162,7 @@ module Kameleon
|
|
157
162
|
unless File.file? path
|
158
163
|
base_yaml_recipe = YAML.load_file base_recipe_path
|
159
164
|
unless yaml_recipe.kind_of? Hash
|
160
|
-
fail RecipeError, "Invalid yaml error"
|
165
|
+
fail RecipeError, "Invalid yaml error : #{base_yaml_recipe}"
|
161
166
|
end
|
162
167
|
base_yaml_recipe.keys.each do |key|
|
163
168
|
if ["export", "bootstrap", "setup"].include? key
|
@@ -186,7 +191,7 @@ module Kameleon
|
|
186
191
|
base_yaml_recipe[key] = base_section.merge(recipe_section)
|
187
192
|
end
|
188
193
|
end
|
189
|
-
@base_recipes_files.push(Pathname.new(base_recipe_path))
|
194
|
+
@base_recipes_files.push(Pathname.new(File.expand_path(base_recipe_path)))
|
190
195
|
return load_base_recipe(base_yaml_recipe, base_recipe_path)
|
191
196
|
end
|
192
197
|
|
@@ -196,11 +201,9 @@ module Kameleon
|
|
196
201
|
if aliases.kind_of? Hash
|
197
202
|
@aliases = aliases
|
198
203
|
elsif aliases.kind_of? String
|
199
|
-
dir_search =
|
200
|
-
|
201
|
-
|
202
|
-
File.join(File.dirname(@path), "aliases")
|
203
|
-
]
|
204
|
+
dir_search = @steps_dirs.map do |steps_dir|
|
205
|
+
File.join(steps_dir, "aliases")
|
206
|
+
end.flatten
|
204
207
|
dir_search.each do |dir_path|
|
205
208
|
path = Pathname.new(File.join(dir_path, aliases))
|
206
209
|
if File.file?(path)
|
@@ -210,7 +213,7 @@ module Kameleon
|
|
210
213
|
return path
|
211
214
|
end
|
212
215
|
end
|
213
|
-
fail RecipeError, "Aliases file '#{path}' does not exists"
|
216
|
+
fail RecipeError, "Aliases file for recipe '#{path}' does not exists"
|
214
217
|
end
|
215
218
|
end
|
216
219
|
end
|
@@ -222,11 +225,9 @@ module Kameleon
|
|
222
225
|
@checkpoint = checkpoint
|
223
226
|
@checkpoint["path"] = @path
|
224
227
|
elsif checkpoint.kind_of? String
|
225
|
-
dir_search =
|
226
|
-
|
227
|
-
|
228
|
-
File.join(File.dirname(@path), "checkpoints")
|
229
|
-
]
|
228
|
+
dir_search = @steps_dirs.map do |steps_dir|
|
229
|
+
File.join(steps_dir, "checkpoints")
|
230
|
+
end.flatten
|
230
231
|
dir_search.each do |dir_path|
|
231
232
|
path = Pathname.new(File.join(dir_path, checkpoint))
|
232
233
|
if File.file?(path)
|
@@ -234,6 +235,7 @@ module Kameleon
|
|
234
235
|
@checkpoint = YAML.load_file(path)
|
235
236
|
@checkpoint["path"] = path.to_s
|
236
237
|
@files.push(path)
|
238
|
+
break
|
237
239
|
end
|
238
240
|
end
|
239
241
|
fail RecipeError, "Checkpoint configuraiton file '#{path}' " \
|
@@ -250,6 +252,7 @@ module Kameleon
|
|
250
252
|
def load_macrostep(step_path, name, args)
|
251
253
|
if step_path.nil?
|
252
254
|
macrostep_yaml = args
|
255
|
+
step_path = @path
|
253
256
|
else
|
254
257
|
macrostep_yaml = YAML.load_file(step_path)
|
255
258
|
# Basic macrostep syntax check
|
@@ -547,6 +550,28 @@ module Kameleon
|
|
547
550
|
return recipe_hash
|
548
551
|
end
|
549
552
|
|
553
|
+
def display_info
|
554
|
+
def prefix
|
555
|
+
Kameleon.ui.shell.say " -> ", :blue
|
556
|
+
end
|
557
|
+
Kameleon.ui.info("Description:")
|
558
|
+
prefix ; Kameleon.ui.info("#{@metainfo['description']}")
|
559
|
+
Kameleon.ui.info("Path:")
|
560
|
+
prefix ; Kameleon.ui.info("#{@path}")
|
561
|
+
Kameleon.ui.info("Parent recipes:")
|
562
|
+
(@base_recipes_files - [@path]).each do |base_recipe_file|
|
563
|
+
prefix ; Kameleon.ui.info("#{base_recipe_file}")
|
564
|
+
end
|
565
|
+
Kameleon.ui.info("Steps:")
|
566
|
+
@files.each do |step|
|
567
|
+
prefix ; Kameleon.ui.info("#{step}")
|
568
|
+
end
|
569
|
+
Kameleon.ui.info("Variables:")
|
570
|
+
@global.each do |key, value|
|
571
|
+
prefix ; Kameleon.ui.info("#{key}: #{value}")
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
550
575
|
def to_array
|
551
576
|
array = []
|
552
577
|
@sections.values.each do |section|
|
@@ -558,8 +583,11 @@ module Kameleon
|
|
558
583
|
end
|
559
584
|
|
560
585
|
class RecipeTemplate < Recipe
|
561
|
-
def
|
562
|
-
|
586
|
+
def relative_path_from_recipe(recipe_path)
|
587
|
+
recipe_path = Pathname.new(recipe_path)
|
588
|
+
relative_path_tpl_repo = @path.relative_path_from(Kameleon.env.repositories_path)
|
589
|
+
absolute_path = Pathname.new(Kameleon.env.workspace).join(relative_path_tpl_repo)
|
590
|
+
return absolute_path.relative_path_from(recipe_path.dirname)
|
563
591
|
end
|
564
592
|
end
|
565
593
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'kameleon/utils'
|
2
|
+
require 'kameleon/step'
|
3
|
+
|
4
|
+
module Kameleon
|
5
|
+
|
6
|
+
class Repository
|
7
|
+
def self.check_git_binary
|
8
|
+
git_path ||= Utils.which("git")
|
9
|
+
if git_path.nil? then
|
10
|
+
raise KameleonError, "git binary not found, make sure it is in your current PATH"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.add(name, url, kwargs = {})
|
15
|
+
check_git_binary
|
16
|
+
cmd = ["git", "clone"]
|
17
|
+
if kwargs[:branch]
|
18
|
+
cmd.push("-b", kwargs[:branch])
|
19
|
+
end
|
20
|
+
cmd.push("--", url, File.join(Kameleon.env.repositories_path, name))
|
21
|
+
process = ChildProcess.build(*cmd)
|
22
|
+
process.io.inherit!
|
23
|
+
process.start
|
24
|
+
process.wait
|
25
|
+
process.stop
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.update(name)
|
29
|
+
check_git_binary
|
30
|
+
git_repo = File.join(Kameleon.env.repositories_path, name)
|
31
|
+
cmd = ["git", "--git-dir", File.join(git_repo, ".git"), "--work-tree",
|
32
|
+
git_repo, "pull", "--verbose"]
|
33
|
+
process = ChildProcess.build(*cmd)
|
34
|
+
process.io.inherit!
|
35
|
+
process.start
|
36
|
+
process.wait
|
37
|
+
process.stop
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.list
|
41
|
+
Dir["#{Kameleon.env.repositories_path}/*"].each do |repo_path|
|
42
|
+
Kameleon.ui.info File.basename("#{repo_path}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/kameleon/utils.rb
CHANGED
@@ -52,5 +52,54 @@ module Kameleon
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
def self.list_recipes(repository_path, kwargs = {})
|
56
|
+
catch_exception = kwargs.fetch(:catch_exception, true)
|
57
|
+
recipes_hash = []
|
58
|
+
recipes_files = get_recipes(repository_path)
|
59
|
+
recipes_files.each do |f|
|
60
|
+
path = f.to_path
|
61
|
+
begin
|
62
|
+
recipe = RecipeTemplate.new(path)
|
63
|
+
name = path.gsub(repository_path.to_path + '/', '').chomp('.yaml')
|
64
|
+
recipes_hash.push({
|
65
|
+
"name" => name,
|
66
|
+
"description" => recipe.metainfo['description'],
|
67
|
+
})
|
68
|
+
rescue => e
|
69
|
+
raise e if Kameleon.env.debug or not catch_exception
|
70
|
+
end
|
71
|
+
end
|
72
|
+
unless recipes_hash.empty?
|
73
|
+
recipes_hash = recipes_hash.sort_by{ |k| k["name"] }
|
74
|
+
name_width = recipes_hash.map { |k| k['name'].size }.max
|
75
|
+
desc_width = Kameleon.ui.shell.terminal_width - name_width - 3
|
76
|
+
desc_width = (80 - name_width - 3) if desc_width < 0
|
77
|
+
end
|
78
|
+
tp(recipes_hash,
|
79
|
+
{"name" => {:width => name_width}},
|
80
|
+
{ "description" => {:width => desc_width}})
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.get_recipes(path)
|
84
|
+
path.children.collect do |child|
|
85
|
+
if child.file?
|
86
|
+
if child.extname == ".yaml"
|
87
|
+
unless child.to_path.include? "/steps/" or child.to_path.include? "/.steps/"
|
88
|
+
child
|
89
|
+
end
|
90
|
+
end
|
91
|
+
elsif child.directory?
|
92
|
+
get_recipes(child)
|
93
|
+
end
|
94
|
+
end.select { |x| x }.flatten(1)
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.which(cmd)
|
98
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
99
|
+
exe = File.join(path, "#{cmd}")
|
100
|
+
return path if File.executable? exe
|
101
|
+
end
|
102
|
+
return nil
|
103
|
+
end
|
55
104
|
end
|
56
105
|
end
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
enabled?:
|
2
|
+
- exec_local: touch $KAMELEON_WORKDIR/list_checkpoint.txt
|
3
|
+
|
4
|
+
create:
|
5
|
+
- exec_local: echo @microstep_id | tee -a $KAMELEON_WORKDIR/list_checkpoint.txt
|
6
|
+
|
7
|
+
apply:
|
8
|
+
- exec_local: echo @microstep_id
|
9
|
+
|
10
|
+
list:
|
11
|
+
- exec_local: cat $KAMELEON_WORKDIR/list_checkpoint.txt
|
12
|
+
|
13
|
+
clear:
|
14
|
+
- exec_local: rm -f $KAMELEON_WORKDIR/list_checkpoint.txt
|