kameleon-builder 2.10.9 → 2.10.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bumpversion.cfg +1 -1
- data/CHANGES +263 -243
- data/lib/kameleon/cli.rb +62 -67
- data/lib/kameleon/context.rb +1 -1
- data/lib/kameleon/engine.rb +147 -101
- data/lib/kameleon/recipe.rb +26 -5
- data/lib/kameleon/shell.rb +2 -2
- data/lib/kameleon/step.rb +5 -3
- data/lib/kameleon/utils.rb +1 -1
- data/lib/kameleon/version.rb +1 -1
- data/tests/recipes/test_recipe_checkpoints.yaml +77 -0
- metadata +4 -2
data/lib/kameleon/cli.rb
CHANGED
@@ -11,7 +11,7 @@ module Kameleon
|
|
11
11
|
class Repository < Thor
|
12
12
|
include Thor::Actions
|
13
13
|
|
14
|
-
desc "add <NAME> <GIT_URL>", "
|
14
|
+
desc "add <NAME> <GIT_URL>", "Add a new repository named <NAME> cloned from <GIT_URL>"
|
15
15
|
method_option :branch, :type => :string,
|
16
16
|
:default => nil,
|
17
17
|
:desc => "checkout <BRANCH>",
|
@@ -20,7 +20,7 @@ module Kameleon
|
|
20
20
|
Kameleon::Repository.add(name, url, options)
|
21
21
|
end
|
22
22
|
|
23
|
-
desc "list", "
|
23
|
+
desc "list", "List available repositories"
|
24
24
|
method_option :git, :type => :boolean,
|
25
25
|
:default => true,
|
26
26
|
:desc => "show the git repository and branch each repository comes from"
|
@@ -28,7 +28,7 @@ module Kameleon
|
|
28
28
|
Kameleon::Repository.list(options)
|
29
29
|
end
|
30
30
|
|
31
|
-
desc "update <NAME>", "
|
31
|
+
desc "update <NAME>", "Update repository named <NAME> from git"
|
32
32
|
def update(name)
|
33
33
|
Kameleon::Repository.update(name)
|
34
34
|
end
|
@@ -38,7 +38,7 @@ module Kameleon
|
|
38
38
|
Kameleon::Repository.remove(name)
|
39
39
|
end
|
40
40
|
|
41
|
-
desc "commands", "
|
41
|
+
desc "commands", "List all available commands", :hide => true
|
42
42
|
def commands
|
43
43
|
puts Repository.all_commands.keys - ["commands"]
|
44
44
|
end
|
@@ -56,7 +56,7 @@ module Kameleon
|
|
56
56
|
Kameleon.env.repositories_path
|
57
57
|
end
|
58
58
|
|
59
|
-
desc "list", "
|
59
|
+
desc "list", "List all available templates"
|
60
60
|
method_option :progress, :type => :boolean, :default => true,
|
61
61
|
:desc => "Show progress bar while resolving templates",
|
62
62
|
:aliases => "-p"
|
@@ -69,10 +69,10 @@ module Kameleon
|
|
69
69
|
Utils.list_recipes(Kameleon.env.repositories_path, options[:filter], options[:progress], true)
|
70
70
|
end
|
71
71
|
|
72
|
-
desc "import <TEMPLATE_NAME>", "
|
72
|
+
desc "import <TEMPLATE_NAME>", "Import the given template"
|
73
73
|
method_option :global, :type => :hash,
|
74
74
|
:default => {}, :aliases => "-g",
|
75
|
-
:desc => "Set custom global variables
|
75
|
+
:desc => "Set custom global variables"
|
76
76
|
def import(template_name)
|
77
77
|
Kameleon.env.root_dir = Kameleon.env.repositories_path
|
78
78
|
template_path = File.join(Kameleon.env.repositories_path, template_name)
|
@@ -104,7 +104,7 @@ module Kameleon
|
|
104
104
|
desc "info <TEMPLATE_NAME>", "Display detailed information about a template"
|
105
105
|
method_option :global, :type => :hash,
|
106
106
|
:default => {}, :aliases => "-g",
|
107
|
-
:desc => "Set custom global variables
|
107
|
+
:desc => "Set custom global variables"
|
108
108
|
def info(template_name)
|
109
109
|
Kameleon.env.root_dir = Kameleon.env.repositories_path
|
110
110
|
template_path = File.join(Kameleon.env.repositories_path, template_name)
|
@@ -133,7 +133,7 @@ module Kameleon
|
|
133
133
|
copy_file(Pathname.new(Kameleon.erb_dirpath).join("extend.yaml.erb"), erb_file)
|
134
134
|
end
|
135
135
|
|
136
|
-
desc "commands", "
|
136
|
+
desc "commands", "List all available commands", :hide => true
|
137
137
|
def commands
|
138
138
|
puts Template.all_commands.keys - ["commands"]
|
139
139
|
end
|
@@ -147,22 +147,22 @@ module Kameleon
|
|
147
147
|
class Main < Thor
|
148
148
|
include Thor::Actions
|
149
149
|
|
150
|
-
desc 'repository <SUBCOMMAND>', '
|
150
|
+
desc 'repository <SUBCOMMAND>', 'Manage repositories of recipes'
|
151
151
|
subcommand 'repository', CLI::Repository
|
152
|
-
desc 'template <SUBCOMMAND>', '
|
152
|
+
desc 'template <SUBCOMMAND>', 'List and import templates'
|
153
153
|
subcommand 'template', CLI::Template
|
154
154
|
|
155
155
|
class_option :color, :type => :boolean, :default => Kameleon.default_values[:color],
|
156
|
-
:desc => "
|
156
|
+
:desc => "Enable colorization in output"
|
157
157
|
class_option :verbose, :type => :boolean, :default => Kameleon.default_values[:verbose],
|
158
|
-
:desc => "
|
158
|
+
:desc => "Enable verbose output for kameleon users"
|
159
159
|
class_option :debug, :type => :boolean, :default => Kameleon.default_values[:debug],
|
160
|
-
:desc => "
|
160
|
+
:desc => "Enable debug output for kameleon developpers"
|
161
161
|
class_option :script, :type => :boolean, :default => Kameleon.default_values[:script],
|
162
|
-
:desc => "Never
|
162
|
+
:desc => "Never prompt for user intervention",
|
163
163
|
:aliases => "-s"
|
164
164
|
|
165
|
-
desc "version", "
|
165
|
+
desc "version", "Print the Kameleon's version information"
|
166
166
|
def version
|
167
167
|
puts "Kameleon version #{Kameleon::VERSION}"
|
168
168
|
end
|
@@ -171,7 +171,7 @@ module Kameleon
|
|
171
171
|
Kameleon.env.repositories_path
|
172
172
|
end
|
173
173
|
|
174
|
-
desc "list", "
|
174
|
+
desc "list", "List all defined recipes in the current directory"
|
175
175
|
method_option :progress, :type => :boolean, :default => false,
|
176
176
|
:desc => "Show progress bar while resolving recipes",
|
177
177
|
:aliases => "-p"
|
@@ -183,10 +183,10 @@ module Kameleon
|
|
183
183
|
Utils.list_recipes(Kameleon.env.workspace, options[:filter], options[:progress])
|
184
184
|
end
|
185
185
|
|
186
|
-
desc "new <RECIPE_PATH> <TEMPLATE_NAME>", "
|
186
|
+
desc "new <RECIPE_PATH> <TEMPLATE_NAME>", "Create a new recipe from template <TEMPLATE_NAME>"
|
187
187
|
method_option :global, :type => :hash,
|
188
188
|
:default => {}, :aliases => "-g",
|
189
|
-
:desc => "Set custom global variables
|
189
|
+
:desc => "Set custom global variables"
|
190
190
|
def new(recipe_name, template_name)
|
191
191
|
Kameleon.env.root_dir = Kameleon.env.repositories_path
|
192
192
|
unless template_name.end_with? '.yaml'
|
@@ -248,7 +248,7 @@ module Kameleon
|
|
248
248
|
desc "info <RECIPE_PATH>", "Display detailed information about a recipe"
|
249
249
|
method_option :global, :type => :hash,
|
250
250
|
:default => {}, :aliases => "-g",
|
251
|
-
:desc => "Set custom global variables
|
251
|
+
:desc => "Set custom global variables"
|
252
252
|
method_option :from_cache, :type => :string,
|
253
253
|
:default => nil,
|
254
254
|
:desc => "Get info from a persistent cache tar file (ignore recipe path)"
|
@@ -280,7 +280,7 @@ module Kameleon
|
|
280
280
|
desc "dag <RECIPE_PATH> [<RECIPE_PATH> [<...>]]", "Draw a DAG of the steps to build one or more recipes"
|
281
281
|
method_option :global, :type => :hash,
|
282
282
|
:default => {}, :aliases => "-g",
|
283
|
-
:desc => "Set custom global variables
|
283
|
+
:desc => "Set custom global variables"
|
284
284
|
method_option :file, :type => :string,
|
285
285
|
:default => "/tmp/kameleon.dag",
|
286
286
|
:desc => "DAG output filename"
|
@@ -319,25 +319,10 @@ module Kameleon
|
|
319
319
|
Kameleon.ui.info("Generated GraphViz #{format} file: #{options[:file]}")
|
320
320
|
end
|
321
321
|
|
322
|
-
desc "dryrun <RECIPE_PATH>", "Show the steps the build would process"
|
323
|
-
method_option :global, :type => :hash,
|
324
|
-
:default => {}, :aliases => "-g",
|
325
|
-
:desc => "Set custom global variables."
|
326
|
-
method_option :relative, :type => :boolean,
|
327
|
-
:default => false,
|
328
|
-
:desc => "Make pathnames relative to the current working directory"
|
329
|
-
def dryrun(*recipe_paths)
|
330
|
-
raise ArgumentError if recipe_paths.empty?
|
331
|
-
recipe_paths.each do |path|
|
332
|
-
recipe = Kameleon::Recipe.new(path)
|
333
|
-
Kameleon::Engine.new(recipe, options.dup.merge({no_create_build_dir: true}).freeze).dryrun
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
322
|
desc "export <RECIPE_PATH> <EXPORT_PATH>", "Export the given recipe with its steps and data to a given directory"
|
338
323
|
method_option :global, :type => :hash,
|
339
324
|
:default => {}, :aliases => "-g",
|
340
|
-
:desc => "Set custom global variables
|
325
|
+
:desc => "Set custom global variables"
|
341
326
|
method_option :add, :type => :boolean,
|
342
327
|
:default => false, :aliases => "-A",
|
343
328
|
:desc => "export recipe and steps to an existing directory (this may overwrite some existing files)"
|
@@ -377,56 +362,64 @@ module Kameleon
|
|
377
362
|
end
|
378
363
|
end
|
379
364
|
|
380
|
-
desc "build <RECIPE_PATH>", "
|
365
|
+
desc "build <RECIPE_PATH>", "Build the appliance from the given recipe"
|
381
366
|
method_option :build_path, :type => :string,
|
382
367
|
:default => nil, :aliases => "-b",
|
383
|
-
:desc => "
|
368
|
+
:desc => "Set the build directory path"
|
384
369
|
method_option :clean, :type => :boolean,
|
385
370
|
:default => false,
|
386
|
-
:desc => "
|
387
|
-
method_option :
|
371
|
+
:desc => "Run the command `kameleon clean` first"
|
372
|
+
method_option :dryrun, :type => :boolean, :aliases => "-d",
|
373
|
+
:default => false,
|
374
|
+
:desc => "Dry run, only show what would run"
|
375
|
+
method_option :relative, :type => :boolean,
|
376
|
+
:default => false,
|
377
|
+
:desc => "Make dryrun show pathnames relative to the current working directory"
|
378
|
+
method_option :from_checkpoint, :type => :string, :aliases => "-F",
|
379
|
+
:default => nil,
|
380
|
+
:desc => "Restart the build from a specific checkpointed step, instead of the latest one"
|
381
|
+
method_option :begin_checkpoint, :type => :string, :aliases => "-B",
|
388
382
|
:default => nil,
|
389
|
-
:desc => "
|
390
|
-
|
391
|
-
|
383
|
+
:desc => "Only create checkpoints after the given step"
|
384
|
+
method_option :end_checkpoint, :type => :string, :aliases => "-E",
|
385
|
+
:default => nil,
|
386
|
+
:desc => "Do not create checkpoints after the given step"
|
387
|
+
method_option :enable_checkpointing, :type => :boolean, :aliases => "-c",
|
392
388
|
:default => false,
|
393
|
-
:desc => "
|
394
|
-
method_option :
|
389
|
+
:desc => "Enable creating and using checkpoints"
|
390
|
+
method_option :microstep_checkpoints, :type => :string,
|
395
391
|
:enum => ["first", "all"],
|
396
|
-
:default => "
|
392
|
+
:default => "all",
|
397
393
|
:desc => "Create checkpoint of the first microstep only, or all"
|
398
|
-
method_option :list_checkpoints, :type => :boolean, :aliases => "
|
394
|
+
method_option :list_checkpoints, :type => :boolean, :aliases => "-l",
|
399
395
|
:default => false,
|
400
|
-
:desc => "
|
401
|
-
method_option :enable_cache, :type => :boolean,
|
396
|
+
:desc => "List availables checkpoints"
|
397
|
+
method_option :enable_cache, :type => :boolean, :aliases => "-C",
|
402
398
|
:default => false,
|
403
|
-
:desc => "
|
399
|
+
:desc => "Generate a persistent cache for the appliance"
|
404
400
|
method_option :cache_path, :type => :string,
|
405
401
|
:default => nil,
|
406
|
-
:desc => "
|
402
|
+
:desc => "Set the cache directory path"
|
407
403
|
method_option :from_cache, :type => :string,
|
408
404
|
:default => nil,
|
409
|
-
:desc => "
|
405
|
+
:desc => "Use a persistent cache tar file to build the image"
|
410
406
|
method_option :cache_archive_compression, :type => :string,
|
411
407
|
:enum => ["none", "gzip", "bz2", "xz"],
|
412
408
|
:default => "gzip",
|
413
|
-
:desc => "Set the persistent cache tar file compression
|
409
|
+
:desc => "Set the persistent cache tar file compression"
|
414
410
|
method_option :polipo_path, :type => :string,
|
415
411
|
:default => nil,
|
416
|
-
:desc => "Full path of the polipo binary to use for the persistent cache
|
412
|
+
:desc => "Full path of the polipo binary to use for the persistent cache"
|
417
413
|
method_option :proxy, :type => :string, :default => "",
|
418
|
-
:desc => "
|
419
|
-
"proxy; it should have the form 'host:port'"
|
414
|
+
:desc => "HTTP proxy address and port (expected format is hostname:port)"
|
420
415
|
method_option :proxy_credentials, :type => :string, :default => "",
|
421
|
-
:desc => "
|
422
|
-
"proxy requires authorisation it should have the "\
|
423
|
-
"form 'username:password'"
|
416
|
+
:desc => "Username and password if required by the parent proxy (expected format is username:password)"
|
424
417
|
method_option :proxy_offline, :type => :boolean,
|
425
|
-
:default => false,
|
426
|
-
:desc => "
|
418
|
+
:default => false,
|
419
|
+
:desc => "Prevent Polipo from contacting remote servers"
|
427
420
|
method_option :global, :type => :hash,
|
428
421
|
:default => {}, :aliases => "-g",
|
429
|
-
:desc => "Set custom global variables
|
422
|
+
:desc => "Set custom global variables"
|
430
423
|
def build(recipe_path=nil)
|
431
424
|
if recipe_path.nil? && !options[:from_cache].nil?
|
432
425
|
unless File.file?(options[:from_cache])
|
@@ -440,7 +433,9 @@ module Kameleon
|
|
440
433
|
end
|
441
434
|
raise BuildError, "A recipe file or a persistent cache archive " \
|
442
435
|
"is required to run this command." if recipe_path.nil?
|
443
|
-
if options[:
|
436
|
+
if options[:dryrun]
|
437
|
+
Kameleon::Engine.new(Kameleon::Recipe.new(recipe_path), options.dup.merge({no_create_build_dir: true}).freeze).dryrun
|
438
|
+
elsif options[:clean]
|
444
439
|
opts = Hash.new.merge options
|
445
440
|
opts[:lazyload] = false
|
446
441
|
opts[:fail_silently] = true
|
@@ -458,11 +453,11 @@ module Kameleon
|
|
458
453
|
total_time = Time.now.to_i - start_time
|
459
454
|
Kameleon.ui.info("")
|
460
455
|
Kameleon.ui.info("Successfully built '#{recipe_path}'")
|
461
|
-
Kameleon.ui.info("Total duration
|
456
|
+
Kameleon.ui.info("Total duration: #{total_time} secs")
|
462
457
|
end
|
463
458
|
end
|
464
459
|
|
465
|
-
desc "commands", "
|
460
|
+
desc "commands", "List all available commands", :hide => true
|
466
461
|
def commands(context="main")
|
467
462
|
Kameleon.ui.debug("Commands for '#{context}':")
|
468
463
|
case context
|
@@ -475,7 +470,7 @@ module Kameleon
|
|
475
470
|
end
|
476
471
|
end
|
477
472
|
|
478
|
-
desc "source_root", "
|
473
|
+
desc "source_root", "Print the kameleon directory path", :hide => true
|
479
474
|
def source_root
|
480
475
|
puts Kameleon.source_root
|
481
476
|
end
|
data/lib/kameleon/context.rb
CHANGED
@@ -79,7 +79,7 @@ module Kameleon
|
|
79
79
|
do_log(out, log_level) unless out.nil?
|
80
80
|
do_log(err, "error") unless err.nil?
|
81
81
|
end
|
82
|
-
Kameleon.ui.verbose("Exit status
|
82
|
+
Kameleon.ui.verbose("Exit status: #{exit_status}")
|
83
83
|
fail ExecError unless exit_status.eql? 0
|
84
84
|
rescue ShellError, Errno::EPIPE => e
|
85
85
|
Kameleon.ui.verbose("Shell cmd failed to launch: #{@shell.shell_cmd}")
|