rat_deployer 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 +7 -0
- data/bin/rat +3 -0
- data/lib/rat_deployer/cli/images.rb +84 -0
- data/lib/rat_deployer/cli.rb +67 -0
- data/lib/rat_deployer/command.rb +43 -0
- data/lib/rat_deployer/config.rb +26 -0
- data/lib/rat_deployer/version.rb +3 -0
- data/lib/rat_deployer.rb +4 -0
- metadata +137 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 04f3379e90ccb366f14476db843ecf1de3402e76
|
4
|
+
data.tar.gz: d51452ccb0aa807cf75073af755c7bb370ef18e8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ab2a49f572c862f2d5463ffe334e9ecedbbc6099f7f02372e0cacdc53dba3ed43a19079df611b6f903622b650bbd608cc6cde83d8253b4103f8ae4837e03fda4
|
7
|
+
data.tar.gz: 94da799880fbe19c640a813b9236c369a778d18712988f741637108aeb815560c9d304474a2e7481ae78d766c67263f01d4fc1ed2150df573b06f7b5ea3f15be
|
data/bin/rat
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
require 'rat_deployer/config'
|
4
|
+
require 'rat_deployer/command'
|
5
|
+
|
6
|
+
module RatDeployer
|
7
|
+
class Cli < Thor
|
8
|
+
class Images < Thor
|
9
|
+
include RatDeployer::Command
|
10
|
+
|
11
|
+
desc 'update [SERVICES...]', 'Update images for given services'
|
12
|
+
def update(*services)
|
13
|
+
build(*services)
|
14
|
+
push(*services)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'build [SERVICES...]', 'Build images for given services'
|
18
|
+
def build(*services)
|
19
|
+
services.each &method(:do_build)
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'push [SERVICES...]', 'Push images for given services'
|
23
|
+
def push(*services)
|
24
|
+
services.each &method(:do_push)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def do_build(service)
|
30
|
+
put_heading "Building service #{service}"
|
31
|
+
|
32
|
+
ensure_image_source(service)
|
33
|
+
|
34
|
+
run "docker build #{source_path(service)} -t #{image_name(service)}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def do_push(service)
|
38
|
+
run "docker push #{image_name(service)}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def ensure_image_source(service)
|
42
|
+
if git_conf(service)
|
43
|
+
git_clone_repo(service) unless File.exists? source_path(service)
|
44
|
+
git_checkout(service)
|
45
|
+
git_pull(service)
|
46
|
+
else
|
47
|
+
unless File.exists? source_path(service)
|
48
|
+
put_error <<-ERROR
|
49
|
+
No source found for service #{service}."
|
50
|
+
Either specify git[url] or provision the source for #{service} yourself.
|
51
|
+
ERROR
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def git_clone_repo(service)
|
57
|
+
url = git_conf(service).fetch("url")
|
58
|
+
run "git clone #{url} sources/#{service}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def git_checkout(service)
|
62
|
+
branch = git_conf(service).fetch("branch", "master")
|
63
|
+
run "git -C #{source_path(service)} checkout -f #{branch}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def git_pull(service)
|
67
|
+
branch = git_conf(service).fetch("branch", "master")
|
68
|
+
run "git -C #{source_path(service)} pull origin #{branch}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def source_path(service)
|
72
|
+
File.expand_path("./sources/#{service}")
|
73
|
+
end
|
74
|
+
|
75
|
+
def git_conf(service)
|
76
|
+
RatDeployer::Config.for_service(service)["git"]
|
77
|
+
end
|
78
|
+
|
79
|
+
def image_name(service)
|
80
|
+
RatDeployer::Config.for_service(service).fetch("name")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
require 'rat_deployer/cli/images'
|
4
|
+
require 'rat_deployer/command'
|
5
|
+
|
6
|
+
module RatDeployer
|
7
|
+
class Cli < Thor
|
8
|
+
include RatDeployer::Command
|
9
|
+
|
10
|
+
desc 'images SUBCOMMAND ...ARGS', 'manage images'
|
11
|
+
subcommand 'images', RatDeployer::Cli::Images
|
12
|
+
|
13
|
+
desc "deploy", "deploys current environment"
|
14
|
+
def deploy
|
15
|
+
images = RatDeployer::Config.for_env["images"]
|
16
|
+
|
17
|
+
if images.any?
|
18
|
+
unset_machine
|
19
|
+
run "rat images update #{images.keys.join(' ')}"
|
20
|
+
set_machine
|
21
|
+
run "rat compose pull"
|
22
|
+
end
|
23
|
+
|
24
|
+
set_machine
|
25
|
+
run "rat compose up -d"
|
26
|
+
unset_machine
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "compose ARGS...", "runs docker-compose command with default flags"
|
30
|
+
def compose(cmd, *cmd_flags)
|
31
|
+
warn_if_running_on_remote_host
|
32
|
+
|
33
|
+
env = RatDeployer::Config.env
|
34
|
+
project_name = RatDeployer::Config.all.fetch('project_name')
|
35
|
+
|
36
|
+
flags = [
|
37
|
+
"-f config/base.yml",
|
38
|
+
"-f config/#{env}.yml",
|
39
|
+
"-p #{project_name}_#{env}"
|
40
|
+
].join(' ')
|
41
|
+
|
42
|
+
run "docker-compose #{flags} #{cmd} #{cmd_flags.join(" ")}"
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "set_machine", "sets machine as configured in your rat_file"
|
46
|
+
def set_machine
|
47
|
+
machine = RatDeployer::Config.for_env.fetch("machine")
|
48
|
+
run "eval $(docker-machine env #{machine})"
|
49
|
+
end
|
50
|
+
|
51
|
+
desc "unset_machine", "unsets machine"
|
52
|
+
def unset_machine
|
53
|
+
run "eval $(docker-machine env --unset)"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def warn_if_running_on_remote_host
|
59
|
+
machine = ENV["DOCKER_MACHINE"]
|
60
|
+
|
61
|
+
if machine
|
62
|
+
put_warning "Your docker client is pointing to the remote machine #{machine}"
|
63
|
+
ask_for_confirmation
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "colorize"
|
2
|
+
require 'highline/import'
|
3
|
+
|
4
|
+
module RatDeployer
|
5
|
+
module Command
|
6
|
+
def run(cmd)
|
7
|
+
msg = "||=> Running command ".colorize(:blue) + "`#{cmd.colorize(:white)}`"
|
8
|
+
puts msg
|
9
|
+
system cmd
|
10
|
+
end
|
11
|
+
|
12
|
+
def put_heading(str)
|
13
|
+
puts "|| #{str}".colorize(:blue)
|
14
|
+
end
|
15
|
+
|
16
|
+
def put_error(str)
|
17
|
+
puts "// #{str}".colorize(:red)
|
18
|
+
end
|
19
|
+
|
20
|
+
def put_warning(str)
|
21
|
+
puts colorize_warning(str)
|
22
|
+
end
|
23
|
+
|
24
|
+
def ask_for_confirmation
|
25
|
+
prompt = "Are you sure you want to continue?"
|
26
|
+
|
27
|
+
a = ''
|
28
|
+
s = '[y/n]'
|
29
|
+
d = 'y'
|
30
|
+
|
31
|
+
until %w[y n].include? a
|
32
|
+
a = ask(colorize_warning("#{prompt} #{s} ")) { |q| q.limit = 1; q.case = :downcase }
|
33
|
+
a = d if a.length == 0
|
34
|
+
end
|
35
|
+
|
36
|
+
exit 1 unless a == 'y'
|
37
|
+
end
|
38
|
+
|
39
|
+
def colorize_warning(str)
|
40
|
+
"\\\\ #{str}".colorize(:yellow)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'deep_merge'
|
3
|
+
|
4
|
+
module RatDeployer
|
5
|
+
module Config
|
6
|
+
def self.all
|
7
|
+
@all ||= YAML.load_file File.expand_path('./rat_config.yml')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.env
|
11
|
+
ENV.fetch('RAT_ENV')
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.for_env(e = env)
|
15
|
+
confs = all.fetch('environments')
|
16
|
+
default_conf = confs['default'] || {}
|
17
|
+
env_conf = confs.fetch(e)
|
18
|
+
|
19
|
+
default_conf.deep_merge env_conf
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.for_service(service)
|
23
|
+
for_env.fetch('images').fetch(service)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/rat_deployer.rb
ADDED
metadata
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rat_deployer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nicolas Oga
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.19.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.19.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: deep_merge
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.1.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: highline
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.7.8
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.7.8
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.13'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.13'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
description: A micro-framework to deploy dockerized apps
|
98
|
+
email:
|
99
|
+
- 2112.oga@gmail.com
|
100
|
+
executables:
|
101
|
+
- rat
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- bin/rat
|
106
|
+
- lib/rat_deployer.rb
|
107
|
+
- lib/rat_deployer/cli.rb
|
108
|
+
- lib/rat_deployer/cli/images.rb
|
109
|
+
- lib/rat_deployer/command.rb
|
110
|
+
- lib/rat_deployer/config.rb
|
111
|
+
- lib/rat_deployer/version.rb
|
112
|
+
homepage: http://github.com/nicooga/rat_deployer
|
113
|
+
licenses:
|
114
|
+
- MIT
|
115
|
+
metadata: {}
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
requirements: []
|
131
|
+
rubyforge_project:
|
132
|
+
rubygems_version: 2.5.1
|
133
|
+
signing_key:
|
134
|
+
specification_version: 4
|
135
|
+
summary: A micro-framework to deploy dockerized apps
|
136
|
+
test_files: []
|
137
|
+
has_rdoc:
|