devkitkat 0.1.21 → 0.1.22
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/Gemfile.lock +13 -11
- data/README.md +2 -2
- data/bin/devkitkat +1 -1
- data/devkitkat.gemspec +2 -1
- data/lib/devkitkat/command.rb +6 -8
- data/lib/devkitkat/config.rb +33 -20
- data/lib/devkitkat/processor.rb +48 -0
- data/lib/devkitkat/service/concerns/service_initializer.rb +17 -0
- data/lib/devkitkat/service/driver/base.rb +23 -0
- data/lib/devkitkat/service/driver/docker/container.rb +163 -0
- data/lib/devkitkat/service/driver/docker/image.rb +33 -0
- data/lib/devkitkat/service/driver/docker.rb +45 -0
- data/lib/devkitkat/service/driver/none.rb +19 -0
- data/lib/devkitkat/service/executor/logger.rb +22 -0
- data/lib/devkitkat/service/executor/scripter.rb +48 -0
- data/lib/devkitkat/service/executor/variables.rb +82 -0
- data/lib/devkitkat/service/executor.rb +102 -0
- data/lib/devkitkat/service/predefined_command/add_example.rb +33 -0
- data/lib/devkitkat/service/predefined_command/add_git_ignore.rb +29 -0
- data/lib/devkitkat/service/predefined_command/add_script.rb +35 -0
- data/lib/devkitkat/service/predefined_command/add_shared_script.rb +21 -0
- data/lib/devkitkat/service/predefined_command/base.rb +17 -0
- data/lib/devkitkat/service/predefined_command/clean.rb +22 -0
- data/lib/devkitkat/service/predefined_command/clone.rb +25 -0
- data/lib/devkitkat/service/predefined_command/exec.rb +18 -0
- data/lib/devkitkat/service/predefined_command/poop.rb +17 -0
- data/lib/devkitkat/service/predefined_command/pull.rb +19 -0
- data/lib/devkitkat/service/predefined_command/reconfigure.rb +26 -0
- data/lib/devkitkat/service/predefined_command/show_variables.rb +17 -0
- data/lib/devkitkat/service.rb +13 -214
- data/lib/devkitkat/version.rb +1 -1
- data/lib/devkitkat.rb +12 -5
- metadata +41 -12
- data/docs/READ.md +0 -1
- data/docs/config/READ.md +0 -1
- data/docs/machine/READ.md +0 -1
- data/docs/service/READ.md +0 -1
- data/lib/devkitkat/executor/docker.rb +0 -154
- data/lib/devkitkat/executor/local.rb +0 -25
- data/lib/devkitkat/executor.rb +0 -62
- data/lib/devkitkat/main.rb +0 -50
data/lib/devkitkat/service.rb
CHANGED
@@ -1,79 +1,26 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
|
+
require "devkitkat/service/executor"
|
4
5
|
|
5
6
|
module Devkitkat
|
6
7
|
class Service
|
7
8
|
attr_reader :name, :config, :command, :executor
|
8
9
|
|
9
|
-
ScriptError = Class.new(StandardError)
|
10
|
-
|
11
10
|
DIVISIONS = %w[src script data cache log example dockerfile].freeze
|
12
11
|
SERVICE_PROPERTIES = %w[repo host port]
|
13
12
|
|
14
|
-
SCRIPT_TEMPLATE = <<-EOS
|
15
|
-
#!/bin/bash
|
16
|
-
set -e
|
17
|
-
|
18
|
-
# TODO: Define scripts
|
19
|
-
EOS
|
20
|
-
|
21
|
-
delegate :options, :script, :args, :kit_root, to: :command
|
22
|
-
|
23
13
|
def initialize(name, config, command)
|
24
14
|
@name, @config, @command = name, config, command
|
25
15
|
end
|
26
16
|
|
27
17
|
def execute
|
28
|
-
execute
|
29
|
-
|
30
|
-
true
|
31
|
-
rescue ScriptError => e
|
32
|
-
puts "Failure: #{e}".colorize(:red)
|
33
|
-
|
34
|
-
false
|
35
|
-
end
|
36
|
-
|
37
|
-
def execute!
|
38
|
-
executor.prepare
|
39
|
-
|
40
|
-
inject_global_variables
|
41
|
-
inject_public_variables
|
42
|
-
inject_private_variables
|
43
|
-
setup_logger
|
44
|
-
|
45
|
-
FileUtils.rm_f(log_path)
|
46
|
-
FileUtils.mkdir_p(log_dir)
|
47
|
-
|
48
|
-
method = script.tr('-', '_')
|
49
|
-
|
50
|
-
if File.exist?(script_path)
|
51
|
-
executor.write(%Q{echo "This script is a custom script provided by you."})
|
52
|
-
executor.write(script_path)
|
53
|
-
elsif respond_to?(method, true)
|
54
|
-
executor.write(%Q{echo "This script is a predefined script provided by devkitkat."})
|
55
|
-
executor.write("set -e")
|
56
|
-
send(method)
|
57
|
-
end
|
58
|
-
|
59
|
-
executor.commit.tap do |result|
|
60
|
-
raise ScriptError, process_error_message($?) unless result
|
61
|
-
end
|
62
|
-
ensure
|
63
|
-
executor.cleanup
|
64
|
-
end
|
65
|
-
|
66
|
-
def log_path
|
67
|
-
File.join(log_dir, "#{script}.log")
|
68
|
-
end
|
69
|
-
|
70
|
-
def container_name
|
71
|
-
"#{config.application}-#{name}"
|
18
|
+
Executor.new(self).execute
|
72
19
|
end
|
73
20
|
|
74
21
|
DIVISIONS.each do |division|
|
75
22
|
define_method :"#{division}_dir" do
|
76
|
-
File.join(
|
23
|
+
File.join(dir, division)
|
77
24
|
end
|
78
25
|
end
|
79
26
|
|
@@ -87,178 +34,30 @@ set -e
|
|
87
34
|
end
|
88
35
|
end
|
89
36
|
|
90
|
-
def
|
91
|
-
File.join(kit_root, 'services'
|
37
|
+
def root_dir
|
38
|
+
File.join(command.kit_root, 'services')
|
92
39
|
end
|
93
40
|
|
94
|
-
def
|
95
|
-
File.join(
|
96
|
-
end
|
97
|
-
|
98
|
-
private
|
99
|
-
|
100
|
-
def inject_global_variables
|
101
|
-
config.variables.each do |key, value|
|
102
|
-
executor.write("export #{key}=#{value}")
|
103
|
-
end
|
104
|
-
|
105
|
-
command.variables&.each do |key, value|
|
106
|
-
executor.write("export #{key}=#{value}")
|
107
|
-
end
|
108
|
-
|
109
|
-
executor.write("export DK_ROOT_DIR=#{kit_root}")
|
110
|
-
executor.write("export DK_ENVIRONMENT_TYPE=#{config.environment_type.to_s}")
|
111
|
-
executor.write("export DK_APPLICATION=#{config.application.to_s}")
|
112
|
-
end
|
113
|
-
|
114
|
-
def inject_public_variables
|
115
|
-
all_services.each do |service|
|
116
|
-
executor.write("export DK_#{service.name.upcase}_DIR=#{service.service_dir}")
|
117
|
-
|
118
|
-
DIVISIONS.each do |division|
|
119
|
-
executor.write("export DK_#{service.name.upcase}_#{division.upcase}_DIR=#{service.send("#{division}_dir")}")
|
120
|
-
end
|
121
|
-
|
122
|
-
executor.write("export DK_#{service.name.upcase}_SHARED_SCRIPT_DIR=#{service.shared_script_dir}")
|
123
|
-
|
124
|
-
config.service_hash(service.name).each do |key, value|
|
125
|
-
executor.write("export DK_#{service.name.upcase}_#{key.upcase}=#{value}")
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def inject_private_variables
|
131
|
-
executor.write("export DK_SELF_DIR=#{service_dir}")
|
132
|
-
|
133
|
-
DIVISIONS.each do |division|
|
134
|
-
executor.write("export DK_SELF_#{division.upcase}_DIR=#{send("#{division}_dir")}")
|
135
|
-
end
|
136
|
-
|
137
|
-
config.service_hash(name).each do |key, value|
|
138
|
-
executor.write("export #{key}=#{value}")
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def setup_logger
|
143
|
-
return if command.interactive?
|
144
|
-
|
145
|
-
executor.write("exec > #{log_path} 2>&1")
|
41
|
+
def dir
|
42
|
+
File.join(root_dir, name)
|
146
43
|
end
|
147
44
|
|
148
|
-
def
|
149
|
-
|
45
|
+
def log_path
|
46
|
+
File.join(log_dir, "#{command.script}.log")
|
150
47
|
end
|
151
48
|
|
152
49
|
def script_path
|
153
|
-
File.join(script_dir, script)
|
50
|
+
File.join(script_dir, command.script)
|
154
51
|
end
|
155
52
|
|
156
53
|
def system?
|
157
54
|
name == 'system'
|
158
55
|
end
|
159
56
|
|
160
|
-
def
|
161
|
-
|
162
|
-
See the log file: #{log_path}]
|
163
|
-
end
|
164
|
-
|
165
|
-
def add_script
|
166
|
-
names = command.args.any? ? command.args : %w[configure unconfigure start]
|
167
|
-
|
168
|
-
FileUtils.mkdir_p(script_dir)
|
169
|
-
|
170
|
-
names.each do |name|
|
171
|
-
file_path = File.join(script_dir, name)
|
172
|
-
|
173
|
-
next if File.exist?(file_path)
|
174
|
-
|
175
|
-
File.write(file_path, SCRIPT_TEMPLATE)
|
176
|
-
File.chmod(0777, file_path)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def add_example
|
181
|
-
names = command.args
|
182
|
-
|
183
|
-
raise ArgumentError, 'Please specify at least one example name' if names.empty?
|
184
|
-
|
185
|
-
FileUtils.mkdir_p(example_dir)
|
186
|
-
|
187
|
-
names.each do |name|
|
188
|
-
file_path = File.join(example_dir, name)
|
189
|
-
|
190
|
-
next if File.exist?(file_path)
|
191
|
-
|
192
|
-
FileUtils.touch(file_path)
|
193
|
-
File.chmod(0777, file_path)
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
def add_shared_script
|
198
|
-
raise ArgumentError, %Q{Shared script has to be added to "system"} unless name == 'system'
|
199
|
-
|
200
|
-
FileUtils.mkdir_p(script_dir)
|
201
|
-
|
202
|
-
file_path = File.join(script_dir, 'shared')
|
203
|
-
|
204
|
-
return if File.exist?(file_path)
|
205
|
-
|
206
|
-
FileUtils.touch(file_path)
|
207
|
-
File.chmod(0777, file_path)
|
208
|
-
end
|
209
|
-
|
210
|
-
def clone
|
211
|
-
return unless repo_defined?
|
212
|
-
|
213
|
-
cmd = <<-EOS
|
214
|
-
if [ -n "$GIT_DEPTH" ]; then
|
215
|
-
git clone #{repo} #{src_dir} --depth $GIT_DEPTH
|
216
|
-
else
|
217
|
-
git clone #{repo} #{src_dir}
|
218
|
-
fi
|
219
|
-
EOS
|
220
|
-
|
221
|
-
executor.write(cmd)
|
222
|
-
end
|
223
|
-
|
224
|
-
def pull
|
225
|
-
return unless repo_defined?
|
226
|
-
|
227
|
-
executor.write("cd #{src_dir}")
|
228
|
-
executor.write("git checkout master")
|
229
|
-
executor.write("git pull origin master")
|
230
|
-
end
|
231
|
-
|
232
|
-
def clean
|
233
|
-
executor.write("rm -rf #{src_dir}")
|
234
|
-
executor.write("rm -rf #{data_dir}")
|
235
|
-
executor.write("rm -rf #{cache_dir}")
|
236
|
-
executor.write("rm -rf #{log_dir}")
|
237
|
-
end
|
57
|
+
def shared_script_path
|
58
|
+
return unless system?
|
238
59
|
|
239
|
-
|
240
|
-
unconfigure_path = File.join(script_dir, 'unconfigure')
|
241
|
-
configure_path = File.join(script_dir, 'configure')
|
242
|
-
|
243
|
-
executor.write(unconfigure_path) if File.exist?(unconfigure_path)
|
244
|
-
executor.write(configure_path) if File.exist?(configure_path)
|
245
|
-
end
|
246
|
-
|
247
|
-
def poop
|
248
|
-
executor.write(%Q{echo "💩"})
|
249
|
-
end
|
250
|
-
|
251
|
-
def exec
|
252
|
-
executor.write(%Q{cd #{src_dir}})
|
253
|
-
executor.write(%Q{#{args.join(' ')}})
|
254
|
-
end
|
255
|
-
|
256
|
-
def show_variables
|
257
|
-
executor.write(%Q{export})
|
258
|
-
end
|
259
|
-
|
260
|
-
def executor
|
261
|
-
@executor ||= Executor.new(self)
|
60
|
+
File.join(script_dir, 'shared')
|
262
61
|
end
|
263
62
|
end
|
264
63
|
end
|
data/lib/devkitkat/version.rb
CHANGED
data/lib/devkitkat.rb
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
require "devkitkat/version"
|
2
|
-
require "devkitkat/main"
|
3
|
-
require "devkitkat/executor"
|
4
2
|
require "devkitkat/command"
|
5
3
|
require "devkitkat/config"
|
6
4
|
require "devkitkat/service"
|
7
|
-
require
|
8
|
-
require 'optparse'
|
9
|
-
require 'parallel'
|
5
|
+
require "devkitkat/processor"
|
10
6
|
require 'colorize'
|
11
7
|
require 'active_support/core_ext/array/conversions'
|
12
8
|
|
13
9
|
module Devkitkat
|
10
|
+
class Main
|
11
|
+
def self.execute
|
12
|
+
command = Command.new
|
13
|
+
config = Config.new(command.kit_root)
|
14
|
+
|
15
|
+
target_services = config.resolve!(command.target, exclude: command.options[:exclude])
|
16
|
+
.map { |name| Service.new(name, config, command) }
|
17
|
+
|
18
|
+
Processor.new(target_services, command, config).execute
|
19
|
+
end
|
20
|
+
end
|
14
21
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devkitkat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shinya Maeda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 1.34.2
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: require_all
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 3.0.0
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 3.0.0
|
167
181
|
description: Make micro services easy
|
168
182
|
email:
|
169
183
|
- shinya@gitlab.com
|
@@ -188,18 +202,33 @@ files:
|
|
188
202
|
- bin/release
|
189
203
|
- bin/setup
|
190
204
|
- devkitkat.gemspec
|
191
|
-
- docs/READ.md
|
192
|
-
- docs/config/READ.md
|
193
|
-
- docs/machine/READ.md
|
194
|
-
- docs/service/READ.md
|
195
205
|
- lib/devkitkat.rb
|
196
206
|
- lib/devkitkat/command.rb
|
197
207
|
- lib/devkitkat/config.rb
|
198
|
-
- lib/devkitkat/
|
199
|
-
- lib/devkitkat/executor/docker.rb
|
200
|
-
- lib/devkitkat/executor/local.rb
|
201
|
-
- lib/devkitkat/main.rb
|
208
|
+
- lib/devkitkat/processor.rb
|
202
209
|
- lib/devkitkat/service.rb
|
210
|
+
- lib/devkitkat/service/concerns/service_initializer.rb
|
211
|
+
- lib/devkitkat/service/driver/base.rb
|
212
|
+
- lib/devkitkat/service/driver/docker.rb
|
213
|
+
- lib/devkitkat/service/driver/docker/container.rb
|
214
|
+
- lib/devkitkat/service/driver/docker/image.rb
|
215
|
+
- lib/devkitkat/service/driver/none.rb
|
216
|
+
- lib/devkitkat/service/executor.rb
|
217
|
+
- lib/devkitkat/service/executor/logger.rb
|
218
|
+
- lib/devkitkat/service/executor/scripter.rb
|
219
|
+
- lib/devkitkat/service/executor/variables.rb
|
220
|
+
- lib/devkitkat/service/predefined_command/add_example.rb
|
221
|
+
- lib/devkitkat/service/predefined_command/add_git_ignore.rb
|
222
|
+
- lib/devkitkat/service/predefined_command/add_script.rb
|
223
|
+
- lib/devkitkat/service/predefined_command/add_shared_script.rb
|
224
|
+
- lib/devkitkat/service/predefined_command/base.rb
|
225
|
+
- lib/devkitkat/service/predefined_command/clean.rb
|
226
|
+
- lib/devkitkat/service/predefined_command/clone.rb
|
227
|
+
- lib/devkitkat/service/predefined_command/exec.rb
|
228
|
+
- lib/devkitkat/service/predefined_command/poop.rb
|
229
|
+
- lib/devkitkat/service/predefined_command/pull.rb
|
230
|
+
- lib/devkitkat/service/predefined_command/reconfigure.rb
|
231
|
+
- lib/devkitkat/service/predefined_command/show_variables.rb
|
203
232
|
- lib/devkitkat/version.rb
|
204
233
|
homepage: https://gitlab.com/dosuken123/devkitkat
|
205
234
|
licenses:
|
data/docs/READ.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Devkitkat
|
data/docs/config/READ.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Config
|
data/docs/machine/READ.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Machine
|
data/docs/service/READ.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Service
|
@@ -1,154 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/module/delegation'
|
2
|
-
require 'docker'
|
3
|
-
|
4
|
-
module Devkitkat
|
5
|
-
class Executor
|
6
|
-
class Docker
|
7
|
-
PreparationError = Class.new(StandardError)
|
8
|
-
|
9
|
-
attr_reader :service, :script_file
|
10
|
-
|
11
|
-
delegate :config, :command, to: :service
|
12
|
-
|
13
|
-
ROOT_IN_CONTAINER = '/devkitkat'
|
14
|
-
|
15
|
-
def initialize(service)
|
16
|
-
@service = service
|
17
|
-
end
|
18
|
-
|
19
|
-
def prepare
|
20
|
-
pull_image unless image_exist?
|
21
|
-
start_container
|
22
|
-
sync_user_with_host
|
23
|
-
end
|
24
|
-
|
25
|
-
def cleanup
|
26
|
-
stop_container
|
27
|
-
end
|
28
|
-
|
29
|
-
def commit(script_file)
|
30
|
-
@script_file = script_file
|
31
|
-
|
32
|
-
rewrite_root_path!
|
33
|
-
new_path = script_path_in_container
|
34
|
-
|
35
|
-
exec([new_path], user: user_name)
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def rewrite_root_path!
|
41
|
-
content = File.read(script_file)
|
42
|
-
new_content = content.gsub(command.kit_root, ROOT_IN_CONTAINER)
|
43
|
-
File.write(script_file, new_content)
|
44
|
-
end
|
45
|
-
|
46
|
-
def script_path_in_container
|
47
|
-
relative_path = script_file.delete_prefix(command.kit_root)
|
48
|
-
File.join(ROOT_IN_CONTAINER, relative_path)
|
49
|
-
end
|
50
|
-
|
51
|
-
def log_path_in_container
|
52
|
-
relative_path = service.log_path.delete_prefix(command.kit_root)
|
53
|
-
File.join(ROOT_IN_CONTAINER, relative_path)
|
54
|
-
end
|
55
|
-
|
56
|
-
def docker_image
|
57
|
-
config.image
|
58
|
-
end
|
59
|
-
|
60
|
-
def container
|
61
|
-
@container ||= ::Docker::Container.create(container_parameter)
|
62
|
-
end
|
63
|
-
|
64
|
-
def container_parameter
|
65
|
-
params = {
|
66
|
-
'Cmd' => %w[tail -f],
|
67
|
-
'Image' => docker_image,
|
68
|
-
'name' => service.container_name,
|
69
|
-
'HostConfig' => {
|
70
|
-
'Binds' => ["#{command.kit_root}:#{ROOT_IN_CONTAINER}"]
|
71
|
-
}
|
72
|
-
}
|
73
|
-
|
74
|
-
if service.port
|
75
|
-
params.deep_merge!(
|
76
|
-
'ExposedPorts' => { "#{service.port}/tcp" => {} },
|
77
|
-
'HostConfig' => {
|
78
|
-
'PortBindings' => {
|
79
|
-
"#{service.port}/tcp" => [{ 'HostPort' => service.port.to_s }]
|
80
|
-
}
|
81
|
-
}
|
82
|
-
)
|
83
|
-
end
|
84
|
-
|
85
|
-
params
|
86
|
-
end
|
87
|
-
|
88
|
-
def pull_image
|
89
|
-
puts "Pulling image #{docker_image}..."
|
90
|
-
::Docker::Image.create('fromImage' => docker_image)
|
91
|
-
puts "Pulled image #{docker_image}..."
|
92
|
-
end
|
93
|
-
|
94
|
-
def image_exist?
|
95
|
-
::Docker::Image.get(docker_image)
|
96
|
-
rescue
|
97
|
-
false
|
98
|
-
end
|
99
|
-
|
100
|
-
def start_container
|
101
|
-
container.start
|
102
|
-
end
|
103
|
-
|
104
|
-
def user_name
|
105
|
-
'devkitkat'
|
106
|
-
end
|
107
|
-
|
108
|
-
def group_id
|
109
|
-
@group_id ||= `id -u`.delete("\n")
|
110
|
-
end
|
111
|
-
|
112
|
-
def user_id
|
113
|
-
@user_id ||= `id -g`
|
114
|
-
end
|
115
|
-
|
116
|
-
def exec(cmds, params = {})
|
117
|
-
stdout_messages, stderr_messages, exit_code =
|
118
|
-
container.exec(cmds, params)
|
119
|
-
|
120
|
-
if command.debug?
|
121
|
-
puts "#{self.class.name} - #{__callee__}: stdout_messages: #{stdout_messages} stderr_messages: #{stderr_messages}"
|
122
|
-
end
|
123
|
-
|
124
|
-
exit_code == 0 ? true : false
|
125
|
-
end
|
126
|
-
|
127
|
-
def exec!(cmds, params = {})
|
128
|
-
unless exec(cmds, params)
|
129
|
-
raise PreparationError, "Failed to execute command in container. cmds: #{cmds}"
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
def sync_user_with_host
|
134
|
-
exec!(['addgroup', '--gid', group_id, user_name])
|
135
|
-
|
136
|
-
exec!(['adduser',
|
137
|
-
'--uid', user_id,
|
138
|
-
'--gid', group_id,
|
139
|
-
'--shell', '/bin/bash',
|
140
|
-
'--home', ROOT_IN_CONTAINER,
|
141
|
-
'--gecos', '',
|
142
|
-
'--disabled-password',
|
143
|
-
user_name])
|
144
|
-
|
145
|
-
exec!(['chown', '-R', "#{user_name}:#{user_name}", ROOT_IN_CONTAINER])
|
146
|
-
end
|
147
|
-
|
148
|
-
def stop_container
|
149
|
-
# container.stop
|
150
|
-
container.remove(force: true)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Devkitkat
|
2
|
-
class Executor
|
3
|
-
class Local
|
4
|
-
attr_reader :service
|
5
|
-
|
6
|
-
delegate :config, :command, to: :service
|
7
|
-
|
8
|
-
def initialize(service)
|
9
|
-
@service = service
|
10
|
-
end
|
11
|
-
|
12
|
-
def prepare
|
13
|
-
# no-op
|
14
|
-
end
|
15
|
-
|
16
|
-
def cleanup
|
17
|
-
# no-op
|
18
|
-
end
|
19
|
-
|
20
|
-
def commit(script_file)
|
21
|
-
system(script_file)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/devkitkat/executor.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
require "devkitkat/executor/docker"
|
2
|
-
require "devkitkat/executor/local"
|
3
|
-
|
4
|
-
module Devkitkat
|
5
|
-
class Executor
|
6
|
-
attr_reader :service, :scripts
|
7
|
-
|
8
|
-
delegate :config, :command, to: :service
|
9
|
-
delegate :prepare, :cleanup, to: :executor
|
10
|
-
|
11
|
-
SCRIPT_HEADER = <<-EOS
|
12
|
-
#!/bin/bash
|
13
|
-
EOS
|
14
|
-
|
15
|
-
def initialize(service)
|
16
|
-
@service = service
|
17
|
-
delete_script_file
|
18
|
-
end
|
19
|
-
|
20
|
-
def write(cmd)
|
21
|
-
ensure_script_file
|
22
|
-
|
23
|
-
File.open(script_file, 'a') do |stream|
|
24
|
-
stream.write(cmd + "\n")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def commit
|
29
|
-
executor.commit(script_file)
|
30
|
-
ensure
|
31
|
-
delete_script_file
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def executor
|
37
|
-
@executor ||= klass.new(service)
|
38
|
-
end
|
39
|
-
|
40
|
-
def klass
|
41
|
-
Object.const_get("Devkitkat::Executor::#{config.environment_type.capitalize}")
|
42
|
-
end
|
43
|
-
|
44
|
-
def script_file
|
45
|
-
File.join(command.tmp_dir, "script-#{service.name}-#{command.script}")
|
46
|
-
end
|
47
|
-
|
48
|
-
def ensure_script_file
|
49
|
-
create_script_file unless File.exist?(script_file)
|
50
|
-
end
|
51
|
-
|
52
|
-
def create_script_file
|
53
|
-
command.create_tmp_dir
|
54
|
-
File.write(script_file, SCRIPT_HEADER)
|
55
|
-
File.chmod(0777, script_file)
|
56
|
-
end
|
57
|
-
|
58
|
-
def delete_script_file
|
59
|
-
FileUtils.rm_f(script_file)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
data/lib/devkitkat/main.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
module Devkitkat
|
2
|
-
class Main
|
3
|
-
attr_reader :config, :command
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@command = Command.new
|
7
|
-
@config = Config.new(command.kit_root)
|
8
|
-
end
|
9
|
-
|
10
|
-
def execute
|
11
|
-
results = []
|
12
|
-
|
13
|
-
print_log_paths
|
14
|
-
|
15
|
-
if target_services.count == 1
|
16
|
-
# If the target is only one, it could be console access (TTY)
|
17
|
-
# so we can't run in parallel.
|
18
|
-
results << target_services.first.execute
|
19
|
-
else
|
20
|
-
results = Parallel.map(target_services, progress: 'Executing', in_processes: 8) do |service|
|
21
|
-
service.execute.tap do |success|
|
22
|
-
raise Parallel::Kill unless success
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
terminate_process_group! unless results&.all? { |result| result == true }
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def terminate_process_group!
|
33
|
-
pgid = Process.getpgid(Process.pid)
|
34
|
-
|
35
|
-
Process.kill('TERM', -pgid)
|
36
|
-
end
|
37
|
-
|
38
|
-
def target_services
|
39
|
-
@target_services ||= config.resolve!(command.target, exclude: command.options[:exclude])
|
40
|
-
.map { |name| Service.new(name, config, command) }
|
41
|
-
end
|
42
|
-
|
43
|
-
def print_log_paths
|
44
|
-
return if command.interactive? || command.quiet?
|
45
|
-
|
46
|
-
log_paths = target_services.map(&:log_path)
|
47
|
-
puts %Q{See the log at \n#{log_paths.join("\n")}}
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|