Class: Lita::Handlers::CodedeployStatus

Inherits:
Handler
  • Object
show all
Defined in:
lib/lita/handlers/codedeploy_status.rb

Instance Method Summary collapse

Instance Method Details

#codedeploy_apiObject



100
101
102
# File 'lib/lita/handlers/codedeploy_status.rb', line 100

def codedeploy_api
  @aws_api ||= codedeploy_api_init
end

#codedeploy_api_initObject



104
105
106
107
108
109
110
111
112
# File 'lib/lita/handlers/codedeploy_status.rb', line 104

def codedeploy_api_init
  if config.aws_access_key && config.aws_secret_access_key
    Aws.config[:credentials] = Aws::Credentials.new(config.aws_access_key, config.aws_secret_access_key)
  end
  if config.aws_region
    Aws.config[:region] = config.aws_region
  end
  Aws::CodeDeploy::Client.new
end

#codedeploy_status(response) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/lita/handlers/codedeploy_status.rb', line 15

def codedeploy_status(response)
  @helper = Module.new do
    def time_ago(t)
      if t
        "(#{TimeLord::Period.new(t, ::Time.now).in_words})"
      end
    end

    def short_instance_id(instance_id)
      instance_id.split('/')[1]
    end
  end

  branch_name = response.matches[0][0]
  if branch_name && branch_name != ''
    branch = config.branches[branch_name]
  else
    config.branches.each do |k,v|
      if v[:default]
        branch_name = k
        branch = v
      end
    end
  end


  unless deployment_done
    response.reply("Deployment watch in progress - please wait until it is done before starting a new one.")
    return
  end

  unless branch
    response.reply("Could not find branch info for branch #{branch_name}.")
    return
  end

  branch[:name] = branch_name

  log.debug "Starting deployment watch for branch #{branch[:name]}: application_name #{branch[:application_name]}, deployment_group_name #{branch[:deployment_group_name]}"

  begin
    @deployment_id = latest_deployment_id(branch[:application_name], branch[:deployment_group_name])
    @deployment_instances = get_deployment_instances

    watch_deployment(branch, response)
  rescue => e
    response.reply("Error: #{e.message}")
  end
end

#deployment_doneObject



130
131
132
# File 'lib/lita/handlers/codedeploy_status.rb', line 130

def deployment_done
  @deployment == nil || @deployment.deployment_info.complete_time != nil
end

#deployment_instance_status(instance_id) ⇒ Object



126
127
128
# File 'lib/lita/handlers/codedeploy_status.rb', line 126

def deployment_instance_status(instance_id)
  codedeploy_api.get_deployment_instance(deployment_id: @deployment_id, instance_id: instance_id)
end

#deployment_statusObject



122
123
124
# File 'lib/lita/handlers/codedeploy_status.rb', line 122

def deployment_status
  codedeploy_api.get_deployment(deployment_id: @deployment_id)
end

#deployment_updatedObject



134
135
136
137
# File 'lib/lita/handlers/codedeploy_status.rb', line 134

def deployment_updated
  @previous_instance_id != @current_instance_id ||
      @previous_instance_update != @current_instance_update
end

#do_watch_deployment(branch, response, timer = nil) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/lita/handlers/codedeploy_status.rb', line 74

def do_watch_deployment(branch, response, timer=nil)
  begin
    update_deployment_info

    if deployment_done
      render_output(branch, response)
      timer.stop if timer
    else
      if deployment_updated
        render_output(branch, response)
      end
    end
  rescue => e
    response.reply("Error: #{e.message}")
  end
end

#get_deployment_instancesObject



118
119
120
# File 'lib/lita/handlers/codedeploy_status.rb', line 118

def get_deployment_instances
  codedeploy_api.list_deployment_instances(deployment_id: @deployment_id).instances_list
end

#latest_deployment_id(application_name, deployment_group_name) ⇒ Object



114
115
116
# File 'lib/lita/handlers/codedeploy_status.rb', line 114

def latest_deployment_id(application_name, deployment_group_name)
  codedeploy_api.list_deployments(application_name: application_name, deployment_group_name: deployment_group_name).deployments.first
end

#render_output(branch, response) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/lita/handlers/codedeploy_status.rb', line 91

def render_output(branch, response)
  response.reply(render_template_with_helpers("codedeploy_status", [@helper], config: config,
                                              branch: branch,
                                              deployment_id: @deployment_id,
                                              deployment: @deployment,
                                              deployment_instances: @deployment_instances,
                                              deployment_instance_status: @deployment_instance_status))
end

#update_deployment_infoObject



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/lita/handlers/codedeploy_status.rb', line 139

def update_deployment_info
  @deployment = deployment_status
  @deployment_instance_status = @deployment_instances.collect {|instance_id| deployment_instance_status(instance_id)}

  raise 'Unable to get deployment info' unless @deployment && @deployment_instance_status

  @previous_instance_id = @current_instance_id
  @previous_instance_update = @current_instance_update

  @deployment_instance_status.each do |status|
    if status.instance_summary.status == 'InProgress'
      @current_instance_id = status.instance_summary.instance_id
      @current_instance_update = status.instance_summary.last_updated_at
    end
  end
end

#watch_deployment(branch, response) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/lita/handlers/codedeploy_status.rb', line 65

def watch_deployment(branch, response)
  do_watch_deployment(branch, response)
  unless deployment_done
    every(10) do |timer|
      do_watch_deployment(branch, response, timer)
    end
  end
end