devinstall 1.0.0 → 1.0.1
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 +4 -4
- data/.gitignore +1 -0
- data/bin/pkg-tool +2 -2
- data/devinstall.gemspec +1 -0
- data/doc/example.yml +12 -1
- data/lib/devinstall/cli.rb +35 -47
- data/lib/devinstall/settings.rb +90 -70
- data/lib/devinstall/utils.rb +20 -13
- data/lib/devinstall/version.rb +1 -1
- data/lib/devinstall.rb +37 -14
- data/spec/settings_spec.rb +31 -0
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 020bb3bf72c1b2c8c0028b4f3325535ac560bd89
|
4
|
+
data.tar.gz: dee754076fd8134e9f29ddd04e985495c62ed0ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc609fc9b54577ebc424b47b106af5892c8af416d27634936302162546e084eb4ac273c3518a88a71f60c579d0c70f3763f158bafdf73aa31fc3442e0dd373ed
|
7
|
+
data.tar.gz: df8ca74a6cddefa371bb4c7cc78a619ee0608396b022cd834a43fd55b78de47bc017688c1fb35dab9e269872de683642e9039363a4b1626439492caca7c1d789
|
data/.gitignore
CHANGED
data/bin/pkg-tool
CHANGED
data/devinstall.gemspec
CHANGED
data/doc/example.yml
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
base:
|
2
2
|
rsync: /usr/bin/rsync
|
3
|
-
ssh: /usr/bin/ssh
|
4
3
|
scp: /usr/bin/scp
|
5
4
|
sudo: sshsudo
|
5
|
+
ssh: /usr/bin/ssh
|
6
|
+
provider: ## NOT YET Implemented!
|
7
|
+
vagrant1:
|
8
|
+
init: vagrant up
|
9
|
+
destroy: vagrant destroy
|
10
|
+
openstack1:
|
11
|
+
node: node.dev.local
|
12
|
+
arch: debian64
|
6
13
|
defaults:
|
7
14
|
package: devinstall
|
8
15
|
env: dev
|
@@ -25,6 +32,9 @@ build:
|
|
25
32
|
# target - the folder where packages will be generated (defaults to folder)
|
26
33
|
# user - for ssh / rsync
|
27
34
|
# arch is the architecture for the generated package (like amd64 or i686)
|
35
|
+
# provider can be ssh or local (in the future vagrant and openstack)
|
36
|
+
# note: the ssh in provider have nothing to do with ssh command in base
|
37
|
+
provider: ssh
|
28
38
|
user: dboca
|
29
39
|
host: vm-dboca.dev.local
|
30
40
|
folder: rs
|
@@ -35,6 +45,7 @@ install:
|
|
35
45
|
# user - for scp / ssh / rsync (defaults to base[user])
|
36
46
|
# environment - live/qa/dev/...
|
37
47
|
dev:
|
48
|
+
provider: ssh
|
38
49
|
user: dboca
|
39
50
|
host:
|
40
51
|
- server1.lan
|
data/lib/devinstall/cli.rb
CHANGED
@@ -1,77 +1,69 @@
|
|
1
1
|
require 'devinstall'
|
2
2
|
require 'getopt/long'
|
3
3
|
require 'devinstall/settings'
|
4
|
+
|
4
5
|
module Devinstall
|
5
6
|
class Cli
|
6
7
|
|
7
8
|
include Utils
|
8
9
|
|
9
|
-
def get_config(fnames)
|
10
|
+
def get_config(*fnames)
|
11
|
+
config=nil
|
10
12
|
fnames.each do |f|
|
11
|
-
(
|
13
|
+
(config ||= (File.expand_path(f) if File.exist? f)) and break
|
12
14
|
end
|
13
|
-
|
15
|
+
config
|
14
16
|
end
|
15
17
|
|
16
18
|
def initialize(*package)
|
17
19
|
begin
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
opt = Getopt::Long.getopts(
|
21
|
+
%w(--config -c),
|
22
|
+
%w(--type -t),
|
23
|
+
%w(--env -e),
|
24
|
+
%w(--verbose -v),
|
25
|
+
%w(--dry-run -d),
|
24
26
|
)
|
25
27
|
rescue
|
26
28
|
puts 'Invalid option at command line'
|
27
29
|
help
|
28
30
|
end
|
29
31
|
#verbose and dry-run
|
30
|
-
$verbose ||=
|
31
|
-
$dry ||=
|
32
|
+
$verbose ||= opt['verbose']
|
33
|
+
$dry ||= opt['dry-run']
|
32
34
|
# get config file
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
if @
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
config = Devinstall::Settings.instance # is a singleton so we don't use new here
|
36
|
+
cfgfile = get_config('./devinstall.yml', '~/.devinstall.yml', opt['config'])
|
37
|
+
exit! 'You must specify the config file' if cfgfile.empty?
|
38
|
+
config.load! cfgfile # load cfgfile
|
39
|
+
config.env = opt['env'] || config.env
|
40
|
+
config.type = opt['type'] || config.type
|
41
|
+
@packages = package || []
|
42
|
+
@packages = config.defaults(:package) if @packages.empty?
|
43
|
+
exit! 'You must ask for a package' if @packages.empty?
|
44
|
+
config.validate
|
45
|
+
rescue KeyNotDefinedError => e
|
46
|
+
exit! e.message
|
44
47
|
end
|
45
48
|
|
46
49
|
def build
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
# create package
|
51
|
-
@opt['package'].each do |package|
|
52
|
-
pk=Devinstall::Pkg.new(Devinstall::Settings.new(@opt['config'], package, @opt['env'], @opt['type']))
|
50
|
+
@packages.each do |package|
|
51
|
+
pk=Devinstall::Pkg.new(package)
|
53
52
|
pk.build
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
56
|
def install
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
@opt['package'].each do |package|
|
62
|
-
pk=Devinstall::Pkg.new(Devinstall::Settings.new(@opt['config'], package, @opt['env'], @opt['type']))
|
57
|
+
@packages.each do |package|
|
58
|
+
pk=Devinstall::Pkg.new(package)
|
63
59
|
pk.build
|
64
60
|
pk.install
|
65
61
|
end
|
66
62
|
end
|
67
63
|
|
68
64
|
def upload
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
@opt['package'].each do |package|
|
73
|
-
config=Devinstall::Settings.new(@opt['config'], package, @opt['env'], @opt['type'])
|
74
|
-
pk=Devinstall::Pkg.new(config)
|
65
|
+
@packages.each do |package|
|
66
|
+
pk=Devinstall::Pkg.new(package)
|
75
67
|
pk.build
|
76
68
|
pk.run_tests
|
77
69
|
pk.upload
|
@@ -79,12 +71,8 @@ module Devinstall
|
|
79
71
|
end
|
80
72
|
|
81
73
|
def test
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
@opt['package'].each do |package|
|
86
|
-
config=Devinstall::Settings.new(@opt['config'], package, @opt['env'], @opt['type'])
|
87
|
-
pk=Devinstall::Pkg.new(config)
|
74
|
+
@packages.each do |package|
|
75
|
+
pk=Devinstall::Pkg.new(package)
|
88
76
|
pk.run_tests
|
89
77
|
end
|
90
78
|
end
|
@@ -93,13 +81,13 @@ module Devinstall
|
|
93
81
|
puts 'Usage:'
|
94
82
|
puts 'pkg-tool command [package_name ... ] --config|-c <file> --type|-t <package_type> --env|-e <environment>'
|
95
83
|
puts 'where command is one of the: build, install, upload, help, version'
|
96
|
-
exit!
|
84
|
+
exit! ''
|
97
85
|
end
|
98
86
|
|
99
87
|
def version
|
100
88
|
puts "devinstall version #{Devinstall::VERSION}"
|
101
89
|
puts "pkg-tool version #{Devinstall::VERSION}"
|
102
|
-
exit!
|
90
|
+
exit! ''
|
103
91
|
end
|
104
92
|
|
105
93
|
end
|
data/lib/devinstall/settings.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'devinstall/deep_symbolize'
|
3
|
+
require 'singleton'
|
4
|
+
require 'pp'
|
2
5
|
|
3
6
|
class Hash
|
4
7
|
include DeepSymbolizable
|
@@ -6,52 +9,67 @@ end
|
|
6
9
|
|
7
10
|
module Devinstall
|
8
11
|
|
9
|
-
class KeyNotDefinedError < RuntimeError;
|
12
|
+
class KeyNotDefinedError < RuntimeError;
|
13
|
+
end
|
10
14
|
|
11
|
-
class UnknownKeyError < RuntimeError;
|
15
|
+
class UnknownKeyError < RuntimeError;
|
16
|
+
end
|
12
17
|
|
13
18
|
class Settings
|
14
|
-
include
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
include Singleton
|
20
|
+
|
21
|
+
attr_accessor :env, :type
|
22
|
+
FILES = []
|
23
|
+
SETTINGS = {}
|
24
|
+
|
25
|
+
def pkg=(pkg)
|
26
|
+
if Array === pkg and pkg.length == 1
|
27
|
+
@pkg = pkg[0]
|
28
|
+
elsif pkg.class.method_defined? :to_sym
|
29
|
+
@pkg = pkg.to_sym
|
30
|
+
else
|
31
|
+
@pkg = pkg
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def pkg
|
36
|
+
@pkg
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate
|
40
|
+
raise KeyNotDefinedError, 'Missing package' unless self.pkg
|
41
|
+
raise KeyNotDefinedError, 'Missing environment' unless self.env
|
42
|
+
raise KeyNotDefinedError, 'Missing package type' unless self.type
|
24
43
|
if Array === self.pkg
|
25
44
|
self.pkg.each do |p|
|
26
|
-
raise KeyNotDefinedError, "Package '#{p}' not defined"
|
27
|
-
raise KeyNotDefinedError, "Package #{p} type '#{type}' not defined " unless
|
45
|
+
raise KeyNotDefinedError, "Package '#{p}' not defined" unless SETTINGS[:packages].has_key? p.to_sym
|
46
|
+
raise KeyNotDefinedError, "Package #{p} type '#{type}' not defined " unless SETTINGS[:packages][p.to_sym].has_key? self.type
|
28
47
|
end
|
29
48
|
else
|
30
|
-
raise KeyNotDefinedError, "Package '#{
|
31
|
-
raise KeyNotDefinedError, "Package #{
|
49
|
+
raise KeyNotDefinedError, "Package '#{pkg}' not defined" unless SETTINGS[:packages].has_key? self.pkg.to_sym
|
50
|
+
raise KeyNotDefinedError, "Package #{pkg} type '#{type}' not defined " unless SETTINGS[:packages][self.pkg.to_sym].has_key? self.type
|
32
51
|
end
|
33
|
-
raise KeyNotDefinedError, "Missing package" unless self.pkg
|
34
|
-
raise KeyNotDefinedError, "Missing environment" unless self.env
|
35
|
-
raise KeyNotDefinedError, "Missing package type" unless self.type
|
36
52
|
rescue KeyNotDefinedError => e
|
37
|
-
|
38
|
-
exit! "" #here should be raise
|
53
|
+
raise e
|
39
54
|
rescue UnknownKeyError => e
|
40
55
|
puts "Program error: #{e.message} at:"
|
41
56
|
puts e.backtrace
|
42
57
|
exit!
|
43
58
|
end
|
44
59
|
|
45
|
-
def load!(filename) # Multiple load -> merge settings
|
46
|
-
unless File.exist?(filename)
|
47
|
-
puts "Unable to find config file \"#{filename}\""
|
60
|
+
def load! (filename) # Multiple load -> merge settings
|
61
|
+
unless File.exist?(File.expand_path(filename))
|
62
|
+
puts "Unable to find config file \"#{File.expand_path(filename)}\""
|
48
63
|
exit!
|
49
64
|
end
|
50
|
-
unless
|
51
|
-
|
65
|
+
unless FILES.include? filename
|
66
|
+
FILES << filename
|
52
67
|
newsets = YAML::load_file(filename).deep_symbolize
|
53
|
-
deep_merge!(
|
68
|
+
deep_merge!(SETTINGS, newsets)
|
54
69
|
end
|
70
|
+
### initialize type, env from defaults unless already defined
|
71
|
+
self.env ||= defaults(:env).to_sym
|
72
|
+
self.type ||= defaults(:type).to_sym
|
55
73
|
end
|
56
74
|
|
57
75
|
def deep_merge!(target, data)
|
@@ -61,68 +79,70 @@ module Devinstall
|
|
61
79
|
target.merge! data, &merger
|
62
80
|
end
|
63
81
|
|
82
|
+
def self.defaults(key=nil)
|
83
|
+
return SETTINGS.has_key? :defaults if key.nil?
|
84
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:package, :type, :env, :providers].include? key
|
85
|
+
SETTINGS[:defaults][key] or raise KeyNotDefinedError, "Undefined key :default:#{key.to_s}"
|
86
|
+
end
|
87
|
+
|
64
88
|
def defaults(key=nil)
|
65
|
-
|
66
|
-
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:package, :type, :env].include? key
|
67
|
-
@@_settings[:defaults][key] or raise KeyNotDefinedError, "Undefined key :default:#{key.to_s}"
|
89
|
+
self.class.defaults key
|
68
90
|
end
|
69
91
|
|
70
|
-
def base(key=nil)
|
71
|
-
return
|
92
|
+
def self.base(key=nil)
|
93
|
+
return SETTINGS.has_key? :base if key.nil?
|
72
94
|
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:rsync, :ssh, :sudo, :scp].include? key
|
73
|
-
|
95
|
+
SETTINGS[:base][key] or raise KeyNotDefinedError, "Undefined key :base:#{key.to_s}"
|
74
96
|
end
|
75
97
|
|
76
|
-
def
|
77
|
-
|
78
|
-
ret=@@_settings[:local][key]
|
79
|
-
if @@_settings[:packages][self.pkg.to_sym][self.type].has_key? :local
|
80
|
-
ret = @@_settings[:packages][self.pgk.to_sym][self.type][:local][key] || ret
|
81
|
-
end
|
82
|
-
ret or raise KeyNotDefinedError, "Undefined key :local:#{key} or :#{self.pkg}:local:#{key}"
|
98
|
+
def base(key=nil)
|
99
|
+
self.class.base key
|
83
100
|
end
|
84
101
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
ret
|
102
|
+
def global_or_local(section, key)
|
103
|
+
ret = nil
|
104
|
+
if SETTINGS[:packages][self.pkg][self.type].has_key? section
|
105
|
+
ret ||= SETTINGS[:packages][self.pkg][self.type][section][self.env][key] if SETTINGS[:packages][self.pkg][self.type][section].has_key? self.env
|
106
|
+
ret ||= SETTINGS[:packages][self.pkg][self.type][section][key] # or nil
|
90
107
|
end
|
91
|
-
ret
|
108
|
+
ret ||= SETTINGS[section][self.env][key] if SETTINGS[section].has_key? self.env
|
109
|
+
ret ||= SETTINGS[section][key] # or nil
|
110
|
+
ret
|
92
111
|
end
|
93
112
|
|
94
|
-
def
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
113
|
+
def local(key=nil)
|
114
|
+
return SETTINGS.has_key? :local if key.nil?
|
115
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:folder, :temp].include? key
|
116
|
+
global_or_local(:local, key) or raise KeyNotDefinedError, "Undefined key :local:#{key} or :#{self.pkg}:local:#{key}"
|
117
|
+
end
|
118
|
+
|
119
|
+
def build(key=nil)
|
120
|
+
return (SETTINGS.has_key? :build or SETTINGS[:packages][self.pkg][self.type].has_key? :build) if key.nil?
|
121
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :target, :arch, :command, :provider].include? key
|
122
|
+
global_or_local(:build, key) or raise KeyNotDefinedError, "Undefined key :build:#{key} or :#{self.pkg}:#{self.type}:build:#{key}"
|
123
|
+
end
|
124
|
+
|
125
|
+
def install(key=nil)
|
126
|
+
return SETTINGS.has_key? :install if key.nil?
|
127
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :type, :arch, :provider].include? key
|
128
|
+
global_or_local(:install, key) or raise KeyNotDefinedError, "Undefined key :install:#{self.env.to_s}:#{key} or :#{self.pkg}:install:#{self.env.to_s}:#{key}"
|
101
129
|
end
|
102
130
|
|
103
131
|
def tests(key=nil) # tests don't have 'env'
|
104
|
-
return
|
105
|
-
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:machine, :folder, :user, :command].include? key
|
106
|
-
|
107
|
-
if @@_settings[:packages][self.pkg.to_sym][self.type].has_key? :tests
|
108
|
-
ret = @@_settings[:packages][self.pkg.to_sym][self.type][:tests][key] || ret
|
109
|
-
end
|
110
|
-
ret or raise KeyNotDefinedError, "Undefined key :tests:#{self.env.to_s}:#{key} or :#{self.pkg}:tests:#{self.env.to_s}:#{key}"
|
132
|
+
return SETTINGS.has_key?(:tests) if key.nil?
|
133
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:machine, :folder, :user, :command, :provider].include? key
|
134
|
+
global_or_local(:tests, key) or raise KeyNotDefinedError, "Undefined key :tests:#{self.env.to_s}:#{key} or :#{self.pkg}:tests:#{self.env.to_s}:#{key}"
|
111
135
|
end
|
112
136
|
|
113
|
-
def repos(key)
|
137
|
+
def repos(key=nil)
|
138
|
+
return SETTINGS.has_key?(:repos) if key.nil?
|
114
139
|
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :type, :arch].include? key
|
115
|
-
|
116
|
-
if @@_settings[:packages][self.pkg.to_sym][self.type].has_key? :repos and @@_settings[:packages][:repos].has_key? self.env
|
117
|
-
ret = @@_settings[:packages][self.pkg.to_sym][self.type][:repos][self.env][key] || ret
|
118
|
-
end
|
119
|
-
ret or raise KeyNotDefinedError, "Undefined key :repos:environments:#{self.env.to_s}:#{key} or :#{self.pkg}:repos:#{self.env.to_s}:#{key}"
|
140
|
+
global_or_local(:repos, key) or raise KeyNotDefinedError, "Undefined key :repos:environments:#{self.env.to_s}:#{key} or :#{self.pkg}:repos:#{self.env.to_s}:#{key}"
|
120
141
|
end
|
121
142
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
143
|
+
def packages(key=nil)
|
144
|
+
return SETTINGS.has_key?(:packages) if key.nil?
|
145
|
+
SETTINGS[:packages][key] ## no checks here!
|
126
146
|
end
|
127
147
|
|
128
148
|
end
|
data/lib/devinstall/utils.rb
CHANGED
@@ -1,29 +1,36 @@
|
|
1
1
|
module Utils
|
2
|
+
class CommandError < RuntimeError
|
3
|
+
attr_accessor :command_output, :return_code
|
4
|
+
|
5
|
+
def verbose_message
|
6
|
+
if $verbose
|
7
|
+
puts self.message
|
8
|
+
puts '#'*20
|
9
|
+
puts self.command_output
|
10
|
+
puts '#'*20
|
11
|
+
puts "Exit code: #{self.return_code}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
2
15
|
|
3
16
|
def command(cmd)
|
4
17
|
puts cmd if $verbose
|
5
18
|
ret=''
|
6
19
|
unless $dry
|
7
|
-
ret = `#{cmd}`
|
20
|
+
ret = `#{cmd}`
|
8
21
|
if $?.exitstatus != 0 ## return failure
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
puts "="*40
|
14
|
-
puts ret
|
15
|
-
puts "="*40
|
16
|
-
puts "Nothing to do. Aborting!"
|
17
|
-
exit! "Done"
|
22
|
+
err=CommandError.new "ErrorRunning #{cmd}"
|
23
|
+
err.command_output = ret
|
24
|
+
err.return_code = $?.exitstatus
|
25
|
+
raise err
|
18
26
|
end
|
19
27
|
end
|
20
28
|
ret
|
21
29
|
end
|
22
30
|
|
23
|
-
def exit!
|
24
|
-
puts msg ||
|
31
|
+
def exit!(msg=nil)
|
32
|
+
puts msg || 'Aborting!'
|
25
33
|
Kernel.exit 1
|
26
34
|
end
|
27
35
|
|
28
|
-
|
29
36
|
end #module
|
data/lib/devinstall/version.rb
CHANGED
data/lib/devinstall.rb
CHANGED
@@ -32,11 +32,10 @@ module Devinstall
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# @param [String] package
|
35
|
-
|
36
|
-
|
37
|
-
@config=
|
38
|
-
# currently implemented only for .deb packages (for .rpm later :D)
|
39
|
-
@package = @config.pkg.to_sym
|
35
|
+
def initialize(package)
|
36
|
+
@config=Settings.instance #class variable,first thing!
|
37
|
+
@config.pkg=package # very important!
|
38
|
+
@package = package # currently implemented only for .deb packages (for .rpm later :D)
|
40
39
|
@_package_version = {} # versions for types:
|
41
40
|
@package_files = {}
|
42
41
|
arch = @config.build(:arch)
|
@@ -51,12 +50,18 @@ module Devinstall
|
|
51
50
|
scp = @config.base(:scp)
|
52
51
|
repo = {}
|
53
52
|
[:user, :host, :folder, :type].each do |k|
|
54
|
-
repo[k] = @config.repos(k) # looks stupid
|
53
|
+
repo[k] = @config.repos(k) # looks stupid
|
55
54
|
end
|
56
55
|
@package_files[type].each do |p, f|
|
57
56
|
puts "Uploading #{f}\t\t[#{p}] to $#{repo[:host]}"
|
58
57
|
command("#{scp} #{@config.local(:temp)}/#{f} #{repo[:user]}@#{repo[:host]}:#{repo[:folder]}")
|
59
58
|
end
|
59
|
+
rescue CommandError => e
|
60
|
+
puts e.verbose_message
|
61
|
+
exit! ''
|
62
|
+
rescue KeyNotdefinederror => e
|
63
|
+
puts e.message
|
64
|
+
exit! ''
|
60
65
|
end
|
61
66
|
|
62
67
|
def build
|
@@ -84,6 +89,12 @@ module Devinstall
|
|
84
89
|
puts "Receiving target #{p.to_s} for #{t.to_s}"
|
85
90
|
command("#{rsync} -az #{build[:user]}@#{build[:host]}:#{build[:target]}/#{t} #{local_temp}")
|
86
91
|
end
|
92
|
+
rescue CommandError => e
|
93
|
+
puts e.verbose_message
|
94
|
+
exit! ''
|
95
|
+
rescue KeyNotdefinederror => e
|
96
|
+
puts e.message
|
97
|
+
exit! ''
|
87
98
|
end
|
88
99
|
|
89
100
|
def install
|
@@ -107,31 +118,37 @@ module Devinstall
|
|
107
118
|
else
|
108
119
|
exit! "unknown package type '#{type.to_s}'"
|
109
120
|
end
|
121
|
+
rescue CommandError => e
|
122
|
+
puts e.verbose_message
|
123
|
+
exit! ''
|
124
|
+
rescue KeyNotdefinederror => e
|
125
|
+
puts e.message
|
126
|
+
exit! ''
|
110
127
|
end
|
111
128
|
|
112
129
|
def run_tests
|
113
130
|
# check if we have the test section in the configuration file
|
114
131
|
unless @config.tests
|
115
|
-
puts
|
116
|
-
puts
|
117
|
-
return
|
132
|
+
puts 'No test section in the config file.'
|
133
|
+
puts 'Skipping tests'
|
134
|
+
return
|
118
135
|
end
|
119
136
|
# for tests we will use almost the same setup as for build
|
120
137
|
test = {}
|
121
138
|
[:user, :machine, :command, :folder].each do |k|
|
122
|
-
test[k] = @config.(k)
|
139
|
+
test[k] = @config.tests(k)
|
123
140
|
end
|
124
141
|
ssh = @config.base(:ssh)
|
125
142
|
# replace "variables" in commands
|
126
143
|
test[:command] = test[:command].
|
127
|
-
|
128
|
-
|
129
|
-
|
144
|
+
gsub('%f', test[:folder]).# %f is the folder where the sources are rsync-ed
|
145
|
+
gsub('%t', @config.build(:target)).# %t is the folder where the build places the result
|
146
|
+
gsub('%p', @package.to_s) # %p is the package name
|
130
147
|
# take the sources from the local folder
|
131
148
|
local_folder = File.expand_path @config.local(:folder)
|
132
149
|
# upload them to the test machine
|
133
150
|
upload_sources("#{local_folder}/", "#{test[:user]}@#{test[:machine]}:#{test[:folder]}")
|
134
|
-
puts
|
151
|
+
puts 'Running all tests'
|
135
152
|
puts 'This will take some time and you have no output'
|
136
153
|
command("#{ssh} #{test[:user]}@#{test[:machine]} \"#{test[:command]}\"")
|
137
154
|
end
|
@@ -140,6 +157,12 @@ module Devinstall
|
|
140
157
|
rsync = @config.base(:rsync)
|
141
158
|
command("#{rsync} -az #{source} #{dest}")
|
142
159
|
end
|
160
|
+
rescue CommandError => e
|
161
|
+
puts e.verbose_message
|
162
|
+
exit! ''
|
163
|
+
rescue KeyNotdefinederror => e
|
164
|
+
puts e.message
|
165
|
+
exit! ''
|
143
166
|
end
|
144
167
|
|
145
168
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
require 'devinstall/settings'
|
4
|
+
|
5
|
+
describe 'Settings' do
|
6
|
+
config=Devinstall::Settings.instance
|
7
|
+
config.load! "./doc/example.yml"
|
8
|
+
|
9
|
+
it 'should load at init' do
|
10
|
+
expect(config).to be_an_instance_of(Devinstall::Settings)
|
11
|
+
[:defaults, :base, :local, :build, :install, :tests, :packages, :repos].each do |p|
|
12
|
+
expect(config.send(p)).to be_true
|
13
|
+
end # all sections loaded!
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should have defaults' do
|
17
|
+
expect(config.defaults).to be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should have a static default' do
|
21
|
+
expect(Devinstall::Settings.defaults(:package)).to be(config.defaults(:package))
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should raise errors for unknown keys' do
|
25
|
+
expect{config.defaults :none}.to raise_error(Devinstall::UnknownKeyError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should raise errors for undefined keys' do
|
29
|
+
expect{config.tests(:provider)}.to raise_error(Devinstall::KeyNotDefinedError)
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devinstall
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dragos Boca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: remote builder and installer
|
56
70
|
email:
|
57
71
|
- dboca@mail.com
|
@@ -75,6 +89,7 @@ files:
|
|
75
89
|
- lib/devinstall/settings.rb
|
76
90
|
- lib/devinstall/utils.rb
|
77
91
|
- lib/devinstall/version.rb
|
92
|
+
- spec/settings_spec.rb
|
78
93
|
homepage: http://github.com/dboca/devinstall
|
79
94
|
licenses:
|
80
95
|
- MIT
|
@@ -100,4 +115,5 @@ signing_key:
|
|
100
115
|
specification_version: 4
|
101
116
|
summary: Copy the source files to a build host, build the packages and install builded
|
102
117
|
packages
|
103
|
-
test_files:
|
118
|
+
test_files:
|
119
|
+
- spec/settings_spec.rb
|