centurion 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -154,6 +154,24 @@ must respond with a valid response in the 200 status range.
154
154
  $ bundle exec centurion -p radio-radio -e staging -a rolling_deploy
155
155
  ````
156
156
 
157
+ **Rolling Deployment Settings**:
158
+ You can change the following settings in your config to tune how the rolling
159
+ deployment behaves. Each of these is controlled with `set(:var_name, 'value')`.
160
+ These can be different for each environment or put into a common block if they
161
+ are the same everywhere. Settings are per-project.
162
+
163
+ * `rolling_deploy_check_interval` => Controls how long Centurion will wait after
164
+ seeing a container as up before moving on to the next one. This should be
165
+ slightly longer than your load balancer check interval. Value in seconds.
166
+ Defaults to 5 seconds.
167
+ * `rolling_deploy_wait_time` => The amount of time to wait between unsuccessful
168
+ health checks before retrying. Value in seconds. Defaults to 5 seconds.
169
+ * `rolling_deploy_retries` => The number of times to retry a health check on
170
+ the container once it is running. This count multiplied by the
171
+ `rolling_deployment_wait_time` is the total time Centurion will wait for
172
+ an individual container to come up before giving up as a failure. Defaults
173
+ to 24 attempts.
174
+
157
175
  ###Deploy a project to a fleet of Docker servers
158
176
 
159
177
  This will hard stop, then start containers on all the specified hosts. This
data/bin/centurion CHANGED
@@ -22,7 +22,7 @@ def possible_environments.to_s
22
22
  end
23
23
 
24
24
  #
25
- # Trollup option setup
25
+ # Trollop option setup
26
26
  #
27
27
  require 'trollop'
28
28
 
@@ -34,6 +34,7 @@ opts = Trollop::options do
34
34
  opt :tag, 'tag (latest...)', type: String, required: false, short: '-t'
35
35
  opt :hosts, 'hosts, comma separated', type: String, required: false, short: '-h'
36
36
  opt :docker_path, 'path to docker executable (default: docker)', type: String, default: 'docker', short: '-d'
37
+ opt :no_pull, 'Skip the pull_image step', type: :flag, default: false, long: '--no-pull'
37
38
  end
38
39
 
39
40
  unless possible_environments.include?(opts[:environment])
@@ -63,8 +64,11 @@ set :hosts, opts[:hosts].split(",") if opts[:hosts]
63
64
 
64
65
  # Default tag should be "latest"
65
66
  set :tag, 'latest' unless any?(:tag)
67
+ set :docker_registry, 'https://registry.hub.docker.com/'
66
68
 
67
69
  # Specify a path to docker executable
68
70
  set :docker_path, opts[:docker_path]
69
71
 
72
+ set :no_pull, opts[:no_pull]
73
+
70
74
  invoke(opts[:action])
@@ -94,7 +94,10 @@ module Centurion::Deploy
94
94
  }
95
95
 
96
96
  if port_bindings
97
- container_config['ExposedPorts'] = { port_bindings.keys.first => {} }
97
+ container_config['ExposedPorts'] ||= {}
98
+ port_bindings.keys.each do |port|
99
+ container_config['ExposedPorts'][port] = {}
100
+ end
98
101
  end
99
102
 
100
103
  if env_vars
@@ -5,12 +5,11 @@ require 'uri'
5
5
  module Centurion; end
6
6
 
7
7
  class Centurion::DockerRegistry
8
- def initialize()
9
- # @base_uri = "https://staging-docker-registry.nr-ops.net"
10
- @base_uri = 'http://chi-docker-registry.nr-ops.net'
8
+ def initialize(base_uri)
9
+ @base_uri = base_uri
11
10
  end
12
11
 
13
- def digest_for_tag( repository, tag)
12
+ def digest_for_tag(repository, tag)
14
13
  path = "/v1/repositories/#{repository}/tags/#{tag}"
15
14
  $stderr.puts "GET: #{path.inspect}"
16
15
  response = Excon.get(
@@ -25,8 +24,8 @@ class Centurion::DockerRegistry
25
24
  JSON.load('[' + response.body + ']').first
26
25
  end
27
26
 
28
- def respository_tags( respository )
29
- path = "/v1/repositories/#{respository}/tags"
27
+ def repository_tags(repository)
28
+ path = "/v1/repositories/#{repository}/tags"
30
29
  $stderr.puts "GET: #{path.inspect}"
31
30
  response = Excon.get(@base_uri + path)
32
31
  raise response.inspect unless response.status == 200
@@ -34,7 +34,7 @@ class Centurion::DockerViaApi
34
34
 
35
35
  def old_containers_for_port(host_port)
36
36
  old_containers = ps(all: true).select do |container|
37
- container["Status"] =~ /^Exit /
37
+ container["Status"] =~ /^(Exit |Exited)/
38
38
  end.select do |container|
39
39
  inspected = inspect_container container["Id"]
40
40
  container_listening_on_port?(inspected, host_port)
@@ -104,7 +104,7 @@ class Centurion::DockerViaApi
104
104
  port_bindings = container['HostConfig']['PortBindings']
105
105
  return false unless port_bindings
106
106
 
107
- port_bindings.values.flatten.any? do |port_binding|
107
+ port_bindings.values.flatten.compact.any? do |port_binding|
108
108
  port_binding['HostPort'].to_i == port.to_i
109
109
  end
110
110
  end
@@ -52,10 +52,7 @@ class Centurion::DockerViaCli
52
52
  end
53
53
 
54
54
  output_thread.kill
55
-
56
- unless $?.success?
57
- raise "The command failed with a non-zero exit status: #{$?.exitstatus}"
58
- end
55
+ validate_status(command)
59
56
  end
60
57
 
61
58
  def run_with_echo( command )
@@ -64,8 +61,12 @@ class Centurion::DockerViaCli
64
61
  IO.popen(command) do |io|
65
62
  io.each_char { |char| print char }
66
63
  end
64
+ validate_status(command)
65
+ end
66
+
67
+ def validate_status(command)
67
68
  unless $?.success?
68
- raise "The command failed with a non-zero exit status: #{$?.exitstatus}"
69
+ raise "The command failed with a non-zero exit status: #{$?.exitstatus}. Command: '#{command}'"
69
70
  end
70
71
  end
71
72
  end
@@ -1,3 +1,3 @@
1
1
  module Centurion
2
- VERSION = '1.0.9'
2
+ VERSION = '1.0.10'
3
3
  end
@@ -103,7 +103,7 @@ namespace :deploy do
103
103
  end
104
104
 
105
105
  task :determine_image_id do
106
- registry = Centurion::DockerRegistry.new()
106
+ registry = Centurion::DockerRegistry.new(fetch(:docker_registry))
107
107
  exact_image = registry.digest_for_tag(fetch(:image), fetch(:tag))
108
108
  set :image_id, exact_image
109
109
  $stderr.puts "RESOLVED #{fetch(:image)}:#{fetch(:tag)} => #{exact_image[0..11]}"
@@ -120,6 +120,10 @@ namespace :deploy do
120
120
  end
121
121
 
122
122
  task :pull_image do
123
+ if fetch(:no_pull)
124
+ info "--no-pull option specified: skipping pull"
125
+ next
126
+ end
123
127
  $stderr.puts "Fetching image #{fetch(:image)}:#{fetch(:tag)} IN PARALLEL\n"
124
128
 
125
129
  target_servers = Centurion::DockerServerGroup.new(fetch(:hosts), fetch(:docker_path))
data/lib/tasks/list.rake CHANGED
@@ -24,8 +24,8 @@ namespace :list do
24
24
 
25
25
  task :tags do
26
26
  begin
27
- registry = Centurion::DockerRegistry.new()
28
- tags = registry.respository_tags(fetch(:image))
27
+ registry = Centurion::DockerRegistry.new(fetch(:docker_registry))
28
+ tags = registry.repository_tags(fetch(:image))
29
29
  tags.each do |tag|
30
30
  puts "\t#{tag[0]}\t-> #{tag[1][0..11]}"
31
31
  end
data/spec/deploy_spec.rb CHANGED
@@ -166,6 +166,13 @@ describe Centurion::Deploy do
166
166
  expect(config.keys).to match_array(%w{ Hostname Image Volumes VolumesFrom })
167
167
  expect(config['Volumes']['/tmp/chaucer']).to eq({})
168
168
  end
169
+
170
+ it "exposes all ports" do
171
+ config = test_deploy.container_config_for(server, 'image_id', {1234 => 80, 9876 => 80})
172
+
173
+ expect(config['ExposedPorts']).to be_a(Hash)
174
+ expect(config['ExposedPorts'].keys).to eq [1234, 9876]
175
+ end
169
176
  end
170
177
 
171
178
  describe '#start_new_container' do
@@ -12,7 +12,7 @@ describe Centurion::DockerViaApi do
12
12
  [
13
13
  {"Id" => "123", "Status" => "Exit 0"},
14
14
  {"Id" => "456", "Status" => "Running blah blah"},
15
- {"Id" => "789", "Status" => "Exit 1"},
15
+ {"Id" => "789", "Status" => "Exited 1 mins ago"},
16
16
  ]
17
17
  end
18
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: centurion
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -21,7 +21,7 @@ authors:
21
21
  autorequire:
22
22
  bindir: bin
23
23
  cert_chain: []
24
- date: 2014-06-13 00:00:00.000000000 Z
24
+ date: 2014-07-08 00:00:00.000000000 Z
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: trollop