fidoci 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/d +47 -0
- data/lib/fidoci/env.rb +66 -0
- data/lib/fidoci/main.rb +64 -0
- data/lib/fidoci.rb +5 -0
- metadata +50 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c7383d0a36cc9491caea846a4a1554a692e866c
|
4
|
+
data.tar.gz: 57517f8b162f38ed5a7947219637ae85a2705d33
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b69803fc8a02b3e5a5934686c54ab289268994e82f6cf3d2b1d134d020f9c1ea26786238a74687f5132fe6a8321e9c19c67daf18c854b770e0310bb88fa960a5
|
7
|
+
data.tar.gz: 3f7e1720a5f2d0f6c4578cfb9c0fd7a70f1894f8d33628675824f9d79f74af6002c3d811f4c76667b9fc1baa8d6d5ae935834eac2f9a5489366422c70b4b7147
|
data/bin/d
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'fidoci'
|
4
|
+
|
5
|
+
if ARGV.size == 0
|
6
|
+
puts "Usage: d OPTIONS"
|
7
|
+
puts "or d COMMAND [arg...]"
|
8
|
+
puts
|
9
|
+
puts "Dockerized development and build workflow."
|
10
|
+
puts
|
11
|
+
puts "Options:"
|
12
|
+
puts
|
13
|
+
puts " --build [--clean] tag Builds 'test' image, run tests inside and if successful, tag image by given 'tag'"
|
14
|
+
puts " --clean Removes all containers and images from docker related to this repo"
|
15
|
+
puts
|
16
|
+
puts "Command:"
|
17
|
+
puts " Running with command will build 'exec' image, start docker-compose with that image and run given command in container"
|
18
|
+
puts
|
19
|
+
puts "Example (for Rails):"
|
20
|
+
puts " d bundle exec rake db:migrate"
|
21
|
+
puts " d bundle exec rails s"
|
22
|
+
puts " d bundle exec rake"
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
|
26
|
+
environment = Fidoci::Main.new
|
27
|
+
|
28
|
+
case ARGV[0]
|
29
|
+
when '--clean'
|
30
|
+
# d --clean
|
31
|
+
# clean service and intermediate docker images
|
32
|
+
environment.clean
|
33
|
+
when '--build'
|
34
|
+
# d --build [--clean] latest-staging
|
35
|
+
# build image, test it and if successful, tag as latest-staging
|
36
|
+
# if --clean is present, will clean all intermediate docker images after
|
37
|
+
if environment.build(ARGV.last, ARGV.size > 1 && ARGV[1] == '--clean')
|
38
|
+
exit 0
|
39
|
+
else
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
else
|
43
|
+
# d cmd args args
|
44
|
+
# run cmd in exec environment
|
45
|
+
# build container image and run all services if not yet
|
46
|
+
environment.cmd(*ARGV)
|
47
|
+
end
|
data/lib/fidoci/env.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
module Fidoci
|
2
|
+
# Environment configuration of D
|
3
|
+
# encapsulates container image building and running commands in it
|
4
|
+
class Env
|
5
|
+
attr_accessor :env_config
|
6
|
+
|
7
|
+
def initialize(image, name, env_config)
|
8
|
+
@name = name.to_s
|
9
|
+
@image = image
|
10
|
+
@env_config = env_config
|
11
|
+
end
|
12
|
+
|
13
|
+
def build_image()
|
14
|
+
if image_exists?
|
15
|
+
puts "Using exisitng image #{image_name}..."
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
|
19
|
+
puts "Building image #{image_name}..."
|
20
|
+
params = []
|
21
|
+
|
22
|
+
params << '--force-rm=true'
|
23
|
+
params << "-t #{image_name}"
|
24
|
+
if env_config['dockerfile']
|
25
|
+
params << "-f #{env_config['dockerfile']}"
|
26
|
+
end
|
27
|
+
|
28
|
+
system "docker build #{params.join(' ')} ."
|
29
|
+
end
|
30
|
+
|
31
|
+
def image_name
|
32
|
+
"%s:%s" % [@image, @name]
|
33
|
+
end
|
34
|
+
|
35
|
+
def image_exists?
|
36
|
+
images = `docker images`
|
37
|
+
images_names = images.split("\n").drop(1).map{|line|
|
38
|
+
parts = line.split(/\s+/)
|
39
|
+
parts[0..1].join(':')
|
40
|
+
}
|
41
|
+
|
42
|
+
images_names.any?{|i| i == image_name}
|
43
|
+
end
|
44
|
+
|
45
|
+
def cmd(*args)
|
46
|
+
if build_image
|
47
|
+
puts "Running `#{args.join(' ')}`..."
|
48
|
+
system "docker-compose run --rm #{@name} #{args.join(' ')}"
|
49
|
+
else
|
50
|
+
puts "Build failed"
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def commands
|
56
|
+
return false unless env_config['commands']
|
57
|
+
|
58
|
+
success = env_config['commands'].all? { |command|
|
59
|
+
cmd command.split(/\s+/)
|
60
|
+
}
|
61
|
+
|
62
|
+
puts "Test failed" unless success
|
63
|
+
success
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/fidoci/main.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Fidoci
|
4
|
+
# Main entry point for D command
|
5
|
+
# reads configuration and provide high-level commands
|
6
|
+
class Main
|
7
|
+
|
8
|
+
attr_accessor :config
|
9
|
+
|
10
|
+
# Initialize entry point
|
11
|
+
# config_file - yml file path with configuration
|
12
|
+
def initialize(config_file = 'd.yml')
|
13
|
+
@config = YAML.load_file(config_file)
|
14
|
+
puts @config['image']
|
15
|
+
end
|
16
|
+
|
17
|
+
# Run command in default "exec" environment
|
18
|
+
# ie in container build and started with exec configuration
|
19
|
+
# args - command and arguments to pass to docker run command
|
20
|
+
def cmd(*args)
|
21
|
+
env(:exec).cmd(*args)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Configured docker repository name
|
25
|
+
# image key from YAML file
|
26
|
+
def repository_name
|
27
|
+
config['image']
|
28
|
+
end
|
29
|
+
|
30
|
+
# Create environment instance with given name
|
31
|
+
# name - key that will be used to configure this env
|
32
|
+
def env(name)
|
33
|
+
Env.new(repository_name, name.to_s, config[name.to_s])
|
34
|
+
end
|
35
|
+
|
36
|
+
# Clean system
|
37
|
+
# removes all service and running containers and their images
|
38
|
+
# and removes all images build by d
|
39
|
+
def clean
|
40
|
+
system 'docker-compose kill'
|
41
|
+
system 'docker-compose rm -f'
|
42
|
+
|
43
|
+
(config.keys - ['image']).each { |name|
|
44
|
+
env = env(name)
|
45
|
+
system "docker rmi -f #{env.image_name}"
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
# Build image and run test in it
|
50
|
+
# tag - tag name to tag image after successful build and test
|
51
|
+
# do_clean - if true, will do clean after build (whether successful or not)
|
52
|
+
def build(tag, do_clean = false)
|
53
|
+
test_env = env(:test)
|
54
|
+
success = test_env.commands
|
55
|
+
|
56
|
+
if success
|
57
|
+
system "docker tag #{test_env.image_name} #{repository_name}:#{tag}"
|
58
|
+
end
|
59
|
+
|
60
|
+
clean if do_clean
|
61
|
+
success
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/fidoci.rb
ADDED
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fidoci
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lukas Dolezal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-07-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Simple tool around docker-compose to enable dockerized dev-2-test-2-production
|
14
|
+
workflow
|
15
|
+
email: lukas@dolezalu.cz
|
16
|
+
executables:
|
17
|
+
- d
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/d
|
22
|
+
- lib/fidoci.rb
|
23
|
+
- lib/fidoci/env.rb
|
24
|
+
- lib/fidoci/main.rb
|
25
|
+
homepage: https://github.com/DocX/fidoci
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.4.5
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Finally Docker CI
|
49
|
+
test_files: []
|
50
|
+
has_rdoc:
|