departure 6.3.0 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d491f83699ed0a2a2932822f624162223ba8a3b74c018a56fd352a00378f3368
4
- data.tar.gz: 6b6b6f192dab28cc61431e20bc7b0a35ecd76ab36a56edf5a0a59c42ae893e37
3
+ metadata.gz: 8e9b07d68819910b4f867268d8680b65677e6c11fe91b7f5c2f3a4b62cee627a
4
+ data.tar.gz: daf4792210ea603d0732fae6daebe97fcbea253960067d800495b49b6c2aa866
5
5
  SHA512:
6
- metadata.gz: 106fa1f8b21f7ab468d6774147352bb2b631398c04df2eb60b664ae520ea44dd91f76fc084ec0215ab722369ad59b3047d9ff6009767329bf26da708f50e60af
7
- data.tar.gz: 66396ee515d0a69e65eb8e39dce53d4eec89a5419886b3482f1b4276be1480cb08adf452585f09f7da48b4683e9f87a1d0b4311c6f9ab05a5801577052feb5cf
6
+ metadata.gz: 1ba37179c249db07bc0770288ff6103ee4502846488319356bb2aad94738dd5727c42fea899e97aaccb974d5e0bd6f06d475ee0f922d460ec0cc2a2a0ad95f4b
7
+ data.tar.gz: 9c5acbc1f3b3064341f371e584c3e3da4f326d9f3bfc9a32d844dccdd12bf50c4c6c4519c5742f086fbb4261e252fc31fa6c5cf5777f1d028da4e4798d127aa8
@@ -0,0 +1,45 @@
1
+ name: Test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ ruby:
11
+ - 2.5
12
+ - 2.6
13
+ - 2.7
14
+ rails:
15
+ - 5.2.0
16
+ - 6.0.0
17
+ - 6.1.0
18
+ include:
19
+ - ruby: 2.4
20
+ rails: 5.2.0
21
+ - ruby: 2.7
22
+ rails: 7.0.1
23
+ - ruby: 3.0
24
+ rails: 6.1.0
25
+ env:
26
+ PERCONA_DB_USER: root
27
+ PERCONA_DB_PASSWORD: root
28
+ RAILS_VERSION: "~> ${{ matrix.rails }}"
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v2
32
+ - uses: ruby/setup-ruby@v1
33
+ with:
34
+ ruby-version: ${{ matrix.ruby }}
35
+ bundler-cache: true
36
+ - name: "Add Percona GPG key"
37
+ run: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 9334A25F8507EFA5
38
+ - name: "Add Percona APT repository"
39
+ run: echo "deb http://repo.percona.com/apt `lsb_release -cs` main" | sudo tee -a /etc/apt/sources.list
40
+ - run: sudo apt-get update -qq
41
+ - run: sudo apt-get install percona-toolkit
42
+ - name: Start MySQL server
43
+ run: sudo systemctl start mysql.service
44
+ - run: bin/setup
45
+ - run: bundle exec rake
data/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  tags
12
12
  departure_error.log
13
13
  .ruby-version
14
+ .idea/
data/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ Please follow the format in [Keep a Changelog](http://keepachangelog.com/)
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.4.0] - 2020-06-23
10
+
11
+ - Support for ActiveRecord 6.1.4
12
+ - Relax mysql2 requirement to allow mysql2 0.5.4
13
+ - Support Rails 6' #upsert_all
14
+
15
+ ## [6.3.0] - 2020-06-23
16
+
17
+ - Support for ActiveRecord 6.1
18
+
9
19
  ## [6.2.0] - 2020-06-23
10
20
 
11
21
  ### Added
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Departure [![Build Status](https://travis-ci.org/departurerb/departure.svg?branch=master)](https://travis-ci.org/departurerb/departure) [![Code Climate](https://codeclimate.com/github/departurerb/departure/badges/gpa.svg)](https://codeclimate.com/github/departurerb/departure) ![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/departurerb/departure/latest/master?style=plastic)
1
+ # Departure
2
+
3
+ ![Build Status](https://img.shields.io/travis/departurerb/departure?style=for-the-badge) ![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/departurerb/departure?style=for-the-badge) ![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/departurerb/departure/latest/master?style=for-the-badge)
2
4
 
3
5
  Departure is an **ActiveRecord connection adapter** that allows running
4
6
  **MySQL online and non-blocking DDL** through `ActiveRecord::Migration` without needing
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'bundler/setup'
4
- require 'percona_migrator'
4
+ require 'departure'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
data/departure.gemspec CHANGED
@@ -7,7 +7,7 @@ require 'departure/version'
7
7
 
8
8
  # This environment variable is set on CI to facilitate testing with multiple
9
9
  # versions of Rails.
10
- RAILS_DEPENDENCY_VERSION = ENV.fetch('RAILS_VERSION', ['>= 5.2.0', '<= 6.1'])
10
+ RAILS_DEPENDENCY_VERSION = ENV.fetch('RAILS_VERSION', ['>= 5.2.0', '!= 7.0.0', '< 7.1'])
11
11
 
12
12
  Gem::Specification.new do |spec|
13
13
  spec.name = 'departure'
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_runtime_dependency 'railties', *Array(RAILS_DEPENDENCY_VERSION)
27
27
  spec.add_runtime_dependency 'activerecord', *Array(RAILS_DEPENDENCY_VERSION)
28
- spec.add_runtime_dependency 'mysql2', '>= 0.4.0', '<= 0.5.3'
28
+ spec.add_runtime_dependency 'mysql2', '>= 0.4.0', '<= 0.5.4'
29
29
 
30
- spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rake', '>= 10.0'
31
31
  spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
32
32
  spec.add_development_dependency 'rspec-its', '~> 1.2'
33
33
  spec.add_development_dependency 'pry-byebug'
@@ -32,7 +32,7 @@ module ForAlterStatements
32
32
  }.merge(options)
33
33
 
34
34
  td = create_table_definition(table_name)
35
- cd = td.new_column_definition(column.name, type, options)
35
+ cd = td.new_column_definition(column.name, type, **options)
36
36
  schema_creation.accept(ActiveRecord::ConnectionAdapters::ChangeColumnDefinition.new(cd, column.name))
37
37
  end
38
38
 
@@ -47,20 +47,26 @@ module ForAlterStatements
47
47
  columns_sql = "SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE #{quote(column_name)}"
48
48
  current_type = exec_query(columns_sql, 'SCHEMA').first['Type']
49
49
  td = create_table_definition(table_name)
50
- cd = td.new_column_definition(new_column_name, current_type, options)
50
+ cd = td.new_column_definition(new_column_name, current_type, **options)
51
51
  schema_creation.accept(ActiveRecord::ConnectionAdapters::ChangeColumnDefinition.new(cd, column.name))
52
52
  end
53
53
 
54
54
  def add_index_for_alter(table_name, column_name, options = {})
55
- index_name, index_type, index_columns, _,
56
- index_algorithm, index_using = add_index_options(table_name, column_name, options)
55
+ if ActiveRecord::VERSION::STRING >= '6.1'
56
+ index_definition, = add_index_options(table_name, column_name, **options)
57
57
 
58
- index_algorithm[0, 0] = ', ' if index_algorithm.present?
59
- "ADD #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_algorithm}"
58
+ "ADD #{schema_creation.accept(index_definition)}"
59
+ else
60
+ index_name, index_type, index_columns, _,
61
+ index_algorithm, index_using = add_index_options(table_name, column_name, **options)
62
+ index_algorithm[0, 0] = ', ' if index_algorithm.present?
63
+
64
+ "ADD #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_algorithm}"
65
+ end
60
66
  end
61
67
 
62
- def remove_index_for_alter(table_name, options = {})
63
- index_name = index_name_for_remove(table_name, options)
68
+ def remove_index_for_alter(table_name, column_name, options = {})
69
+ index_name = index_name_for_remove(table_name, column_name, options)
64
70
  "DROP INDEX #{quote_column_name(index_name)}"
65
71
  end
66
72
 
@@ -77,7 +83,7 @@ module ForAlterStatements
77
83
 
78
84
  def add_column_for_alter(table_name, column_name, type, options = {})
79
85
  td = create_table_definition(table_name)
80
- cd = td.new_column_definition(column_name, type, options)
86
+ cd = td.new_column_definition(column_name, type, **options)
81
87
  schema_creation.accept(ActiveRecord::ConnectionAdapters::AddColumnDefinition.new(cd))
82
88
  end
83
89
 
@@ -85,7 +91,7 @@ module ForAlterStatements
85
91
  "DROP COLUMN #{quote_column_name(column_name)}"
86
92
  end
87
93
 
88
- def remove_columns_for_alter(table_name, *column_names)
94
+ def remove_columns_for_alter(table_name, *column_names, **options)
89
95
  column_names.map { |column_name| remove_column_for_alter(table_name, column_name) }
90
96
  end
91
97
  end
@@ -1,6 +1,7 @@
1
1
  require 'active_record/connection_adapters/abstract_mysql_adapter'
2
2
  require 'active_record/connection_adapters/statement_pool'
3
3
  require 'active_record/connection_adapters/mysql2_adapter'
4
+ require 'active_support/core_ext/string/filters'
4
5
  require 'departure'
5
6
  require 'forwardable'
6
7
 
@@ -69,7 +70,7 @@ module ActiveRecord
69
70
 
70
71
  ADAPTER_NAME = 'Percona'.freeze
71
72
 
72
- def_delegators :mysql_adapter, :last_inserted_id, :each_hash, :set_field_encoding
73
+ def_delegators :mysql_adapter, :each_hash, :set_field_encoding
73
74
 
74
75
  def initialize(connection, _logger, connection_options, _config)
75
76
  @mysql_adapter = connection_options[:mysql_adapter]
@@ -93,9 +94,10 @@ module ActiveRecord
93
94
  execute(to_sql(sql, binds), name)
94
95
  end
95
96
 
96
- def exec_query(sql, name = 'SQL', _binds = [])
97
+ def exec_query(sql, name = 'SQL', _binds = [], **_kwargs)
97
98
  result = execute(sql, name)
98
- ActiveRecord::Result.new(result.fields, result.to_a)
99
+ fields = result.fields if defined?(result.fields)
100
+ ActiveRecord::Result.new(fields, result.to_a)
99
101
  end
100
102
 
101
103
  # Executes a SELECT query and returns an array of rows. Each row is an
@@ -107,8 +109,8 @@ module ActiveRecord
107
109
 
108
110
  # Executes a SELECT query and returns an array of record hashes with the
109
111
  # column names as keys and column values as values.
110
- def select(sql, name = nil, binds = [])
111
- exec_query(sql, name, binds)
112
+ def select(sql, name = nil, binds = [], **kwargs)
113
+ exec_query(sql, name, binds, **kwargs)
112
114
  end
113
115
 
114
116
  # Returns true, as this adapter supports migrations
@@ -129,12 +131,18 @@ module ActiveRecord
129
131
  # @param options [Hash] optional
130
132
  def add_index(table_name, column_name, options = {})
131
133
  if ActiveRecord::VERSION::STRING >= '6.1'
132
- index, algorithm, if_not_exists = add_index_options(table_name, column_name, options)
133
- create_index = CreateIndexDefinition.new(index, algorithm, if_not_exists)
134
- execute schema_creation.accept(create_index)
134
+ index_definition, = add_index_options(table_name, column_name, **options)
135
+ execute <<-SQL.squish
136
+ ALTER TABLE #{quote_table_name(index_definition.table)}
137
+ ADD #{schema_creation.accept(index_definition)}
138
+ SQL
135
139
  else
136
- index_name, index_type, index_columns, index_options = add_index_options(table_name, column_name, options)
137
- execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{index_type} INDEX #{quote_column_name(index_name)} (#{index_columns})#{index_options}" # rubocop:disable Metrics/LineLength
140
+ index_name, index_type, index_columns, index_options = add_index_options(table_name, column_name, **options)
141
+ execute <<-SQL.squish
142
+ ALTER TABLE #{quote_table_name(table_name)}
143
+ ADD #{index_type} INDEX
144
+ #{quote_column_name(index_name)} (#{index_columns})#{index_options}
145
+ SQL
138
146
  end
139
147
  end
140
148
 
@@ -142,14 +150,14 @@ module ActiveRecord
142
150
  #
143
151
  # @param table_name [String, Symbol]
144
152
  # @param options [Hash] optional
145
- def remove_index(table_name, *args, **options)
146
- column_name = args.first
147
- if column_name
153
+ def remove_index(table_name, column_name = nil, **options)
154
+ if ActiveRecord::VERSION::STRING >= '6.1'
148
155
  return if options[:if_exists] && !index_exists?(table_name, column_name, **options)
149
- index_name = index_name_for_remove(table_name, column_name, **options)
156
+ index_name = index_name_for_remove(table_name, column_name, options)
150
157
  else
151
158
  index_name = index_name_for_remove(table_name, options)
152
159
  end
160
+
153
161
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP INDEX #{quote_column_name(index_name)}"
154
162
  end
155
163
 
@@ -181,6 +189,10 @@ module ActiveRecord
181
189
  mysql_adapter.raw_connection.server_info[:version]
182
190
  end
183
191
 
192
+ def last_inserted_id(result)
193
+ mysql_adapter.send(:last_inserted_id, result)
194
+ end
195
+
184
196
  private
185
197
 
186
198
  attr_reader :mysql_adapter
@@ -8,10 +8,11 @@ module Departure
8
8
  # @param command_line [String]
9
9
  # @param error_log_path [String]
10
10
  # @param logger [#write_no_newline]
11
- def initialize(command_line, error_log_path, logger)
11
+ def initialize(command_line, error_log_path, logger, redirect_stderr)
12
12
  @command_line = command_line
13
13
  @error_log_path = error_log_path
14
14
  @logger = logger
15
+ @redirect_stderr = redirect_stderr
15
16
  end
16
17
 
17
18
  # Executes the command returning its status. It also prints its stdout to
@@ -35,7 +36,7 @@ module Departure
35
36
 
36
37
  private
37
38
 
38
- attr_reader :command_line, :error_log_path, :logger, :status
39
+ attr_reader :command_line, :error_log_path, :logger, :status, :redirect_stderr
39
40
 
40
41
  # Runs the command in a separate process, capturing its stdout and
41
42
  # execution status
@@ -56,11 +57,15 @@ module Departure
56
57
  end
57
58
 
58
59
  # Builds the actual command including stderr redirection to the specified
59
- # log file
60
+ # log file or stdout
60
61
  #
61
62
  # @return [String]
62
63
  def full_command
63
- "#{command_line} 2> #{error_log_path}"
64
+ if redirect_stderr
65
+ "#{command_line} 2> #{error_log_path}"
66
+ else
67
+ "#{command_line} 2>&1"
68
+ end
64
69
  end
65
70
 
66
71
  # Validates the status of the execution
@@ -1,12 +1,13 @@
1
1
  module Departure
2
2
  class Configuration
3
- attr_accessor :tmp_path, :global_percona_args, :enabled_by_default
3
+ attr_accessor :tmp_path, :global_percona_args, :enabled_by_default, :redirect_stderr
4
4
 
5
5
  def initialize
6
6
  @tmp_path = '.'.freeze
7
7
  @error_log_filename = 'departure_error.log'.freeze
8
8
  @global_percona_args = nil
9
9
  @enabled_by_default = true
10
+ @redirect_stderr = true
10
11
  end
11
12
 
12
13
  def error_log_path
@@ -6,4 +6,6 @@ module Departure
6
6
  end
7
7
  end
8
8
  end
9
+
10
+ class OriginalAdapterConnection < ConnectionBase; end
9
11
  end
@@ -81,7 +81,7 @@ module Departure
81
81
  # enabled in a previous migration.
82
82
  def reconnect_without_percona
83
83
  return unless connection_config[:adapter] == 'percona'
84
- Departure::ConnectionBase.establish_connection(connection_config.merge(adapter: original_adapter))
84
+ Departure::OriginalAdapterConnection.establish_connection(connection_config.merge(adapter: original_adapter))
85
85
  end
86
86
 
87
87
  private
@@ -15,6 +15,7 @@ module Departure
15
15
  @cli_generator = cli_generator
16
16
  @mysql_adapter = mysql_adapter
17
17
  @error_log_path = config.error_log_path
18
+ @redirect_stderr = config.redirect_stderr
18
19
  end
19
20
 
20
21
  # Executes the passed sql statement using pt-online-schema-change for ALTER
@@ -44,12 +45,12 @@ module Departure
44
45
  # @param command_line [String]
45
46
  # @return [Boolean]
46
47
  def execute(command_line)
47
- Command.new(command_line, error_log_path, logger).run
48
+ Command.new(command_line, error_log_path, logger, redirect_stderr).run
48
49
  end
49
50
 
50
51
  private
51
52
 
52
- attr_reader :logger, :cli_generator, :mysql_adapter, :error_log_path
53
+ attr_reader :logger, :cli_generator, :mysql_adapter, :error_log_path, :redirect_stderr
53
54
 
54
55
  # Checks whether the sql statement is an ALTER TABLE
55
56
  #
@@ -1,3 +1,3 @@
1
1
  module Departure
2
- VERSION = '6.3.0'.freeze
2
+ VERSION = '6.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: departure
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.3.0
4
+ version: 6.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Zayats
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2021-03-17 00:00:00.000000000 Z
18
+ date: 2022-08-04 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: railties
@@ -24,9 +24,12 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.2.0
27
- - - "<="
27
+ - - "!="
28
+ - !ruby/object:Gem::Version
29
+ version: 7.0.0
30
+ - - "<"
28
31
  - !ruby/object:Gem::Version
29
- version: '6.1'
32
+ version: '7.1'
30
33
  type: :runtime
31
34
  prerelease: false
32
35
  version_requirements: !ruby/object:Gem::Requirement
@@ -34,9 +37,12 @@ dependencies:
34
37
  - - ">="
35
38
  - !ruby/object:Gem::Version
36
39
  version: 5.2.0
37
- - - "<="
40
+ - - "!="
38
41
  - !ruby/object:Gem::Version
39
- version: '6.1'
42
+ version: 7.0.0
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '7.1'
40
46
  - !ruby/object:Gem::Dependency
41
47
  name: activerecord
42
48
  requirement: !ruby/object:Gem::Requirement
@@ -44,9 +50,12 @@ dependencies:
44
50
  - - ">="
45
51
  - !ruby/object:Gem::Version
46
52
  version: 5.2.0
47
- - - "<="
53
+ - - "!="
54
+ - !ruby/object:Gem::Version
55
+ version: 7.0.0
56
+ - - "<"
48
57
  - !ruby/object:Gem::Version
49
- version: '6.1'
58
+ version: '7.1'
50
59
  type: :runtime
51
60
  prerelease: false
52
61
  version_requirements: !ruby/object:Gem::Requirement
@@ -54,9 +63,12 @@ dependencies:
54
63
  - - ">="
55
64
  - !ruby/object:Gem::Version
56
65
  version: 5.2.0
57
- - - "<="
66
+ - - "!="
67
+ - !ruby/object:Gem::Version
68
+ version: 7.0.0
69
+ - - "<"
58
70
  - !ruby/object:Gem::Version
59
- version: '6.1'
71
+ version: '7.1'
60
72
  - !ruby/object:Gem::Dependency
61
73
  name: mysql2
62
74
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +78,7 @@ dependencies:
66
78
  version: 0.4.0
67
79
  - - "<="
68
80
  - !ruby/object:Gem::Version
69
- version: 0.5.3
81
+ version: 0.5.4
70
82
  type: :runtime
71
83
  prerelease: false
72
84
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,19 +88,19 @@ dependencies:
76
88
  version: 0.4.0
77
89
  - - "<="
78
90
  - !ruby/object:Gem::Version
79
- version: 0.5.3
91
+ version: 0.5.4
80
92
  - !ruby/object:Gem::Dependency
81
93
  name: rake
82
94
  requirement: !ruby/object:Gem::Requirement
83
95
  requirements:
84
- - - "~>"
96
+ - - ">="
85
97
  - !ruby/object:Gem::Version
86
98
  version: '10.0'
87
99
  type: :development
88
100
  prerelease: false
89
101
  version_requirements: !ruby/object:Gem::Requirement
90
102
  requirements:
91
- - - "~>"
103
+ - - ">="
92
104
  - !ruby/object:Gem::Version
93
105
  version: '10.0'
94
106
  - !ruby/object:Gem::Dependency
@@ -168,11 +180,11 @@ extensions: []
168
180
  extra_rdoc_files: []
169
181
  files:
170
182
  - ".codeclimate.yml"
183
+ - ".github/workflows/test.yml"
171
184
  - ".gitignore"
172
185
  - ".pryrc"
173
186
  - ".rspec"
174
187
  - ".rubocop.yml"
175
- - ".travis.yml"
176
188
  - CHANGELOG.md
177
189
  - CODE_OF_CONDUCT.md
178
190
  - Dockerfile
@@ -233,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
233
245
  - !ruby/object:Gem::Version
234
246
  version: '0'
235
247
  requirements: []
236
- rubygems_version: 3.2.3
248
+ rubygems_version: 3.3.7
237
249
  signing_key:
238
250
  specification_version: 4
239
251
  summary: pt-online-schema-change runner for ActiveRecord migrations
data/.travis.yml DELETED
@@ -1,31 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.5.5
5
- - 2.6.3
6
- - 2.7.0
7
-
8
- env:
9
- - RAILS_VERSION="~> 6.1.0"
10
- - RAILS_VERSION="~> 6.0.0"
11
- - RAILS_VERSION="~> 5.2.0"
12
-
13
- jobs:
14
- include:
15
- - rvm: 2.4.6
16
- env: RAILS_VERSION="~> 5.2.0"
17
-
18
- services:
19
- - mysql
20
-
21
- before_install:
22
- - travis_retry sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 8507EFA5
23
- - echo "deb http://repo.percona.com/apt `lsb_release -cs` main" | sudo tee -a /etc/apt/sources.list
24
- - sudo apt-get update -qq
25
- - sudo apt-get install percona-toolkit
26
- - gem update bundler
27
-
28
- install: bin/setup
29
-
30
- after_success:
31
- - codeclimate-test-reporter