kameleon-builder 2.10.2 → 2.10.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bumpversion.cfg +2 -2
- data/CHANGES +39 -0
- data/RELEASING.md +69 -0
- data/bin/kameleon +1 -1
- data/completion/kameleon.bash +15 -4
- data/erb/extend.yaml.erb +24 -0
- data/erb/{userconf.erb → userconf.yaml.erb} +1 -0
- data/kameleon-builder.gemspec +5 -4
- data/lib/kameleon/cli.rb +111 -49
- data/lib/kameleon/recipe.rb +2 -2
- data/lib/kameleon/shell.rb +10 -5
- data/lib/kameleon/utils.rb +40 -8
- data/lib/kameleon/version.rb +1 -2
- data/lib/kameleon.rb +9 -3
- metadata +23 -10
- data/RELEASING.rst +0 -29
- data/erb/extend.erb +0 -33
- data/version.txt +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3fd959d36bbd756d9a632b39e1d9bdd1bcaa5a0c4fd8104187041473dbd4ae0
|
4
|
+
data.tar.gz: 3d36533205a0a55d3e2622ff1f713f4c2432f6cd48c34afc9bd35006855e9302
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2915fa5554adacbbeda1d03655bf995ab8191e9396649adc2cd158a386926b00f991da040144bb35b5d15ca37e127222400749f3d82c6e00fe934cce4bf851f2
|
7
|
+
data.tar.gz: c0c5754fcffb10f0c1d80b5523accf99768facc1468190ffd3991842d05edeacdedfef9d0b5651dc844b90dddc8c535234de2214f1d47177c42fbeada596531c
|
data/.bumpversion.cfg
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
[bumpversion]
|
2
2
|
commit = True
|
3
3
|
tag = True
|
4
|
-
current_version = 2.10.
|
4
|
+
current_version = 2.10.6
|
5
5
|
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+))?
|
6
6
|
serialize =
|
7
7
|
{major}.{minor}.{patch}.{release}
|
8
8
|
{major}.{minor}.{patch}
|
9
9
|
|
10
|
-
[bumpversion:file:version.
|
10
|
+
[bumpversion:file:lib/kameleon/version.rb]
|
11
11
|
|
12
12
|
[bumpversion:part:release]
|
13
13
|
optional_value = gamma
|
data/CHANGES
CHANGED
@@ -1,10 +1,49 @@
|
|
1
1
|
Kameleon CHANGELOG
|
2
2
|
==================
|
3
3
|
|
4
|
+
Version 2.10.6
|
5
|
+
--------------
|
6
|
+
|
7
|
+
Released on November 24th 2021
|
8
|
+
|
9
|
+
- Add the option filter for the template and recipe listings
|
10
|
+
- Preserve permission of files when importing template
|
11
|
+
|
12
|
+
Version 2.10.5
|
13
|
+
--------------
|
14
|
+
|
15
|
+
Released on July 29th 2021
|
16
|
+
|
17
|
+
- Remove polipo from the software dependencies as it is not maintained anymore. This breaks the caching feature.
|
18
|
+
- Some changes to allow a debian packaging.
|
19
|
+
- Update authors.
|
20
|
+
- Change the version information file and update scripts accordingly.
|
21
|
+
|
22
|
+
Version 2.10.4
|
23
|
+
--------------
|
24
|
+
|
25
|
+
Released on May 11th 2020
|
26
|
+
|
27
|
+
- Fix support for extend ERB
|
28
|
+
- Add the `kameleon template erb` command
|
29
|
+
- Fix bash completion
|
30
|
+
- Cosmetic code fixes
|
31
|
+
|
32
|
+
Version 2.10.3
|
33
|
+
--------------
|
34
|
+
|
35
|
+
Released on April 10th 2020
|
36
|
+
|
37
|
+
- Rework kameleon template list: add color add progress bar
|
38
|
+
- Make bash completion understand the subcommands
|
39
|
+
- Fix the command help -> `kameleon <command> -h`
|
40
|
+
- Add support for custom extend erb templates
|
41
|
+
|
4
42
|
Version 2.10.2
|
5
43
|
--------------
|
6
44
|
|
7
45
|
Released on April 09th 2020
|
46
|
+
|
8
47
|
- Fix cli help for the repository and template sub-commands
|
9
48
|
- Add the git remote url and branch to kameleon repo list
|
10
49
|
- Add the 'kameleon repository remove' command
|
data/RELEASING.md
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
About releases:
|
2
|
+
===============
|
3
|
+
You can use the script ``./scripts/bumpversion.py`` which will handle
|
4
|
+
everything (incrementation, git tag creation, changelog update).
|
5
|
+
First you need to install bumpversion using pip::
|
6
|
+
```
|
7
|
+
sudo pip install bumpversion
|
8
|
+
```
|
9
|
+
Assuming work is done in the devel branch.
|
10
|
+
|
11
|
+
For stable releases:
|
12
|
+
--------------------
|
13
|
+
|
14
|
+
## Merge devel into master:
|
15
|
+
```
|
16
|
+
git checkout master
|
17
|
+
git merge devel
|
18
|
+
```
|
19
|
+
|
20
|
+
## Fix anything needed
|
21
|
+
Should be no conflict but...
|
22
|
+
Make sure changelog is up to date.
|
23
|
+
|
24
|
+
## Bump version
|
25
|
+
***Warning*** Make sure that there is no dirty file (not committed) before the following.
|
26
|
+
```
|
27
|
+
./scripts/bumpversion.py release # will do 2.7.0.dev -> 2.7.0 + git tag + changelog
|
28
|
+
git push
|
29
|
+
```
|
30
|
+
|
31
|
+
## Build gem
|
32
|
+
```
|
33
|
+
gem build kameleon-builder.gemspec
|
34
|
+
```
|
35
|
+
|
36
|
+
## Push to Ruby gem repository
|
37
|
+
```
|
38
|
+
gem push kameleon-builder-2.7.0.gem
|
39
|
+
```
|
40
|
+
|
41
|
+
Note: You need a rubygem account and the owner has to give you permissions so that you can push.
|
42
|
+
To do so, create an account on https://rubygems.org/ and ask an owner to do
|
43
|
+
the following command::
|
44
|
+
|
45
|
+
```
|
46
|
+
gem owner kameleon-builder -a your@email.com
|
47
|
+
```
|
48
|
+
|
49
|
+
That's all :)
|
50
|
+
|
51
|
+
For devel releases:
|
52
|
+
-------------------
|
53
|
+
|
54
|
+
## Move to the devel branch and rebase on master
|
55
|
+
```
|
56
|
+
git checkout devel
|
57
|
+
git rebase master
|
58
|
+
```
|
59
|
+
|
60
|
+
## Prepare the new version
|
61
|
+
Create the new devel version (e.g. 2.7.0 dev)
|
62
|
+
```
|
63
|
+
./scripts/bumpversion.py newversion patch # 2.6.7 -> 2.7.0.dev
|
64
|
+
```
|
65
|
+
|
66
|
+
At this point, do work, commit, and so on.
|
67
|
+
And same as above to build "devel" gem and use them locally, or push them if really wanted.
|
68
|
+
|
69
|
+
Up to the time to build a new stable version.
|
data/bin/kameleon
CHANGED
data/completion/kameleon.bash
CHANGED
@@ -2,12 +2,23 @@
|
|
2
2
|
|
3
3
|
_kameleon() {
|
4
4
|
COMPREPLY=()
|
5
|
-
local
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
local i=1
|
6
|
+
while [ $i -le "$COMP_CWORD" -a "${COMP_WORDS[$i]:0:1}" == "-" ]; do
|
7
|
+
((i++))
|
8
|
+
done
|
9
|
+
if [ "$COMP_CWORD" -eq $i ]; then
|
10
|
+
local commands="$(compgen -W "$(kameleon commands)" -- "${COMP_WORDS[$i]}")"
|
9
11
|
COMPREPLY=( $commands $projects )
|
10
12
|
fi
|
13
|
+
while [ $i -le "$COMP_CWORD" -a "${COMP_WORDS[$i]:0:1}" == "-" ]; do
|
14
|
+
((i++))
|
15
|
+
done
|
16
|
+
if [ "$COMP_CWORD" -eq $((i+1)) ] && kameleon commands | grep -q "${COMP_WORDS[$i]}" ; then
|
17
|
+
if kameleon help | grep -qe "^ kameleon ${COMP_WORDS[$i]}[a-z]* <SUBCOMMAND>"; then
|
18
|
+
local commands="$(compgen -W "$(kameleon ${COMP_WORDS[$i]} commands)" -- "${COMP_WORDS[$((i+1))]}")"
|
19
|
+
COMPREPLY=( $commands $projects )
|
20
|
+
fi
|
21
|
+
fi
|
11
22
|
}
|
12
23
|
|
13
24
|
complete -o default -F _kameleon kameleon
|
data/erb/extend.yaml.erb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# vim: softtabstop=2 shiftwidth=2 expandtab fenc=utf-8 cc=81 tw=80
|
3
|
+
#==============================================================================
|
4
|
+
#
|
5
|
+
# DESCRIPTION: <MY RECIPE DESCRIPTION>
|
6
|
+
#
|
7
|
+
#==============================================================================
|
8
|
+
# This recipe extends another. To look at the step involed, run:
|
9
|
+
# kameleon dryrun <%= recipe_name %>
|
10
|
+
# To see the variables that you can override, use the following command:
|
11
|
+
# kameleon info <%= recipe_name %>
|
12
|
+
---
|
13
|
+
extend: <%= tpl.relative_path_from_recipe(recipe_path) %>
|
14
|
+
|
15
|
+
global:
|
16
|
+
|
17
|
+
bootstrap:
|
18
|
+
- "@base"
|
19
|
+
|
20
|
+
setup:
|
21
|
+
- "@base"
|
22
|
+
|
23
|
+
export:
|
24
|
+
- "@base"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
---
|
2
2
|
repositories_path: <%= Kameleon.default_values[:repositories_path] %>
|
3
|
+
extend_yaml_erb: <%= Kameleon.default_values[:extend_yaml_erb] %>
|
3
4
|
script: <%= Kameleon.default_values[:script] %>
|
4
5
|
color: <%= Kameleon.default_values[:color] %>
|
5
6
|
debug: <%= Kameleon.default_values[:debug] %>
|
data/kameleon-builder.gemspec
CHANGED
@@ -12,13 +12,13 @@ Gem::Specification.new do |s|
|
|
12
12
|
'Cristan Ruiz',
|
13
13
|
'Pierre Neyron',
|
14
14
|
'Bruno Bzeznik']
|
15
|
-
s.email = ['salem
|
16
|
-
'michael.mercier@
|
17
|
-
'
|
15
|
+
s.email = ['salem@harrache.info',
|
16
|
+
'michael.mercier@libr.fr',
|
17
|
+
'camilo1729@gmail.com',
|
18
18
|
'pierre.neyron@imag.fr',
|
19
19
|
'bruno.bzeznik@imag.fr']
|
20
20
|
s.description = %q{The mindful appliance builder}
|
21
|
-
s.summary = %q{Kameleon is a tool to build
|
21
|
+
s.summary = %q{Kameleon is a tool to build system appliances from scratch}
|
22
22
|
s.homepage = 'http://kameleon.imag.fr/'
|
23
23
|
s.license = 'GPL-2.0'
|
24
24
|
|
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.add_dependency 'table_print', '~> 1.5'
|
34
34
|
s.add_dependency 'psych', '~> 2.0'
|
35
35
|
s.add_dependency 'ruby-graphviz', '~> 1.2'
|
36
|
+
s.add_dependency 'progressbar', '~> 1'
|
36
37
|
|
37
38
|
s.requirements = ['polipo 1.0.3, or greater', 'graphviz 2.38.0 or greater']
|
38
39
|
end
|
data/lib/kameleon/cli.rb
CHANGED
@@ -11,8 +11,8 @@ module Kameleon
|
|
11
11
|
class Repository < Thor
|
12
12
|
include Thor::Actions
|
13
13
|
|
14
|
-
desc "add <NAME> <GIT_URL>", "Adds a new repository named <NAME> cloned from
|
15
|
-
method_option :branch, :type => :string
|
14
|
+
desc "add <NAME> <GIT_URL>", "Adds a new repository named <NAME> cloned from <GIT_URL>."
|
15
|
+
method_option :branch, :type => :string,
|
16
16
|
:default => nil,
|
17
17
|
:desc => "checkout <BRANCH>",
|
18
18
|
:aliases => "-b"
|
@@ -32,37 +32,45 @@ module Kameleon
|
|
32
32
|
def update(name)
|
33
33
|
Kameleon::Repository.update(name)
|
34
34
|
end
|
35
|
-
map %w(-h --help) => :help
|
36
|
-
map %w(ls) => :list
|
37
35
|
|
38
36
|
desc "remove <NAME>", "Remove repository named <NAME>"
|
39
37
|
def remove(name)
|
40
38
|
Kameleon::Repository.remove(name)
|
41
39
|
end
|
42
|
-
|
40
|
+
|
41
|
+
desc "commands", "Lists all available commands", :hide => true
|
42
|
+
def commands
|
43
|
+
puts Repository.all_commands.keys - ["commands"]
|
44
|
+
end
|
45
|
+
|
43
46
|
map %w(ls) => :list
|
44
47
|
map %w(rm) => :remove
|
48
|
+
map %w(completions) => :commands
|
45
49
|
end
|
46
50
|
|
47
51
|
|
48
52
|
class Template < Thor
|
49
53
|
include Thor::Actions
|
50
54
|
|
51
|
-
# register CLI::Repository, 'repository', 'repository', 'Manages set of remote git repositories'
|
52
|
-
|
53
55
|
def self.source_root
|
54
56
|
Kameleon.env.repositories_path
|
55
57
|
end
|
56
58
|
|
57
59
|
desc "list", "Lists all available templates"
|
60
|
+
method_option :progress, :type => :boolean, :default => true,
|
61
|
+
:desc => "Show progress bar while resolving templates",
|
62
|
+
:aliases => "-p"
|
63
|
+
method_option :filter, :type => :string, :default => '',
|
64
|
+
:desc => "Filter templates with the given regexp",
|
65
|
+
:aliases => "-f"
|
58
66
|
def list
|
59
|
-
Kameleon.ui.
|
60
|
-
|
61
|
-
Utils.list_recipes(Kameleon.env.repositories_path)
|
67
|
+
Kameleon.ui.shell.say "Recipe templates available in: ", :red, false
|
68
|
+
Kameleon.ui.shell.say Kameleon.env.repositories_path.to_s, :yellow
|
69
|
+
Utils.list_recipes(Kameleon.env.repositories_path, options[:filter], options[:progress], true)
|
62
70
|
end
|
63
71
|
|
64
72
|
desc "import <TEMPLATE_NAME>", "Imports the given template"
|
65
|
-
method_option :global, :type => :hash
|
73
|
+
method_option :global, :type => :hash,
|
66
74
|
:default => {}, :aliases => "-g",
|
67
75
|
:desc => "Set custom global variables."
|
68
76
|
def import(template_name)
|
@@ -88,12 +96,13 @@ module Kameleon
|
|
88
96
|
relative_path = path.relative_path_from(Kameleon.env.repositories_path)
|
89
97
|
dst = File.join(Kameleon.env.workspace, relative_path)
|
90
98
|
copy_file(path, dst)
|
99
|
+
chmod(dst, File.stat(path).mode, {:verbose=>false})
|
91
100
|
end
|
92
101
|
end
|
93
102
|
end
|
94
103
|
|
95
104
|
desc "info <TEMPLATE_NAME>", "Display detailed information about a template"
|
96
|
-
method_option :global, :type => :hash
|
105
|
+
method_option :global, :type => :hash,
|
97
106
|
:default => {}, :aliases => "-g",
|
98
107
|
:desc => "Set custom global variables."
|
99
108
|
def info(template_name)
|
@@ -110,8 +119,27 @@ module Kameleon
|
|
110
119
|
tpl.resolve! :strict => false
|
111
120
|
tpl.display_info(false)
|
112
121
|
end
|
113
|
-
|
122
|
+
|
123
|
+
desc "erb <PATH>", "Create a extend recipe ERB file"
|
124
|
+
def erb(path)
|
125
|
+
if File.directory?(path)
|
126
|
+
erb_file = Pathname.new(path).join(Kameleon.default_values[:extend_yaml_erb])
|
127
|
+
elsif File.file?(path) and path.end_with?(".yaml")
|
128
|
+
erb_file = Pathname.new(path.gsub(%r{^(.+?/)?([^/]+?)(\.yaml)?$},'\1.\2') + Kameleon.default_values[:extend_yaml_erb])
|
129
|
+
else
|
130
|
+
fail KameleonError, "Invalid path '#{path}', please give a path to a yaml file or a directory"
|
131
|
+
end
|
132
|
+
Kameleon.ui.verbose("Create extend recipe ERB '#{erb_file}'")
|
133
|
+
copy_file(Pathname.new(Kameleon.erb_dirpath).join("extend.yaml.erb"), erb_file)
|
134
|
+
end
|
135
|
+
|
136
|
+
desc "commands", "Lists all available commands", :hide => true
|
137
|
+
def commands
|
138
|
+
puts Template.all_commands.keys - ["commands"]
|
139
|
+
end
|
140
|
+
|
114
141
|
map %w(ls) => :list
|
142
|
+
map %w(completions) => :commands
|
115
143
|
end
|
116
144
|
end
|
117
145
|
|
@@ -133,26 +161,30 @@ module Kameleon
|
|
133
161
|
class_option :script, :type => :boolean, :default => Kameleon.default_values[:script],
|
134
162
|
:desc => "Never prompts for user intervention",
|
135
163
|
:aliases => "-s"
|
136
|
-
map %w(-h --help) => :help
|
137
164
|
|
138
165
|
desc "version", "Prints the Kameleon's version information"
|
139
166
|
def version
|
140
167
|
puts "Kameleon version #{Kameleon::VERSION}"
|
141
168
|
end
|
142
|
-
map %w(-v --version) => :version
|
143
169
|
|
144
170
|
def self.source_root
|
145
171
|
Kameleon.env.repositories_path
|
146
172
|
end
|
147
173
|
|
148
174
|
desc "list", "Lists all defined recipes in the current directory"
|
175
|
+
method_option :progress, :type => :boolean, :default => false,
|
176
|
+
:desc => "Show progress bar while resolving recipes",
|
177
|
+
:aliases => "-p"
|
178
|
+
method_option :filter, :type => :string, :default => '',
|
179
|
+
:desc => "Filter recipes with the given regexp",
|
180
|
+
:aliases => "-f"
|
149
181
|
def list
|
150
|
-
|
182
|
+
Kameleon.ui.shell.say "Workspace recipes:", :red
|
183
|
+
Utils.list_recipes(Kameleon.env.workspace, options[:filter], options[:progress])
|
151
184
|
end
|
152
|
-
map %w(ls) => :list
|
153
185
|
|
154
186
|
desc "new <RECIPE_PATH> <TEMPLATE_NAME>", "Creates a new recipe from template <TEMPLATE_NAME>"
|
155
|
-
method_option :global, :type => :hash
|
187
|
+
method_option :global, :type => :hash,
|
156
188
|
:default => {}, :aliases => "-g",
|
157
189
|
:desc => "Set custom global variables."
|
158
190
|
def new(recipe_name, template_name)
|
@@ -187,14 +219,25 @@ module Kameleon
|
|
187
219
|
relative_path = path.relative_path_from(Kameleon.env.repositories_path)
|
188
220
|
dst = File.join(Kameleon.env.workspace, relative_path)
|
189
221
|
copy_file(path, dst)
|
222
|
+
chmod(dst, File.stat(path).mode, {:verbose=>false})
|
190
223
|
end
|
191
224
|
Dir::mktmpdir do |tmp_dir|
|
192
225
|
recipe_temp = File.join(tmp_dir, File.basename(recipe_path))
|
193
226
|
## copying recipe
|
194
227
|
File.open(recipe_temp, 'w+') do |file|
|
195
|
-
|
196
|
-
|
197
|
-
|
228
|
+
message="Try and use extend recipe ERB: "
|
229
|
+
extend_yaml_erb_list = Pathname.new(template_name).dirname.ascend.to_a.map do |p|
|
230
|
+
Kameleon.env.repositories_path.join(p, Kameleon.default_values[:extend_yaml_erb])
|
231
|
+
end
|
232
|
+
extend_yaml_erb_list.unshift(Kameleon.env.repositories_path.join(template_name.gsub(%r{^(.+?/)?([^/]+?)(\.yaml)?$},'\1.\2') + Kameleon.default_values[:extend_yaml_erb]))
|
233
|
+
extend_yaml_erb_list.push(Pathname.new(Kameleon.erb_dirpath).join("extend.yaml.erb"))
|
234
|
+
extend_yaml_erb = extend_yaml_erb_list.find do |f|
|
235
|
+
Kameleon.ui.verbose(message + f.to_s)
|
236
|
+
message = "-> Not found, fallback: "
|
237
|
+
File.readable?(f)
|
238
|
+
end
|
239
|
+
Kameleon.ui.debug("Open ERB file: '#{extend_yaml_erb}'")
|
240
|
+
result = ERB.new(File.open(extend_yaml_erb, 'rb') { |f| f.read }).result(binding)
|
198
241
|
file.write(result)
|
199
242
|
end
|
200
243
|
copy_file(recipe_temp, recipe_path)
|
@@ -203,16 +246,13 @@ module Kameleon
|
|
203
246
|
end
|
204
247
|
|
205
248
|
desc "info <RECIPE_PATH>", "Display detailed information about a recipe"
|
206
|
-
method_option :global, :type => :hash
|
249
|
+
method_option :global, :type => :hash,
|
207
250
|
:default => {}, :aliases => "-g",
|
208
251
|
:desc => "Set custom global variables."
|
209
|
-
method_option :from_cache, :type => :string
|
252
|
+
method_option :from_cache, :type => :string,
|
210
253
|
:default => nil,
|
211
254
|
:desc => "Get info from a persistent cache tar file (ignore recipe path)"
|
212
|
-
method_option :
|
213
|
-
:default => false,
|
214
|
-
:desc => "Show the build sequence but do not actually build"
|
215
|
-
method_option :relative, :type => :boolean ,
|
255
|
+
method_option :relative, :type => :boolean,
|
216
256
|
:default => false,
|
217
257
|
:desc => "Make pathnames relative to the current working directory"
|
218
258
|
def info(*recipe_paths)
|
@@ -238,18 +278,18 @@ module Kameleon
|
|
238
278
|
end
|
239
279
|
|
240
280
|
desc "dag <RECIPE_PATH> [<RECIPE_PATH> [<...>]]", "Draw a DAG of the steps to build one or more recipes"
|
241
|
-
method_option :global, :type => :hash
|
281
|
+
method_option :global, :type => :hash,
|
242
282
|
:default => {}, :aliases => "-g",
|
243
283
|
:desc => "Set custom global variables."
|
244
|
-
method_option :file, :type => :string
|
284
|
+
method_option :file, :type => :string,
|
245
285
|
:default => "/tmp/kameleon.dag",
|
246
286
|
:desc => "DAG output filename"
|
247
|
-
method_option :format, :type => :string
|
287
|
+
method_option :format, :type => :string,
|
248
288
|
:desc => "DAG GraphViz format"
|
249
|
-
method_option :relative, :type => :boolean
|
289
|
+
method_option :relative, :type => :boolean,
|
250
290
|
:default => false,
|
251
291
|
:desc => "Make pathnames relative to the current working directory"
|
252
|
-
method_option :recipes_only, :type => :boolean
|
292
|
+
method_option :recipes_only, :type => :boolean,
|
253
293
|
:default => false,
|
254
294
|
:desc => "Show recipes only (mostly useful to display multiple recipes inheritance)"
|
255
295
|
def dag(*recipe_paths)
|
@@ -280,10 +320,10 @@ module Kameleon
|
|
280
320
|
end
|
281
321
|
|
282
322
|
desc "dryrun <RECIPE_PATH>", "Show the steps the build would process"
|
283
|
-
method_option :global, :type => :hash
|
323
|
+
method_option :global, :type => :hash,
|
284
324
|
:default => {}, :aliases => "-g",
|
285
325
|
:desc => "Set custom global variables."
|
286
|
-
method_option :relative, :type => :boolean
|
326
|
+
method_option :relative, :type => :boolean,
|
287
327
|
:default => false,
|
288
328
|
:desc => "Make pathnames relative to the current working directory"
|
289
329
|
def dryrun(*recipe_paths)
|
@@ -295,10 +335,10 @@ module Kameleon
|
|
295
335
|
end
|
296
336
|
|
297
337
|
desc "export <RECIPE_PATH> <EXPORT_PATH>", "Export the given recipe with its steps and data to a given directory"
|
298
|
-
method_option :global, :type => :hash
|
338
|
+
method_option :global, :type => :hash,
|
299
339
|
:default => {}, :aliases => "-g",
|
300
340
|
:desc => "Set custom global variables."
|
301
|
-
method_option :add, :type => :boolean
|
341
|
+
method_option :add, :type => :boolean,
|
302
342
|
:default => false, :aliases => "-A",
|
303
343
|
:desc => "export recipe and steps to an existing directory (this may overwrite some existing files)"
|
304
344
|
def export(recipe_path,dest_path)
|
@@ -338,36 +378,36 @@ module Kameleon
|
|
338
378
|
end
|
339
379
|
|
340
380
|
desc "build <RECIPE_PATH>", "Builds the appliance from the given recipe"
|
341
|
-
method_option :build_path, :type => :string
|
381
|
+
method_option :build_path, :type => :string,
|
342
382
|
:default => nil, :aliases => "-b",
|
343
383
|
:desc => "Sets the build directory path"
|
344
|
-
method_option :clean, :type => :boolean
|
384
|
+
method_option :clean, :type => :boolean,
|
345
385
|
:default => false,
|
346
386
|
:desc => "Runs the command `kameleon clean` first"
|
347
|
-
method_option :from_checkpoint, :type => :string
|
387
|
+
method_option :from_checkpoint, :type => :string,
|
348
388
|
:default => nil,
|
349
389
|
:desc => "Uses specific checkpoint to build the image. " \
|
350
390
|
"Default value is the last checkpoint."
|
351
|
-
method_option :enable_checkpoint, :type => :boolean
|
391
|
+
method_option :enable_checkpoint, :type => :boolean,
|
352
392
|
:default => false,
|
353
393
|
:desc => "Enables checkpoint [experimental]"
|
354
|
-
method_option :list_checkpoints, :type => :boolean
|
394
|
+
method_option :list_checkpoints, :type => :boolean, :aliases => "--checkpoints",
|
355
395
|
:default => false,
|
356
396
|
:desc => "Lists all availables checkpoints"
|
357
397
|
method_option :enable_cache, :type => :boolean,
|
358
398
|
:default => false,
|
359
399
|
:desc => "Generates a persistent cache for the appliance."
|
360
|
-
method_option :cache_path, :type => :string
|
400
|
+
method_option :cache_path, :type => :string,
|
361
401
|
:default => nil,
|
362
402
|
:desc => "Sets the cache directory path"
|
363
|
-
method_option :from_cache, :type => :string
|
403
|
+
method_option :from_cache, :type => :string,
|
364
404
|
:default => nil,
|
365
405
|
:desc => "Uses a persistent cache tar file to build the image."
|
366
|
-
method_option :cache_archive_compression, :type => :string
|
406
|
+
method_option :cache_archive_compression, :type => :string,
|
367
407
|
:enum => ["none", "gzip", "bz2", "xz"],
|
368
408
|
:default => "gzip",
|
369
409
|
:desc => "Set the persistent cache tar file compression."
|
370
|
-
method_option :polipo_path, :type => :string
|
410
|
+
method_option :polipo_path, :type => :string,
|
371
411
|
:default => nil,
|
372
412
|
:desc => "Full path of the polipo binary to use for the persistent cache."
|
373
413
|
method_option :proxy, :type => :string, :default => "",
|
@@ -377,7 +417,7 @@ module Kameleon
|
|
377
417
|
:desc => "Specifies the username and password if the parent "\
|
378
418
|
"proxy requires authorisation it should have the "\
|
379
419
|
"form 'username:password'"
|
380
|
-
method_option :proxy_offline, :type => :boolean
|
420
|
+
method_option :proxy_offline, :type => :boolean,
|
381
421
|
:default => false, :aliases => "--offline",
|
382
422
|
:desc => "Prevents Polipo from contacting remote servers"
|
383
423
|
method_option :global, :type => :hash,
|
@@ -419,8 +459,16 @@ module Kameleon
|
|
419
459
|
end
|
420
460
|
|
421
461
|
desc "commands", "Lists all available commands", :hide => true
|
422
|
-
def commands
|
423
|
-
|
462
|
+
def commands(context="main")
|
463
|
+
Kameleon.ui.debug("Commands for '#{context}':")
|
464
|
+
case context
|
465
|
+
when "main"
|
466
|
+
puts Main.all_commands.keys - ["commands"]
|
467
|
+
when "repository"
|
468
|
+
invoke CLI::Repository, "commands", [], []
|
469
|
+
when "template"
|
470
|
+
invoke CLI::Template, "commands", [], []
|
471
|
+
end
|
424
472
|
end
|
425
473
|
|
426
474
|
desc "source_root", "Prints the kameleon directory path", :hide => true
|
@@ -428,6 +476,10 @@ module Kameleon
|
|
428
476
|
puts Kameleon.source_root
|
429
477
|
end
|
430
478
|
|
479
|
+
map %w(-v --version) => :version
|
480
|
+
map %w(ls) => :list
|
481
|
+
map %w(completions) => :commands
|
482
|
+
|
431
483
|
def initialize(*args)
|
432
484
|
super
|
433
485
|
self.options ||= {}
|
@@ -445,7 +497,17 @@ module Kameleon
|
|
445
497
|
Kameleon.ui.verbose("The level of output is set to #{Kameleon.ui.level}")
|
446
498
|
end
|
447
499
|
|
448
|
-
def self.start(*)
|
500
|
+
def self.start(*args)
|
501
|
+
# `kameleon build -h` does not work without the following, except for subcommands...
|
502
|
+
# Ref: https://stackoverflow.com/a/49044225/6431461
|
503
|
+
if (Thor::HELP_MAPPINGS & ARGV).any? and subcommands.grep(/^#{ARGV[0]}/).empty?
|
504
|
+
Kameleon.ui.debug("Apply workaround to handle the help command in #{ARGV}")
|
505
|
+
Thor::HELP_MAPPINGS.each do |cmd|
|
506
|
+
if match = ARGV.delete(cmd)
|
507
|
+
ARGV.unshift match
|
508
|
+
end
|
509
|
+
end
|
510
|
+
end
|
449
511
|
super
|
450
512
|
rescue Exception => e
|
451
513
|
Kameleon.ui = Kameleon::UI::Shell.new
|
data/lib/kameleon/recipe.rb
CHANGED
@@ -93,7 +93,7 @@ module Kameleon
|
|
93
93
|
unless File.file? @path
|
94
94
|
yaml_recipe = YAML.load_file @path
|
95
95
|
unless yaml_recipe.kind_of? Hash
|
96
|
-
fail RecipeError, "Invalid yaml
|
96
|
+
fail RecipeError, "Invalid yaml: #{@path}"
|
97
97
|
end
|
98
98
|
|
99
99
|
update_steps_dirs()
|
@@ -242,7 +242,7 @@ module Kameleon
|
|
242
242
|
unless File.file? path
|
243
243
|
base_yaml_recipe = YAML.load_file base_recipe_path
|
244
244
|
unless yaml_recipe.kind_of? Hash
|
245
|
-
fail RecipeError, "Invalid yaml
|
245
|
+
fail RecipeError, "Invalid yaml: #{base_yaml_recipe}"
|
246
246
|
end
|
247
247
|
base_yaml_recipe.keys.each do |key|
|
248
248
|
if ["export", "bootstrap", "setup"].include? key
|
data/lib/kameleon/shell.rb
CHANGED
@@ -25,12 +25,17 @@ module Kameleon
|
|
25
25
|
@bash_history_file = File.join(@bash_scripts_dir, "bash_history")
|
26
26
|
@bash_env_file = File.join(@bash_scripts_dir, "bash_env")
|
27
27
|
@bash_status_file = File.join(@bash_scripts_dir, "bash_status")
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
if File::directory?(f = File.join(Kameleon.source_root, "contrib"))
|
29
|
+
@contrib_dir = f
|
30
|
+
elsif File::directory?(f = '/usr/share/kameleon/contrib')
|
31
|
+
@contrib_dir = f
|
32
|
+
else
|
33
|
+
raise "Could not find contrib dir"
|
34
|
+
end
|
35
|
+
@default_bashrc_file = File.join(@contrib_dir, 'kameleon_bashrc.sh')
|
36
|
+
@cmd_tpl = ERB.new(File.read(File.join(@contrib_dir,
|
31
37
|
"kameleon_exec_cmd.sh")))
|
32
|
-
@cmd_wrapper_tpl = ERB.new(File.read(File.join(
|
33
|
-
"contrib",
|
38
|
+
@cmd_wrapper_tpl = ERB.new(File.read(File.join(@contrib_dir,
|
34
39
|
"kameleon_exec_cmd_wrapper.sh")))
|
35
40
|
|
36
41
|
if @shell_workdir
|
data/lib/kameleon/utils.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'progressbar'
|
2
|
+
|
1
3
|
module Kameleon
|
2
4
|
module Utils
|
3
5
|
|
@@ -123,33 +125,63 @@ module Kameleon
|
|
123
125
|
end
|
124
126
|
end
|
125
127
|
|
126
|
-
def self.list_recipes(
|
127
|
-
Kameleon.env.root_dir =
|
128
|
+
def self.list_recipes(recipes_path, filter = '', do_progressbar = false, is_repository = false, kwargs = {})
|
129
|
+
Kameleon.env.root_dir = recipes_path
|
128
130
|
catch_exception = kwargs.fetch(:catch_exception, true)
|
129
131
|
recipes_hash = []
|
130
|
-
recipes_files = get_recipes(
|
132
|
+
recipes_files = get_recipes(recipes_path).select { |f| Regexp.new(filter).match(f.to_s.gsub(recipes_path.to_s + '/', '').chomp('.yaml')) }
|
133
|
+
if recipes_files.empty?
|
134
|
+
Kameleon.ui.shell.say " <None>", :cyan
|
135
|
+
return
|
136
|
+
end
|
137
|
+
if do_progressbar
|
138
|
+
progressbar = ProgressBar.create(:format => '%t (%p%%) %bᗧ%i',
|
139
|
+
:title => 'Resolving ' + if is_repository; 'templates' else 'recipes' end,
|
140
|
+
:progress_mark => '.',
|
141
|
+
:remainder_mark => '・',
|
142
|
+
:total => recipes_files.size + 10,
|
143
|
+
:starting_at => 10)
|
144
|
+
end
|
131
145
|
recipes_files.each do |f|
|
132
146
|
path = f.to_s
|
133
147
|
begin
|
134
148
|
recipe = RecipeTemplate.new(path)
|
135
|
-
name = path.gsub(
|
149
|
+
name = path.gsub(recipes_path.to_s + '/', '').chomp('.yaml')
|
136
150
|
recipes_hash.push({
|
137
151
|
"name" => name,
|
138
152
|
"description" => recipe.metainfo['description'],
|
139
153
|
})
|
154
|
+
progressbar.increment if do_progressbar
|
140
155
|
rescue => e
|
141
156
|
raise e if Kameleon.env.debug or not catch_exception
|
142
157
|
end
|
143
158
|
end
|
144
159
|
unless recipes_hash.empty?
|
145
|
-
recipes_hash = recipes_hash.sort_by{ |k| k["name"] }
|
146
160
|
name_width = recipes_hash.map { |k| k['name'].size }.max
|
147
161
|
desc_width = Kameleon.ui.shell.terminal_width - name_width - 3
|
148
162
|
desc_width = (80 - name_width - 3) if desc_width < 0
|
149
163
|
end
|
150
|
-
|
151
|
-
|
152
|
-
|
164
|
+
repo_str_old = nil
|
165
|
+
recipes_hash.sort_by{ |k| k["name"] }.each do |r|
|
166
|
+
if is_repository
|
167
|
+
repo_str,recipe_dir_str,recipe_str = r["name"].match(%r{^([^/]+/)(.+/)?([^/]+)$}).to_a[1..3].map{|m| m.to_s}
|
168
|
+
else
|
169
|
+
repo_str,recipe_dir_str,recipe_str = r["name"].match(%r{^()(.+/)?([^/]+)$}).to_a[1..3].map{|m| m.to_s}
|
170
|
+
end
|
171
|
+
if not repo_str_old.nil? and repo_str_old != repo_str
|
172
|
+
Kameleon.ui.shell.say "#{'-' * name_width} | #{'-' * desc_width}"
|
173
|
+
end
|
174
|
+
repo_str_old = repo_str
|
175
|
+
Kameleon.ui.debug("#{r["name"]} -> repo=#{repo_str}, recipe_dir=#{recipe_dir_str}, recipee=#{recipe_str}")
|
176
|
+
Kameleon.ui.shell.say "#{repo_str}", :yellow, false
|
177
|
+
Kameleon.ui.shell.say "#{recipe_dir_str}", :cyan, false
|
178
|
+
Kameleon.ui.shell.say sprintf("%-#{name_width - repo_str.length - recipe_dir_str.length}s", recipe_str), :magenta, false
|
179
|
+
Kameleon.ui.shell.say " | ", nil, false
|
180
|
+
if r["description"].to_s.length > desc_width - 4
|
181
|
+
r["description"] = r["description"][0..(desc_width - 4)] + "..."
|
182
|
+
end
|
183
|
+
Kameleon.ui.shell.say sprintf("%-#{desc_width}s", r["description"]), :blue
|
184
|
+
end
|
153
185
|
end
|
154
186
|
|
155
187
|
def self.get_recipes(path)
|
data/lib/kameleon/version.rb
CHANGED
data/lib/kameleon.rb
CHANGED
@@ -30,7 +30,12 @@ module Kameleon
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def erb_dirpath
|
33
|
-
File.join(Kameleon.source_root, 'erb')
|
33
|
+
d = File.join(Kameleon.source_root, 'erb')
|
34
|
+
if File::directory?(d)
|
35
|
+
return d
|
36
|
+
elsif File::directory?(d = '/usr/share/kameleon/erb')
|
37
|
+
return d
|
38
|
+
end
|
34
39
|
end
|
35
40
|
|
36
41
|
def userdir
|
@@ -46,7 +51,7 @@ module Kameleon
|
|
46
51
|
def init_userconf()
|
47
52
|
if not File.exists?(Kameleon.userconf_path) or File.zero?(Kameleon.userconf_path)
|
48
53
|
File.open(Kameleon.userconf_path, 'w+') do |file|
|
49
|
-
userconf_erb = File.join(Kameleon.erb_dirpath, "userconf.erb")
|
54
|
+
userconf_erb = File.join(Kameleon.erb_dirpath, "userconf.yaml.erb")
|
50
55
|
erb = ERB.new(File.open(userconf_erb, 'rb') { |f| f.read })
|
51
56
|
result = erb.result(binding)
|
52
57
|
file.write(result)
|
@@ -73,7 +78,8 @@ module Kameleon
|
|
73
78
|
:debug => userconf.fetch("debug", false),
|
74
79
|
:script => userconf.fetch("script", false),
|
75
80
|
:repositories_path => userconf.fetch("repositories_path",
|
76
|
-
|
81
|
+
File.join(userdir.to_s, 'repos')),
|
82
|
+
:extend_yaml_erb => userconf.fetch("extend_yaml_erb", ".extend.yaml.erb")
|
77
83
|
}
|
78
84
|
end
|
79
85
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kameleon-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.10.
|
4
|
+
version: 2.10.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Salem Harrache
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date:
|
15
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: childprocess
|
@@ -96,11 +96,25 @@ dependencies:
|
|
96
96
|
- - "~>"
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '1.2'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: progressbar
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '1'
|
106
|
+
type: :runtime
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - "~>"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1'
|
99
113
|
description: The mindful appliance builder
|
100
114
|
email:
|
101
|
-
- salem
|
102
|
-
- michael.mercier@
|
103
|
-
-
|
115
|
+
- salem@harrache.info
|
116
|
+
- michael.mercier@libr.fr
|
117
|
+
- camilo1729@gmail.com
|
104
118
|
- pierre.neyron@imag.fr
|
105
119
|
- bruno.bzeznik@imag.fr
|
106
120
|
executables:
|
@@ -117,7 +131,7 @@ files:
|
|
117
131
|
- COPYING
|
118
132
|
- Gemfile
|
119
133
|
- README.rst
|
120
|
-
- RELEASING.
|
134
|
+
- RELEASING.md
|
121
135
|
- Vagrantfile
|
122
136
|
- bin/kameleon
|
123
137
|
- completion/_kameleon
|
@@ -157,8 +171,8 @@ files:
|
|
157
171
|
- contrib/steps/setup/root_ssh_config.yaml
|
158
172
|
- contrib/steps/setup/set_user_password.yaml
|
159
173
|
- contrib/steps/setup/system_optimization.yaml
|
160
|
-
- erb/extend.erb
|
161
|
-
- erb/userconf.erb
|
174
|
+
- erb/extend.yaml.erb
|
175
|
+
- erb/userconf.yaml.erb
|
162
176
|
- kameleon-builder.gemspec
|
163
177
|
- lib/kameleon.rb
|
164
178
|
- lib/kameleon/cli.rb
|
@@ -200,7 +214,6 @@ files:
|
|
200
214
|
- tests/test_context.rb
|
201
215
|
- tests/test_recipe.rb
|
202
216
|
- tests/test_version.rb
|
203
|
-
- version.txt
|
204
217
|
homepage: http://kameleon.imag.fr/
|
205
218
|
licenses:
|
206
219
|
- GPL-2.0
|
@@ -226,7 +239,7 @@ rubyforge_project:
|
|
226
239
|
rubygems_version: 2.7.6.2
|
227
240
|
signing_key:
|
228
241
|
specification_version: 4
|
229
|
-
summary: Kameleon is a tool to build
|
242
|
+
summary: Kameleon is a tool to build system appliances from scratch
|
230
243
|
test_files:
|
231
244
|
- tests/helper.rb
|
232
245
|
- tests/issue76/fail.stdout
|
data/RELEASING.rst
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
You can use the script ``./scripts/bumpversion.py`` which will handle
|
2
|
-
everything (incrementation, git tag creation, changelog update).
|
3
|
-
First you need to install bumpversion using pip::
|
4
|
-
|
5
|
-
sudo pip2 install bumpversion
|
6
|
-
|
7
|
-
Then for the actual releasing:
|
8
|
-
|
9
|
-
1) After each release, a new version has to be created (in this example, the 2.7.0 dev)::
|
10
|
-
|
11
|
-
python2 ./scripts/bumpversion.py newversion minor # 2.6.7 -> 2.7.0.dev
|
12
|
-
|
13
|
-
2) [work/commit]
|
14
|
-
3) **Warning:** Be sure that there is no dirty file (not committed) before
|
15
|
-
doing this.
|
16
|
-
|
17
|
-
Releasing a new version::
|
18
|
-
|
19
|
-
python2 ./scripts/bumpversion.py release # 2.7.0.dev -> 2.7.0 + git tag + changelog
|
20
|
-
gem build kameleon-builder.gemspec
|
21
|
-
gem push kameleon-builder-2.7.0.gem
|
22
|
-
|
23
|
-
You need a rubygem account and I have to give you permissions so that you can push.
|
24
|
-
To do so, create an account on https://rubygems.org/ and ask an owner to do
|
25
|
-
the following command::
|
26
|
-
|
27
|
-
gem owner kameleon-builder -a your@email.com
|
28
|
-
|
29
|
-
And that's all :)
|
data/erb/extend.erb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
#==============================================================================
|
2
|
-
# vim: softtabstop=2 shiftwidth=2 expandtab fenc=utf-8 cc=81 tw=80
|
3
|
-
#==============================================================================
|
4
|
-
#
|
5
|
-
# DESCRIPTION: <MY RECIPE DESCRIPTION>
|
6
|
-
#
|
7
|
-
#==============================================================================
|
8
|
-
---
|
9
|
-
extend: <%= tpl.relative_path_from_recipe(recipe_path) %>
|
10
|
-
|
11
|
-
global:
|
12
|
-
# This is the backend you have imported to switch to an other backend BCKD do:
|
13
|
-
#
|
14
|
-
# kameleon template import <%= tpl.relative_path_from_recipe(recipe_path) %> --global backend:BCKB
|
15
|
-
#
|
16
|
-
# Then, uncomment and update the following variable.
|
17
|
-
<% if Kameleon.env.global["backend"] %>
|
18
|
-
backend: <%= Kameleon.env.global["backend"] %>
|
19
|
-
<% else %>
|
20
|
-
# backend: qemu
|
21
|
-
<% end %>
|
22
|
-
# To see the variables that you can override, use the following command:
|
23
|
-
#
|
24
|
-
# kameleon info <%= recipe_name %>
|
25
|
-
|
26
|
-
bootstrap:
|
27
|
-
- "@base"
|
28
|
-
|
29
|
-
setup:
|
30
|
-
- "@base"
|
31
|
-
|
32
|
-
export:
|
33
|
-
- "@base"
|
data/version.txt
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.10.2
|