kaiser 0.6.4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -2
- data/exe/kaiser +0 -1
- data/lib/kaiser/cli.rb +41 -15
- data/lib/kaiser/cmds/set.rb +5 -0
- data/lib/kaiser/cmds/shutdown.rb +1 -1
- data/lib/kaiser/cmds/up.rb +18 -5
- data/lib/kaiser/command_runner.rb +12 -8
- data/lib/kaiser/config.rb +6 -4
- data/lib/kaiser/kaiserfile.rb +16 -2
- data/lib/kaiser/service.rb +38 -0
- data/lib/kaiser/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54e276a77032f484d216acc213a7c9157c8d5afd3c241c95c81c68845cd94dd7
|
4
|
+
data.tar.gz: cd24e7b599320b2c6e6ef94bc2c0fcb27f02f82fa6bbe6fda7919af2de5ce862
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d24d16515b2832b274adeeda21ecec02295394ad7b093874832cf7af154693fb5a8d0a7975e053fe7ecc0b24b380b8ff4864af1cd0acd95b8cf6343b273e29eb
|
7
|
+
data.tar.gz: e0aa642762fc2b3af586fbb1967c829d959854c645a282e73869713b3385279a2b891baade25f474b547c6d302052cf16450b9ddc08366722d740bf1530db5db
|
data/README.md
CHANGED
@@ -31,23 +31,30 @@ Simply clone the repo and run
|
|
31
31
|
|
32
32
|
```
|
33
33
|
cd kaiser
|
34
|
+
bundle
|
34
35
|
docker build -t degica/kaiser .
|
35
36
|
```
|
36
37
|
|
37
38
|
And then add the following line to your `.bashrc` or `.bash_profile`
|
38
39
|
|
39
40
|
```
|
40
|
-
alias kaiser='docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.kaiser:/root/.kaiser -v `pwd`:`pwd` -e CONTEXT_DIR="`pwd`"
|
41
|
+
alias kaiser='docker run --pull=always --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.kaiser:/root/.kaiser -v `pwd`:`pwd` -e CONTEXT_DIR="`pwd`" degicadev/kaiser'
|
41
42
|
```
|
42
43
|
|
43
44
|
Or if you use fish
|
44
45
|
|
45
46
|
```
|
46
47
|
function kaiser
|
47
|
-
docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.kaiser:/root/.kaiser -v (pwd):(pwd) -e CONTEXT_DIR=(pwd)
|
48
|
+
docker run --pull=always --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.kaiser:/root/.kaiser -v (pwd):(pwd) -e CONTEXT_DIR=(pwd) degicadev/kaiser $argv
|
48
49
|
end
|
49
50
|
```
|
50
51
|
|
52
|
+
Confirm it is working by running
|
53
|
+
|
54
|
+
```
|
55
|
+
kaiser -h
|
56
|
+
```
|
57
|
+
|
51
58
|
## Usage
|
52
59
|
|
53
60
|
You'll need a Dockerfile and a Kaiserfile. The Kaiserfile should be placed in the project root directory, with contents like this:
|
data/exe/kaiser
CHANGED
data/lib/kaiser/cli.rb
CHANGED
@@ -8,6 +8,12 @@ module Kaiser
|
|
8
8
|
class Cli
|
9
9
|
extend Kaiser::CliOptions
|
10
10
|
|
11
|
+
attr_reader :use_kaiserfile
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@use_kaiserfile = true
|
15
|
+
end
|
16
|
+
|
11
17
|
def set_config
|
12
18
|
# This is here for backwards compatibility since it can be used in Kaiserfiles.
|
13
19
|
# It would be a good idea to deprecate this and make it more abstract.
|
@@ -19,7 +25,7 @@ module Kaiser
|
|
19
25
|
@out = Config.out
|
20
26
|
@info_out = Config.info_out
|
21
27
|
|
22
|
-
@kaiserfile.validate!
|
28
|
+
@kaiserfile.validate! if @use_kaiserfile
|
23
29
|
end
|
24
30
|
|
25
31
|
# At first I did this in the constructor but the problem with that is Optimist
|
@@ -37,7 +43,7 @@ module Kaiser
|
|
37
43
|
Optimist.options do
|
38
44
|
banner u
|
39
45
|
|
40
|
-
global_opts.each { |o| opt
|
46
|
+
global_opts.each { |o| opt(*o) }
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
@@ -56,12 +62,12 @@ module Kaiser
|
|
56
62
|
# easily use ARGV.shift to access its own subcommands.
|
57
63
|
ARGV.shift
|
58
64
|
|
59
|
-
Kaiser::Config.load(Dir.pwd)
|
65
|
+
Kaiser::Config.load(Dir.pwd, use_kaiserfile: cmd.use_kaiserfile)
|
60
66
|
|
61
67
|
# We do all this work in here instead of the exe/kaiser file because we
|
62
68
|
# want -h options to output before we check if a Kaiserfile exists.
|
63
69
|
# If we do it in exe/kaiser, people won't be able to check help messages
|
64
|
-
# unless they create a Kaiserfile
|
70
|
+
# unless they create a Kaiserfile first.
|
65
71
|
if opts[:quiet]
|
66
72
|
Config.out = File.open(File::NULL, 'w')
|
67
73
|
Config.info_out = File.open(File::NULL, 'w')
|
@@ -104,11 +110,7 @@ module Kaiser
|
|
104
110
|
services.each do |service|
|
105
111
|
Config.info_out.puts "Starting service: #{service.name}"
|
106
112
|
run_if_dead(
|
107
|
-
service.shared_name,
|
108
|
-
"docker run -d
|
109
|
-
--name #{service.shared_name}
|
110
|
-
--network #{Config.config[:networkname]}
|
111
|
-
#{service.image}"
|
113
|
+
service.shared_name, service.start_docker_command
|
112
114
|
)
|
113
115
|
end
|
114
116
|
end
|
@@ -240,6 +242,10 @@ module Kaiser
|
|
240
242
|
end
|
241
243
|
|
242
244
|
def attach_app
|
245
|
+
start_services
|
246
|
+
|
247
|
+
puts 'Attaching to app...'
|
248
|
+
|
243
249
|
cmd = (ARGV || []).join(' ')
|
244
250
|
killrm app_container_name
|
245
251
|
|
@@ -259,6 +265,8 @@ module Kaiser
|
|
259
265
|
#{app_params}
|
260
266
|
kaiser:#{envname}-#{current_branch} #{cmd}".tr("\n", ' ')
|
261
267
|
|
268
|
+
stop_services
|
269
|
+
|
262
270
|
Config.out.puts 'Cleaning up...'
|
263
271
|
end
|
264
272
|
|
@@ -390,6 +398,10 @@ module Kaiser
|
|
390
398
|
@services ||= Config.kaiserfile.services.map { |name, info| Service.new(envname, name, info) }
|
391
399
|
end
|
392
400
|
|
401
|
+
def force_platform
|
402
|
+
Config.kaiserfile.platform || ''
|
403
|
+
end
|
404
|
+
|
393
405
|
def db_port
|
394
406
|
Config.config[:envs][envname][:db_port]
|
395
407
|
end
|
@@ -514,6 +526,19 @@ module Kaiser
|
|
514
526
|
end
|
515
527
|
end
|
516
528
|
|
529
|
+
def selenium_node_image
|
530
|
+
return ENV['OVERRIDE_SELENIUM_NODE_IMAGE'] unless ENV['OVERRIDE_SELENIUM_NODE_IMAGE'].nil?
|
531
|
+
|
532
|
+
if RUBY_PLATFORM.start_with?('arm64') || RUBY_PLATFORM.start_with?('aarch64')
|
533
|
+
# use the seleniarm image because its more stable in arm procs
|
534
|
+
# somehow the x64 image does not do well under qemu under arm
|
535
|
+
return 'seleniarm/standalone-chromium'
|
536
|
+
end
|
537
|
+
|
538
|
+
# default to x64 image
|
539
|
+
'selenium/standalone-chrome-debug'
|
540
|
+
end
|
541
|
+
|
517
542
|
def ensure_setup
|
518
543
|
ensure_env
|
519
544
|
|
@@ -528,15 +553,16 @@ module Kaiser
|
|
528
553
|
"docker run -d
|
529
554
|
--name #{Config.config[:shared_names][:redis]}
|
530
555
|
--network #{Config.config[:networkname]}
|
531
|
-
redis:alpine"
|
556
|
+
redis:7-alpine"
|
532
557
|
)
|
533
558
|
run_if_dead(
|
534
559
|
Config.config[:shared_names][:chrome],
|
535
560
|
"docker run -d
|
536
561
|
-p 5900:5900
|
562
|
+
--shm-size='2g'
|
537
563
|
--name #{Config.config[:shared_names][:chrome]}
|
538
564
|
--network #{Config.config[:networkname]}
|
539
|
-
|
565
|
+
#{selenium_node_image}"
|
540
566
|
)
|
541
567
|
run_if_dead(
|
542
568
|
Config.config[:shared_names][:nginx],
|
@@ -574,7 +600,7 @@ module Kaiser
|
|
574
600
|
|
575
601
|
def container_dead?(container)
|
576
602
|
x = JSON.parse(`docker inspect #{container} 2>/dev/null`)
|
577
|
-
|
603
|
+
x.empty? || x[0]['State']['Running'] == false
|
578
604
|
end
|
579
605
|
|
580
606
|
def if_container_dead(container)
|
@@ -585,14 +611,14 @@ module Kaiser
|
|
585
611
|
|
586
612
|
def create_if_volume_not_exist(vol)
|
587
613
|
x = JSON.parse(`docker volume inspect #{vol} 2>/dev/null`)
|
588
|
-
return unless x.
|
614
|
+
return unless x.empty?
|
589
615
|
|
590
616
|
CommandRunner.run! Config.out, "docker volume create #{vol}"
|
591
617
|
end
|
592
618
|
|
593
619
|
def create_if_network_not_exist(net)
|
594
620
|
x = JSON.parse(`docker inspect #{net} 2>/dev/null`)
|
595
|
-
return unless x.
|
621
|
+
return unless x.empty?
|
596
622
|
|
597
623
|
CommandRunner.run! Config.out, "docker network create #{net}"
|
598
624
|
end
|
@@ -615,7 +641,7 @@ module Kaiser
|
|
615
641
|
|
616
642
|
def killrm(container)
|
617
643
|
x = JSON.parse(`docker inspect #{container} 2>/dev/null`)
|
618
|
-
return if x.
|
644
|
+
return if x.empty?
|
619
645
|
|
620
646
|
CommandRunner.run Config.out, "docker kill #{container}" if x[0]['State'] && x[0]['State']['Running'] == true
|
621
647
|
CommandRunner.run Config.out, "docker rm #{container}" if x[0]['State']
|
data/lib/kaiser/cmds/set.rb
CHANGED
data/lib/kaiser/cmds/shutdown.rb
CHANGED
data/lib/kaiser/cmds/up.rb
CHANGED
@@ -28,14 +28,27 @@ module Kaiser
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
def build_cmd
|
32
|
+
platform_args = ''
|
33
|
+
platform_args = "--platform=#{force_platform}" unless force_platform.empty?
|
34
|
+
build_args = docker_build_args.map { |k, v| "--build-arg #{k}=#{v}" }
|
35
|
+
[
|
36
|
+
'docker build',
|
37
|
+
"-t kaiser:#{envname}-#{current_branch}",
|
38
|
+
"-f #{tmp_dockerfile_name} #{Config.work_dir}",
|
39
|
+
platform_args,
|
40
|
+
build_args.join(' ').to_s
|
41
|
+
]
|
42
|
+
end
|
43
|
+
|
31
44
|
def setup_app
|
32
45
|
Config.info_out.puts 'Setting up application'
|
33
46
|
File.write(tmp_dockerfile_name, docker_file_contents)
|
34
|
-
|
35
|
-
CommandRunner.run! Config.out, "
|
36
|
-
|
37
|
-
|
38
|
-
|
47
|
+
|
48
|
+
CommandRunner.run! Config.out, build_cmd.join("\n\t"), env_vars: {
|
49
|
+
'DOCKER_BUILDKIT' => '1',
|
50
|
+
'BUILDKIT_PROGRESS' => 'plain'
|
51
|
+
}
|
39
52
|
FileUtils.rm(tmp_dockerfile_name)
|
40
53
|
end
|
41
54
|
end
|
@@ -1,24 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'pty'
|
3
4
|
require 'English'
|
4
5
|
|
5
|
-
# This is the command runner
|
6
6
|
module Kaiser
|
7
|
-
#
|
7
|
+
# This is the command runner
|
8
|
+
# it abstracts away the complicated syntax required to deal with
|
9
|
+
# PTY and to pass the lines programmatically to the host application
|
10
|
+
# as well as to capture the return code at the end.
|
8
11
|
class CommandRunner
|
9
|
-
def self.run(out, cmd, &block)
|
12
|
+
def self.run(out, cmd, env_vars: {}, &block)
|
10
13
|
out.puts "> #{cmd}"
|
11
|
-
CommandRunner.new(out, cmd).run_command(&block)
|
14
|
+
CommandRunner.new(out, cmd, env_vars).run_command(&block)
|
12
15
|
end
|
13
16
|
|
14
|
-
def self.run!(out, cmd, &block)
|
15
|
-
status = run(out, cmd, &block)
|
17
|
+
def self.run!(out, cmd, env_vars: {}, &block)
|
18
|
+
status = run(out, cmd, env_vars: env_vars, &block)
|
16
19
|
raise Kaiser::CmdError.new(cmd, status) if status.to_s != '0'
|
17
20
|
end
|
18
21
|
|
19
|
-
def initialize(out, cmd)
|
22
|
+
def initialize(out, cmd, env_vars)
|
20
23
|
@out = out
|
21
24
|
@cmd = cmd.tr "\n", ' '
|
25
|
+
@env_vars = env_vars
|
22
26
|
end
|
23
27
|
|
24
28
|
def print_and_return_status(status = 0)
|
@@ -38,7 +42,7 @@ module Kaiser
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def run_command(&block)
|
41
|
-
PTY.spawn("#{@cmd} 2>&1") do |stdout, _stdin, pid|
|
45
|
+
PTY.spawn(@env_vars, "#{@cmd} 2>&1") do |stdout, _stdin, pid|
|
42
46
|
print_lines(stdout, &block)
|
43
47
|
Process.wait(pid)
|
44
48
|
end
|
data/lib/kaiser/config.rb
CHANGED
@@ -12,7 +12,7 @@ module Kaiser
|
|
12
12
|
:kaiserfile,
|
13
13
|
:config
|
14
14
|
|
15
|
-
def load(work_dir)
|
15
|
+
def load(work_dir, use_kaiserfile: true)
|
16
16
|
@work_dir = work_dir
|
17
17
|
@config_dir = "#{ENV['HOME']}/.kaiser"
|
18
18
|
|
@@ -20,7 +20,6 @@ module Kaiser
|
|
20
20
|
|
21
21
|
FileUtils.mkdir_p @config_dir
|
22
22
|
@config_file = "#{@config_dir}/config.yml"
|
23
|
-
@kaiserfile = Kaiserfile.new("#{@work_dir}/Kaiserfile")
|
24
23
|
|
25
24
|
@config = {
|
26
25
|
envnames: {},
|
@@ -39,8 +38,11 @@ module Kaiser
|
|
39
38
|
|
40
39
|
load_config
|
41
40
|
|
42
|
-
|
43
|
-
|
41
|
+
if use_kaiserfile
|
42
|
+
@kaiserfile = Kaiserfile.new("#{@work_dir}/Kaiserfile")
|
43
|
+
alt_kaiserfile = "#{ENV['HOME']}/kaiserfiles/Kaiserfile.#{@config[:envnames][work_dir]}"
|
44
|
+
@kaiserfile = Kaiserfile.new(alt_kaiserfile) if File.exist?(alt_kaiserfile)
|
45
|
+
end
|
44
46
|
|
45
47
|
@config
|
46
48
|
end
|
data/lib/kaiser/kaiserfile.rb
CHANGED
@@ -76,6 +76,10 @@ module Kaiser
|
|
76
76
|
}
|
77
77
|
end
|
78
78
|
|
79
|
+
def force_platform(platform_name)
|
80
|
+
@platform = platform_name
|
81
|
+
end
|
82
|
+
|
79
83
|
def expose(port)
|
80
84
|
@port = port
|
81
85
|
end
|
@@ -98,10 +102,20 @@ module Kaiser
|
|
98
102
|
@server_type = value
|
99
103
|
end
|
100
104
|
|
101
|
-
def service(name,
|
105
|
+
def service(name,
|
106
|
+
image: name,
|
107
|
+
command: nil,
|
108
|
+
binds: {},
|
109
|
+
env: {})
|
110
|
+
|
102
111
|
raise "duplicate service #{name.inspect}" if @services.key?(name)
|
103
112
|
|
104
|
-
@services[name] = {
|
113
|
+
@services[name] = {
|
114
|
+
image: image,
|
115
|
+
command: command,
|
116
|
+
binds: binds,
|
117
|
+
env: env
|
118
|
+
}
|
105
119
|
end
|
106
120
|
end
|
107
121
|
end
|
data/lib/kaiser/service.rb
CHANGED
@@ -18,5 +18,43 @@ module Kaiser
|
|
18
18
|
def image
|
19
19
|
@service_info[:image]
|
20
20
|
end
|
21
|
+
|
22
|
+
def command
|
23
|
+
@service_info[:command].to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def binds
|
27
|
+
@service_info[:binds] || {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def env
|
31
|
+
@service_info[:env] || {}
|
32
|
+
end
|
33
|
+
|
34
|
+
def start_docker_command
|
35
|
+
envstring = env.map do |k, v|
|
36
|
+
"-e #{k}=#{v}"
|
37
|
+
end.join(' ')
|
38
|
+
|
39
|
+
bindstring = binds.map do |k, v|
|
40
|
+
"-v #{k}:#{v}"
|
41
|
+
end.join(' ')
|
42
|
+
|
43
|
+
commandstring = command
|
44
|
+
|
45
|
+
cmd_array = [
|
46
|
+
'docker run -d',
|
47
|
+
"--name #{shared_name}",
|
48
|
+
"--network #{Config.config[:networkname]}",
|
49
|
+
envstring,
|
50
|
+
bindstring,
|
51
|
+
image,
|
52
|
+
commandstring
|
53
|
+
]
|
54
|
+
|
55
|
+
cmd_array.filter! { |x| !x.empty? }
|
56
|
+
|
57
|
+
cmd_array.join(' ')
|
58
|
+
end
|
21
59
|
end
|
22
60
|
end
|
data/lib/kaiser/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kaiser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Siaw
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -198,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
198
198
|
- !ruby/object:Gem::Version
|
199
199
|
version: '0'
|
200
200
|
requirements: []
|
201
|
-
rubygems_version: 3.
|
201
|
+
rubygems_version: 3.3.26
|
202
202
|
signing_key:
|
203
203
|
specification_version: 4
|
204
204
|
summary: Manage your monsters
|