devinstall 0.2.2 → 0.2.3
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/bin/pkg-tool +7 -64
- data/lib/devinstall/cli.rb +83 -0
- data/lib/devinstall/deep_symbolize.rb +0 -27
- data/lib/devinstall/settings.rb +3 -2
- data/lib/devinstall/version.rb +1 -1
- data/lib/devinstall.rb +75 -53
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51f4ddcf8ee4cb1806c0ee407aa1c6e582c7088c
|
4
|
+
data.tar.gz: 7317bd32282391c568339f534e23bd485bbf02b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ac955e8f47abcfcf93f2ad3351ef78125d8d7e68b898ff4ff5812473fcf2fd3c159a35d4e576d04336b54630c52166b92efe7904fc9855f3884869753756b06
|
7
|
+
data.tar.gz: ae05a8d213cf8570eeb9c7a4016de3dbe31f39da88e1db182d6a187b339e81c8cb4699577983ea3c77348adef9944a35ef5a2d8018764c0a5861a3b7b7182b06
|
data/bin/pkg-tool
CHANGED
@@ -1,69 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'devinstall'
|
5
|
-
require 'devinstall/settings'
|
3
|
+
require 'devinstall/cli'
|
6
4
|
|
7
|
-
|
8
|
-
opt =Getopt::Long.getopts(
|
9
|
-
['--version', '-v',],
|
10
|
-
['--package', '-p', Getopt::REQUIRED],
|
11
|
-
['--config', '-c', Getopt::REQUIRED],
|
12
|
-
['--type', '-t', Getopt::REQUIRED],
|
13
|
-
['--env', '-e', Getopt::REQUIRED],
|
14
|
-
['--build', '-b',],
|
15
|
-
['--upload', '-u',],
|
16
|
-
['--install', '-i',],
|
17
|
-
['--test', '-t,'],
|
18
|
-
['--help', '-h',],
|
19
|
-
)
|
20
|
-
rescue
|
21
|
-
puts 'Invalid option in command line'
|
22
|
-
help!
|
23
|
-
exit! 1
|
24
|
-
end
|
25
|
-
|
26
|
-
def help!
|
27
|
-
puts 'Usage: pkg-install --config|-c <file> --package|-p <package> --type|-t <package_type> --env|-e <environment> --build|--upload|--install'
|
28
|
-
end
|
29
|
-
|
30
|
-
if opt['version']
|
31
|
-
puts "devinstall version #{Devinstall::VERSION}"
|
32
|
-
puts "pkg-tool version #{Devinstall::VERSION}"
|
33
|
-
exit(0)
|
34
|
-
end
|
35
|
-
|
36
|
-
if opt['help']
|
37
|
-
help!
|
38
|
-
exit!(0)
|
39
|
-
end
|
40
|
-
unless opt['config']
|
41
|
-
puts 'You must specify the config file'
|
42
|
-
exit! 1 # Exit
|
43
|
-
end
|
44
|
-
Settings.load! opt['config']
|
45
|
-
|
46
|
-
['package', 'env', 'type'].each do |o|
|
47
|
-
if Settings.defaults[o.to_sym]
|
48
|
-
opt[o]=Settings.defaults[o.to_sym]
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
unless opt['package'] && opt['config'] && opt['type'] && opt['env'] && (opt['build'] || opt['upload'] || opt['install'] || opt['test'])
|
53
|
-
puts 'You must speciffy --config file, --package, --type and --env and one of the actions (--build, --install, --upload or --test)'
|
54
|
-
exit! 1
|
55
|
-
end
|
56
|
-
package=Devinstall::Pkg.new(opt['package'])
|
5
|
+
command = ARGV.shift
|
57
6
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
package.build(opt['type'].to_sym)
|
62
|
-
package.install(opt['env'].to_sym)
|
63
|
-
elsif opt['upload']
|
64
|
-
package.build(opt['type'].to_sym)
|
65
|
-
package.run_tests(opt['env'].to_sym)
|
66
|
-
package.upload(opt['env'].to_sym)
|
67
|
-
elsif opt['test']
|
68
|
-
package.run_tests(opt['env'].to_sym)
|
7
|
+
unless %w"build install upload help version test".include? command
|
8
|
+
puts "Unknown command #{command}"
|
9
|
+
exit 1
|
69
10
|
end
|
11
|
+
cli=Cli.new
|
12
|
+
cli.send(command.to_sym)
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'devinstall'
|
2
|
+
require 'getopt/long'
|
3
|
+
require 'devinstall/settings'
|
4
|
+
module Devinstall
|
5
|
+
class Cli
|
6
|
+
# extend self
|
7
|
+
# make this module a singleton also
|
8
|
+
# See why
|
9
|
+
|
10
|
+
def get_config(fnames)
|
11
|
+
fnames.each do |f|
|
12
|
+
(@opt['config'] ||= (File.expand_path(f) if File.exist? f)) and break
|
13
|
+
end
|
14
|
+
@opt['config']
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
begin
|
19
|
+
@opt = Getopt::Long.getopts(
|
20
|
+
['--package', '-p', Getopt::REQUIRED],
|
21
|
+
['--config', '-c', Getopt::REQUIRED],
|
22
|
+
['--type', '-t', Getopt::REQUIRED],
|
23
|
+
['--env', '-e', Getopt::REQUIRED],
|
24
|
+
)
|
25
|
+
rescue
|
26
|
+
puts 'Invalid option in command line'
|
27
|
+
help
|
28
|
+
exit! 1
|
29
|
+
end
|
30
|
+
# get config file
|
31
|
+
unless get_config(["./devinstall.yml"])
|
32
|
+
puts 'You must specify the config file'
|
33
|
+
exit! 1 # Exit
|
34
|
+
end
|
35
|
+
# parse config file
|
36
|
+
Settings.load!(@opt['config'])
|
37
|
+
# complete from default values
|
38
|
+
%w"package env type".each { |o| @opt[o] ||= Settings.defaults[o.to_sym] if Settings.defaults[o.to_sym] }
|
39
|
+
# verify all informations
|
40
|
+
%w"package type env".each do |k|
|
41
|
+
unless @opt[k]
|
42
|
+
puts "You must specify option '#{k}' either as default or in command line"
|
43
|
+
help
|
44
|
+
end
|
45
|
+
end
|
46
|
+
# create package
|
47
|
+
@package=Devinstall::Pkg.new(@opt['package'])
|
48
|
+
end
|
49
|
+
|
50
|
+
def version
|
51
|
+
puts "devinstall version #{Devinstall::VERSION}"
|
52
|
+
puts "pkg-tool version #{Devinstall::VERSION}"
|
53
|
+
exit(0)
|
54
|
+
end
|
55
|
+
|
56
|
+
def help
|
57
|
+
puts 'Usage:'
|
58
|
+
puts 'pkg-install command --config|-c <file> --package|-p <package> --type|-t <package_type> --env|-e <environment>'
|
59
|
+
puts 'where command is one of the: build, install, upload, help, version'
|
60
|
+
exit! 0
|
61
|
+
end
|
62
|
+
|
63
|
+
def build
|
64
|
+
@package.build(@opt['type'].to_sym)
|
65
|
+
end
|
66
|
+
|
67
|
+
def install
|
68
|
+
package.build(@opt['type'].to_sym)
|
69
|
+
package.install(@opt['env'].to_sym)
|
70
|
+
end
|
71
|
+
|
72
|
+
def upload
|
73
|
+
package.build(@opt['type'].to_sym)
|
74
|
+
package.run_tests(@opt['env'].to_sym)
|
75
|
+
package.upload(@opt['env'].to_sym)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test
|
79
|
+
package.run_tests(@opt['env'].to_sym)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -1,17 +1,3 @@
|
|
1
|
-
# Symbolizes all of hash's keys and subkeys.
|
2
|
-
# Also allows for custom pre-processing of keys (e.g. downcasing, etc)
|
3
|
-
# if the block is given:
|
4
|
-
#
|
5
|
-
# somehash.deep_symbolize { |key| key.downcase }
|
6
|
-
#
|
7
|
-
# Usage: either include it into global Hash class to make it available to
|
8
|
-
# to all hashes, or extend only your own hash objects with this
|
9
|
-
# module.
|
10
|
-
# E.g.:
|
11
|
-
# 1) class Hash; include DeepSymbolizable; end
|
12
|
-
# 2) myhash.extend DeepSymbolizable
|
13
|
-
|
14
|
-
|
15
1
|
module DeepSymbolizable
|
16
2
|
|
17
3
|
def deep_symbolize(&block)
|
@@ -23,35 +9,22 @@ module DeepSymbolizable
|
|
23
9
|
module Symbolizers
|
24
10
|
extend self
|
25
11
|
|
26
|
-
# the primary method - symbolizes keys of the given hash,
|
27
|
-
# preprocessing them with a block if one was given, and recursively
|
28
|
-
# going into all nested enumerables
|
29
12
|
def hash(hash, &block)
|
30
13
|
hash.inject({}) do |result, (key, value)|
|
31
|
-
# Recursively deep-symbolize subhashes
|
32
14
|
value = _recurse_(value, &block)
|
33
|
-
|
34
|
-
# Pre-process the key with a block if it was given
|
35
15
|
key = yield key if block_given?
|
36
|
-
# Symbolize the key string if it responds to to_sym
|
37
16
|
sym_key = key.to_sym rescue key
|
38
|
-
|
39
|
-
# write it back into the result and return the updated hash
|
40
17
|
result[sym_key] = value
|
41
18
|
result
|
42
19
|
end
|
43
20
|
end
|
44
21
|
|
45
|
-
# walking over arrays and symbolizing all nested elements
|
46
22
|
def array(ary, &block)
|
47
23
|
ary.map { |v| _recurse_(v, &block) }
|
48
24
|
end
|
49
25
|
|
50
|
-
# handling recursion - any Enumerable elements (except String)
|
51
|
-
# is being extended with the module, and then symbolized
|
52
26
|
def _recurse_(value, &block)
|
53
27
|
if value.is_a?(Enumerable) && !value.is_a?(String)
|
54
|
-
# support for a use case without extended core Hash
|
55
28
|
value.extend DeepSymbolizable unless value.class.include?(DeepSymbolizable)
|
56
29
|
value = value.deep_symbolize(&block)
|
57
30
|
end
|
data/lib/devinstall/settings.rb
CHANGED
@@ -23,8 +23,9 @@ module Settings
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def deep_merge!(target, data)
|
26
|
-
merger = proc
|
27
|
-
Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2
|
26
|
+
merger = proc do |_, v1, v2|
|
27
|
+
Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2
|
28
|
+
end
|
28
29
|
target.merge! data, &merger
|
29
30
|
end
|
30
31
|
|
data/lib/devinstall/version.rb
CHANGED
data/lib/devinstall.rb
CHANGED
@@ -13,35 +13,41 @@ module Devinstall
|
|
13
13
|
# @param [Symbol] type
|
14
14
|
def get_version(type)
|
15
15
|
if type == :deb
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
begin
|
17
|
+
deb_changelog = File.expand_path "#{Settings.local[:folder]}/#{@package}/debian/changelog" # This is the folder that should be checked
|
18
|
+
deb_package_version = File.open(deb_changelog, 'r') { |f| f.gets.chomp.sub(/^.*\((.*)\).*$/, '\1') }
|
19
|
+
@_package_version[:deb] = deb_package_version
|
20
|
+
|
21
|
+
rescue IOError => e
|
22
|
+
puts "IO Error while opening #{deb_changelog}"
|
23
|
+
puts "Aborting \n #{e}"
|
24
|
+
exit! 1
|
25
|
+
end
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
22
29
|
# @param [String] package
|
23
30
|
def initialize (package)
|
24
31
|
# curently implemented only for .deb packages (for .rpm later :D)
|
25
|
-
@package =package.to_sym
|
26
|
-
@_package_version =Hash.new # versions for types:
|
27
|
-
@package_files =Hash.new
|
28
|
-
arch =Settings.build[:arch]
|
29
|
-
pname ="#{package}_#{get_version :deb}"
|
30
|
-
@package_files[:deb] ={deb: "#{pname}_#{arch}.deb",
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
@package = package.to_sym
|
33
|
+
@_package_version = Hash.new # versions for types:
|
34
|
+
@package_files = Hash.new
|
35
|
+
arch = Settings.build[:arch]
|
36
|
+
pname = "#{package}_#{get_version :deb}"
|
37
|
+
@package_files[:deb] = {deb: "#{pname}_#{arch}.deb",
|
38
|
+
tgz: "#{pname}.tar.gz",
|
39
|
+
dsc: "#{pname}.dsc",
|
40
|
+
chg: "#{pname}_amd64.changes"}
|
34
41
|
end
|
35
42
|
|
36
|
-
def upload (
|
37
|
-
scp =Settings.base[:scp]
|
38
|
-
repo =
|
39
|
-
type =Settings.repos[:environments][
|
43
|
+
def upload (env)
|
44
|
+
scp = Settings.base[:scp]
|
45
|
+
repo = {}
|
46
|
+
type = Settings.repos[:environments][env][:type]
|
40
47
|
[:user, :host, :folder].each do |k|
|
41
|
-
fail("Unexistent key repos:#{environment}:#{k}") unless Settings.repos[:environments][
|
42
|
-
repo[k]=Settings.repos[:environments][
|
48
|
+
fail("Unexistent key repos:#{environment}:#{k}") unless Settings.repos[:environments][env].has_key?(k)
|
49
|
+
repo[k] = Settings.repos[:environments][env][k]
|
43
50
|
end
|
44
|
-
build(type)
|
45
51
|
@package_files[type].each do |p|
|
46
52
|
system("#{scp} #{Settings.local[:temp]}/#{p} #{repo[:user]}@#{repo[:host]}:#{repo[:folder]}")
|
47
53
|
end
|
@@ -50,25 +56,25 @@ module Devinstall
|
|
50
56
|
# @param [Symbol] type
|
51
57
|
def build (type)
|
52
58
|
puts "Building package #{@package} type #{type.to_s}"
|
53
|
-
unless Settings.packages[@package].has_key?
|
54
|
-
puts
|
55
|
-
puts
|
56
|
-
exit!
|
59
|
+
unless Settings.packages[@package].has_key? type
|
60
|
+
puts "Package '#{@package}' cannot be built for the required environment"
|
61
|
+
puts "undefined build configuration for '#{type.to_s}'"
|
62
|
+
exit! 1
|
57
63
|
end
|
58
|
-
build =
|
64
|
+
build = {}
|
59
65
|
[:user, :host, :folder, :target].each do |k|
|
60
|
-
unless Settings.build.has_key?
|
61
|
-
puts
|
62
|
-
exit!
|
66
|
+
unless Settings.build.has_key? k
|
67
|
+
puts "Undefined key 'build:#{k.to_s}:'"
|
68
|
+
exit! 1
|
63
69
|
end
|
64
|
-
build[k]=Settings.build[k]
|
70
|
+
build[k] = Settings.build[k]
|
65
71
|
end
|
66
72
|
|
67
|
-
ssh =Settings.base[:ssh]
|
68
|
-
build_command=Settings.packages[@package][type][:build_command]
|
69
|
-
rsync =Settings.base[:rsync]
|
70
|
-
local_folder =File.expand_path Settings.local[:folder]
|
71
|
-
local_temp =File.expand_path Settings.local[:temp]
|
73
|
+
ssh = Settings.base[:ssh]
|
74
|
+
build_command = Settings.packages[@package][type][:build_command]
|
75
|
+
rsync = Settings.base[:rsync]
|
76
|
+
local_folder = File.expand_path Settings.local[:folder]
|
77
|
+
local_temp = File.expand_path Settings.local[:temp]
|
72
78
|
|
73
79
|
build_command = build_command.gsub('%f', build[:folder]).
|
74
80
|
gsub('%t', Settings.build[:target]).
|
@@ -76,41 +82,51 @@ module Devinstall
|
|
76
82
|
gsub('%T', type.to_s)
|
77
83
|
|
78
84
|
upload_sources("#{local_folder}/", "#{build[:user]}@#{build[:host]}:#{build[:folder]}")
|
79
|
-
system("#{ssh} #{build[:user]}@#{build[:host]} \"#{build_command}\"")
|
85
|
+
res = system("#{ssh} #{build[:user]}@#{build[:host]} \"#{build_command}\"")
|
86
|
+
unless res
|
87
|
+
puts 'Build error'
|
88
|
+
puts 'Aborting!'
|
89
|
+
exit! 1
|
90
|
+
end
|
80
91
|
@package_files[type].each do |p, t|
|
81
92
|
puts "Receiving target #{p.to_s} for #{t.to_s}"
|
82
|
-
system("#{rsync} -az #{build[:user]}@#{build[:host]}:#{build[:target]}/#{t} #{local_temp}")
|
93
|
+
res = system("#{rsync} -az #{build[:user]}@#{build[:host]}:#{build[:target]}/#{t} #{local_temp}")
|
94
|
+
unless res
|
95
|
+
puts 'File downloading error'
|
96
|
+
puts 'Aborting!'
|
97
|
+
exit! 1
|
98
|
+
end
|
83
99
|
end
|
84
100
|
end
|
85
101
|
|
86
|
-
def run_tests(
|
102
|
+
def run_tests(env)
|
87
103
|
# for tests we will use aprox the same setup as for build
|
88
|
-
test =
|
104
|
+
test = {}
|
89
105
|
[:user, :machine, :command, :folder].each do |k|
|
90
|
-
unless Settings.tests[
|
106
|
+
unless Settings.tests[env].has_key? k
|
91
107
|
puts("Undefined key 'tests:#{environment}:#{k.to_s}:'")
|
92
|
-
exit!
|
108
|
+
exit! 1
|
93
109
|
end
|
94
|
-
test[k]=Settings.tests[
|
110
|
+
test[k] = Settings.tests[env][k]
|
95
111
|
end
|
96
|
-
ssh =Settings.base[:ssh]
|
112
|
+
ssh = Settings.base[:ssh]
|
97
113
|
|
98
114
|
test[:command] = test[:command].gsub('%f', test[:folder]).
|
99
115
|
gsub('%t', Settings.build[:target]).
|
100
116
|
gsub('%p', @package.to_s)
|
101
117
|
|
102
|
-
local_folder =File.expand_path Settings.local[:folder] #take the sources from the local folder
|
118
|
+
local_folder = File.expand_path Settings.local[:folder] #take the sources from the local folder
|
103
119
|
|
104
120
|
upload_sources("#{local_folder}/", "#{test[:user]}@#{test[:machine]}:#{test[:folder]}") # upload them to the test machine
|
105
121
|
|
106
122
|
puts "Running all tests for the #{environment} environment"
|
107
123
|
puts "This will take some time"
|
108
|
-
ret=system("#{ssh} #{test[:user]}@#{test[:machine]} \"#{test[:command]}\"")
|
124
|
+
ret = system("#{ssh} #{test[:user]}@#{test[:machine]} \"#{test[:command]}\"")
|
109
125
|
if ret
|
110
126
|
puts "Errors during test. Aborting current procedure"
|
111
127
|
exit! 1
|
112
128
|
end
|
113
|
-
rescue
|
129
|
+
rescue => ee
|
114
130
|
puts "Unknown exception during parsing config file"
|
115
131
|
puts "Aborting (#{ee})"
|
116
132
|
exit! 1
|
@@ -118,17 +134,17 @@ module Devinstall
|
|
118
134
|
|
119
135
|
def install (environment)
|
120
136
|
puts "Installing #{@package} in #{environment} environment."
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
install=
|
137
|
+
local_temp = Settings.local[:temp]
|
138
|
+
sudo = Settings.base[:sudo]
|
139
|
+
scp = Settings.base[:scp]
|
140
|
+
type = Settings.install[:environments][environment][:type].to_sym
|
141
|
+
install = {}
|
126
142
|
[:user, :host, :folder].each do |k|
|
127
|
-
unless Settings.install[:environments][environment].has_key?
|
143
|
+
unless Settings.install[:environments][environment].has_key? k
|
128
144
|
puts "Undefined key 'install:#{environment.to_s}:#{k.to_s}'"
|
129
145
|
exit! 1
|
130
146
|
end
|
131
|
-
install[k]=Settings.install[:environments][environment][k]
|
147
|
+
install[k] = Settings.install[:environments][environment][k]
|
132
148
|
end
|
133
149
|
case type
|
134
150
|
when :deb
|
@@ -141,8 +157,14 @@ module Devinstall
|
|
141
157
|
end
|
142
158
|
|
143
159
|
def upload_sources (source, dest)
|
144
|
-
rsync =Settings.base[:rsync]
|
145
|
-
system("#{rsync} -az #{source} #{dest}")
|
160
|
+
rsync = Settings.base[:rsync]
|
161
|
+
res = system("#{rsync} -az #{source} #{dest}")
|
162
|
+
unless res
|
163
|
+
puts "Rsync error"
|
164
|
+
puts "Aborting!"
|
165
|
+
exit! 1
|
166
|
+
end
|
167
|
+
res
|
146
168
|
end
|
147
169
|
end
|
148
170
|
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: 0.2.
|
4
|
+
version: 0.2.3
|
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-04-
|
11
|
+
date: 2013-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- devinstall.gemspec
|
81
81
|
- doc/example.yml
|
82
82
|
- lib/devinstall.rb
|
83
|
+
- lib/devinstall/cli.rb
|
83
84
|
- lib/devinstall/deep_symbolize.rb
|
84
85
|
- lib/devinstall/settings.rb
|
85
86
|
- lib/devinstall/version.rb
|