devinstall 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|