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 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: