class EcsShip::Deploy

Public Class Methods

new(cluster_name, service_name, task_name, docker_image_name, docker_tag = 'latest') click to toggle source
# File lib/ecs_ship/deploy.rb, line 5
def initialize(cluster_name, service_name, task_name, docker_image_name, docker_tag = 'latest')
  @cluster_name = cluster_name
  @docker_tag = docker_tag
  @service_name = service_name
  @task_name = task_name
  @docker_image_name = docker_image_name

  raise "Invalid cluster name, valid clusters are: #{cluster_names}" unless cluster_names.any?{|available_name| available_name == cluster_name}
end

Public Instance Methods

all_clusters() click to toggle source
# File lib/ecs_ship/deploy.rb, line 88
def all_clusters
  @all_clusters ||= JSON.parse(`aws ecs describe-clusters --clusters #{cluster_arns.join(' ')}`)['clusters']
end
cluster_arns() click to toggle source
# File lib/ecs_ship/deploy.rb, line 92
def cluster_arns
  JSON.parse(`aws ecs list-clusters`)['clusterArns']
end
cluster_names() click to toggle source
# File lib/ecs_ship/deploy.rb, line 96
def cluster_names
  all_clusters.map{|c| c['clusterName']}
end
deploy() click to toggle source
# File lib/ecs_ship/deploy.rb, line 15
def deploy
  stop_existing_task
  rev_task_version
  start_updated_task

  puts "Shipped! #{@service_name} should now be running #{versioned_task_name}"

rescue StandardError => e
  syntax
  raise e
end
rev_task_version() click to toggle source
# File lib/ecs_ship/deploy.rb, line 41
def rev_task_version
  begin
    puts 'Creating new task definition with updated version number'

    task_definition = JSON.parse(`aws ecs describe-task-definition --task-definition #{@task_name}`)['taskDefinition']

    @revision = task_definition['revision'] + 1

    registerable_params = [:family, :taskRoleArn, :networkMode, :containerDefinitions, :volumes, :placementConstraints]

    task_definition['containerDefinitions'].map! do |container_definition|
      if container_definition['image'].include?(@docker_image_name)
        container_definition['image'] = "#{@docker_image_name}:#{@docker_tag}"
      end
      container_definition
    end

    File.open(temp_definition_path, 'w') do |file|
      file.write(task_definition.select{|k, v| registerable_params.include?(k.to_sym)}.to_json)
    end

    success = system("aws ecs register-task-definition --family #{@task_name} --cli-input-json file://#{temp_definition_path}")
    unless success
      raise 'Failed to rev task version'
    end
  ensure
    File.delete(temp_definition_path)
  end
end
start_updated_task() click to toggle source
# File lib/ecs_ship/deploy.rb, line 75
def start_updated_task
  puts 'Starting service back up with newly created task definition'

  success = system("aws ecs update-service --cluster #{@cluster_name} --service #{@service_name} --desired-count 1 --task-definition #{versioned_task_name}")
  unless success
    raise 'Failed to start back up the updated service'
  end
end
stop_existing_task() click to toggle source
# File lib/ecs_ship/deploy.rb, line 27
def stop_existing_task
  puts 'Stopping existing task... yes this is a downtime deployment'

  running_task_arns = JSON.parse(`aws ecs list-tasks --cluster #{@cluster_name} --family #{@task_name} --desired-status RUNNING`)['taskArns']
  running_task_arns.each do |task_arn|
    system("aws ecs stop-task --cluster #{@cluster_name} --task #{task_arn}")
  end

  success = system("aws ecs update-service --cluster #{@cluster_name} --service #{@service_name} --desired-count 0")
  unless success
    raise 'Failed to stop existing task'
  end
end
syntax() click to toggle source
# File lib/ecs_ship/deploy.rb, line 100
def syntax
  puts "Arguments: #{method(:initialize).parameters.map{|p| "#{p.last} (#{p.first})"}.join(' ')}"
  puts "\n"
  puts "Valid stacks: #{cluster_names}}"
end
temp_definition_path() click to toggle source
# File lib/ecs_ship/deploy.rb, line 71
def temp_definition_path
  'temp_definition_delete_me.json'
end
versioned_task_name() click to toggle source
# File lib/ecs_ship/deploy.rb, line 84
def versioned_task_name
  "#{@task_name}:#{@revision}"
end