devinstall 0.2.6 → 1.0.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 +4 -4
- data/README.md +39 -12
- data/bin/pkg-tool +22 -8
- data/doc/example.yml +33 -31
- data/lib/devinstall/cli.rb +65 -49
- data/lib/devinstall/settings.rb +108 -43
- data/lib/devinstall/utils.rb +8 -2
- data/lib/devinstall/version.rb +1 -1
- data/lib/devinstall.rb +92 -117
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a72a20aa430bcf037ca21512a32d6e143087f0f8
|
4
|
+
data.tar.gz: 5db3417f1ebd025f01da2c84dd9766050b29f9f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 705c0e2eac77b70d570246ea152a64be626a58a8f9762fb2367af6f49ca4bf55b9b23c6fb3c0f5837be82ddb1f8d26b2bc26bc2d7c9534a4427ea9d4dbdedf94
|
7
|
+
data.tar.gz: 7ff04e301b68ce8ca10615f98d647a150d8977bd95c61a15db0c28a9fa5bc2f3eed0b5ca2face0b84eaca1d090099887ebde781615d7dab25cb6fd7ae14b73fd
|
data/README.md
CHANGED
@@ -24,29 +24,56 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
-
|
27
|
+
When you install the gem, the installer automaticaly install a program named pkg-tool.
|
28
|
+
All the actions can be done via this tool.
|
28
29
|
|
29
|
-
|
30
|
+
The general command line syntax is:
|
30
31
|
|
31
|
-
|
32
|
+
$ pkg_tool <action> [<package>] [--env <environment>] [--type <type>] [--config <config_file>]
|
32
33
|
|
33
|
-
|
34
|
+
Where:
|
35
|
+
|
36
|
+
### Action can be one of the:
|
37
|
+
|
38
|
+
build
|
39
|
+
|
40
|
+
Builds the package on the `build/env/host` and copy the package file(s) back in the `base/temp` folder
|
41
|
+
|
42
|
+
install
|
43
|
+
|
44
|
+
Build (using `build` command) and install the builded package on the `install/env/host`
|
45
|
+
|
46
|
+
tests
|
47
|
+
|
48
|
+
Run the tests described in `test` section of the configuration file
|
34
49
|
|
35
|
-
|
50
|
+
upload
|
36
51
|
|
37
|
-
|
52
|
+
Build the package, run the tests and upload thr file to the repo
|
38
53
|
|
39
|
-
The
|
54
|
+
### The switches
|
40
55
|
|
41
|
-
|
56
|
+
The command line switches are:
|
42
57
|
|
43
|
-
|
58
|
+
--config: the config file (defaults to ./devinstall.yml)
|
44
59
|
|
45
|
-
|
60
|
+
--env: the environment for the install or upload action
|
61
|
+
|
62
|
+
--type: only for –action build and specifies the package type (deb, rpm, tar.gz, arc....)
|
63
|
+
|
64
|
+
The switches override the defaults in the config file
|
65
|
+
|
66
|
+
## Example command:
|
67
|
+
|
68
|
+
$ pkg-tool install devinstall –config ./config.yml --env dev
|
69
|
+
|
70
|
+
This will build and install the package "devinstall" on dev environment
|
71
|
+
|
72
|
+
or
|
46
73
|
|
47
|
-
|
74
|
+
$ pkg-tool upload devinstall --config ./config.yml --env dev-rh
|
48
75
|
|
49
|
-
|
76
|
+
This will build and upload package "devinstall" to repository for dev-rh environment as defined in config.yml
|
50
77
|
|
51
78
|
## Contributing
|
52
79
|
|
data/bin/pkg-tool
CHANGED
@@ -1,11 +1,29 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler/setup'
|
3
4
|
require 'devinstall/cli'
|
4
5
|
|
6
|
+
unless ARGV[0]
|
7
|
+
puts "You must specify an action"
|
8
|
+
exit! ""
|
9
|
+
end
|
10
|
+
|
11
|
+
package = [] # creata a new Array
|
5
12
|
command = ARGV.shift
|
6
|
-
package = ''
|
7
13
|
|
8
|
-
|
14
|
+
while ARGV[0] and ARGV[0][0..1] != '--'
|
15
|
+
package << ARGV.shift
|
16
|
+
end
|
17
|
+
|
18
|
+
if %w"version --version -v".include? command
|
19
|
+
command = 'version'
|
20
|
+
end
|
21
|
+
|
22
|
+
if %w"help --help -h".include? command
|
23
|
+
command = 'help'
|
24
|
+
end
|
25
|
+
|
26
|
+
unless %w"build install upload test help version".include? command
|
9
27
|
puts "Unknown command #{command}"
|
10
28
|
exit! 1
|
11
29
|
end
|
@@ -13,10 +31,6 @@ end
|
|
13
31
|
## the next should be the package
|
14
32
|
# so if ARGV[0] don't start with --
|
15
33
|
# we name it package
|
16
|
-
|
17
|
-
package = ARGV.shift
|
18
|
-
end
|
19
|
-
|
20
|
-
cli=Devinstall::Cli.new(package)
|
34
|
+
cli=Devinstall::Cli.new(*package) ## Cli can be called for multiple packages
|
21
35
|
cli.send(command.to_sym)
|
22
36
|
|
data/doc/example.yml
CHANGED
@@ -2,12 +2,23 @@ base:
|
|
2
2
|
rsync: /usr/bin/rsync
|
3
3
|
ssh: /usr/bin/ssh
|
4
4
|
scp: /usr/bin/scp
|
5
|
-
sudo:
|
5
|
+
sudo: sshsudo
|
6
|
+
defaults:
|
7
|
+
package: devinstall
|
8
|
+
env: dev
|
9
|
+
type: deb
|
10
|
+
tests:
|
11
|
+
# dev is the environment
|
12
|
+
dev:
|
13
|
+
machine: dboca.dev.local
|
14
|
+
folder: rs
|
15
|
+
user: dboca
|
16
|
+
command: "cd %f && make devtest"
|
6
17
|
local:
|
7
18
|
# folder - source folder
|
8
19
|
# temp - temporary folder
|
9
|
-
folder: ~/
|
10
|
-
temp:
|
20
|
+
folder: ~/projects/devinstall
|
21
|
+
temp: ~/.tmp
|
11
22
|
build:
|
12
23
|
# host - build machine
|
13
24
|
# folder - rsync to?
|
@@ -15,7 +26,7 @@ build:
|
|
15
26
|
# user - for ssh / rsync
|
16
27
|
# arch is the architecture for the generated package (like amd64 or i686)
|
17
28
|
user: dboca
|
18
|
-
host: vm.
|
29
|
+
host: vm-dboca.dev.local
|
19
30
|
folder: rs
|
20
31
|
target: rs
|
21
32
|
arch: all
|
@@ -23,33 +34,25 @@ install:
|
|
23
34
|
# host - dev/prod deploy and install host
|
24
35
|
# user - for scp / ssh / rsync (defaults to base[user])
|
25
36
|
# environment - live/qa/dev/...
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
prod:
|
35
|
-
host: prod01.server.lan
|
36
|
-
type: rpm
|
37
|
-
arch: all
|
38
|
-
# user defaults to install[:user]
|
37
|
+
dev:
|
38
|
+
user: dboca
|
39
|
+
host:
|
40
|
+
- server1.lan
|
41
|
+
- server2.lan
|
42
|
+
folder: /home/dboca ## folder for scp/dpkg -i
|
43
|
+
type: deb
|
44
|
+
arch: all
|
39
45
|
repos:
|
40
46
|
# for repository deployment
|
41
47
|
# in a repository should be all packages for all architectures so we don't have an 'arch:' field
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
folder: /srv/repo
|
48
|
-
dev-rh:
|
49
|
-
type: rpm
|
48
|
+
dev:
|
49
|
+
user: dboca
|
50
|
+
host: dboca.repo.lan
|
51
|
+
folder: /srv/repo/incoming
|
52
|
+
type: deb
|
50
53
|
packages:
|
51
|
-
|
52
|
-
# might contain all the sections above (local, build, install,
|
54
|
+
devinstall:
|
55
|
+
# might contain all the sections above (local, build, install, repos)
|
53
56
|
# type and build_command are mandatory
|
54
57
|
# in build_command the folowing expansions are made:
|
55
58
|
# %f build[folder]
|
@@ -57,7 +60,6 @@ packages:
|
|
57
60
|
# %p package (current package)
|
58
61
|
# %T type (deb, rpm, tar.gz ,...)
|
59
62
|
deb:
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
build_command: "cd %f && dpkg-buildpackage"
|
63
|
+
build:
|
64
|
+
command: "cd %f/%p && dpkg-buildpackage"
|
65
|
+
|
data/lib/devinstall/cli.rb
CHANGED
@@ -3,9 +3,8 @@ require 'getopt/long'
|
|
3
3
|
require 'devinstall/settings'
|
4
4
|
module Devinstall
|
5
5
|
class Cli
|
6
|
-
|
7
|
-
|
8
|
-
# See why
|
6
|
+
|
7
|
+
include Utils
|
9
8
|
|
10
9
|
def get_config(fnames)
|
11
10
|
fnames.each do |f|
|
@@ -14,78 +13,95 @@ module Devinstall
|
|
14
13
|
@opt['config']
|
15
14
|
end
|
16
15
|
|
17
|
-
def initialize(package)
|
16
|
+
def initialize(*package)
|
18
17
|
begin
|
19
18
|
@opt = Getopt::Long.getopts(
|
20
|
-
['--package', '-p', Getopt::REQUIRED],
|
21
19
|
['--config', '-c', Getopt::REQUIRED],
|
22
20
|
['--type', '-t', Getopt::REQUIRED],
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
['--env', '-e', Getopt::REQUIRED],
|
22
|
+
['--verbose', '-v'],
|
23
|
+
['--dry-run', '-d'],
|
26
24
|
)
|
27
25
|
rescue
|
28
|
-
puts 'Invalid option
|
26
|
+
puts 'Invalid option at command line'
|
29
27
|
help
|
30
|
-
exit! 1
|
31
28
|
end
|
32
29
|
#verbose and dry-run
|
33
30
|
$verbose ||= @opt['verbose']
|
34
|
-
$dry
|
31
|
+
$dry ||= @opt['dry-run']
|
35
32
|
# get config file
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
Settings.load!(@opt['config'])
|
42
|
-
# complete from default values
|
43
|
-
%w"package env type".each { |o| @opt[o] ||= Settings.defaults[o.to_sym] if Settings.defaults[o.to_sym] }
|
44
|
-
# verify all informations
|
45
|
-
if package != '' # a packege was supplied on commandline
|
46
|
-
@opt['package'] = package # this overrides all
|
33
|
+
get_config(["./devinstall.yml", "~/.devinstall.yml"])
|
34
|
+
# add packages
|
35
|
+
@opt['package']=[] # reset the package array because commandline have priority
|
36
|
+
if package # a package was supplied on command line
|
37
|
+
package.each { |p| @opt['package'] << p } # now this overrides everything
|
47
38
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
39
|
+
#get default packages
|
40
|
+
if @opt['package'].empty?
|
41
|
+
config = Devinstall::Settings.new(@opt['config'], nil, @opt['env'], @opt['type']) # Just for pkg :D
|
42
|
+
@opt['package'] = config.pkg # we DO have accessor
|
53
43
|
end
|
54
|
-
# create package
|
55
|
-
@package=Devinstall::Pkg.new(@opt['package'])
|
56
|
-
end
|
57
|
-
|
58
|
-
def version
|
59
|
-
puts "devinstall version #{Devinstall::VERSION}"
|
60
|
-
puts "pkg-tool version #{Devinstall::VERSION}"
|
61
|
-
exit! 0
|
62
|
-
end
|
63
|
-
|
64
|
-
def help
|
65
|
-
puts 'Usage:'
|
66
|
-
puts 'pkg-install command --config|-c <file> --package|-p <package> --type|-t <package_type> --env|-e <environment>'
|
67
|
-
puts 'where command is one of the: build, install, upload, help, version'
|
68
|
-
exit! 0
|
69
44
|
end
|
70
45
|
|
71
46
|
def build
|
72
|
-
@
|
47
|
+
if @opt['config'].empty?
|
48
|
+
exit! 'You must specify the config file'
|
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']))
|
53
|
+
pk.build
|
54
|
+
end
|
73
55
|
end
|
74
56
|
|
75
57
|
def install
|
76
|
-
@
|
77
|
-
|
58
|
+
if @opt['config'].empty?
|
59
|
+
exit! 'You must specify the config file'
|
60
|
+
end
|
61
|
+
@opt['package'].each do |package|
|
62
|
+
pk=Devinstall::Pkg.new(Devinstall::Settings.new(@opt['config'], package, @opt['env'], @opt['type']))
|
63
|
+
pk.build
|
64
|
+
pk.install
|
65
|
+
end
|
78
66
|
end
|
79
67
|
|
80
68
|
def upload
|
81
|
-
@
|
82
|
-
|
83
|
-
|
69
|
+
if @opt['config'].empty?
|
70
|
+
exit! 'You must specify the config file'
|
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)
|
75
|
+
pk.build
|
76
|
+
pk.run_tests
|
77
|
+
pk.upload
|
78
|
+
end
|
84
79
|
end
|
85
80
|
|
86
81
|
def test
|
87
|
-
@
|
82
|
+
if @opt['config'].empty?
|
83
|
+
exit! 'You must specify the config file'
|
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)
|
88
|
+
pk.run_tests
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def help
|
93
|
+
puts 'Usage:'
|
94
|
+
puts 'pkg-tool command [package_name ... ] --config|-c <file> --type|-t <package_type> --env|-e <environment>'
|
95
|
+
puts 'where command is one of the: build, install, upload, help, version'
|
96
|
+
exit! ""
|
97
|
+
end
|
98
|
+
|
99
|
+
def version
|
100
|
+
puts "devinstall version #{Devinstall::VERSION}"
|
101
|
+
puts "pkg-tool version #{Devinstall::VERSION}"
|
102
|
+
exit! ""
|
88
103
|
end
|
89
104
|
|
90
105
|
end
|
91
106
|
end
|
107
|
+
|
data/lib/devinstall/settings.rb
CHANGED
@@ -4,62 +4,127 @@ class Hash
|
|
4
4
|
include DeepSymbolizable
|
5
5
|
end
|
6
6
|
|
7
|
+
module Devinstall
|
8
|
+
|
9
|
+
class KeyNotDefinedError < RuntimeError; end
|
10
|
+
|
11
|
+
class UnknownKeyError < RuntimeError; end
|
12
|
+
|
13
|
+
class Settings
|
14
|
+
include Utils
|
15
|
+
attr_accessor :pkg, :env, :type
|
16
|
+
|
17
|
+
def initialize (filename, pkg = nil, env = nil, type = nil)
|
18
|
+
@@_files ||= []
|
19
|
+
@@_settings ||= {}
|
20
|
+
load! filename
|
21
|
+
self.pkg = pkg ? pkg : defaults(:package)
|
22
|
+
self.env = env ? env.to_sym : defaults(:env).to_sym
|
23
|
+
self.type = type ? type.to_sym : defaults(:type).to_sym
|
24
|
+
if Array === self.pkg
|
25
|
+
self.pkg.each do |p|
|
26
|
+
raise KeyNotDefinedError, "Package '#{p}' not defined" unless @@_settings[:packages].has_key? p.to_sym
|
27
|
+
raise KeyNotDefinedError, "Package #{p} type '#{type}' not defined " unless @@_settings[:packages][p.to_sym].has_key? self.type
|
28
|
+
end
|
29
|
+
else
|
30
|
+
raise KeyNotDefinedError, "Package '#{p}' not defined" unless @@_settings[:packages].has_key? self.pkg.to_sym
|
31
|
+
raise KeyNotDefinedError, "Package #{p} type '#{type}' not defined " unless @@_settings[:packages][self.pkg.to_sym].has_key? self.type
|
32
|
+
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
|
+
rescue KeyNotDefinedError => e
|
37
|
+
puts "#{e.message}"
|
38
|
+
exit! "" #here should be raise
|
39
|
+
rescue UnknownKeyError => e
|
40
|
+
puts "Program error: #{e.message} at:"
|
41
|
+
puts e.backtrace
|
42
|
+
exit!
|
43
|
+
end
|
7
44
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
45
|
+
def load!(filename) # Multiple load -> merge settings
|
46
|
+
unless File.exist?(filename)
|
47
|
+
puts "Unable to find config file \"#{filename}\""
|
48
|
+
exit!
|
49
|
+
end
|
50
|
+
unless @@_files.include? filename
|
51
|
+
@@_files << filename
|
52
|
+
newsets = YAML::load_file(filename).deep_symbolize
|
53
|
+
deep_merge!(@@_settings, newsets)
|
54
|
+
end
|
55
|
+
end
|
14
56
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
57
|
+
def deep_merge!(target, data)
|
58
|
+
merger = proc do |_, v1, v2|
|
59
|
+
Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2
|
60
|
+
end
|
61
|
+
target.merge! data, &merger
|
19
62
|
end
|
20
|
-
newsets = YAML::load_file(filename).deep_symbolize
|
21
|
-
newsets = newsets[options[:env].to_sym] if options[:env] && newsets[options[:env].to_sym]
|
22
|
-
deep_merge!(@_settings, newsets)
|
23
|
-
end
|
24
63
|
|
25
|
-
|
26
|
-
|
27
|
-
|
64
|
+
def defaults(key=nil)
|
65
|
+
return @@_settings.has_key? :defaults if key.nil?
|
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}"
|
28
68
|
end
|
29
|
-
target.merge! data, &merger
|
30
|
-
end
|
31
69
|
|
32
|
-
|
33
|
-
|
34
|
-
|
70
|
+
def base(key=nil)
|
71
|
+
return @@_settings.has_key? :base if key.nil?
|
72
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:rsync, :ssh, :sudo, :scp].include? key
|
73
|
+
@@_settings[:base][key] or raise KeyNotDefinedError, "Undefined key :base:#{key.to_s}"
|
74
|
+
end
|
35
75
|
|
36
|
-
|
37
|
-
|
38
|
-
|
76
|
+
def local(key)
|
77
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:folder, :temp].include? key
|
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}"
|
83
|
+
end
|
39
84
|
|
40
|
-
|
41
|
-
|
42
|
-
|
85
|
+
def build(key)
|
86
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :target, :arch, :command].include? key
|
87
|
+
ret=@@_settings[:build][key]
|
88
|
+
if @@_settings[:packages][self.pkg.to_sym][self.type].has_key? :build
|
89
|
+
ret = @@_settings[:packages][self.pkg.to_sym][self.type][:build][key] || ret
|
90
|
+
end
|
91
|
+
ret or raise KeyNotDefinedError, "Undefined key :build:#{key} or :#{self.pkg}:#{self.type}:build:#{key}"
|
92
|
+
end
|
43
93
|
|
44
|
-
|
45
|
-
|
46
|
-
|
94
|
+
def install(key)
|
95
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :type, :arch].include? key
|
96
|
+
ret=@@_settings[:install][self.env][key]
|
97
|
+
if @@_settings[:packages][self.pkg.to_sym][self.type].has_key? :install and @@_settings[:packages][:install].has_key? self.env
|
98
|
+
ret = @@_settings[:packages][self.pgk.to_sym][self.type][:install][self.env][key] || ret
|
99
|
+
end
|
100
|
+
ret or raise KeyNotDefinedError, "Undefined key :install:#{self.env.to_s}:#{key} or :#{self.pkg}:install:#{self.env.to_s}:#{key}"
|
101
|
+
end
|
47
102
|
|
48
|
-
|
49
|
-
|
50
|
-
|
103
|
+
def tests(key=nil) # tests don't have 'env'
|
104
|
+
return @@_settings.has_key?(:tests) if key.nil?
|
105
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:machine, :folder, :user, :command].include? key
|
106
|
+
ret=@@_settings[:tests][key]
|
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}"
|
111
|
+
end
|
51
112
|
|
52
|
-
|
53
|
-
|
54
|
-
|
113
|
+
def repos(key)
|
114
|
+
raise UnknownKeyError, "Don't know what are you asking about: '#{key}'" unless [:user, :host, :folder, :type, :arch].include? key
|
115
|
+
ret=@@_settings[:repos][self.env][key]
|
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}"
|
120
|
+
end
|
55
121
|
|
56
|
-
|
57
|
-
|
58
|
-
|
122
|
+
%w(repos packages).each do |m|
|
123
|
+
define_method(m) do
|
124
|
+
@@_settings[m.to_sym]
|
125
|
+
end
|
126
|
+
end
|
59
127
|
|
60
|
-
def packages
|
61
|
-
@_settings[:packages]
|
62
128
|
end
|
63
|
-
|
64
129
|
end
|
65
130
|
|
data/lib/devinstall/utils.rb
CHANGED
@@ -8,16 +8,22 @@ module Utils
|
|
8
8
|
if $?.exitstatus != 0 ## return failure
|
9
9
|
puts "While executing:"
|
10
10
|
puts cmd
|
11
|
-
puts "The command failed with exitstatus $?.exitstatus"
|
11
|
+
puts "The command failed with exitstatus #{$?.exitstatus}"
|
12
12
|
puts "Full output of command follows"
|
13
13
|
puts "="*40
|
14
14
|
puts ret
|
15
|
+
puts "="*40
|
15
16
|
puts "Nothing to do. Aborting!"
|
16
|
-
exit!
|
17
|
+
exit! "Done"
|
17
18
|
end
|
18
19
|
end
|
19
20
|
ret
|
20
21
|
end
|
21
22
|
|
23
|
+
def exit! msg
|
24
|
+
puts msg || "Aborting!"
|
25
|
+
Kernel.exit 1
|
26
|
+
end
|
27
|
+
|
22
28
|
|
23
29
|
end #module
|
data/lib/devinstall/version.rb
CHANGED
data/lib/devinstall.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'devinstall/version'
|
2
2
|
require 'devinstall/deep_symbolize'
|
3
3
|
require 'devinstall/utils'
|
4
|
-
require 'devinstall/settings'
|
5
|
-
# for something more complex because we will need to
|
6
|
-
# define things (repos/install-hosts) for different
|
7
|
-
# environments (dev/qa/prelive/live/prod/backup and so)
|
4
|
+
require 'devinstall/settings'
|
8
5
|
require 'pp'
|
9
6
|
|
10
7
|
module Devinstall
|
@@ -13,85 +10,71 @@ module Devinstall
|
|
13
10
|
|
14
11
|
include Utils
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
13
|
+
def get_version
|
14
|
+
case @config.type
|
15
|
+
when :deb
|
16
|
+
begin
|
17
|
+
deb_changelog = File.expand_path "#{@config.local(:folder)}/#{@package}/debian/changelog" # This is the folder that should be checked
|
18
|
+
unless File.exists? deb_changelog
|
19
|
+
exit! <<-eos
|
20
|
+
No 'debian/changelog' found in specified :local:folder (#{@config.local(:folder)})
|
21
|
+
Please check your config file
|
22
|
+
eos
|
23
|
+
end
|
24
|
+
@_package_version[:deb] = File.open(deb_changelog, 'r') { |f| f.gets.chomp.sub(/^.*\((.*)\).*$/, '\1') }
|
25
|
+
rescue IOError => e
|
26
|
+
exit! <<-eos
|
27
|
+
IO Error while opening #{deb_changelog}
|
28
|
+
Aborting \n #{e}
|
29
|
+
eos
|
30
|
+
end
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
34
|
# @param [String] package
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
@package_files =
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
tgz: "#{pname}.tar.gz",
|
47
|
-
dsc: "#{pname}.dsc",
|
48
|
-
chg: "#{pname}_amd64.changes"}
|
35
|
+
# @param [String] config
|
36
|
+
def initialize (config)
|
37
|
+
@config=config #class variable,first thing!
|
38
|
+
# currently implemented only for .deb packages (for .rpm later :D)
|
39
|
+
@package = @config.pkg.to_sym
|
40
|
+
@_package_version = {} # versions for types:
|
41
|
+
@package_files = {}
|
42
|
+
arch = @config.build(:arch)
|
43
|
+
p_name = "#{@package}_#{get_version}"
|
44
|
+
@package_files[:deb] = {deb: "#{p_name}_#{arch}.deb",
|
45
|
+
tgz: "#{p_name}.tar.gz",
|
46
|
+
dsc: "#{p_name}.dsc",
|
47
|
+
chg: "#{p_name}_amd64.changes"}
|
49
48
|
end
|
50
49
|
|
51
|
-
def upload
|
52
|
-
scp =
|
50
|
+
def upload
|
51
|
+
scp = @config.base(:scp)
|
53
52
|
repo = {}
|
54
|
-
|
55
|
-
|
56
|
-
unless Settings.repos[:environments][env].has_key?(k)
|
57
|
-
puts "Unexistent key #{k} in repos:environments:#{env}"
|
58
|
-
puts "Aborting"
|
59
|
-
exit! 1
|
60
|
-
end
|
61
|
-
repo[k] = Settings.repos[:environments][env][k]
|
53
|
+
[:user, :host, :folder, :type].each do |k|
|
54
|
+
repo[k] = @config.repos(k) # looks stupid
|
62
55
|
end
|
63
|
-
@package_files[type].each do |p,f|
|
56
|
+
@package_files[type].each do |p, f|
|
64
57
|
puts "Uploading #{f}\t\t[#{p}] to $#{repo[:host]}"
|
65
|
-
command("#{scp} #{
|
58
|
+
command("#{scp} #{@config.local(:temp)}/#{f} #{repo[:user]}@#{repo[:host]}:#{repo[:folder]}")
|
66
59
|
end
|
67
60
|
end
|
68
61
|
|
69
|
-
|
70
|
-
|
71
|
-
puts "Building package #{@package} type #{type
|
72
|
-
unless Settings.packages[@package].has_key? type
|
73
|
-
puts "Package '#{@package}' cannot be built for the required environment"
|
74
|
-
puts "undefined build configuration for '#{type.to_s}'"
|
75
|
-
exit! 1
|
76
|
-
end
|
62
|
+
def build
|
63
|
+
type = @config.type
|
64
|
+
puts "Building package #{@package} type #{type}"
|
77
65
|
build = {}
|
78
66
|
[:user, :host, :folder, :target].each do |k|
|
79
|
-
|
80
|
-
puts "Undefined key 'build:#{k.to_s}:'"
|
81
|
-
puts "Aborting!"
|
82
|
-
exit! 1
|
83
|
-
end
|
84
|
-
build[k] = Settings.build[k]
|
67
|
+
build[k] = @config.build(k)
|
85
68
|
end
|
86
69
|
|
87
|
-
ssh =
|
88
|
-
build_command =
|
89
|
-
rsync =
|
90
|
-
local_folder = File.expand_path
|
91
|
-
local_temp = File.expand_path
|
70
|
+
ssh = @config.base(:ssh)
|
71
|
+
build_command = @config.build(:command)
|
72
|
+
rsync = @config.base(:rsync)
|
73
|
+
local_folder = File.expand_path @config.local(:folder)
|
74
|
+
local_temp = File.expand_path @config.local(:temp)
|
92
75
|
|
93
76
|
build_command = build_command.gsub('%f', build[:folder]).
|
94
|
-
gsub('%t',
|
77
|
+
gsub('%t', @config.build(:target)).
|
95
78
|
gsub('%p', @package.to_s).
|
96
79
|
gsub('%T', type.to_s)
|
97
80
|
|
@@ -103,69 +86,61 @@ module Devinstall
|
|
103
86
|
end
|
104
87
|
end
|
105
88
|
|
106
|
-
def
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
114
|
-
test[k] = Settings.tests[env][k]
|
115
|
-
end
|
116
|
-
ssh = Settings.base[:ssh]
|
117
|
-
|
118
|
-
test[:command] = test[:command].gsub('%f', test[:folder]).
|
119
|
-
gsub('%t', Settings.build[:target]).
|
120
|
-
gsub('%p', @package.to_s)
|
121
|
-
|
122
|
-
local_folder = File.expand_path Settings.local[:folder] #take the sources from the local folder
|
123
|
-
|
124
|
-
upload_sources("#{local_folder}/", "#{test[:user]}@#{test[:machine]}:#{test[:folder]}") # upload them to the test machine
|
125
|
-
|
126
|
-
puts "Running all tests for the #{env} environment"
|
127
|
-
puts "This will take some time and you have no output"
|
128
|
-
command("#{ssh} #{test[:user]}@#{test[:machine]} \"#{test[:command]}\"")
|
129
|
-
rescue => ee
|
130
|
-
puts "Unknown exception during parsing config file"
|
131
|
-
puts "Aborting (#{ee})"
|
132
|
-
exit! 1
|
133
|
-
end
|
134
|
-
|
135
|
-
def install (environment)
|
136
|
-
puts "Installing #{@package} in #{environment} environment."
|
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
|
89
|
+
def install
|
90
|
+
env = @config.env
|
91
|
+
puts "Installing #{@package} in #{env} environment."
|
92
|
+
local_temp = @config.local(:temp)
|
93
|
+
sudo = @config.base(:sudo)
|
94
|
+
scp = @config.base(:scp)
|
95
|
+
type = @config.type
|
141
96
|
install = {}
|
142
97
|
[:user, :host, :folder].each do |k|
|
143
|
-
|
144
|
-
puts "Undefined key 'install:#{environment.to_s}:#{k.to_s}'"
|
145
|
-
exit! 1
|
146
|
-
end
|
147
|
-
install[k] = Settings.install[:environments][environment][k]
|
98
|
+
install[k] = @config.install(k)
|
148
99
|
end
|
149
|
-
|
150
100
|
install[:host] = [install[:host]] unless Array === install[:host]
|
151
|
-
|
152
101
|
case type
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
102
|
+
when :deb
|
103
|
+
install[:host].each do |host|
|
104
|
+
command("#{scp} #{local_temp}/#{@package_files[type][:deb]} #{install[:user]}@#{host}:#{install[:folder]}")
|
105
|
+
command("#{sudo} #{install[:user]}@#{host} /usr/bin/dpkg -i #{install[:folder]}/#{@package_files[type][:deb]}")
|
106
|
+
end
|
107
|
+
else
|
108
|
+
exit! "unknown package type '#{type.to_s}'"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def run_tests
|
113
|
+
# check if we have the test section in the configuration file
|
114
|
+
unless @config.tests
|
115
|
+
puts "No test section in the config file."
|
116
|
+
puts "Skipping tests"
|
117
|
+
return;
|
161
118
|
end
|
119
|
+
# for tests we will use almost the same setup as for build
|
120
|
+
test = {}
|
121
|
+
[:user, :machine, :command, :folder].each do |k|
|
122
|
+
test[k] = @config.(k)
|
123
|
+
end
|
124
|
+
ssh = @config.base(:ssh)
|
125
|
+
# replace "variables" in commands
|
126
|
+
test[:command] = test[:command].
|
127
|
+
gsub('%f', test[:folder]). # %f is the folder where the sources are rsync-ed
|
128
|
+
gsub('%t', @config.build(:target)). # %t is the folder where the build places the result
|
129
|
+
gsub('%p', @package.to_s) # %p is the package name
|
130
|
+
# take the sources from the local folder
|
131
|
+
local_folder = File.expand_path @config.local(:folder)
|
132
|
+
# upload them to the test machine
|
133
|
+
upload_sources("#{local_folder}/", "#{test[:user]}@#{test[:machine]}:#{test[:folder]}")
|
134
|
+
puts "Running all tests"
|
135
|
+
puts 'This will take some time and you have no output'
|
136
|
+
command("#{ssh} #{test[:user]}@#{test[:machine]} \"#{test[:command]}\"")
|
162
137
|
end
|
163
138
|
|
164
139
|
def upload_sources (source, dest)
|
165
|
-
rsync =
|
140
|
+
rsync = @config.base(:rsync)
|
166
141
|
command("#{rsync} -az #{source} #{dest}")
|
167
142
|
end
|
168
143
|
end
|
169
|
-
end
|
170
144
|
|
145
|
+
end
|
171
146
|
|
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.
|
4
|
+
version: 1.0.0
|
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-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|