app_builder 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app_builder.gemspec +3 -0
- data/lib/app_builder.rb +6 -0
- data/lib/app_builder/archiver.rb +2 -2
- data/lib/app_builder/base.rb +2 -2
- data/lib/app_builder/builder.rb +13 -6
- data/lib/app_builder/logger.rb +48 -0
- data/lib/app_builder/server.rb +97 -0
- data/lib/app_builder/uploader.rb +16 -6
- data/lib/app_builder/version.rb +1 -1
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 16e6784f07c5a6ea216a05502d569ead643ef3cc
|
4
|
+
data.tar.gz: 6d2fb40d61b2e7329eb4c3a2f528feaea073a013
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0865b3c4d763355ff5aa601ea8dd2b098af728efcd92c336ce2674745819e73aee94deb1d243ac67a3d6f460f41d73ca071b935fddd5f19a0d06ec1741f3374f'
|
7
|
+
data.tar.gz: 20aa8af30e89a5f56daa96d151acc1864f4995a30799b03c442ab5b6a21825785bd0386947948373889198b028df80c3cd52479e11458e1c88a3c0096f538242
|
data/app_builder.gemspec
CHANGED
@@ -20,6 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
+
spec.add_dependency "net-ssh"
|
24
|
+
spec.add_dependency "net-scp"
|
25
|
+
|
23
26
|
spec.add_development_dependency "bundler", "~> 1.16"
|
24
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
28
|
spec.add_development_dependency "minitest", "~> 5.0"
|
data/lib/app_builder.rb
CHANGED
@@ -2,10 +2,16 @@ require "erb"
|
|
2
2
|
require "forwardable"
|
3
3
|
require "logger"
|
4
4
|
require "open3"
|
5
|
+
require "tempfile"
|
5
6
|
require "yaml"
|
6
7
|
|
8
|
+
require "net/ssh"
|
9
|
+
require "net/scp"
|
10
|
+
|
7
11
|
require "app_builder/version"
|
8
12
|
require "app_builder/config"
|
13
|
+
require "app_builder/logger"
|
14
|
+
require "app_builder/server.rb"
|
9
15
|
require "app_builder/base"
|
10
16
|
require "app_builder/archiver"
|
11
17
|
require "app_builder/builder"
|
data/lib/app_builder/archiver.rb
CHANGED
data/lib/app_builder/base.rb
CHANGED
data/lib/app_builder/builder.rb
CHANGED
@@ -1,18 +1,25 @@
|
|
1
1
|
module AppBuilder
|
2
2
|
class Builder < Base
|
3
|
+
attr_accessor :archiver
|
4
|
+
|
3
5
|
class << self
|
4
|
-
def build(
|
5
|
-
new(
|
6
|
+
def build(conf)
|
7
|
+
new(conf).build
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(conf = nil)
|
12
|
+
if conf.class <= Archiver
|
13
|
+
@archiver = conf
|
14
|
+
conf = conf.config
|
6
15
|
end
|
16
|
+
super(conf)
|
17
|
+
@archiver ||= Archiver.new(config)
|
7
18
|
end
|
8
19
|
|
9
20
|
def build
|
10
21
|
archiver.archive
|
11
22
|
execute("tar zcf #{builded_src_path} .", chdir: archive_path)
|
12
23
|
end
|
13
|
-
|
14
|
-
def archiver
|
15
|
-
@archiver ||= Archiver.new(config)
|
16
|
-
end
|
17
24
|
end
|
18
25
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module AppBuilder
|
2
|
+
class Logger < ::Logger
|
3
|
+
class Formatter < ::Logger::Formatter
|
4
|
+
Format = "%s\t%s\t%d\t%s\n".freeze
|
5
|
+
|
6
|
+
def call(severity, time, progname, msg)
|
7
|
+
Format % [severity, format_datetime(time), $$, msg2str(msg)]
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def format_datetime(time)
|
13
|
+
time.strftime(@datetime_format || "%F %H:%M:%S.%6N".freeze)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
|
18
|
+
progname: nil, formatter: nil, datetime_format: nil,
|
19
|
+
shift_period_suffix: '%Y%m%d')
|
20
|
+
super
|
21
|
+
@default_formatter = Formatter.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def format_message(severity, datetime, progname, msg)
|
25
|
+
apply_severity_color(
|
26
|
+
severity,
|
27
|
+
(@formatter || @default_formatter).call(severity, datetime, progname, msg),
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def apply_severity_color(severity, msg)
|
34
|
+
case severity
|
35
|
+
when "DEBUG".freeze
|
36
|
+
"\033[2m#{msg}\033[m"
|
37
|
+
when "INFO".freeze
|
38
|
+
"\033[32m#{msg}\033[m"
|
39
|
+
when "WARN".freeze
|
40
|
+
"\033[33m#{msg}\033[m"
|
41
|
+
when "ERROR".freeze, "FATAL".freeze
|
42
|
+
"\033[31m#{msg}\033[m"
|
43
|
+
else
|
44
|
+
msg
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module AppBuilder
|
2
|
+
class Server
|
3
|
+
attr_accessor :address, :user, :options, :logger
|
4
|
+
|
5
|
+
LOCAL_ADDRESSES = %w(local 127.0.0.1).freeze
|
6
|
+
|
7
|
+
def initialize(address = nil, user: nil, options: {}, logger: nil)
|
8
|
+
@address = address
|
9
|
+
@user = user || ENV.fetch("USER", nil)
|
10
|
+
@options = options
|
11
|
+
@logger = logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute(*cmds)
|
15
|
+
results = []
|
16
|
+
|
17
|
+
if local?
|
18
|
+
options = cmds.last.is_a?(Hash) ? cmds.pop : {}
|
19
|
+
cmds.each do |cmd|
|
20
|
+
message = "Execute command [local]: #{cmd}"
|
21
|
+
message += " (with: #{options.inspect})" unless options.empty?
|
22
|
+
log(:info, message)
|
23
|
+
|
24
|
+
stdout, stderr, status = Open3.capture3(cmd, **options)
|
25
|
+
log(:error, "Failed [#{status.exitstatus}]: #{stderr}") unless status.success?
|
26
|
+
results << stdout
|
27
|
+
end
|
28
|
+
else
|
29
|
+
ssh_start do |ssh|
|
30
|
+
cmds.each do |cmd|
|
31
|
+
log(:info, "Execute command [#{address}]: #{cmd}")
|
32
|
+
results << ssh.exec!(cmd).chomp
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
results
|
38
|
+
end
|
39
|
+
|
40
|
+
def upload(src_path, dest_path)
|
41
|
+
erb = File.extname(src_path) == ".erb".freeze
|
42
|
+
if local?
|
43
|
+
if erb
|
44
|
+
log(:info, "Create #{dest_path} from #{src_path}")
|
45
|
+
File.open(dest_path, "w") { |f| f.write(ERB.new(File.read(src_path)).result) }
|
46
|
+
else
|
47
|
+
execute("cp #{src_path} #{dest_path}")
|
48
|
+
end
|
49
|
+
else
|
50
|
+
ssh_start do |ssh|
|
51
|
+
log(:info, "Upload: local:#{src_path} to #{address}:#{dest_path}")
|
52
|
+
if erb
|
53
|
+
begin
|
54
|
+
f = Tempfile.open(File.basename(dest_path))
|
55
|
+
f.write(ERB.new(File.read(src_path)).result)
|
56
|
+
f.close
|
57
|
+
ssh.scp.upload!(f.path, dest_path)
|
58
|
+
rescue
|
59
|
+
f.unlink
|
60
|
+
end
|
61
|
+
else
|
62
|
+
ssh.scp.upload!(src_path, dest_path)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def ssh_start
|
69
|
+
raise ArgumentError unless block_given?
|
70
|
+
Net::SSH.start(address, ssh_user, ssh_options) { |ssh| yield ssh }
|
71
|
+
end
|
72
|
+
|
73
|
+
def local?
|
74
|
+
address.nil? || LOCAL_ADDRESSES.include?(address.to_s)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def log(level, message)
|
80
|
+
return unless logger
|
81
|
+
logger.send(level, message)
|
82
|
+
end
|
83
|
+
|
84
|
+
def ssh_options
|
85
|
+
return default_ssh_options if options.nil? || options.empty?
|
86
|
+
default_ssh_options.merge(options)
|
87
|
+
end
|
88
|
+
|
89
|
+
def ssh_user
|
90
|
+
user || ENV["USER"]
|
91
|
+
end
|
92
|
+
|
93
|
+
def default_ssh_options
|
94
|
+
{ port: 22, keys: File.expand_path("~/.ssh/id_rsa"), forward_agent: true }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/app_builder/uploader.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
1
|
module AppBuilder
|
2
2
|
class Uploader < Base
|
3
|
+
attr_accessor :builder
|
4
|
+
|
3
5
|
class << self
|
4
|
-
def upload(
|
5
|
-
new(
|
6
|
+
def upload(conf)
|
7
|
+
new(conf).upload
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(conf = nil)
|
12
|
+
case conf
|
13
|
+
when AppBuilder::Archiver
|
14
|
+
@builder = Builder.new(conf)
|
15
|
+
conf = conf.config
|
16
|
+
when AppBuilder::Builder
|
17
|
+
@builder = conf
|
18
|
+
conf = conf.config
|
6
19
|
end
|
20
|
+
super(conf)
|
7
21
|
end
|
8
22
|
|
9
23
|
def upload
|
@@ -41,9 +55,5 @@ module AppBuilder
|
|
41
55
|
def s3?(url)
|
42
56
|
url.to_s.start_with?("s3://")
|
43
57
|
end
|
44
|
-
|
45
|
-
def builder
|
46
|
-
@builder || Builder.new(config)
|
47
|
-
end
|
48
58
|
end
|
49
59
|
end
|
data/lib/app_builder/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- i2bskn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: net-ssh
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: net-scp
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +115,8 @@ files:
|
|
87
115
|
- lib/app_builder/base.rb
|
88
116
|
- lib/app_builder/builder.rb
|
89
117
|
- lib/app_builder/config.rb
|
118
|
+
- lib/app_builder/logger.rb
|
119
|
+
- lib/app_builder/server.rb
|
90
120
|
- lib/app_builder/template/manifest.yml.erb
|
91
121
|
- lib/app_builder/uploader.rb
|
92
122
|
- lib/app_builder/version.rb
|
@@ -109,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
139
|
version: '0'
|
110
140
|
requirements: []
|
111
141
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.
|
142
|
+
rubygems_version: 2.6.11
|
113
143
|
signing_key:
|
114
144
|
specification_version: 4
|
115
145
|
summary: Application build utilities.
|