instana 1.11.5 → 1.13.0
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/.circleci/config.yml +168 -0
- data/Rakefile +26 -37
- data/lib/instana/agent.rb +6 -0
- data/lib/instana/base.rb +2 -0
- data/lib/instana/frameworks/cuba.rb +33 -0
- data/lib/instana/frameworks/instrumentation/action_controller.rb +11 -0
- data/lib/instana/frameworks/roda.rb +41 -0
- data/lib/instana/frameworks/sinatra.rb +17 -0
- data/lib/instana/instrumentation/excon.rb +1 -1
- data/lib/instana/instrumentation/net-http.rb +2 -0
- data/lib/instana/instrumentation/rack.rb +23 -3
- data/lib/instana/instrumentation/redis.rb +39 -33
- data/lib/instana/secrets.rb +42 -0
- data/lib/instana/setup.rb +1 -0
- data/lib/instana/test.rb +4 -3
- data/lib/instana/tracing/span.rb +9 -0
- data/lib/instana/version.rb +1 -1
- data/test/apps/cuba.rb +4 -0
- data/test/apps/roda.rb +3 -0
- data/test/apps/sinatra.rb +4 -0
- data/test/config_test.rb +1 -17
- data/test/frameworks/cuba_test.rb +14 -1
- data/test/frameworks/rack_test.rb +125 -65
- data/test/frameworks/rails/actioncontroller_test.rb +12 -0
- data/test/frameworks/roda_test.rb +14 -0
- data/test/frameworks/sinatra_test.rb +37 -15
- data/test/instrumentation/grpc_test.rb +1 -1
- data/test/instrumentation/resque_test.rb +9 -16
- data/test/jobs/resque_error_job.rb +2 -2
- data/test/jobs/resque_fast_job.rb +2 -2
- data/test/secrets_test.rb +73 -0
- data/test/test_helper.rb +3 -3
- data/test/tracing/tracer_test.rb +31 -1
- metadata +7 -6
- data/.travis.yml +0 -43
- data/test/tracing/trace_test.rb +0 -67
@@ -153,4 +153,16 @@ class ActionControllerTest < Minitest::Test
|
|
153
153
|
assert ac_span.key?(:stack)
|
154
154
|
assert 1, ac_span[:ec]
|
155
155
|
end
|
156
|
+
|
157
|
+
def test_path_template
|
158
|
+
clear_all!
|
159
|
+
|
160
|
+
Net::HTTP.get(URI.parse('http://localhost:3205/test/world'))
|
161
|
+
|
162
|
+
spans = ::Instana.processor.queued_spans
|
163
|
+
rack_span = find_first_span_by_name(spans, :rack)
|
164
|
+
|
165
|
+
assert_equal false, rack_span.key?(:error)
|
166
|
+
assert_equal '/test/world(.:format)', rack_span[:data][:http][:path_tpl]
|
167
|
+
end
|
156
168
|
end
|
@@ -40,5 +40,19 @@ if defined?(::Roda)
|
|
40
40
|
assert first_span[:data][:http].key?(:host)
|
41
41
|
assert_equal "example.org", first_span[:data][:http][:host]
|
42
42
|
end
|
43
|
+
|
44
|
+
def test_path_template
|
45
|
+
clear_all!
|
46
|
+
|
47
|
+
r = get '/greet/instana'
|
48
|
+
assert last_response.ok?
|
49
|
+
|
50
|
+
spans = ::Instana.processor.queued_spans
|
51
|
+
assert_equal 1, spans.count
|
52
|
+
|
53
|
+
first_span = spans.first
|
54
|
+
assert_equal :rack, first_span[:n]
|
55
|
+
assert_equal '/greet/{name}', first_span[:data][:http][:path_tpl]
|
56
|
+
end
|
43
57
|
end
|
44
58
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'sinatra'
|
2
2
|
if defined?(::Sinatra)
|
3
3
|
require 'test_helper'
|
4
4
|
require File.expand_path(File.dirname(__FILE__) + '/../apps/sinatra')
|
@@ -17,28 +17,50 @@ if defined?(::Sinatra)
|
|
17
17
|
r = get '/'
|
18
18
|
assert last_response.ok?
|
19
19
|
|
20
|
-
assert r.headers.key?("X-Instana-T")
|
21
|
-
assert r.headers.key?("X-Instana-S")
|
22
20
|
|
23
21
|
spans = ::Instana.processor.queued_spans
|
24
22
|
assert_equal 1, spans.count
|
25
23
|
|
26
|
-
|
27
|
-
assert_equal :rack,
|
28
|
-
|
29
|
-
assert first_span[:data].key?(:http)
|
24
|
+
rack_span = spans.first
|
25
|
+
assert_equal :rack, rack_span[:n]
|
26
|
+
# ::Instana::Util.pry!
|
30
27
|
|
31
|
-
assert
|
32
|
-
|
28
|
+
assert r.headers.key?("X-Instana-T")
|
29
|
+
assert r.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
|
30
|
+
assert r.headers.key?("X-Instana-S")
|
31
|
+
assert r.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
|
32
|
+
assert r.headers.key?("X-Instana-L")
|
33
|
+
assert r.headers["X-Instana-L"] == '1'
|
34
|
+
assert r.headers.key?("Server-Timing")
|
35
|
+
assert r.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
|
36
|
+
|
37
|
+
assert rack_span.key?(:data)
|
38
|
+
assert rack_span[:data].key?(:http)
|
39
|
+
assert rack_span[:data][:http].key?(:method)
|
40
|
+
assert_equal "GET", rack_span[:data][:http][:method]
|
33
41
|
|
34
|
-
assert
|
35
|
-
assert_equal "/",
|
42
|
+
assert rack_span[:data][:http].key?(:url)
|
43
|
+
assert_equal "/", rack_span[:data][:http][:url]
|
36
44
|
|
37
|
-
assert
|
38
|
-
assert_equal 200,
|
45
|
+
assert rack_span[:data][:http].key?(:status)
|
46
|
+
assert_equal 200, rack_span[:data][:http][:status]
|
39
47
|
|
40
|
-
assert
|
41
|
-
assert_equal "example.org",
|
48
|
+
assert rack_span[:data][:http].key?(:host)
|
49
|
+
assert_equal "example.org", rack_span[:data][:http][:host]
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_path_template
|
53
|
+
clear_all!
|
54
|
+
|
55
|
+
r = get '/greet/instana'
|
56
|
+
assert last_response.ok?
|
57
|
+
|
58
|
+
spans = ::Instana.processor.queued_spans
|
59
|
+
assert_equal 1, spans.count
|
60
|
+
|
61
|
+
first_span = spans.first
|
62
|
+
assert_equal :rack, first_span[:n]
|
63
|
+
assert_equal '/greet/:name', first_span[:data][:http][:path_tpl]
|
42
64
|
end
|
43
65
|
end
|
44
66
|
end
|
@@ -5,8 +5,8 @@ require 'resque'
|
|
5
5
|
|
6
6
|
if ENV.key?('REDIS_URL')
|
7
7
|
::Resque.redis = ENV['REDIS_URL']
|
8
|
-
elsif ENV.key?('
|
9
|
-
::Resque.redis = ENV['
|
8
|
+
elsif ENV.key?('REDIS_URL')
|
9
|
+
::Resque.redis = ENV['REDIS_URL']
|
10
10
|
else
|
11
11
|
::Resque.redis = 'localhost:6379'
|
12
12
|
end
|
@@ -23,16 +23,15 @@ class ResqueClientTest < Minitest::Test
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_enqueue
|
26
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test') do
|
26
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
27
27
|
::Resque.enqueue(FastJob)
|
28
28
|
end
|
29
29
|
|
30
30
|
spans = ::Instana.processor.queued_spans
|
31
|
-
assert_equal
|
31
|
+
assert_equal 2, spans.length
|
32
32
|
|
33
33
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
34
34
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
35
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
36
35
|
|
37
36
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
38
37
|
|
@@ -40,48 +39,42 @@ class ResqueClientTest < Minitest::Test
|
|
40
39
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
41
40
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
42
41
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
43
|
-
|
44
|
-
assert_equal :redis, redis_span[:n]
|
45
42
|
end
|
46
43
|
|
47
44
|
def test_enqueue_to
|
48
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test') do
|
45
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test') do
|
49
46
|
::Resque.enqueue_to(:critical, FastJob)
|
50
47
|
end
|
51
48
|
|
52
49
|
spans = ::Instana.processor.queued_spans
|
53
|
-
assert_equal
|
50
|
+
assert_equal 2, spans.length
|
54
51
|
|
55
52
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
56
53
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
57
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
58
54
|
|
59
55
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
60
56
|
assert_equal :"resque-client", resque_span[:n]
|
61
57
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
62
58
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
63
59
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
64
|
-
assert_equal :redis, redis_span[:n]
|
65
60
|
end
|
66
61
|
|
67
62
|
def test_dequeue
|
68
|
-
::Instana.tracer.start_or_continue_trace('resque-client_test', '', {}) do
|
63
|
+
::Instana.tracer.start_or_continue_trace(:'resque-client_test', '', {}) do
|
69
64
|
::Resque.dequeue(FastJob, { :generate => :farfalla })
|
70
65
|
end
|
71
66
|
|
72
67
|
spans = ::Instana.processor.queued_spans
|
73
|
-
assert_equal
|
68
|
+
assert_equal 2, spans.length
|
74
69
|
|
75
70
|
sdk_span = find_first_span_by_name(spans, :'resque-client_test')
|
76
71
|
resque_span = find_first_span_by_name(spans, :'resque-client')
|
77
|
-
redis_span = find_first_span_by_name(spans, :redis)
|
78
72
|
|
79
73
|
assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
|
80
|
-
assert_equal :"resque-client",
|
74
|
+
assert_equal :"resque-client", resque_span[:n]
|
81
75
|
assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
|
82
76
|
assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
|
83
77
|
assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
|
84
|
-
assert_equal :redis, redis_span[:n]
|
85
78
|
end
|
86
79
|
|
87
80
|
def test_worker_job
|
@@ -7,8 +7,8 @@ class ErrorJob
|
|
7
7
|
def self.perform
|
8
8
|
if ENV.key?('REDIS_URL')
|
9
9
|
redis = Redis.new(:url => ENV['REDIS_URL'])
|
10
|
-
elsif ENV.key?('
|
11
|
-
redis = Redis.new(:url => ENV['
|
10
|
+
elsif ENV.key?('REDIS_URL')
|
11
|
+
redis = Redis.new(:url => ENV['REDIS_URL'])
|
12
12
|
else
|
13
13
|
redis = Redis.new(:url => 'localhost:6379')
|
14
14
|
end
|
@@ -7,8 +7,8 @@ class FastJob
|
|
7
7
|
def self.perform
|
8
8
|
if ENV.key?('REDIS_URL')
|
9
9
|
redis = Redis.new(:url => ENV['REDIS_URL'])
|
10
|
-
elsif ENV.key?('
|
11
|
-
redis = Redis.new(:url => ENV['
|
10
|
+
elsif ENV.key?('REDIS_URL')
|
11
|
+
redis = Redis.new(:url => ENV['REDIS_URL'])
|
12
12
|
else
|
13
13
|
redis = Redis.new(:url => 'redis://localhost:6379')
|
14
14
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SecretsTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@subject = Instana::Secrets.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_equals_ignore_case
|
9
|
+
sample_config = {
|
10
|
+
"matcher"=>"equals-ignore-case",
|
11
|
+
"list"=>["key"]
|
12
|
+
}
|
13
|
+
|
14
|
+
url = url_for(%w(key Str kEy KEY))
|
15
|
+
assert_redacted @subject.remove_from_query(url, sample_config), %w(key kEy KEY)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_equals
|
19
|
+
sample_config = {
|
20
|
+
"matcher"=>"equals",
|
21
|
+
"list"=>["key", "kEy"]
|
22
|
+
}
|
23
|
+
|
24
|
+
url = url_for(%w(key Str kEy KEY))
|
25
|
+
assert_redacted @subject.remove_from_query(url, sample_config), %w(key kEy)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_contains_ignore_case
|
29
|
+
sample_config = {
|
30
|
+
"matcher"=>"contains-ignore-case",
|
31
|
+
"list"=>["stan"]
|
32
|
+
}
|
33
|
+
|
34
|
+
url = url_for(%w(instantiate conTESTant sample))
|
35
|
+
assert_redacted @subject.remove_from_query(url, sample_config), %w(instantiate conTESTant)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_contains
|
39
|
+
sample_config = {
|
40
|
+
"matcher"=>"contains",
|
41
|
+
"list"=>["stan"]
|
42
|
+
}
|
43
|
+
|
44
|
+
url = url_for(%w(instantiate conTESTant sample))
|
45
|
+
assert_redacted @subject.remove_from_query(url, sample_config), %w(instantiate)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_regexp
|
50
|
+
sample_config = {
|
51
|
+
"matcher"=>"regex",
|
52
|
+
"list"=>["l{2}"]
|
53
|
+
}
|
54
|
+
|
55
|
+
url = url_for(%w(ball foot move))
|
56
|
+
assert_redacted @subject.remove_from_query(url, sample_config), %w(ball)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def url_for(keys)
|
62
|
+
url = URI('http://example.com')
|
63
|
+
url.query = URI.encode_www_form(keys.map { |k| [k, rand(1..100)]})
|
64
|
+
url.to_s
|
65
|
+
end
|
66
|
+
|
67
|
+
def assert_redacted(str, keys)
|
68
|
+
url = URI(str)
|
69
|
+
params = CGI.parse(url.query)
|
70
|
+
|
71
|
+
assert_equal keys, params.select { |_, v| v == %w(<redacted>) }.keys, 'to be redacted'
|
72
|
+
end
|
73
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -39,17 +39,17 @@ when /libraries/
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
ENV['
|
42
|
+
ENV['REDIS_URL'] ||= 'redis://127.0.0.1:6379'
|
43
43
|
|
44
44
|
# Configure redis for sidekiq client
|
45
45
|
Sidekiq.configure_client do |config|
|
46
|
-
config.redis = { url: ENV['
|
46
|
+
config.redis = { url: ENV['REDIS_URL'] }
|
47
47
|
end
|
48
48
|
|
49
49
|
# Configure redis for sidekiq worker
|
50
50
|
$sidekiq_mode = :server
|
51
51
|
::Sidekiq.configure_server do |config|
|
52
|
-
config.redis = { url: ENV['
|
52
|
+
config.redis = { url: ENV['REDIS_URL'] }
|
53
53
|
end
|
54
54
|
$sidekiq_mode = :client
|
55
55
|
|
data/test/tracing/tracer_test.rb
CHANGED
@@ -46,6 +46,37 @@ class TracerTest < Minitest::Test
|
|
46
46
|
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
47
47
|
end
|
48
48
|
|
49
|
+
def test_exotic_tag_types
|
50
|
+
clear_all!
|
51
|
+
|
52
|
+
assert_equal false, ::Instana.tracer.tracing?
|
53
|
+
|
54
|
+
require 'resolv'
|
55
|
+
r = Resolv::DNS.new
|
56
|
+
ipv4 = r.getaddress("www.pwpush.com")
|
57
|
+
|
58
|
+
::Instana.tracer.start_or_continue_trace(:rack, {:ipaddr => ipv4}) do
|
59
|
+
assert_equal true, ::Instana.tracer.tracing?
|
60
|
+
sleep 0.1
|
61
|
+
end
|
62
|
+
|
63
|
+
spans = ::Instana.processor.queued_spans
|
64
|
+
assert_equal 1, spans.length
|
65
|
+
|
66
|
+
first_span = spans.first
|
67
|
+
assert_equal :rack, first_span[:n]
|
68
|
+
assert first_span[:ts].is_a?(Integer)
|
69
|
+
assert first_span[:d].is_a?(Integer)
|
70
|
+
assert first_span[:d].between?(100, 130)
|
71
|
+
assert first_span.key?(:data)
|
72
|
+
assert first_span[:data].key?(:ipaddr)
|
73
|
+
assert first_span[:data][:ipaddr].is_a?(String)
|
74
|
+
assert first_span.key?(:f)
|
75
|
+
assert first_span[:f].key?(:e)
|
76
|
+
assert first_span[:f].key?(:h)
|
77
|
+
assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
|
78
|
+
end
|
79
|
+
|
49
80
|
def test_errors_are_properly_propagated
|
50
81
|
clear_all!
|
51
82
|
exception_raised = false
|
@@ -198,7 +229,6 @@ class TracerTest < Minitest::Test
|
|
198
229
|
assert_equal sdk_span[:k], 3
|
199
230
|
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_info], 1
|
200
231
|
assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_exit_info], 1
|
201
|
-
|
202
232
|
end
|
203
233
|
|
204
234
|
def test_block_tracing_error_capture
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Giacomo Lombardo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -173,11 +173,11 @@ executables: []
|
|
173
173
|
extensions: []
|
174
174
|
extra_rdoc_files: []
|
175
175
|
files:
|
176
|
+
- ".circleci/config.yml"
|
176
177
|
- ".codeclimate.yml"
|
177
178
|
- ".fasterer.yml"
|
178
179
|
- ".gitignore"
|
179
180
|
- ".rubocop.yml"
|
180
|
-
- ".travis.yml"
|
181
181
|
- Dockerfile
|
182
182
|
- Gemfile
|
183
183
|
- LICENSE
|
@@ -242,6 +242,7 @@ files:
|
|
242
242
|
- lib/instana/opentracing/carrier.rb
|
243
243
|
- lib/instana/opentracing/tracer.rb
|
244
244
|
- lib/instana/rack.rb
|
245
|
+
- lib/instana/secrets.rb
|
245
246
|
- lib/instana/setup.rb
|
246
247
|
- lib/instana/test.rb
|
247
248
|
- lib/instana/thread_local.rb
|
@@ -287,6 +288,7 @@ files:
|
|
287
288
|
- test/jobs/sidekiq_job_2.rb
|
288
289
|
- test/models/block.rb
|
289
290
|
- test/models/block6.rb
|
291
|
+
- test/secrets_test.rb
|
290
292
|
- test/servers/grpc_50051.rb
|
291
293
|
- test/servers/helpers/sidekiq_worker_initializer.rb
|
292
294
|
- test/servers/rackapp_6511.rb
|
@@ -296,7 +298,6 @@ files:
|
|
296
298
|
- test/tracing/custom_test.rb
|
297
299
|
- test/tracing/id_management_test.rb
|
298
300
|
- test/tracing/opentracing_test.rb
|
299
|
-
- test/tracing/trace_test.rb
|
300
301
|
- test/tracing/tracer_async_test.rb
|
301
302
|
- test/tracing/tracer_test.rb
|
302
303
|
homepage: https://www.instana.com/
|
@@ -322,7 +323,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
322
323
|
- !ruby/object:Gem::Version
|
323
324
|
version: '0'
|
324
325
|
requirements: []
|
325
|
-
rubygems_version: 3.
|
326
|
+
rubygems_version: 3.1.4
|
326
327
|
signing_key:
|
327
328
|
specification_version: 4
|
328
329
|
summary: Ruby Distributed Tracing & Metrics Sensor for Instana
|
@@ -332,11 +333,11 @@ test_files:
|
|
332
333
|
- test/tracing/tracer_test.rb
|
333
334
|
- test/tracing/custom_test.rb
|
334
335
|
- test/tracing/opentracing_test.rb
|
335
|
-
- test/tracing/trace_test.rb
|
336
336
|
- test/tracing/tracer_async_test.rb
|
337
337
|
- test/agent/agent_test.rb
|
338
338
|
- test/models/block.rb
|
339
339
|
- test/models/block6.rb
|
340
|
+
- test/secrets_test.rb
|
340
341
|
- test/instrumentation/sidekiq-client_test.rb
|
341
342
|
- test/instrumentation/resque_test.rb
|
342
343
|
- test/instrumentation/sidekiq-worker_test.rb
|
data/.travis.yml
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
|
3
|
-
cache:
|
4
|
-
bundler: true
|
5
|
-
directories:
|
6
|
-
- vendor/bundle
|
7
|
-
|
8
|
-
rvm:
|
9
|
-
- 2.6
|
10
|
-
- 2.4
|
11
|
-
|
12
|
-
before_install:
|
13
|
-
- gem update --system
|
14
|
-
- gem install bundler
|
15
|
-
- gem --version
|
16
|
-
|
17
|
-
before_script:
|
18
|
-
- psql -c 'create database travis_ci_test;' -U postgres
|
19
|
-
- mysql -e 'CREATE DATABASE travis_ci_test;'
|
20
|
-
|
21
|
-
script: "bundle exec rake test"
|
22
|
-
|
23
|
-
services:
|
24
|
-
- memcached
|
25
|
-
- redis
|
26
|
-
- mysql
|
27
|
-
- postgresql
|
28
|
-
|
29
|
-
gemfile:
|
30
|
-
- Gemfile
|
31
|
-
- gemfiles/libraries.gemfile
|
32
|
-
- gemfiles/rails50.gemfile
|
33
|
-
- gemfiles/rails60.gemfile
|
34
|
-
|
35
|
-
matrix:
|
36
|
-
exclude:
|
37
|
-
- rvm: 2.4
|
38
|
-
gemfile: gemfiles/rails60.gemfile
|
39
|
-
|
40
|
-
notifications:
|
41
|
-
slack:
|
42
|
-
rooms:
|
43
|
-
secure: Ae9tJmBO9/sgYWthHRS5uufAf8s6uIMdtmQn+gBkcAXaMWJgt1IAzpIj98Qsg15/lhHS8ezwCe7WIAWC4mM1cnwl/hP195dbgLzF4D2uOjaIXj55ckIIE06jBX1yHapu0vMFSaKwgL4auEEVg4xkehBb9TzLNG/LbExadZQOIkeLdtgU04VrPfDC9pZWPplXT4kzjMZkMESzBYaCfNl6eenu0sHdoxSvngv52MImog6aZQKT+k3ccAa1yzZNhUdy4gSZi1HafXdSCn4UTPDtkNIlsWBW8yprICLxZV/NvgUTEEJYSHO6Ucx9Er22LzKtNbEYlAs1GErGWjDzpqvvXt/5UwNx0rLDrVKI/xMIELEbT047mSgJ8tpVd0ErGA/bnDfbF2oDFTAEXq4jaeAMaVR9Q1CW0ZZF2Jh5jOKc41U+AVGgaMDaBA0ukDSeXvJcnteZ9EllOO8ZAtC2FKtBNnj36W13KTR0TkjMCl+KOiVJXnOyRJIR+CUL9BdDuODBVPZHqZaZ48N+MOG9dRb+fvkdTnwh7hU+UmR08kOsd4x+dDlm4dBrFrB8v8udQ7XuBN9AOZty2CPWFUSJM1BxtetyS3We0L6lQ8o/B9STFNK4KTa/M8wNq1Fm85h3ZKHHIHDpQnXM6vD8SV1p9u91C5UI8rEyxzW5IaT2oqXsCzU=
|