donce 0.0.5 → 0.1.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/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/donce.gemspec +1 -1
- data/lib/donce.rb +17 -9
- data/test/test_donce.rb +32 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77e8fc303600f62224be74352774a1d7d2a0e151cf4935316112874bf2b4c39f
|
4
|
+
data.tar.gz: 220d2d7b9fcdcd4702fb594daf2211a0268f54a7fc21231bbf8e4a670f75d796
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e70dc715fb1b8166a6bf0805639b7f384e5f346438fdd8c030444d02a7fee8bcfb042ccd1bf71ef095ca201f1dbb4f586a30fe50a102686eb5b4dff6e6e2ee8
|
7
|
+
data.tar.gz: 2a4bf49df247f331a36dfaffb055a66f38e207dda78133c49d7db95e7178be4421253803d456e931cb40227802142c7f5d7363b11cb36345d85c662d79f00800
|
data/Gemfile
CHANGED
@@ -28,7 +28,7 @@ gem 'minitest', '5.25.4', require: false
|
|
28
28
|
gem 'minitest-reporters', '1.7.1', require: false
|
29
29
|
gem 'minitest-retry', '0.2.5', require: false
|
30
30
|
gem 'rake', '13.2.1', require: false
|
31
|
-
gem 'rspec-rails', '7.1.
|
31
|
+
gem 'rspec-rails', '7.1.1', require: false
|
32
32
|
gem 'rubocop', '1.71.2', require: false
|
33
33
|
gem 'rubocop-minitest', '0.36.0', require: false
|
34
34
|
gem 'rubocop-performance', '1.23.1', require: false
|
data/Gemfile.lock
CHANGED
@@ -134,7 +134,7 @@ GEM
|
|
134
134
|
reline (0.6.0)
|
135
135
|
io-console (~> 0.5)
|
136
136
|
rexml (3.4.0)
|
137
|
-
rspec-core (3.13.
|
137
|
+
rspec-core (3.13.3)
|
138
138
|
rspec-support (~> 3.13.0)
|
139
139
|
rspec-expectations (3.13.3)
|
140
140
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -142,7 +142,7 @@ GEM
|
|
142
142
|
rspec-mocks (3.13.2)
|
143
143
|
diff-lcs (>= 1.2.0, < 2.0)
|
144
144
|
rspec-support (~> 3.13.0)
|
145
|
-
rspec-rails (7.1.
|
145
|
+
rspec-rails (7.1.1)
|
146
146
|
actionpack (>= 7.0)
|
147
147
|
activesupport (>= 7.0)
|
148
148
|
railties (>= 7.0)
|
@@ -213,7 +213,7 @@ DEPENDENCIES
|
|
213
213
|
minitest-reporters (= 1.7.1)
|
214
214
|
minitest-retry (= 0.2.5)
|
215
215
|
rake (= 13.2.1)
|
216
|
-
rspec-rails (= 7.1.
|
216
|
+
rspec-rails (= 7.1.1)
|
217
217
|
rubocop (= 1.71.2)
|
218
218
|
rubocop-minitest (= 0.36.0)
|
219
219
|
rubocop-performance (= 1.23.1)
|
data/donce.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
27
27
|
s.required_ruby_version = '>=3.0'
|
28
28
|
s.name = 'donce'
|
29
|
-
s.version = '0.0
|
29
|
+
s.version = '0.1.0'
|
30
30
|
s.license = 'MIT'
|
31
31
|
s.summary = 'Builds and starts temporary Docker containers'
|
32
32
|
s.description =
|
data/lib/donce.rb
CHANGED
@@ -68,7 +68,7 @@ module Kernel
|
|
68
68
|
|
69
69
|
# Build Docker image (or use existing one), run Docker container, and then clean up.
|
70
70
|
#
|
71
|
-
# @param [String] dockerfile The content of the +Dockerfile+
|
71
|
+
# @param [String] dockerfile The content of the +Dockerfile+ (if array is provided, it will be concatenated)
|
72
72
|
# @param [String] home The directory with Dockerfile and all other necessary files
|
73
73
|
# @param [String] image The name of Docker image, e.g. "ubuntu:24.04"
|
74
74
|
# @param [Logger] log The logging destination, can be +$stdout+
|
@@ -76,12 +76,13 @@ module Kernel
|
|
76
76
|
# @param [Hash<String,String>] env Environment variables going into the container
|
77
77
|
# @param [Hash<String,String>] volumes Local to container volumes mapping
|
78
78
|
# @param [Hash<String,String>] ports Local to container port mapping
|
79
|
+
# @param [Hash<String,String>] build_args Arguments for +docker build+ as +--build-arg+ may need
|
79
80
|
# @param [Boolean] root Let user inside the container be "root"?
|
80
81
|
# @param [String|Array<String>] command The command for the script inside the container
|
81
82
|
# @param [Integer] timeout Maximum seconds to spend on each +docker+ call
|
82
83
|
# @return [String] The stdout of the container
|
83
84
|
def donce(dockerfile: nil, image: nil, home: nil, log: $stdout, args: '', env: {}, root: false, command: '',
|
84
|
-
timeout: 10, volumes: {}, ports: {})
|
85
|
+
timeout: 10, volumes: {}, ports: {}, build_args: {})
|
85
86
|
raise 'Either use "dockerfile" or "home"' if dockerfile && home
|
86
87
|
raise 'Either use "dockerfile" or "image"' if dockerfile && image
|
87
88
|
raise 'Either use "image" or "home"' if home && image
|
@@ -92,13 +93,20 @@ module Kernel
|
|
92
93
|
image
|
93
94
|
else
|
94
95
|
i = "donce-#{SecureRandom.hex(6)}"
|
96
|
+
a = [
|
97
|
+
"--tag #{i}",
|
98
|
+
build_args.map { |k, v| "--build-arg #{Shellwords.escape("#{k}=#{v}")}" }.join(' ')
|
99
|
+
].join(' ')
|
95
100
|
if dockerfile
|
96
101
|
Dir.mktmpdir do |tmp|
|
102
|
+
dockerfile = dockerfile.join("\n") if dockerfile.is_a?(Array)
|
97
103
|
File.write(File.join(tmp, 'Dockerfile'), dockerfile)
|
98
|
-
qbash("#{docker} build #{Shellwords.escape(tmp)}
|
104
|
+
qbash("#{docker} build #{a} #{Shellwords.escape(tmp)}", log:)
|
99
105
|
end
|
106
|
+
elsif home
|
107
|
+
qbash("#{docker} build #{a} #{Shellwords.escape(home)}", log:)
|
100
108
|
else
|
101
|
-
|
109
|
+
raise 'Either "dockerfile" or "home" must be provided'
|
102
110
|
end
|
103
111
|
i
|
104
112
|
end
|
@@ -109,13 +117,13 @@ module Kernel
|
|
109
117
|
begin
|
110
118
|
cmd = [
|
111
119
|
docker, 'run',
|
112
|
-
block_given? ? '
|
120
|
+
block_given? ? '--detach' : nil,
|
113
121
|
'--name', Shellwords.escape(container),
|
114
122
|
OS.linux? ? nil : "--add-host #{donce_host}:host-gateway",
|
115
123
|
args,
|
116
|
-
env.map { |k, v| "
|
117
|
-
ports.map { |k, v| "
|
118
|
-
volumes.map { |k, v| "
|
124
|
+
env.map { |k, v| "--env #{Shellwords.escape("#{k}=#{v}")}" }.join(' '),
|
125
|
+
ports.map { |k, v| "--publish #{Shellwords.escape("#{k}:#{v}")}" }.join(' '),
|
126
|
+
volumes.map { |k, v| "--volume #{Shellwords.escape("#{k}:#{v}")}" }.join(' '),
|
119
127
|
root ? nil : "--user=#{Shellwords.escape("#{Process.uid}:#{Process.gid}")}",
|
120
128
|
Shellwords.escape(img),
|
121
129
|
command
|
@@ -144,7 +152,7 @@ module Kernel
|
|
144
152
|
log:
|
145
153
|
)
|
146
154
|
stdout = logs if block_given?
|
147
|
-
qbash("#{docker} rm
|
155
|
+
qbash("#{docker} rm --force #{Shellwords.escape(container)}", log:)
|
148
156
|
end
|
149
157
|
stdout
|
150
158
|
ensure
|
data/test/test_donce.rb
CHANGED
@@ -34,6 +34,20 @@ class TestDonce < Minitest::Test
|
|
34
34
|
assert_equal("hello\n", stdout)
|
35
35
|
end
|
36
36
|
|
37
|
+
def test_prints_build_args
|
38
|
+
stdout = donce(
|
39
|
+
dockerfile: [
|
40
|
+
'FROM ubuntu',
|
41
|
+
'ARG FOO=what?',
|
42
|
+
'RUN echo $FOO > /tmp/foo',
|
43
|
+
'CMD cat /tmp/foo'
|
44
|
+
],
|
45
|
+
build_args: { 'FOO' => 'hello' },
|
46
|
+
log: Loog::NULL
|
47
|
+
)
|
48
|
+
assert_equal("hello\n", stdout)
|
49
|
+
end
|
50
|
+
|
37
51
|
def test_runs_existing_image
|
38
52
|
stdout = donce(image: 'ubuntu:24.04', command: 'echo hello', log: Loog::NULL)
|
39
53
|
assert_equal("hello\n", stdout)
|
@@ -47,6 +61,24 @@ class TestDonce < Minitest::Test
|
|
47
61
|
end
|
48
62
|
end
|
49
63
|
|
64
|
+
def test_copies_resources
|
65
|
+
content = 'hello!'
|
66
|
+
Dir.mktmpdir do |home|
|
67
|
+
File.write(File.join(home, 'test.txt'), content)
|
68
|
+
File.write(
|
69
|
+
File.join(home, 'Dockerfile'),
|
70
|
+
[
|
71
|
+
'FROM ubuntu',
|
72
|
+
'WORKDIR /foo',
|
73
|
+
'COPY test.txt .',
|
74
|
+
'CMD cat test.txt'
|
75
|
+
].join("\n")
|
76
|
+
)
|
77
|
+
stdout = donce(home:, log: Loog::NULL)
|
78
|
+
assert_equal(content, stdout)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
50
82
|
def test_runs_daemon
|
51
83
|
seen = false
|
52
84
|
donce(dockerfile: "FROM ubuntu\nCMD while true; do sleep 1; echo sleeping; done", log: Loog::NULL) do |id|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: donce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|