skylight 1.7.2 → 2.0.0.beta1
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 +4 -4
- data/CHANGELOG.md +4 -33
- data/ext/extconf.rb +32 -6
- data/ext/libskylight.yml +6 -9
- data/ext/skylight_native.c +49 -18
- data/lib/skylight.rb +35 -1
- data/lib/skylight/api.rb +4 -2
- data/lib/skylight/cli.rb +1 -1
- data/lib/skylight/cli/doctor.rb +6 -4
- data/lib/skylight/config.rb +149 -518
- data/lib/skylight/data/cacert.pem +236 -812
- data/lib/skylight/helpers.rb +5 -1
- data/lib/skylight/instrumenter.rb +10 -241
- data/lib/skylight/middleware.rb +1 -89
- data/lib/skylight/native.rb +8 -6
- data/lib/skylight/native_ext_fetcher.rb +251 -0
- data/lib/skylight/normalizers/active_job/enqueue_at.rb +2 -20
- data/lib/skylight/probes/sinatra_add_middleware.rb +22 -0
- data/lib/skylight/railtie.rb +11 -131
- data/lib/skylight/sinatra.rb +1 -5
- data/lib/skylight/trace.rb +1 -229
- data/lib/skylight/util/http.rb +3 -3
- data/lib/skylight/vendor/cli/thor/actions/directory.rb +5 -15
- data/lib/skylight/version.rb +1 -1
- metadata +114 -91
- data/lib/skylight/compat.rb +0 -76
- data/lib/skylight/core.rb +0 -149
- data/lib/skylight/deprecation.rb +0 -55
- data/lib/skylight/formatters/http.rb +0 -20
- data/lib/skylight/gc.rb +0 -107
- data/lib/skylight/normalizers.rb +0 -192
- data/lib/skylight/normalizers/action_controller/process_action.rb +0 -50
- data/lib/skylight/normalizers/action_controller/send_file.rb +0 -50
- data/lib/skylight/normalizers/action_view/render_collection.rb +0 -22
- data/lib/skylight/normalizers/action_view/render_partial.rb +0 -21
- data/lib/skylight/normalizers/action_view/render_template.rb +0 -21
- data/lib/skylight/normalizers/active_model_serializers/render.rb +0 -26
- data/lib/skylight/normalizers/active_record/instantiation.rb +0 -17
- data/lib/skylight/normalizers/active_record/sql.rb +0 -55
- data/lib/skylight/normalizers/active_support/cache.rb +0 -51
- data/lib/skylight/normalizers/active_support/cache_clear.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_decrement.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_delete.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_exist.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_fetch_hit.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_generate.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_increment.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_read_multi.rb +0 -16
- data/lib/skylight/normalizers/active_support/cache_write.rb +0 -16
- data/lib/skylight/normalizers/coach/handler_finish.rb +0 -36
- data/lib/skylight/normalizers/coach/middleware_finish.rb +0 -23
- data/lib/skylight/normalizers/couch_potato/query.rb +0 -20
- data/lib/skylight/normalizers/default.rb +0 -27
- data/lib/skylight/normalizers/elasticsearch/request.rb +0 -20
- data/lib/skylight/normalizers/faraday/request.rb +0 -38
- data/lib/skylight/normalizers/grape/endpoint.rb +0 -30
- data/lib/skylight/normalizers/grape/endpoint_render.rb +0 -26
- data/lib/skylight/normalizers/grape/endpoint_run.rb +0 -33
- data/lib/skylight/normalizers/grape/endpoint_run_filters.rb +0 -23
- data/lib/skylight/normalizers/moped/query.rb +0 -100
- data/lib/skylight/probes.rb +0 -129
- data/lib/skylight/probes/action_controller.rb +0 -64
- data/lib/skylight/probes/action_dispatch.rb +0 -30
- data/lib/skylight/probes/action_view.rb +0 -43
- data/lib/skylight/probes/active_model_serializers.rb +0 -55
- data/lib/skylight/probes/elasticsearch.rb +0 -37
- data/lib/skylight/probes/excon.rb +0 -26
- data/lib/skylight/probes/excon/middleware.rb +0 -68
- data/lib/skylight/probes/faraday.rb +0 -22
- data/lib/skylight/probes/grape.rb +0 -88
- data/lib/skylight/probes/httpclient.rb +0 -46
- data/lib/skylight/probes/middleware.rb +0 -68
- data/lib/skylight/probes/mongo.rb +0 -161
- data/lib/skylight/probes/mongoid.rb +0 -21
- data/lib/skylight/probes/moped.rb +0 -39
- data/lib/skylight/probes/net_http.rb +0 -58
- data/lib/skylight/probes/redis.rb +0 -71
- data/lib/skylight/probes/sequel.rb +0 -37
- data/lib/skylight/probes/sinatra.rb +0 -76
- data/lib/skylight/probes/tilt.rb +0 -31
- data/lib/skylight/subscriber.rb +0 -122
- data/lib/skylight/user_config.rb +0 -60
- data/lib/skylight/util.rb +0 -17
- data/lib/skylight/util/allocation_free.rb +0 -26
- data/lib/skylight/util/clock.rb +0 -54
- data/lib/skylight/util/deploy.rb +0 -132
- data/lib/skylight/util/gzip.rb +0 -21
- data/lib/skylight/util/inflector.rb +0 -112
- data/lib/skylight/util/logging.rb +0 -127
- data/lib/skylight/util/multi_io.rb +0 -21
- data/lib/skylight/util/native_ext_fetcher.rb +0 -253
- data/lib/skylight/util/platform.rb +0 -75
- data/lib/skylight/util/proxy.rb +0 -13
- data/lib/skylight/vendor/active_support/notifications.rb +0 -207
- data/lib/skylight/vendor/active_support/notifications/fanout.rb +0 -159
- data/lib/skylight/vendor/active_support/notifications/instrumenter.rb +0 -72
- data/lib/skylight/vendor/active_support/per_thread_registry.rb +0 -52
- data/lib/skylight/vendor/thread_safe.rb +0 -126
- data/lib/skylight/vendor/thread_safe/non_concurrent_cache_backend.rb +0 -133
- data/lib/skylight/vendor/thread_safe/synchronized_cache_backend.rb +0 -76
- data/lib/skylight/vm/gc.rb +0 -70
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
module Skylight
|
|
2
|
-
module Probes
|
|
3
|
-
module Sinatra
|
|
4
|
-
class Probe
|
|
5
|
-
def install
|
|
6
|
-
class << ::Sinatra::Base
|
|
7
|
-
alias build_without_sk build
|
|
8
|
-
alias compile_without_sk! compile!
|
|
9
|
-
|
|
10
|
-
def compile!(verb, path, *args, &block)
|
|
11
|
-
compile_without_sk!(verb, path, *args, &block).tap do |_, _, keys_or_wrapper, wrapper|
|
|
12
|
-
wrapper ||= keys_or_wrapper
|
|
13
|
-
|
|
14
|
-
# Deal with the situation where the path is a regex, and the default behavior
|
|
15
|
-
# of Ruby stringification produces an unreadable mess
|
|
16
|
-
if path.is_a?(Regexp)
|
|
17
|
-
human_readable = "<sk-regex>%r{#{path.source}}</sk-regex>"
|
|
18
|
-
wrapper.instance_variable_set(:@route_name, "#{verb} #{human_readable}")
|
|
19
|
-
else
|
|
20
|
-
wrapper.instance_variable_set(:@route_name, "#{verb} #{path}")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Newer versions of Sinatra populate env['sinatra.route']. Polyfill older
|
|
24
|
-
# versions in a targeted but hackish way.
|
|
25
|
-
if ::Sinatra::VERSION < '1.4.0'
|
|
26
|
-
def wrapper.[](app, args)
|
|
27
|
-
app.env['sinatra.route'] = @route_name
|
|
28
|
-
super
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def build(*args, &block)
|
|
35
|
-
self.use Skylight::Middleware
|
|
36
|
-
build_without_sk(*args, &block)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
::Sinatra::Base.class_eval do
|
|
41
|
-
alias dispatch_without_sk! dispatch!
|
|
42
|
-
alias compile_template_without_sk compile_template
|
|
43
|
-
|
|
44
|
-
def dispatch!(*args, &block)
|
|
45
|
-
dispatch_without_sk!(*args, &block).tap do
|
|
46
|
-
instrumenter = Skylight::Instrumenter.instance
|
|
47
|
-
next unless instrumenter
|
|
48
|
-
trace = instrumenter.current_trace
|
|
49
|
-
next unless trace
|
|
50
|
-
|
|
51
|
-
# Set the endpoint name to the route name
|
|
52
|
-
route = env['sinatra.route']
|
|
53
|
-
trace.endpoint = route if route
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def compile_template(engine, data, options, *args, &block)
|
|
58
|
-
# Pass along a useful "virtual path" to Tilt. The Tilt probe will handle
|
|
59
|
-
# instrumenting correctly.
|
|
60
|
-
case data
|
|
61
|
-
when Symbol
|
|
62
|
-
options[:sky_virtual_path] = data.to_s
|
|
63
|
-
else
|
|
64
|
-
options[:sky_virtual_path] = "Inline template (#{engine})"
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
compile_template_without_sk(engine, data, options, *args, &block)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
register(:sinatra, "Sinatra::Base", "sinatra/base", Sinatra::Probe.new)
|
|
75
|
-
end
|
|
76
|
-
end
|
data/lib/skylight/probes/tilt.rb
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Supports 0.2+, though Sinatra doesn't support 2.0, and Rails doesn't work with older versions
|
|
2
|
-
module Skylight
|
|
3
|
-
module Probes
|
|
4
|
-
module Tilt
|
|
5
|
-
class Probe
|
|
6
|
-
def install
|
|
7
|
-
if Gem::Version.new(::Tilt::VERSION) < Gem::Version.new('1.4.1')
|
|
8
|
-
Skylight::DEPRECATOR.deprecation_warning("Support for Tilt versions before 1.4.1")
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
::Tilt::Template.class_eval do
|
|
12
|
-
alias render_without_sk render
|
|
13
|
-
|
|
14
|
-
def render(*args, &block)
|
|
15
|
-
opts = {
|
|
16
|
-
category: "view.render.template",
|
|
17
|
-
title: options[:sky_virtual_path] || "Unknown template name"
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
Skylight.instrument(opts) do
|
|
21
|
-
render_without_sk(*args, &block)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
register(:tilt, "Tilt::Template", "tilt/template", Tilt::Probe.new)
|
|
30
|
-
end
|
|
31
|
-
end
|
data/lib/skylight/subscriber.rb
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
module Skylight
|
|
2
|
-
# @api private
|
|
3
|
-
class Subscriber
|
|
4
|
-
include Util::Logging
|
|
5
|
-
|
|
6
|
-
attr_reader :config
|
|
7
|
-
|
|
8
|
-
def initialize(config, instrumenter)
|
|
9
|
-
@config = config
|
|
10
|
-
@subscriber = nil
|
|
11
|
-
@normalizers = Normalizers.build(config)
|
|
12
|
-
@instrumenter = instrumenter
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def register!
|
|
16
|
-
unregister! if @subscriber
|
|
17
|
-
pattern = ArrayPattern.new(@normalizers.keys)
|
|
18
|
-
@subscriber = ActiveSupport::Notifications.subscribe pattern, self
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def unregister!
|
|
22
|
-
ActiveSupport::Notifications.unsubscribe @subscriber
|
|
23
|
-
@subscriber = nil
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
class ArrayPattern
|
|
27
|
-
|
|
28
|
-
def initialize(keys)
|
|
29
|
-
@keys = Set.new keys
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def ===(item)
|
|
33
|
-
@keys.include?(item)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
# ===== ActiveSupport::Notifications API
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
|
|
44
|
-
class Notification
|
|
45
|
-
attr_reader :name, :span
|
|
46
|
-
|
|
47
|
-
def initialize(name, span)
|
|
48
|
-
@name, @span = name, span
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def start(name, id, payload)
|
|
53
|
-
return if @instrumenter.disabled?
|
|
54
|
-
return unless trace = @instrumenter.current_trace
|
|
55
|
-
|
|
56
|
-
result = normalize(trace, name, payload)
|
|
57
|
-
|
|
58
|
-
unless result == :skip
|
|
59
|
-
case result.size
|
|
60
|
-
when 4
|
|
61
|
-
error "old style normalizer; name=#{name.inspect}; normalizer=#{@normalizers.normalizer_for(name).class}"
|
|
62
|
-
cat, title, desc, _ = result
|
|
63
|
-
when 3
|
|
64
|
-
cat, title, desc = result
|
|
65
|
-
else
|
|
66
|
-
raise "Invalid normalizer result: #{result.inspect}"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
span = trace.instrument(cat, title, desc)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
trace.notifications << Notification.new(name, span)
|
|
73
|
-
rescue Exception => e
|
|
74
|
-
error "Subscriber#start error; msg=%s", e.message
|
|
75
|
-
debug "trace=%s", trace.inspect
|
|
76
|
-
debug "in: name=%s", name.inspect
|
|
77
|
-
debug "in: payload=%s", payload.inspect
|
|
78
|
-
debug "out: cat=%s, title=%s, desc=%s", cat.inspect, name.inspect, desc.inspect
|
|
79
|
-
t { e.backtrace.join("\n") }
|
|
80
|
-
nil
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def finish(name, id, payload)
|
|
84
|
-
return if @instrumenter.disabled?
|
|
85
|
-
return unless trace = @instrumenter.current_trace
|
|
86
|
-
|
|
87
|
-
while curr = trace.notifications.pop
|
|
88
|
-
if curr.name == name
|
|
89
|
-
begin
|
|
90
|
-
normalize_after(trace, curr.span, name, payload)
|
|
91
|
-
ensure
|
|
92
|
-
trace.done(curr.span) if curr.span
|
|
93
|
-
end
|
|
94
|
-
return
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
rescue Exception => e
|
|
99
|
-
error "Subscriber#finish error; msg=%s", e.message
|
|
100
|
-
debug "trace=%s", trace.inspect
|
|
101
|
-
debug "in: name=%s", name.inspect
|
|
102
|
-
debug "in: payload=%s", payload.inspect
|
|
103
|
-
t { e.backtrace.join("\n") }
|
|
104
|
-
nil
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def publish(name, *args)
|
|
108
|
-
# Ignored for now because nothing in rails uses it
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
private
|
|
112
|
-
|
|
113
|
-
def normalize(*args)
|
|
114
|
-
@normalizers.normalize(*args)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def normalize_after(*args)
|
|
118
|
-
@normalizers.normalize_after(*args)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
end
|
|
122
|
-
end
|
data/lib/skylight/user_config.rb
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
require 'yaml'
|
|
2
|
-
|
|
3
|
-
module Skylight
|
|
4
|
-
class UserConfig
|
|
5
|
-
|
|
6
|
-
attr_accessor :disable_dev_warning, :disable_env_warning
|
|
7
|
-
|
|
8
|
-
def initialize(config)
|
|
9
|
-
@config = config
|
|
10
|
-
reload
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def file_path
|
|
14
|
-
return @file_path if @file_path
|
|
15
|
-
|
|
16
|
-
config_path = @config[:user_config_path] || begin
|
|
17
|
-
require "etc"
|
|
18
|
-
home_dir = ENV['HOME'] || Etc.getpwuid.dir || (ENV["USER"] && File.expand_path("~#{ENV['USER']}"))
|
|
19
|
-
if home_dir
|
|
20
|
-
File.join(home_dir, ".skylight")
|
|
21
|
-
else
|
|
22
|
-
raise ConfigError, "The Skylight `user_config_path` must be defined since the home directory cannot be inferred"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
@file_path = File.expand_path(config_path)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def disable_dev_warning?
|
|
30
|
-
disable_dev_warning
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def disable_env_warning?
|
|
34
|
-
disable_env_warning
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def reload
|
|
38
|
-
config = File.exist?(file_path) ? YAML.load_file(file_path) : false
|
|
39
|
-
return unless config
|
|
40
|
-
|
|
41
|
-
self.disable_dev_warning = !!config['disable_dev_warning']
|
|
42
|
-
self.disable_env_warning = !!config['disable_env_warning']
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def save
|
|
46
|
-
FileUtils.mkdir_p(File.dirname(file_path))
|
|
47
|
-
File.open(file_path, 'w') do |f|
|
|
48
|
-
f.puts YAML.dump(to_hash)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def to_hash
|
|
53
|
-
{
|
|
54
|
-
'disable_dev_warning' => disable_dev_warning,
|
|
55
|
-
'disable_env_warning' => disable_env_warning
|
|
56
|
-
}
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
end
|
|
60
|
-
end
|
data/lib/skylight/util.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Skylight
|
|
2
|
-
# @api private
|
|
3
|
-
module Util
|
|
4
|
-
# Used from the main lib
|
|
5
|
-
require 'skylight/util/allocation_free'
|
|
6
|
-
require 'skylight/util/clock'
|
|
7
|
-
require 'skylight/util/deploy'
|
|
8
|
-
require 'skylight/util/hostname'
|
|
9
|
-
require 'skylight/util/logging'
|
|
10
|
-
require 'skylight/util/ssl'
|
|
11
|
-
require 'skylight/util/http'
|
|
12
|
-
|
|
13
|
-
# Used from the CLI
|
|
14
|
-
autoload :Gzip, 'skylight/util/gzip'
|
|
15
|
-
autoload :Inflector, 'skylight/util/inflector'
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module Skylight
|
|
2
|
-
module Util
|
|
3
|
-
# Helpers to reduce memory allocation
|
|
4
|
-
module AllocationFree
|
|
5
|
-
|
|
6
|
-
# Find an item in an array without allocation.
|
|
7
|
-
#
|
|
8
|
-
# @param array [Array] the array to search
|
|
9
|
-
# @yield a block called against each item until a match is found
|
|
10
|
-
# @yieldparam item an item from the array
|
|
11
|
-
# @yieldreturn [Boolean] whether `item` matches the criteria
|
|
12
|
-
# return the found item or nil, if nothing found
|
|
13
|
-
def array_find(array)
|
|
14
|
-
i = 0
|
|
15
|
-
|
|
16
|
-
while i < array.size
|
|
17
|
-
item = array[i]
|
|
18
|
-
return item if yield item
|
|
19
|
-
i += 1
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
nil
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
data/lib/skylight/util/clock.rb
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module Skylight
|
|
2
|
-
module Util
|
|
3
|
-
# A more precise clock
|
|
4
|
-
class Clock
|
|
5
|
-
|
|
6
|
-
if Skylight.native?
|
|
7
|
-
def tick
|
|
8
|
-
native_hrtime
|
|
9
|
-
end
|
|
10
|
-
else
|
|
11
|
-
def tick
|
|
12
|
-
now = Time.now
|
|
13
|
-
now.to_i * 1_000_000_000 + now.usec * 1_000
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# TODO: rename to secs
|
|
18
|
-
def absolute_secs
|
|
19
|
-
Time.now.to_i
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# TODO: remove
|
|
23
|
-
def nanos
|
|
24
|
-
tick
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# TODO: remove
|
|
28
|
-
def secs
|
|
29
|
-
nanos / 1_000_000_000
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def self.absolute_secs
|
|
33
|
-
default.absolute_secs
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def self.nanos
|
|
37
|
-
default.nanos
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def self.secs
|
|
41
|
-
default.secs
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def self.default
|
|
45
|
-
@clock ||= Clock.new
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def self.default=(clock)
|
|
49
|
-
@clock = clock
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
data/lib/skylight/util/deploy.rb
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
require 'json'
|
|
2
|
-
require 'uri'
|
|
3
|
-
require 'skylight/util/logging'
|
|
4
|
-
|
|
5
|
-
module Skylight
|
|
6
|
-
module Util
|
|
7
|
-
|
|
8
|
-
module Deploy
|
|
9
|
-
|
|
10
|
-
def self.build(config)
|
|
11
|
-
DEPLOY_TYPES.each do |type|
|
|
12
|
-
deploy = type.new(config)
|
|
13
|
-
return deploy if deploy.id
|
|
14
|
-
end
|
|
15
|
-
nil
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
class EmptyDeploy
|
|
19
|
-
|
|
20
|
-
attr_reader :config
|
|
21
|
-
attr_reader :timestamp
|
|
22
|
-
|
|
23
|
-
def initialize(config)
|
|
24
|
-
@config = config
|
|
25
|
-
@timestamp = Time.now.to_i
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def id
|
|
29
|
-
git_sha
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def git_sha
|
|
33
|
-
nil
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def description
|
|
37
|
-
nil
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def to_query_string
|
|
41
|
-
URI.encode_www_form(
|
|
42
|
-
timestamp: timestamp,
|
|
43
|
-
deploy_id: id.to_s[0..100], # Keep this sane
|
|
44
|
-
git_sha: git_sha ? git_sha[0..40] : nil, # A valid SHA will never exceed 40
|
|
45
|
-
description: description ? description[0..255] : nil) # Avoid massive descriptions
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
class DefaultDeploy < EmptyDeploy
|
|
51
|
-
include Logging
|
|
52
|
-
|
|
53
|
-
def initialize(*)
|
|
54
|
-
super
|
|
55
|
-
if description && !id
|
|
56
|
-
warn "The configured deploy will be ignored as an id or git_sha must be provided."
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def id
|
|
61
|
-
config.get(:'deploy.id') || git_sha
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def git_sha
|
|
65
|
-
config.get(:'deploy.git_sha')
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def description
|
|
69
|
-
config.get(:'deploy.description')
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
class HerokuDeploy < EmptyDeploy
|
|
75
|
-
|
|
76
|
-
def initialize(*)
|
|
77
|
-
super
|
|
78
|
-
@info = get_info
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def id
|
|
82
|
-
@info ? @info['id'] : nil
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def git_sha
|
|
86
|
-
@info ? @info['commit'] : nil
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def description
|
|
90
|
-
@info ? @info['description'] : nil
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
private
|
|
94
|
-
|
|
95
|
-
def get_info
|
|
96
|
-
info_path = config[:'heroku.dyno_info_path']
|
|
97
|
-
|
|
98
|
-
if File.exist?(info_path)
|
|
99
|
-
if info = JSON.parse(File.read(info_path))
|
|
100
|
-
info['release']
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
class GitDeploy < EmptyDeploy
|
|
108
|
-
|
|
109
|
-
attr_reader :git_sha, :description
|
|
110
|
-
|
|
111
|
-
def initialize(*)
|
|
112
|
-
super
|
|
113
|
-
@git_sha, @description = get_info
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
private
|
|
117
|
-
|
|
118
|
-
def get_info
|
|
119
|
-
Dir.chdir(config.root) do
|
|
120
|
-
info = `git log -1 --pretty="%H %s" 2>&1`
|
|
121
|
-
info.split(" ", 2).map(&:strip) if $?.success?
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
DEPLOY_TYPES = [DefaultDeploy, HerokuDeploy, GitDeploy]
|
|
128
|
-
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
end
|
|
132
|
-
end
|