class EcrDeploy::Task

Public Class Methods

new(config, environment) click to toggle source
# File lib/ecr_deploy/task.rb, line 4
def initialize(config, environment)
  fail ArgumentError, "#{environment} does not exist in the configuration." \
    if !config.environments.include?(environment)

  @ecs = Aws::ECS::Client.new
  s3 = Aws::S3::Resource.new

  @cluster_name = config.base_config["cluster"]

  @service_names = config.services(environment)
  @run_task_names = config.run_tasks(environment)
  @register_task_names = config.register_tasks(environment)

  @bucket = s3.bucket(config.base_config["template_bucket"])
  @bucket_prefix = config.base_config["template_bucket_prefix"] || ""

  @environment = environment
  @env_vars = @bucket.
    object(build_path("#{environment}-env.json")).get.body.string
end

Public Instance Methods

deploy!(image_tag_name) click to toggle source
# File lib/ecr_deploy/task.rb, line 25
def deploy!(image_tag_name)
  task_def_names = (@service_names + @run_task_names + @register_task_names).uniq
  task_def_arns = task_def_names.map { |name| register_task_definition(name, image_tag_name) }
  task_def = Hash[task_def_names.zip(task_def_arns)]

  @service_names.each do |name|
    service_name = "#{@environment}-#{name}"
    $stderr.puts "==> Updating service \"#{service_name}\""
    @ecs.update_service(
      cluster: @cluster_name,
      service: service_name,
      task_definition: task_def[name])
  end

  @run_task_names.each do |name|
    $stderr.puts "==> Running task \"#{name}\" in \"#{@environment}\""
    @ecs.run_task(
      cluster: @cluster_name,
      task_definition: task_def[name],
      count: 1)
  end
end
register_task_definition(name, image_tag_name) click to toggle source
# File lib/ecr_deploy/task.rb, line 63
def register_task_definition(name, image_tag_name)
  template = @bucket.object(build_path("#{@environment}-#{name}.json")).
    get.body.string
  template.gsub!("[CURRENT_IMAGE_TAG]", image_tag_name)
  template.gsub!("[ENVIRONMENT]", @env_vars)

  template_obj = JSON.parse(template, symbolize_names: true)
  task = @ecs.register_task_definition(template_obj)

  task.task_definition.task_definition_arn
end
wait_until_stable(wait_time = 600) click to toggle source
# File lib/ecr_deploy/task.rb, line 48
def wait_until_stable(wait_time = 600)
  services = @service_names.map { |name| "#{@environment}-#{name}" }
  $stderr.puts "==> Waiting for #{services.join ", "} to stabilize..."
  started_at = Time.now
  @ecs.wait_until(:services_stable, cluster: @cluster, services: services) do |w|
    w.max_attempts = nil

    w.before_wait do |attempts, response|
      throw :failure if Time.now - started_at > wait_time
    end
  end
rescue Aws::Waiters::Errors::WaiterFailed => e
  $stderr.puts "!!> An error occurred while waiting for services to stabilize. #{e}"
end

Private Instance Methods

build_path(path) click to toggle source
# File lib/ecr_deploy/task.rb, line 77
def build_path(path)
  @bucket_prefix + path
end