rbld 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 03d269e8517d0c5d51573433ed718b7a97fb9c89
4
- data.tar.gz: 5664d2ca28b6ae3e53597c756cd3156878b959c3
3
+ metadata.gz: d227fefcee50eefa5f3d6bfa353ada39b2ca01af
4
+ data.tar.gz: 8ac255f0c137b88e4ba6d38d43f3c6dd4d26ff7d
5
5
  SHA512:
6
- metadata.gz: cd5a400e66efb95db58de1b73d4f999c4c2ad22113e4c67fb756195004a933842a049bda5449d38b30c1cd19b2e4b1beb519bc74caa6ede10dbe07365bd9dd5d
7
- data.tar.gz: 5a61db1f9b6422e3d1f61fc14488a9890f1028d23b67eeb66d5800f471cc2d050b805cbdcc6ec276e2f18aac64f794906883bad149d53d4066166fc19cd387ee
6
+ metadata.gz: c6d267b8044f72f2fa02ab7768eca155bb9555945707858da17e884a76f46c0d32c1243f0774aac6448bcf8824a3b375390241dbfd88f1fdb73234a6a720ebeb
7
+ data.tar.gz: e124388ec7544bb4c7fe5b5457db4faffa90f6fa4b914c49759b4e60452a59476d6821e1aef2dec22dde51e0e64df088f132c19b1cef996e69103bce7c1c9c15
@@ -7,7 +7,6 @@ module Rebuild::CLI
7
7
 
8
8
  def run(parameters)
9
9
  env = Environment.new( parameters[0] )
10
- cmd = get_cmdline_tail( parameters )
11
10
  rbld_log.info("Going to deploy \"#{env}\"")
12
11
  engine_api.deploy!( env )
13
12
  rbld_print.progress "Successfully deployed #{env}\n"
@@ -1,5 +1,8 @@
1
1
  module Rebuild::CLI
2
2
  class RbldModifyCommand < Command
3
+
4
+ include RunOptions
5
+
3
6
  def initialize
4
7
  @usage = [
5
8
  { :syntax => "modify [OPTIONS] [ENVIRONMENT[:TAG]]",
@@ -10,13 +13,15 @@ module Rebuild::CLI
10
13
  "specified environment" }
11
14
  ]
12
15
  @description = "Modify a local environment"
16
+ @options = opts_text
13
17
  end
14
18
 
15
19
  def run(parameters)
20
+ runopts, parameters = parse_opts( parameters )
16
21
  env = Environment.new( parameters.shift )
17
22
  cmd = get_cmdline_tail( parameters )
18
23
  rbld_log.info("Going to modify \"#{env}\" with \"#{cmd}\"")
19
- @errno = engine_api.modify!( env, cmd )
24
+ @errno = engine_api.modify!( env, cmd, runopts )
20
25
  end
21
26
  end
22
27
  end
@@ -1,5 +1,8 @@
1
1
  module Rebuild::CLI
2
2
  class RbldRunCommand < Command
3
+
4
+ include RunOptions
5
+
3
6
  def initialize
4
7
  @usage = [
5
8
  { :syntax => "run [OPTIONS] [ENVIRONMENT[:TAG]]",
@@ -10,15 +13,17 @@ module Rebuild::CLI
10
13
  "specified environment" }
11
14
  ]
12
15
  @description = "Run command in a local environment"
16
+ @options = opts_text
13
17
  end
14
18
 
15
19
  def run(parameters)
20
+ runopts, parameters = parse_opts( parameters )
16
21
  env = Environment.new( parameters.shift )
17
22
  cmd = get_cmdline_tail( parameters )
18
23
  rbld_log.info("Going to run \"#{cmd}\" in \"#{env}\"")
19
24
 
20
25
  warn_if_modified( env, 'running' )
21
- @errno = engine_api.run( env, cmd )
26
+ @errno = engine_api.run( env, cmd, runopts )
22
27
  end
23
28
  end
24
29
  end
@@ -0,0 +1,12 @@
1
+ module Rebuild::CLI
2
+ class RbldVersionCommand < Command
3
+ def initialize
4
+ @usage = "version [OPTIONS]"
5
+ @description = "Show the Rebuild version information"
6
+ end
7
+
8
+ def run(parameters)
9
+ puts "Rebuild CLI version #{Rebuild::Version.info}"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ 1.1.0
@@ -1,5 +1,6 @@
1
1
  require_relative 'rbld_log'
2
2
  require_relative 'rbld_utils'
3
+ require_relative 'rbld_verinfo'
3
4
  require_relative 'rbld_engine'
4
5
 
5
6
  module Rebuild::CLI
@@ -184,6 +185,27 @@ END_USAGE
184
185
  end
185
186
  end
186
187
 
188
+ module RunOptions
189
+ def opts_text
190
+ [["-p, --privileged", "Run environment with superuser privileges"]]
191
+ end
192
+
193
+ def parse_opts(parameters)
194
+ replace_argv( parameters ) do
195
+ opts = GetoptLong.new([ '--privileged', '-p', GetoptLong::NO_ARGUMENT ])
196
+ runopts = {}
197
+ opts.each do |opt, arg|
198
+ case opt
199
+ when '--privileged'
200
+ runopts[:privileged] = true
201
+ end
202
+ end
203
+
204
+ return runopts, ARGV
205
+ end
206
+ end
207
+ end
208
+
187
209
  class Main
188
210
 
189
211
  def self.usage
@@ -1,20 +1,40 @@
1
1
  require 'parseconfig'
2
2
 
3
3
  module Rebuild
4
+ class Remote
5
+ def initialize(cfg)
6
+ return unless cfg
7
+
8
+ if @name = cfg['REMOTE_NAME']
9
+ @type = cfg["REMOTE_TYPE_#{@name}"]
10
+ @path = cfg["REMOTE_#{@name}"]
11
+ end
12
+ end
13
+
14
+ def validate!
15
+ unless @valid
16
+ raise 'Remote not defined' unless @name
17
+ raise 'Remote type not defined' unless @type
18
+ raise 'Remote location not defined' unless @path
19
+
20
+ @valid = true
21
+ end
22
+
23
+ self
24
+ end
25
+
26
+ attr_reader :name, :type, :path
27
+ end
28
+
4
29
  class Config
5
30
  def initialize()
6
31
  cfg_file = File.join( Dir.home, '.rbld', 'rebuild.conf' )
7
-
8
- if File.exist?( cfg_file )
9
- cfg = ParseConfig.new( cfg_file )
10
- rname = cfg['REMOTE_NAME']
11
- @remote = rname ? cfg["REMOTE_#{rname}"] : nil
12
- end
32
+ cfg = File.exist?( cfg_file ) ? ParseConfig.new( cfg_file ) : nil
33
+ @remote = Remote.new( cfg )
13
34
  end
14
35
 
15
36
  def remote!
16
- raise 'Remote not defined' unless @remote
17
- @remote
37
+ @remote.validate!
18
38
  end
19
39
  end
20
40
  end
@@ -7,7 +7,9 @@ require_relative 'rbld_log'
7
7
  require_relative 'rbld_config'
8
8
  require_relative 'rbld_utils'
9
9
  require_relative 'rbld_print'
10
- require_relative 'rbld_registry'
10
+ require_relative 'rbld_reg_docker'
11
+ require_relative 'rbld_reg_fs'
12
+ require_relative 'rbld_fileops'
11
13
 
12
14
  module Rebuild::Engine
13
15
  extend Rebuild::Utils::Errors
@@ -271,8 +273,6 @@ module Rebuild::Engine
271
273
  EnvironmentIsModified: 'Environment is modified, commit or checkout first',
272
274
  EnvironmentNotKnown: 'Unknown environment %s',
273
275
  NoChangesToCommit: 'No changes to commit for %s',
274
- EnvironmentLoadFailure: 'Failed to load environment from %s',
275
- EnvironmentSaveFailure: 'Failed to save environment %s to %s',
276
276
  EnvironmentDeploymentFailure: 'Failed to deploy from %s',
277
277
  EnvironmentAlreadyExists: 'Environment %s already exists',
278
278
  EnvironmentNotFoundInTheRegistry: 'Environment %s does not exist in the registry',
@@ -281,61 +281,6 @@ module Rebuild::Engine
281
281
  EnvironmentPublishFailure: 'Failed to publish on %s',
282
282
  EnvironmentCreateFailure: 'Failed to create %s'
283
283
 
284
- class EnvironmentFile
285
- def initialize(filename, docker_api = Docker)
286
- @filename, @docker_api = filename, docker_api
287
- end
288
-
289
- def load!
290
- begin
291
- with_gzip_reader { |gz| Docker::Image.load(gz) }
292
- rescue => msg
293
- rbld_print.trace( msg )
294
- raise EnvironmentLoadFailure, @filename
295
- end
296
- end
297
-
298
- def save!(name, identity)
299
- begin
300
- with_gzip_writer do |gz|
301
- Docker::Image.save_stream( identity ) { |chunk| gz.write chunk }
302
- end
303
- rescue => msg
304
- rbld_print.trace( msg )
305
- raise EnvironmentSaveFailure, [name, @filename]
306
- end
307
- end
308
-
309
- private
310
-
311
- def with_gzip_writer
312
- begin
313
- File.open(@filename, 'w') do |f|
314
- f.binmode
315
- gz = Zlib::GzipWriter.new(f)
316
- begin
317
- yield gz
318
- ensure
319
- gz.close
320
- end
321
- end
322
- rescue
323
- FileUtils::safe_unlink( @filename )
324
- raise
325
- end
326
- end
327
-
328
- def with_gzip_reader
329
- Zlib::GzipReader.open( @filename ) do |gz|
330
- begin
331
- yield gz
332
- ensure
333
- gz.close
334
- end
335
- end
336
- end
337
- end
338
-
339
284
  class DockerContext
340
285
  def self.from_file(file)
341
286
  base = %Q{
@@ -501,13 +446,13 @@ module Rebuild::Engine
501
446
  end
502
447
 
503
448
  def search(env_name)
504
- rbld_print.progress "Searching in #{@cfg.remote!}..."
449
+ rbld_print.progress "Searching in #{@cfg.remote!.path}..."
505
450
 
506
451
  begin
507
452
  registry.search( env_name.name, env_name.tag )
508
453
  rescue => msg
509
454
  rbld_print.trace( msg )
510
- raise RegistrySearchFailed, @cfg.remote!
455
+ raise RegistrySearchFailed, @cfg.remote!.path
511
456
  end
512
457
  end
513
458
 
@@ -517,7 +462,7 @@ module Rebuild::Engine
517
462
  raise EnvironmentNotFoundInTheRegistry, env_name.full \
518
463
  if registry.search( env_name.name, env_name.tag ).empty?
519
464
 
520
- rbld_print.progress "Deploying from #{@cfg.remote!}..."
465
+ rbld_print.progress "Deploying from #{@cfg.remote!.path}..."
521
466
 
522
467
  begin
523
468
  registry.deploy( env_name.name, env_name.tag ) do |img|
@@ -526,7 +471,7 @@ module Rebuild::Engine
526
471
  end
527
472
  rescue => msg
528
473
  rbld_print.trace( msg )
529
- raise EnvironmentDeploymentFailure, @cfg.remote!
474
+ raise EnvironmentDeploymentFailure, @cfg.remote!.path
530
475
  end
531
476
 
532
477
  @cache.refresh!
@@ -541,33 +486,33 @@ module Rebuild::Engine
541
486
  unless registry.search( env_name.name, env_name.tag ).empty?
542
487
 
543
488
  begin
544
- rbld_print.progress "Publishing on #{@cfg.remote!}..."
545
- registry.publish( env.name, env.tag, env.img.api_obj )
489
+ rbld_print.progress "Publishing on #{@cfg.remote!.path}..."
490
+ registry.publish( env.name, env.tag, env.img )
546
491
  rescue => msg
547
492
  rbld_print.trace( msg )
548
- raise EnvironmentPublishFailure, @cfg.remote!
493
+ raise EnvironmentPublishFailure, @cfg.remote!.path
549
494
  end
550
495
  end
551
496
 
552
- def run(env_name, cmd)
497
+ def run(env_name, cmd, runopts = {})
553
498
  env = existing_env( env_name )
554
- run_env_disposable( env, cmd )
499
+ run_env_disposable( env, cmd, runopts )
555
500
  @cache.refresh!
556
501
  @errno
557
502
  end
558
503
 
559
- def modify!(env_name, cmd)
504
+ def modify!(env_name, cmd, runopts = {})
560
505
  env = existing_env( env_name )
561
506
 
562
507
  rbld_print.progress_start 'Initializing environment'
563
508
 
564
509
  if env.modified?
565
510
  rbld_log.info("Running container #{env.modification_container}")
566
- rerun_modification_cont(env, cmd)
511
+ rerun_modification_cont(env, cmd, runopts)
567
512
  else
568
513
  rbld_log.info("Running environment #{env.img}")
569
514
  rbld_print.progress_end
570
- run_env(env, cmd)
515
+ run_env(env, cmd, runopts)
571
516
  end
572
517
  @cache.refresh!
573
518
  @errno
@@ -667,8 +612,18 @@ module Rebuild::Engine
667
612
  end
668
613
 
669
614
  def registry
670
- @registry ||= Rebuild::Registry::API.new( @cfg.remote! )
671
- @registry
615
+ return @registry if @registry
616
+
617
+ case @cfg.remote!.type
618
+ when 'docker'
619
+ reg_module = Rebuild::Registry::Docker
620
+ when 'rebuild'
621
+ reg_module = Rebuild::Registry::FS
622
+ else
623
+ raise "Remote type #{@cfg.remote!.type} is unknown"
624
+ end
625
+
626
+ @registry = reg_module::API.new( @cfg.remote!.path )
672
627
  end
673
628
 
674
629
  def run_external(cmdline)
@@ -706,23 +661,23 @@ module Rebuild::Engine
706
661
  -e REBUILD_PWD=#{rs.pwd} \
707
662
  --security-opt label:disable \
708
663
  #{trace_run_settings} \
664
+ #{opts[:privileged] ? "--privileged" : ""} \
709
665
  #{opts[:rerun] ? env.rerun_img.id : env.img.id} \
710
666
  "#{cmd.join(' ')}" \
711
667
  }
712
668
  end
713
669
 
714
- def run_env_disposable(env, cmd)
670
+ def run_env_disposable(env, cmd, runopts)
715
671
  env.execution_container.remove! if env.execution_container
716
672
  names = NameFactory.new(env)
717
673
 
718
674
  cmdline = %Q{
719
- docker run \
720
- --rm \
721
- --name #{names.running} \
722
- --hostname #{names.hostname} \
723
- #{run_settings( env, cmd )} \
675
+ docker run \
676
+ --rm \
677
+ --name #{names.running} \
678
+ --hostname #{names.hostname} \
679
+ #{run_settings( env, cmd, runopts )} \
724
680
  }
725
-
726
681
  run_external( cmdline )
727
682
  end
728
683
 
@@ -739,7 +694,7 @@ module Rebuild::Engine
739
694
  run_external( cmdline )
740
695
  end
741
696
 
742
- def rerun_modification_cont(env, cmd)
697
+ def rerun_modification_cont(env, cmd, opts = {})
743
698
  rbld_print.progress_tick
744
699
 
745
700
  names = NameFactory.new( env )
@@ -754,7 +709,7 @@ module Rebuild::Engine
754
709
 
755
710
  @cache.refresh!
756
711
 
757
- run_env( @cache.get(env), cmd, rerun: true )
712
+ run_env( @cache.get(env), cmd, opts.merge(rerun: true) )
758
713
  end
759
714
 
760
715
  def existing_env(name)
@@ -0,0 +1,67 @@
1
+ require 'docker'
2
+ require_relative 'rbld_utils'
3
+ require_relative 'rbld_print'
4
+
5
+ module Rebuild::Engine
6
+ extend Rebuild::Utils::Errors
7
+
8
+ rebuild_errors \
9
+ EnvironmentLoadFailure: 'Failed to load environment from %s',
10
+ EnvironmentSaveFailure: 'Failed to save environment %s to %s'
11
+
12
+ class EnvironmentFile
13
+ def initialize(filename, docker_api = Docker)
14
+ @filename, @docker_api = filename, docker_api
15
+ end
16
+
17
+ def load!
18
+ begin
19
+ with_gzip_reader { |gz| Docker::Image.load(gz) }
20
+ rescue => msg
21
+ rbld_print.trace( msg )
22
+ raise EnvironmentLoadFailure, @filename
23
+ end
24
+ end
25
+
26
+ def save!(name, identity)
27
+ begin
28
+ with_gzip_writer do |gz|
29
+ Docker::Image.save_stream( identity ) { |chunk| gz.write chunk }
30
+ end
31
+ rescue => msg
32
+ rbld_print.trace( msg )
33
+ raise EnvironmentSaveFailure, [name, @filename]
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def with_gzip_writer
40
+ begin
41
+ File.open(@filename, 'w') do |f|
42
+ f.binmode
43
+ gz = Zlib::GzipWriter.new(f)
44
+ begin
45
+ yield gz
46
+ ensure
47
+ gz.close
48
+ end
49
+ end
50
+ rescue
51
+ FileUtils::safe_unlink( @filename )
52
+ raise
53
+ end
54
+ end
55
+
56
+ def with_gzip_reader
57
+ Zlib::GzipReader.open( @filename ) do |gz|
58
+ begin
59
+ yield gz
60
+ ensure
61
+ gz.close
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ end
@@ -4,6 +4,7 @@ require_relative 'rbld_utils'
4
4
 
5
5
  module Rebuild
6
6
  module Registry
7
+ module Docker
7
8
  extend Rebuild::Utils::Errors
8
9
 
9
10
  rebuild_errors \
@@ -54,8 +55,9 @@ module Rebuild
54
55
  end.compact
55
56
  end
56
57
 
57
- def publish(name, tag, api_obj)
58
+ def publish(name, tag, img)
58
59
  url = Entry.new( name, tag, @remote ).url
60
+ api_obj = img.api_obj
59
61
 
60
62
  api_obj.tag( repo: url.repo, tag: url.tag )
61
63
 
@@ -69,7 +71,7 @@ module Rebuild
69
71
  end
70
72
  end
71
73
 
72
- def deploy(name, tag, api_class = Docker::Image)
74
+ def deploy(name, tag, api_class = ::Docker::Image)
73
75
  url = Entry.new( name, tag, @remote ).url
74
76
 
75
77
  begin
@@ -103,4 +105,5 @@ module Rebuild
103
105
  end
104
106
  end
105
107
  end
108
+ end
106
109
  end
@@ -0,0 +1,62 @@
1
+ require_relative 'rbld_log'
2
+ require_relative 'rbld_utils'
3
+ require_relative 'rbld_fileops'
4
+
5
+ module Rebuild
6
+ module Registry
7
+ module FS
8
+ extend Rebuild::Utils::Errors
9
+
10
+ rebuild_error FSLookupError: 'Failed to access registry at %s'
11
+
12
+ class API
13
+ FILE_SFX = '.rbe'
14
+ private_constant :FILE_SFX
15
+
16
+ def initialize(path)
17
+ @path = path
18
+ rbld_log.info( "Connecting to registry #{@path}" )
19
+ raise FSLookupError, @remote unless Dir.exists?( @path )
20
+ end
21
+
22
+ def search(name = nil, tag = nil)
23
+ wildcard = File.join( tag.to_s.empty? ? ["#{name}*", '*' ] : [name, tag] ) + FILE_SFX
24
+
25
+ rbld_log.info( "Searching for #{wildcard}" )
26
+
27
+ Dir.glob( File.join( @path, wildcard ) ).map do |n|
28
+ pfx = File.join( @path,'' )
29
+ sfx = FILE_SFX
30
+ s = File::SEPARATOR
31
+ nametag = n.match( /^#{pfx}([^#{s}]+)#{s}([^#{s}]+)#{sfx}$/ ).captures
32
+ Rebuild::Utils::FullImageName.new( *nametag )
33
+ end
34
+ end
35
+
36
+ def publish(name, tag, img)
37
+ reg_dir = File.join( @path, name )
38
+ reg_file = File.join( reg_dir, tag ) + FILE_SFX
39
+
40
+ rbld_log.info( "Pushing to #{@path}" )
41
+
42
+ FileUtils.mkdir_p( File.join( reg_dir ) )
43
+
44
+ begin
45
+ ef = Rebuild::Engine::EnvironmentFile.new(reg_file)
46
+ ef.save!( Rebuild::Utils::FullImageName.new( name, tag ), img.identity )
47
+ rescue
48
+ FileUtils.rm_rf( reg_file )
49
+ raise
50
+ end
51
+ end
52
+
53
+ def deploy(name, tag, api_class = ::Docker::Image)
54
+ reg_file = File.join( @path, name, tag ) + FILE_SFX
55
+ rbld_log.info( "Pulling from #{@path}" )
56
+ ef = Rebuild::Engine::EnvironmentFile.new(reg_file).load!
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ module Rebuild
2
+ module Version
3
+ def self.retrieve_info
4
+ git_ver_script = File.expand_path("../../../tools/version.rb", __FILE__)
5
+ if File.exists?( git_ver_script )
6
+ require git_ver_script
7
+ rbld_version
8
+ else
9
+ File.read(File.expand_path("../data/version", __FILE__))
10
+ end
11
+ end
12
+
13
+ private_class_method :retrieve_info
14
+
15
+ def self.info
16
+ @ver ||= retrieve_info
17
+ end
18
+ end
19
+ end
@@ -2,8 +2,19 @@ CONF_DIR = File.join( Dir.home, '.rbld' )
2
2
  RBLD_CONF = File.expand_path( 'rebuild.conf', CONF_DIR )
3
3
 
4
4
  CONF_CONTENTS = <<TEXT
5
+ #This is a sample config file for Rebuild
6
+ #Uncomment and adjust following lines
7
+ #according to your registry configuration
8
+
9
+ #For Docker registries
5
10
  #REMOTE_NAME=origin
11
+ #REMOTE_TYPE_origin="docker"
6
12
  #REMOTE_origin="10.0.110.110:5000"
13
+
14
+ #For native Rebuild registry
15
+ #REMOTE_NAME=origin
16
+ #REMOTE_TYPE_origin="rebuild"
17
+ #REMOTE_origin="/mnt/rbld_regsitry_root"
7
18
  TEXT
8
19
 
9
20
  task default: [RBLD_CONF]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbld
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Fleytman
8
8
  autorequire:
9
9
  bindir: cli/bin
10
10
  cert_chain: []
11
- date: 2017-01-09 00:00:00.000000000 Z
11
+ date: 2017-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -278,13 +278,18 @@ files:
278
278
  - cli/lib/commands/rbld_save.rb
279
279
  - cli/lib/commands/rbld_search.rb
280
280
  - cli/lib/commands/rbld_status.rb
281
+ - cli/lib/commands/rbld_version.rb
282
+ - cli/lib/data/version
281
283
  - cli/lib/rbld_commands.rb
282
284
  - cli/lib/rbld_config.rb
283
285
  - cli/lib/rbld_engine.rb
286
+ - cli/lib/rbld_fileops.rb
284
287
  - cli/lib/rbld_log.rb
285
288
  - cli/lib/rbld_print.rb
286
- - cli/lib/rbld_registry.rb
289
+ - cli/lib/rbld_reg_docker.rb
290
+ - cli/lib/rbld_reg_fs.rb
287
291
  - cli/lib/rbld_utils.rb
292
+ - cli/lib/rbld_verinfo.rb
288
293
  - tools/rebuild-conf/Rakefile
289
294
  homepage: http://rbld.io/
290
295
  licenses:
@@ -309,5 +314,5 @@ rubyforge_project:
309
314
  rubygems_version: 2.4.8
310
315
  signing_key:
311
316
  specification_version: 4
312
- summary: rbld-1.0.2
317
+ summary: rbld-1.1.0
313
318
  test_files: []