rat_deployer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rat_deployer/cli'
3
+ RatDeployer::Cli.start(ARGV)
@@ -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
@@ -0,0 +1,3 @@
1
+ module RatDeployer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ require 'rat_deployer/version'
2
+
3
+ module RatDeployer
4
+ end
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: