cide 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.cide.yml +12 -0
- data/.travis.yml +0 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/cide.gemspec +1 -1
- data/lib/cide.rb +38 -80
- data/lib/cide/docker.rb +49 -0
- data/lib/cide_template.erb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 420cafd5b8230af243adaadab1b4a5ff19b2c6e0
|
4
|
+
data.tar.gz: 423c2ec82b3220defe4dd1a065c6f07b37247336
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d229414e56f23a7fa6cc0c4a2d14039c4fe80aee1b4ba1b2dfb703d0b1f02e903ccc1815961b3e641d32bd66b93b52026bc0d5b644a49ed7185eefb4d1d9373
|
7
|
+
data.tar.gz: f1d25af0be10c7d39223b961f8c8299acd14b93cf0d31864c835e163947d4669697fdc898168d0619c23b4186d280ddd4bfa75d1e8e571d3b2a23c782b890b77
|
data/.cide.yml
ADDED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/cide.gemspec
CHANGED
data/lib/cide.rb
CHANGED
@@ -1,36 +1,29 @@
|
|
1
1
|
require 'erb'
|
2
2
|
require 'json'
|
3
3
|
require 'optparse'
|
4
|
-
require 'shellwords'
|
5
4
|
require 'time'
|
6
5
|
require 'yaml'
|
7
6
|
|
8
7
|
require 'thor'
|
9
8
|
|
9
|
+
require 'cide/docker'
|
10
|
+
|
10
11
|
# CIDE is a Continuous Integration Docker Environment runner
|
11
12
|
#
|
12
13
|
# The juicy bits are defined in CIDE::CLI
|
13
14
|
module CIDE
|
15
|
+
DIR = File.expand_path('..', __FILE__)
|
14
16
|
DOCKERFILE = 'Dockerfile'
|
15
|
-
SSH_CONFIG_FILE = 'ssh_config'
|
16
17
|
TEMP_SSH_KEY = 'id_rsa.tmp'
|
17
|
-
DOCKERFILE_TEMPLATE = File.
|
18
|
-
|
19
|
-
)
|
20
|
-
SSH_CONFIG_CONTENTS = File.read(File.expand_path('../ssh_config', __FILE__))
|
18
|
+
DOCKERFILE_TEMPLATE = File.join(DIR, 'cide_template.erb')
|
19
|
+
SSH_CONFIG_FILE = 'ssh_config'
|
20
|
+
SSH_CONFIG_PATH = File.join(DIR, SSH_CONFIG_FILE)
|
21
21
|
CONFIG_FILE = '.cide.yml'
|
22
22
|
|
23
23
|
CIDE_DIR = '/cide'
|
24
24
|
CIDE_SRC_DIR = File.join(CIDE_DIR, '/src')
|
25
25
|
CIDE_SSH_DIR = File.join(CIDE_DIR, '/.ssh')
|
26
26
|
|
27
|
-
module_function
|
28
|
-
|
29
|
-
def docker_id(str)
|
30
|
-
# Replaces invalid docker tag characters by underscores
|
31
|
-
"#{str}".downcase.gsub(/[^a-z0-9\-_.]/, '_')
|
32
|
-
end
|
33
|
-
|
34
27
|
def self.struct(opts = {}, &block)
|
35
28
|
Class.new(Struct.new(*opts.keys), &block).new(*opts.values)
|
36
29
|
end
|
@@ -45,18 +38,23 @@ module CIDE
|
|
45
38
|
export_dir: './artifacts',
|
46
39
|
host_export_dir: nil,
|
47
40
|
run: 'script/ci',
|
48
|
-
|
41
|
+
use_ssh: false,
|
42
|
+
ssh_key: '~/.ssh/id_rsa',
|
49
43
|
) do
|
50
44
|
|
51
45
|
alias_method :image=, :from=
|
52
46
|
alias_method :command=, :run=
|
53
47
|
|
54
48
|
def name=(str)
|
55
|
-
super CIDE.
|
49
|
+
super CIDE::Docker.id(str)
|
50
|
+
end
|
51
|
+
|
52
|
+
def ssh_key_path
|
53
|
+
File.expand_path(ssh_key)
|
56
54
|
end
|
57
55
|
|
58
56
|
def to_dockerfile
|
59
|
-
ERB.new(DOCKERFILE_TEMPLATE, nil, '<>-').result(binding)
|
57
|
+
ERB.new(File.read(DOCKERFILE_TEMPLATE), nil, '<>-').result(binding)
|
60
58
|
end
|
61
59
|
|
62
60
|
def merge!(opts = {})
|
@@ -78,8 +76,9 @@ module CIDE
|
|
78
76
|
|
79
77
|
# Command-line option-parsing and execution for cide
|
80
78
|
class CLI < Thor
|
81
|
-
include CIDE
|
79
|
+
include CIDE::Docker
|
82
80
|
include Thor::Actions
|
81
|
+
add_runtime_options!
|
83
82
|
|
84
83
|
default_command 'build'
|
85
84
|
|
@@ -106,9 +105,9 @@ module CIDE
|
|
106
105
|
default: nil
|
107
106
|
|
108
107
|
method_option 'ssh_key',
|
109
|
-
desc: '
|
108
|
+
desc: 'Path to a ssh key to import into the docker image',
|
110
109
|
aliases: ['s'],
|
111
|
-
default:
|
110
|
+
default: '~/.ssh/id_rsa'
|
112
111
|
|
113
112
|
def build
|
114
113
|
setup_docker
|
@@ -122,40 +121,18 @@ module CIDE
|
|
122
121
|
|
123
122
|
tag = "cide/#{config.name}"
|
124
123
|
|
125
|
-
if config.
|
126
|
-
|
127
|
-
|
128
|
-
File.write(TEMP_SSH_KEY, ssh_key_contents)
|
129
|
-
config.ssh_key = TEMP_SSH_KEY
|
130
|
-
at_exit do
|
131
|
-
File.unlink(TEMP_SSH_KEY)
|
124
|
+
if config.use_ssh
|
125
|
+
unless File.exist?(config.ssh_key_path)
|
126
|
+
fail MalformattedArgumentError, "SSH key #{config.ssh_key} not found"
|
132
127
|
end
|
133
|
-
|
134
|
-
|
128
|
+
|
129
|
+
create_tmp_file SSH_CONFIG_FILE, File.read(SSH_CONFIG_PATH)
|
130
|
+
create_tmp_file TEMP_SSH_KEY, File.read(config.ssh_key_path)
|
135
131
|
end
|
136
132
|
|
137
133
|
say_status :config, config.to_h
|
138
134
|
|
139
|
-
|
140
|
-
if !File.exist?(DOCKERFILE)
|
141
|
-
say_status :Dockerfile, 'Creating temporary Dockerfile'
|
142
|
-
File.write(DOCKERFILE, config.to_dockerfile)
|
143
|
-
at_exit do
|
144
|
-
File.unlink(DOCKERFILE)
|
145
|
-
end
|
146
|
-
else
|
147
|
-
say_status :Dockerfile, 'Using existing Dockerfile'
|
148
|
-
end
|
149
|
-
|
150
|
-
if !File.exist?(SSH_CONFIG_FILE)
|
151
|
-
say_status :ssh_config, 'Creating temporary ssh config'
|
152
|
-
File.write(SSH_CONFIG_FILE, SSH_CONFIG_CONTENTS)
|
153
|
-
at_exit do
|
154
|
-
File.unlink(SSH_CONFIG_FILE)
|
155
|
-
end
|
156
|
-
else
|
157
|
-
say_status :ssh_config, 'Using existing ssh config'
|
158
|
-
end
|
135
|
+
create_tmp_file DOCKERFILE, config.to_dockerfile
|
159
136
|
|
160
137
|
docker :build, '-t', tag, '.'
|
161
138
|
|
@@ -171,13 +148,16 @@ module CIDE
|
|
171
148
|
|
172
149
|
host_export_dir = File.expand_path(
|
173
150
|
config.host_export_dir || config.export_dir,
|
174
|
-
Dir.pwd
|
151
|
+
Dir.pwd,
|
152
|
+
)
|
175
153
|
|
176
154
|
docker :cp, [id, guest_export_dir].join(':'), host_export_dir
|
177
155
|
|
178
156
|
ensure
|
179
157
|
docker :rm, '-f', id
|
180
158
|
end
|
159
|
+
rescue Docker::Error => ex
|
160
|
+
exit ex.exitstatus
|
181
161
|
end
|
182
162
|
|
183
163
|
desc 'clean', 'Removes old containers'
|
@@ -195,7 +175,7 @@ module CIDE
|
|
195
175
|
days_to_keep = options[:days]
|
196
176
|
max_images = options[:count]
|
197
177
|
|
198
|
-
x =
|
178
|
+
x = docker('images', '--no-trunc', capture: true)
|
199
179
|
iter = x.lines.each
|
200
180
|
iter.next
|
201
181
|
cide_image_ids = iter
|
@@ -208,7 +188,7 @@ module CIDE
|
|
208
188
|
return
|
209
189
|
end
|
210
190
|
|
211
|
-
x =
|
191
|
+
x = docker('inspect', *cide_image_ids, capture: true)
|
212
192
|
cide_images = JSON.parse(x.strip)
|
213
193
|
.each { |image| image['Created'] = Time.iso8601(image['Created']) }
|
214
194
|
.sort { |a, b| a['Created'] <=> b['Created'] }
|
@@ -228,44 +208,22 @@ module CIDE
|
|
228
208
|
return
|
229
209
|
end
|
230
210
|
|
231
|
-
|
211
|
+
docker('rmi', *old_cide_images)
|
232
212
|
end
|
233
213
|
|
234
214
|
desc 'init', "Creates a blank #{CONFIG_FILE} into the project"
|
235
215
|
def init
|
236
|
-
if File.exist?(CONFIG_FILE)
|
237
|
-
puts "#{CONFIG_FILE} already exists"
|
238
|
-
return
|
239
|
-
end
|
240
216
|
puts "Creating #{CONFIG_FILE} with default values"
|
241
217
|
create_file CONFIG_FILE, DefaultConfig.to_yaml
|
242
218
|
end
|
243
219
|
|
244
|
-
|
245
|
-
|
246
|
-
def setup_docker
|
247
|
-
@setup_docker ||= (
|
248
|
-
if `uname`.strip == 'Darwin' && !ENV['DOCKER_HOST']
|
249
|
-
unless system('which boot2docker >/dev/null 2>&1')
|
250
|
-
puts 'make sure boot2docker is installed and running'
|
251
|
-
puts
|
252
|
-
puts '> brew install boot2docker'
|
253
|
-
exit 1
|
254
|
-
end
|
255
|
-
|
256
|
-
`boot2docker shellinit 2>/dev/null`
|
257
|
-
.lines
|
258
|
-
.grep(/export (\w+)=(.*)/) { ENV[$1] = $2.strip }
|
259
|
-
end
|
260
|
-
true
|
261
|
-
)
|
262
|
-
end
|
220
|
+
private
|
263
221
|
|
264
|
-
def
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
222
|
+
def create_tmp_file(destination, *args, &block)
|
223
|
+
create_file(destination, *args, &block)
|
224
|
+
at_exit do
|
225
|
+
remove_file(destination, verbose: false)
|
226
|
+
end
|
269
227
|
end
|
270
228
|
end
|
271
229
|
end
|
data/lib/cide/docker.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module CIDE
|
4
|
+
# Simple docker client helper
|
5
|
+
module Docker
|
6
|
+
# Generates a valid id for docker from any string
|
7
|
+
def self.id(str)
|
8
|
+
"#{str}".downcase.gsub(/[^a-z0-9\-_.]/, '_')
|
9
|
+
end
|
10
|
+
|
11
|
+
# Raised when a docker command exits with a status higher than zero
|
12
|
+
class Error < StandardError
|
13
|
+
attr_reader :exitstatus
|
14
|
+
def initialize(exitstatus)
|
15
|
+
@exitstatus = exitstatus
|
16
|
+
super("Failed with exitstatus #{exitstatus}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def docker(*args, **opts)
|
21
|
+
setup_docker
|
22
|
+
|
23
|
+
ret = run Shellwords.join(['docker'] + args), opts
|
24
|
+
exitstatus = $?.exitstatus
|
25
|
+
fail Error, exitstatus if exitstatus > 0
|
26
|
+
ret
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def setup_docker
|
32
|
+
@setup_docker ||= (
|
33
|
+
if `uname`.strip == 'Darwin' && !ENV['DOCKER_HOST']
|
34
|
+
unless system('which boot2docker >/dev/null 2>&1')
|
35
|
+
puts 'make sure boot2docker is installed and running'
|
36
|
+
puts
|
37
|
+
puts '> brew install boot2docker'
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
|
41
|
+
`boot2docker shellinit 2>/dev/null`
|
42
|
+
.lines
|
43
|
+
.grep(/export (\w+)=(.*)/) { ENV[$1] = $2.strip }
|
44
|
+
end
|
45
|
+
true
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/cide_template.erb
CHANGED
@@ -14,11 +14,11 @@ ENV HOME <%= CIDE_DIR %>
|
|
14
14
|
WORKDIR <%= CIDE_SRC_DIR %>
|
15
15
|
|
16
16
|
# SSH config
|
17
|
-
<% if
|
17
|
+
<% if use_ssh -%>
|
18
18
|
ADD ssh_config <%= File.expand_path('config', CIDE_SSH_DIR) %>
|
19
19
|
RUN chmod 400 <%= File.expand_path('config', CIDE_SSH_DIR) %>
|
20
20
|
|
21
|
-
ADD <%=
|
21
|
+
ADD <%= TEMP_SSH_KEY %> <%= File.expand_path('id_rsa', CIDE_SSH_DIR) %>
|
22
22
|
RUN chmod 400 <%= File.expand_path('id_rsa', CIDE_SSH_DIR) %>
|
23
23
|
RUN chmod 755 <%= CIDE_SSH_DIR %>
|
24
24
|
RUN chown -R cide:cide <%= CIDE_DIR %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cide
|
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
|
- zimbatm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -62,6 +62,7 @@ executables:
|
|
62
62
|
extensions: []
|
63
63
|
extra_rdoc_files: []
|
64
64
|
files:
|
65
|
+
- ".cide.yml"
|
65
66
|
- ".gitignore"
|
66
67
|
- ".rubocop.yml"
|
67
68
|
- ".travis.yml"
|
@@ -75,6 +76,7 @@ files:
|
|
75
76
|
- cide
|
76
77
|
- cide.gemspec
|
77
78
|
- lib/cide.rb
|
79
|
+
- lib/cide/docker.rb
|
78
80
|
- lib/cide_template.erb
|
79
81
|
- lib/ssh_config
|
80
82
|
homepage: https://github.com/zimbatm/cide
|