docker-template 0.8.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,15 @@
1
- # ----------------------------------------------------------------------------
2
1
  # Frozen-string-literal: true
3
2
  # Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
4
3
  # Encoding: utf-8
5
- # ----------------------------------------------------------------------------
6
4
 
7
5
  module Docker
8
6
  module Template
9
7
  module Notify
10
8
  module_function
11
9
 
12
- # ----------------------------------------------------------------------
10
+ # --
13
11
  # Notify the user of a push that is happening.
14
- # ----------------------------------------------------------------------
12
+ # --
15
13
 
16
14
  def push(builder)
17
15
  $stderr.puts Simple::Ansi.green(
@@ -19,9 +17,9 @@ module Docker
19
17
  )
20
18
  end
21
19
 
22
- # ----------------------------------------------------------------------
20
+ # --
23
21
  # Notify the user that we are tag aliasing.
24
- # ----------------------------------------------------------------------
22
+ # --
25
23
 
26
24
  def alias(builder)
27
25
  repo = builder.repo
@@ -30,14 +28,59 @@ module Docker
30
28
  $stderr.puts msg
31
29
  end
32
30
 
33
- # ----------------------------------------------------------------------
31
+ # --
32
+
33
+ def build(repo, rootfs: false)
34
+ build_start(repo, {
35
+ :rootfs => rootfs
36
+ })
37
+
38
+ if block_given?
39
+ yield
40
+ build_end(repo, {
41
+ :rootfs => rootfs
42
+ })
43
+ end
44
+ end
45
+
46
+ # --
34
47
  # Notify the user that we are building their repository.
35
- # ----------------------------------------------------------------------
48
+ # --
36
49
 
37
- def build(repo, **kwd)
38
- img = repo.to_s(**kwd)
39
- msg = Simple::Ansi.green("Building: #{img}")
40
- $stderr.puts msg
50
+ def build_start(repo, rootfs: false)
51
+ if ENV["TRAVIS"] && !ENV.key?("RSPEC_RUNNING")
52
+ STDOUT.puts(format("travis_fold:end:%s",
53
+ repo.to_s(:rootfs => rootfs).tr("^A-Za-z0-9", "-").gsub(
54
+ /\-$/, ""
55
+ )
56
+ ))
57
+ end
58
+
59
+ $stderr.puts Simple::Ansi.green(format(
60
+ "Building: %s", repo.to_s({
61
+ :rootfs => rootfs
62
+ })
63
+ ))
64
+ end
65
+
66
+ # --
67
+ # Notify the user that building their repository has ended.
68
+ # --
69
+
70
+ def build_end(repo, rootfs: false)
71
+ if ENV["TRAVIS"] && !ENV.key?("RSPEC_RUNNING")
72
+ STDOUT.puts(format("travis_fold:end:%s",
73
+ repo.to_s(:rootfs => rootfs).tr("^A-Za-z0-9", "-").gsub(
74
+ /\-$/, ""
75
+ )
76
+ ))
77
+ end
78
+
79
+ $stderr.puts Simple::Ansi.green(format(
80
+ "Done Building: %s", repo.to_s({
81
+ :rootfs => rootfs
82
+ })
83
+ ))
41
84
  end
42
85
  end
43
86
  end
@@ -1,8 +1,6 @@
1
- # ----------------------------------------------------------------------------
2
1
  # Frozen-string-literal: true
3
2
  # Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
4
3
  # Encoding: utf-8
5
- # ----------------------------------------------------------------------------
6
4
 
7
5
  module Docker
8
6
  module Template
@@ -16,62 +14,60 @@ module Docker
16
14
  @argv = argv
17
15
  end
18
16
 
19
- # ----------------------------------------------------------------------
17
+ # --
20
18
  # Return `raw_repos` if you send us a list of repos you wish to build,
21
19
  # otherwise we get the children of the repo folder and ship that off so
22
20
  # you can build *every* repo, I don't know if you want that.
23
- # ----------------------------------------------------------------------
24
-
21
+ # --
25
22
  def all
26
23
  return @raw_repos unless @raw_repos.empty?
27
- Template.root.join(Metadata.new({}).repos_dir).children.map do |path|
24
+ return [Template.root.basename.to_s] if Template.project?
25
+ Template.root.join(Meta.new({}).repos_dir).children.map do |path|
28
26
  path.basename.to_s
29
27
  end
30
28
 
31
29
  rescue Errno::ENOENT
32
- then raise Error::RepoNotFound
30
+ then raise(
31
+ Error::RepoNotFound
32
+ )
33
33
  end
34
34
 
35
- # ----------------------------------------------------------------------
35
+ # --
36
36
  # rubocop:disable Metrics/AbcSize
37
- # ----------------------------------------------------------------------
38
-
37
+ # --
39
38
  def parse
40
- repos = {
41
- :scratch => [],
42
- :simple => [],
43
- :aliases => []
44
- }
39
+ scratch = []
40
+ simple = []
41
+ aliases = []
45
42
 
46
43
  all.each do |v|
47
- hash = self.class.to_repo_hash(
48
- v
49
- )
44
+ hash = self.class.to_repo_hash(v)
45
+ raise Error::BadRepoName, v if hash.empty?
46
+ Repo.new(hash, @argv).to_repos.each do |r|
47
+ scratch << r if r.builder.scratch? && !r.alias?
48
+ simple << r unless r.alias? || r.builder.scratch?
49
+ aliases << r if r.alias?
50
+ end
51
+ end
50
52
 
51
- if hash.empty?
52
- raise(Docker::Template::Error::BadRepoName,
53
- v
53
+ out = aliases.each_with_object(scratch | simple) do |alias_, repos|
54
+ index = repos.rindex { |v| v.name == alias_.name }
55
+ if index
56
+ repos.insert(index + 1,
57
+ alias_
54
58
  )
55
59
 
56
60
  else
57
- Repo.new(hash, @argv).to_repos.each do |r|
58
- r.alias?? repos[:aliases] << r : \
59
- if r.builder.scratch?
60
- repos[:scratch] << r else repos[:simple] << r
61
- end
62
- end
61
+ repos.push(
62
+ alias_
63
+ )
63
64
  end
64
65
  end
65
-
66
- repos.values.reduce(
67
- :|
68
- )
69
66
  end
70
67
 
71
- # ----------------------------------------------------------------------
68
+ # --
72
69
  # rubocop:enable Metrics/AbcSize
73
- # ----------------------------------------------------------------------
74
-
70
+ # --
75
71
  def self.to_repo_hash(val)
76
72
  data = val.to_s.split(SPLIT_REGEXP)
77
73
 
@@ -83,7 +79,20 @@ module Docker
83
79
  {}
84
80
  end
85
81
 
86
- # ----------------------------------------------------------------------
82
+ # --
83
+
84
+ def self.from_tag_to_repo_hash(val)
85
+ data = val.to_s.split(SPLIT_REGEXP)
86
+
87
+ return "tag" => data[0] if data.one?
88
+ return "name" => data[0], "tag" => data[1] if val =~ COLON_REGEXP && data.size == 2
89
+ return "user" => data[0], "name" => data[1] if val =~ SLASH_REGEXP && data.size == 2
90
+ return "user" => data[0], "name" => data[1], "tag" => data[2] if data.size == 3
91
+
92
+ {}
93
+ end
94
+
95
+ # --
87
96
 
88
97
  def self.full_name?(val)
89
98
  parsed = to_repo_hash(val)
@@ -1,18 +1,18 @@
1
- # ----------------------------------------------------------------------------
2
1
  # Frozen-string-literal: true
3
2
  # Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
4
3
  # Encoding: utf-8
5
- # ----------------------------------------------------------------------------
6
4
 
7
5
  module Docker
8
6
  module Template
9
7
  class Repo
10
8
  extend Forwardable::Extended
11
9
 
12
- # ----------------------------------------------------------------------
10
+ # --
13
11
 
14
12
  def initialize(*hashes)
15
- @base_meta = hashes.compact.reduce(:deep_merge).freeze
13
+ @base_meta = hashes.compact
14
+ @base_meta = @base_meta.reduce(:deep_merge)
15
+ @base_meta.freeze
16
16
 
17
17
  unless root.exist?
18
18
  raise(
@@ -21,57 +21,56 @@ module Docker
21
21
  end
22
22
  end
23
23
 
24
- # ----------------------------------------------------------------------
25
- # Determines whether or not we should (or you should) push the repo.
26
- # ----------------------------------------------------------------------
24
+ # --
27
25
 
28
26
  def pushable?
29
- (metadata["push"] || metadata["push_only"]) &&
30
- !metadata["cache_only"] && !metadata[
27
+ (meta["push"] || meta["push_only"]) &&
28
+ !meta["cache_only"] && !meta[
31
29
  "clean_only"
32
30
  ]
33
31
  end
34
32
 
35
- # ----------------------------------------------------------------------
36
- # Determines whether or not we should (or you should) cache the repo.
37
- # ----------------------------------------------------------------------
33
+ # --
38
34
 
39
35
  def cacheable?
40
- (metadata["cache"] || metadata["cache_only"]) &&
41
- !metadata[
36
+ (meta["cache"] || meta["cache_only"]) &&
37
+ !meta[
42
38
  "push_only"
43
39
  ]
44
40
  end
45
41
 
46
- # ----------------------------------------------------------------------
47
- # Determines whether or not we should (or you should) build the repo.
48
- # ----------------------------------------------------------------------
42
+ # --
43
+
44
+ def clean_cache?
45
+ (meta["clean"] || meta["clean_only"])
46
+ end
47
+
48
+ # --
49
49
 
50
50
  def buildable?
51
- !metadata["push_only"] && !metadata["cache_only"] &&
52
- !metadata[
51
+ meta.build? && !meta["push_only"] && !meta["cache_only"] &&
52
+ !meta[
53
53
  "clean_only"
54
54
  ]
55
55
  end
56
56
 
57
- # ----------------------------------------------------------------------
57
+ # --
58
58
  # Pulls out the repo this repo is aliasing it, this happens when you
59
59
  # when you set the tag in the "alias" section of your `opts.yml`.
60
- # ----------------------------------------------------------------------
61
-
60
+ # --
62
61
  def aliased
63
62
  full = Parser.full_name?(
64
- metadata.aliased_tag
63
+ meta.aliased_tag
65
64
  )
66
65
 
67
66
  if alias? && full
68
67
  self.class.new(to_h.merge(Parser.to_repo_hash(
69
- metadata.aliased_tag
68
+ meta.aliased_tag
70
69
  )))
71
70
 
72
71
  elsif alias?
73
72
  self.class.new(to_h.merge({
74
- "tag" => metadata.aliased_tag
73
+ "tag" => meta.aliased_tag
75
74
  }))
76
75
  end
77
76
 
@@ -81,51 +80,47 @@ module Docker
81
80
  end
82
81
  end
83
82
 
84
- # ----------------------------------------------------------------------
83
+ # --
85
84
  # Initializes and returns the builder so that you can build the repo.
86
- # ----------------------------------------------------------------------
87
-
85
+ # --
88
86
  def builder
89
87
  return @builder ||= begin
90
- Template.const_get(type.capitalize).new(
88
+ Template::Builder.const_get(type.capitalize).new(
91
89
  self
92
90
  )
93
91
  end
94
92
  end
95
93
 
96
- # ----------------------------------------------------------------------
94
+ # --
97
95
  # Convert the repo into it's final image name, however if you tell, us
98
96
  # this is a rootfs build we will convert it into the rootfs name.
99
- # ----------------------------------------------------------------------
100
-
97
+ # --
101
98
  def to_s(rootfs: false)
102
- prefix = metadata["local_prefix"]
99
+ prefix = meta["local_prefix"]
103
100
  return "#{user}/#{name}:#{tag}" unless rootfs
104
101
  "#{prefix}/rootfs:#{name}"
105
102
  end
106
103
 
107
- # ----------------------------------------------------------------------
104
+ # --
108
105
  # The directory you wish to cache to (like `cache/`) or other.
109
- # ----------------------------------------------------------------------
110
-
106
+ # --
111
107
  def cache_dir
112
108
  return root.join(
113
- metadata["cache_dir"], tag
109
+ meta["cache_dir"], tag
114
110
  )
115
111
  end
116
112
 
117
- # ----------------------------------------------------------------------
113
+ # --
118
114
  # The directory you store your image data in (by default `copy/`.)
119
- # ----------------------------------------------------------------------
120
-
115
+ # --
121
116
  def copy_dir(*path)
122
- dir = metadata["copy_dir"]
123
- root.join(dir,
124
- *path
117
+ dir = meta["copy_dir"]
118
+ root.join(
119
+ dir, *path
125
120
  )
126
121
  end
127
122
 
128
- # ----------------------------------------------------------------------
123
+ # --
129
124
 
130
125
  def to_tag_h
131
126
  {
@@ -135,91 +130,100 @@ module Docker
135
130
  }
136
131
  end
137
132
 
138
- # ----------------------------------------------------------------------
133
+ # --
139
134
 
140
135
  def to_rootfs_h
141
136
  {
142
137
  "tag" => name,
143
- "repo" => "#{metadata["local_prefix"]}/rootfs",
138
+ "repo" => "#{meta["local_prefix"]}/rootfs",
144
139
  "force" => true
145
140
  }
146
141
  end
147
142
 
148
- # ----------------------------------------------------------------------
143
+ # --
149
144
 
150
145
  def tmpdir(*args, root: nil)
151
146
  args.unshift(user, name, tag)
152
- Pathutil.tmpdir(args,
153
- nil, root
147
+ Pathutil.tmpdir(
148
+ args, nil, root
154
149
  )
155
150
  end
156
151
 
157
- # ----------------------------------------------------------------------
152
+ # --
158
153
 
159
154
  def tmpfile(*args, root: nil)
160
155
  args.unshift(user, name, tag)
161
- Pathutil.tmpfile(args,
162
- nil, root
156
+ Pathutil.tmpfile(
157
+ args, nil, root
163
158
  )
164
159
  end
165
160
 
166
- # ----------------------------------------------------------------------
161
+ # --
167
162
  # If a tag was given then it returns [self] and if a tag was not sent
168
163
  # it then goes on to detect the type and split itself accordingly
169
164
  # returning multiple, AKA all repos that should be built.
170
- # ----------------------------------------------------------------------
171
-
165
+ # --
172
166
  def to_repos
173
- set = Set.new
174
- if @base_meta.key?("tag")
175
- set << self
167
+ if Template.project?
168
+ then Set.new([
169
+ self
170
+ ])
171
+
176
172
  else
177
- tags.each do |tag|
178
- hash = to_h.merge("tag" => tag)
179
- set << self.class.new(
180
- hash, @cli_opts
181
- )
173
+ set = Set.new
174
+ if @base_meta.key?("tag")
175
+ set << self
176
+ else
177
+ tags.each do |tag|
178
+ hash = Parser.from_tag_to_repo_hash(tag)
179
+ hash = to_h.merge(hash)
180
+ set << self.class.new(
181
+ hash, @cli_opts
182
+ )
183
+ end
182
184
  end
185
+
186
+ set
183
187
  end
184
- set
185
188
  end
186
189
 
187
- # ----------------------------------------------------------------------
190
+ # --
188
191
 
189
- def metadata
190
- return @metadata ||= begin
191
- Metadata.new(
192
+ def meta
193
+ return @meta ||= begin
194
+ Meta.new(
192
195
  @base_meta
193
196
  )
194
197
  end
195
198
  end
196
199
 
197
- # ----------------------------------------------------------------------
200
+ # --
198
201
 
199
202
  def to_env(tar_gz: nil, copy_dir: nil)
200
- hash = metadata["env"] || { "all" => {}}
201
- Metadata.new(hash, :root => metadata).merge({
203
+ hash = meta["env"] || { "all" => {}}
204
+ Meta.new(hash, :root => meta).merge({
202
205
  "REPO" => name,
203
206
  "TAR_GZ" => tar_gz,
204
- "GROUP" => metadata.group,
207
+ "GROUP" => meta.group,
208
+ "DEBUG" => meta.debug?? "true" : "",
205
209
  "COPY_DIR" => copy_dir,
206
210
  "BUILD_TYPE" => type,
207
211
  "TAG" => tag
208
212
  })
209
213
  end
210
214
 
211
- # ----------------------------------------------------------------------
215
+ # --
212
216
 
213
217
  rb_delegate :build, :to => :builder
214
- rb_delegate :alias?, :to => :metadata
215
- rb_delegate :complex_alias?, :to => :metadata
216
- rb_delegate :type, :to => :metadata, :type => :hash
217
- rb_delegate :user, :to => :metadata, :type => :hash
218
- rb_delegate :name, :to => :metadata, :type => :hash
219
- rb_delegate :tag, :to => :metadata, :type => :hash
218
+ rb_delegate :alias?, :to => :meta
219
+ rb_delegate :complex_alias?, :to => :meta
220
+ rb_delegate :type, :to => :meta, :type => :hash
221
+ rb_delegate :user, :to => :meta, :type => :hash
222
+ rb_delegate :name, :to => :meta, :type => :hash
223
+ rb_delegate :tag, :to => :meta, :type => :hash
220
224
  rb_delegate :to_h, :to => :@base_meta
221
- rb_delegate :root, :to => :metadata
222
- rb_delegate :tags, :to => :metadata
225
+ rb_delegate :root, :to => :meta
226
+ rb_delegate :tags, :to => :meta
223
227
  rb_delegate :clean, {
224
228
  :to => Cache, :alias_of => :cleanup, :args => %w(
225
229
  self