gitlab-qa 8.4.2 → 8.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -12
  3. data/Gemfile.lock +1 -1
  4. data/exe/gitlab-qa +1 -1
  5. data/lib/gitlab/qa/component/base.rb +2 -2
  6. data/lib/gitlab/qa/component/gitlab.rb +1 -1
  7. data/lib/gitlab/qa/component/staging.rb +17 -35
  8. data/lib/gitlab/qa/component/suggested_reviewer.rb +47 -0
  9. data/lib/gitlab/qa/docker/command.rb +3 -14
  10. data/lib/gitlab/qa/docker/engine.rb +1 -1
  11. data/lib/gitlab/qa/release.rb +6 -2
  12. data/lib/gitlab/qa/report/find_set_dri.rb +43 -0
  13. data/lib/gitlab/qa/report/gitlab_issue_client.rb +7 -0
  14. data/lib/gitlab/qa/report/relate_failure_issue.rb +16 -0
  15. data/lib/gitlab/qa/report/results_reporter_shared.rb +1 -1
  16. data/lib/gitlab/qa/report/test_result.rb +8 -0
  17. data/lib/gitlab/qa/runtime/env.rb +5 -14
  18. data/lib/gitlab/qa/scenario/test/integration/suggested_reviewer.rb +62 -0
  19. data/lib/gitlab/qa/scenario/test/omnibus/update_from_previous.rb +1 -1
  20. data/lib/gitlab/qa/service/cluster_provider/base.rb +33 -0
  21. data/lib/gitlab/qa/service/cluster_provider/k3d.rb +141 -0
  22. data/lib/gitlab/qa/service/kubernetes_cluster.rb +62 -0
  23. data/lib/gitlab/qa/support/shell_command.rb +98 -0
  24. data/lib/gitlab/qa/support/shellout.rb +16 -0
  25. data/lib/gitlab/qa/version.rb +1 -1
  26. data/lib/gitlab/qa.rb +0 -1
  27. data/support/manifests/suggested_reviewer/authenticator.yaml +41 -0
  28. data/support/manifests/suggested_reviewer/postgres.yaml +84 -0
  29. data/support/manifests/suggested_reviewer/pubsub.yaml +41 -0
  30. data/support/manifests/suggested_reviewer/recommender-bot.yaml +242 -0
  31. data/support/manifests/suggested_reviewer/recommender.yaml +52 -0
  32. metadata +15 -7
  33. data/lib/gitlab/qa/component/internet_tunnel.rb +0 -76
  34. data/lib/gitlab/qa/docker/shellout.rb +0 -77
  35. data/lib/gitlab/qa/scenario/test/integration/kubernetes.rb +0 -56
  36. data/lib/gitlab/qa/scenario/test/integration/ssh_tunnel.rb +0 -56
  37. data/lib/gitlab/qa/support/dev_ee_qa_image.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae27f1af0edb9ce83b3ba33e8f18ddb155b62a786b7977d93ab74dfe2ba33e77
4
- data.tar.gz: 45f26af4e1796502625888791990c16403654f1abe9558deca1d7fc351135383
3
+ metadata.gz: cedbc28c7349c22c56af141445b79d1c7c29444f66d191f465a91e8d0fc244ae
4
+ data.tar.gz: 9b857df0ad9502c59aa081fb7b1ebb2865bc7c4339c49c6f37a356c08eb1740a
5
5
  SHA512:
6
- metadata.gz: 4b7e606c2e6966d29ddc414e512ad7c2ce19a67dcf9ef20fcdaec5575219aa82631cb77c486e35c74f1a4c956004b6f7519f6422838a09d8e43873a5e9c4bbb4
7
- data.tar.gz: 7ebbdd74ef735ecbdcb107bafa1418754f3cc89b18d72da2986b0d0d455145e25e4e4c812ab2d2dcbc72e4d50b2337d5f60d66100d715bbd6d3e4750f9eb9c22
6
+ metadata.gz: 4231efbe843158613694938667c8402d5dcbddeb918fb19cf00743839c80c5bc05917c264474d48e3558dd33978e9973baecad229a041873473faa1ce376122c
7
+ data.tar.gz: 7a9c4a7efd9b4759c6c487e8872ca76cfb35cc6b91cebc90e2c77b61d742b5ed2f68acd044f6b86cbfce30d822423ddd4e09cae2b5c26dd4ea2a26a72364c5e9
data/.rubocop_todo.yml CHANGED
@@ -57,12 +57,6 @@ Naming/RescuedExceptionsVariableName:
57
57
  Exclude:
58
58
  - 'lib/gitlab/qa/component/staging.rb'
59
59
 
60
- # Offense count: 3
61
- # Cop supports --auto-correct.
62
- RSpec/EmptyLineAfterLetBlock:
63
- Exclude:
64
- - 'spec/gitlab/qa/support/dev_ee_qa_image_spec.rb'
65
-
66
60
  # Offense count: 4
67
61
  # Cop supports --auto-correct.
68
62
  # Configuration parameters: CustomTransform, IgnoredWords.
@@ -70,12 +64,6 @@ RSpec/ExampleWording:
70
64
  Exclude:
71
65
  - 'spec/gitlab/qa/component/gitlab_spec.rb'
72
66
 
73
- # Offense count: 1
74
- # Configuration parameters: CustomTransform, IgnoreMethods, SpecSuffixOnly.
75
- RSpec/FilePath:
76
- Exclude:
77
- - 'spec/gitlab/qa/support/dev_ee_qa_image_spec.rb'
78
-
79
67
  # Offense count: 2
80
68
  RSpec/LeakyConstantDeclaration:
81
69
  Exclude:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-qa (8.4.2)
4
+ gitlab-qa (8.6.0)
5
5
  activesupport (~> 6.1)
6
6
  gitlab (~> 4.18.0)
7
7
  http (~> 5.0)
data/exe/gitlab-qa CHANGED
@@ -6,4 +6,4 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
 
7
7
  require 'gitlab/qa'
8
8
 
9
- Gitlab::QA::Runner.run(ARGV)
9
+ Gitlab::QA::Runner.run(ARGV.dup)
@@ -157,11 +157,11 @@ module Gitlab
157
157
  reconfigure
158
158
  wait_until_ready
159
159
  process_exec_commands
160
- rescue Docker::Shellout::StatusError => e
160
+ rescue Support::ShellCommand::StatusError => e
161
161
  # for scenarios where a service fails during startup, attempt to retry to avoid flaky failures
162
162
  if (retries += 1) < 3
163
163
  Runtime::Logger.warn(
164
- "Retry instance_no_teardown due to Docker::Shellout::StatusError -- attempt #{retries}"
164
+ "Retry instance_no_teardown due to Support::ShellCommand::StatusError -- attempt #{retries}"
165
165
  )
166
166
  teardown!
167
167
  retry
@@ -338,7 +338,7 @@ module Gitlab
338
338
  output = docker.inspect(name) { |command| command << "--format='{{json .State.Health.Status}}'" }
339
339
 
340
340
  output == '"healthy"'
341
- rescue Docker::Shellout::StatusError
341
+ rescue Support::ShellCommand::StatusError
342
342
  false
343
343
  end
344
344
  end
@@ -20,31 +20,21 @@ module Gitlab
20
20
  end
21
21
 
22
22
  def self.image
23
+ # QA images are tagged with the following logic
24
+ # 1. For auto-deploy versions, they are tagged with their corresponding commit SHA
25
+ # That is, if auto-deploy version is `15.4.202209150620+70251a89db4.a625f183e2e`,
26
+ # the QA image tag will be `70251a89db4`
27
+ # 2. For stable/RC versions, they are tagged with the version with `v` prefix.
28
+ # That is, if the version is `15.3.3-ee`, the QA image tag will be `v15.3.3-ee`
29
+ # These images are available from the GitLab project's container registry.
30
+
31
+ # If token to access dev.gitlab.org registry is provided, we will
32
+ # fetch from there. Else, we will try to fetch from GitLab.com
33
+ # registry.
23
34
  if Runtime::Env.dev_access_token_variable
24
- # Auto-deploy builds have a tag formatted like 12.1.12345+5159f2949cb.59c9fa631
25
- # where `5159f2949cb` is the EE commit SHA. QA images are tagged using
26
- # the version from the VERSION file and this commit SHA, e.g.
27
- # `12.0-5159f2949cb` (note that the `major.minor` doesn't necessarily match).
28
- # To work around that, we're fetching the `revision` from the version API
29
- # and then find the corresponding QA image in the
30
- # `dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee-qa` container
31
- # registry, based on this revision.
32
- # See:
33
- # - https://gitlab.com/gitlab-org/quality/staging/issues/56
34
- # - https://gitlab.com/gitlab-org/release/framework/issues/421
35
- # - https://gitlab.com/gitlab-org/gitlab-qa/issues/398
36
- #
37
- # For official builds (currently deployed on preprod) we use the version
38
- # string e.g. '12.5.4-ee' for tag matching
39
- Support::DevEEQAImage.new.retrieve_image_from_container_registry!(tag_end)
35
+ "dev.gitlab.org:5005/gitlab/gitlab-ee/gitlab-ee-qa:#{tag}"
40
36
  else
41
- # Auto-deploy builds have a tag formatted like 12.0.12345+5159f2949cb.59c9fa631
42
- # but the version api returns a semver version like 12.0.1
43
- # so images are tagged using minor and major semver components plus
44
- # the EE commit ref, which is the 'revision' returned by the API
45
- # and so the version used for the docker image tag is like 12.0-5159f2949cb
46
- # See: https://gitlab.com/gitlab-org/quality/staging/issues/56
47
- "ee:#{Version.new(address).major_minor_revision}"
37
+ "registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa:#{tag}"
48
38
  end
49
39
  end
50
40
 
@@ -52,8 +42,8 @@ module Gitlab
52
42
  self::ADDRESS
53
43
  end
54
44
 
55
- def self.tag_end
56
- @tag_end ||= Version.new(address).tag_end
45
+ def self.tag
46
+ @tag ||= Version.new(address).tag
57
47
  end
58
48
 
59
49
  class Version
@@ -65,16 +55,8 @@ module Gitlab
65
55
  Runtime::Env.require_qa_access_token!
66
56
  end
67
57
 
68
- def tag_end
69
- official? ? version : revision
70
- end
71
-
72
- def major_minor_revision
73
- api_response = api_get!
74
- version_regexp = /^v?(?<major>\d+)\.(?<minor>\d+)\.\d+/
75
- match = version_regexp.match(api_response.fetch('version'))
76
-
77
- "#{match[:major]}.#{match[:minor]}-#{api_response.fetch('revision')}"
58
+ def tag
59
+ official? ? "v#{version}" : revision
78
60
  end
79
61
 
80
62
  private
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Component
6
+ class SuggestedReviewer
7
+ include Scenario::Actable
8
+
9
+ # Source: https://gitlab.com/gitlab-org/modelops/applied-ml/review-recommender/cluster-management
10
+ MANIFESTS_PATH = File.expand_path('../../../../support/manifests/suggested_reviewer', __dir__)
11
+
12
+ def initialize
13
+ @cluster = Service::KubernetesCluster.new(provider_class: Service::ClusterProvider::K3d)
14
+ end
15
+
16
+ def name
17
+ @name ||= "suggested_reviewer"
18
+ end
19
+
20
+ def prepare
21
+ @cluster.create_registry_mirror
22
+ end
23
+
24
+ def create_cluster
25
+ @cluster.create!
26
+ end
27
+
28
+ def deploy_services
29
+ Dir.glob(File.join(MANIFESTS_PATH, '**/*')).each do |file|
30
+ Runtime::Logger.info("Applying manifest #{file}")
31
+ @cluster.apply_manifest(File.read(file))
32
+ end
33
+ end
34
+
35
+ def teardown
36
+ @cluster.remove!
37
+ end
38
+
39
+ def wait_until_ready; end
40
+
41
+ def teardown?
42
+ !Runtime::Scenario.attributes.include?(:teardown) || Runtime::Scenario.teardown
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -4,7 +4,7 @@ module Gitlab
4
4
  module QA
5
5
  module Docker
6
6
  class Command
7
- attr_reader :args, :stream_output
7
+ attr_reader :args
8
8
 
9
9
  # Shell command
10
10
  #
@@ -41,24 +41,13 @@ module Gitlab
41
41
  "docker #{@args.join(' ')}"
42
42
  end
43
43
 
44
- # Returns a masked string form of a Command
45
- #
46
- # @example
47
- # Command.new('a docker command', mask_secrets: 'command').mask_secrets #=> 'a docker *****'
48
- # Command.new('a docker command', mask_secrets: %w[docker command]).mask_secrets #=> 'a ***** *****'
49
- #
50
- # @return [String] The masked command string
51
- def mask_secrets
52
- @mask_secrets.each_with_object(+to_s) { |secret, s| s.gsub!(secret, '*****') }
53
- end
54
-
55
44
  def ==(other)
56
45
  to_s == other.to_s
57
46
  end
58
47
 
59
48
  def execute!(&block)
60
- Docker::Shellout.new(self).execute!(&block)
61
- rescue Docker::Shellout::StatusError => e
49
+ Support::ShellCommand.new(to_s, mask_secrets: @mask_secrets, stream_output: @stream_output).execute!(&block)
50
+ rescue Support::ShellCommand::StatusError => e
62
51
  e.set_backtrace([])
63
52
 
64
53
  raise e
@@ -112,7 +112,7 @@ module Gitlab
112
112
 
113
113
  def manifest_exists?(name)
114
114
  Docker::Command.execute("manifest inspect #{name}")
115
- rescue Docker::Shellout::StatusError
115
+ rescue Support::ShellCommand::StatusError
116
116
  false
117
117
  else
118
118
  true
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/module/delegation"
4
+
3
5
  module Gitlab
4
6
  module QA
5
7
  class Release
@@ -23,6 +25,8 @@ module Gitlab
23
25
  \z
24
26
  }xi.freeze
25
27
 
28
+ delegate :ci_project_path, to: Gitlab::QA::Runtime::Env
29
+
26
30
  # Official dev tag example:
27
31
  # 12.5.4(-rc42)-ee
28
32
  # |-------------|--|
@@ -109,7 +113,7 @@ module Gitlab
109
113
  def qa_image
110
114
  @qa_image ||= if omnibus_mirror?
111
115
  omnibus_project = image.match(CUSTOM_GITLAB_IMAGE_REGEX)[:project]
112
- gitlab_project = "/gitlab-org/gitlab/"
116
+ gitlab_project = ci_project_path ? "/#{ci_project_path}/" : "/gitlab-org/gitlab/"
113
117
 
114
118
  "#{image.gsub(omnibus_project, gitlab_project)}-qa"
115
119
  else
@@ -139,7 +143,7 @@ module Gitlab
139
143
  # Tag scheme for gitlab-{ce,ee}-qa images is like 11.1.0-rc12-ee
140
144
  def qa_tag
141
145
  if dev_gitlab_org? && (match_data = tag.match(DEV_TAG_REGEX))
142
- "#{match_data[:version]}-#{match_data[:gitlab_ref]}"
146
+ match_data[:gitlab_ref]
143
147
  else
144
148
  tag.sub(/[-.]([ce]e)(\.(\d+))?\z/, '-\1')
145
149
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Gitlab
6
+ module QA
7
+ module Report
8
+ module FindSetDri
9
+ def set_dri_via_group(product_group, test)
10
+ parse_json_with_sets
11
+ fetch_stage_sets(test)
12
+
13
+ return @sets.sample['username'] if @stage_sets.empty?
14
+
15
+ fetch_group_sets(product_group)
16
+
17
+ if @group_sets.empty?
18
+ @stage_sets.sample['username']
19
+ else
20
+ @group_sets.sample['username']
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def parse_json_with_sets
27
+ response = Support::HttpRequest.make_http_request(
28
+ url: 'https://gitlab-org.gitlab.io/gitlab-roulette/roulette.json'
29
+ )
30
+ @sets = JSON.parse(response.body).select { |user| user['role'].include?('software-engineer-in-test') }
31
+ end
32
+
33
+ def fetch_stage_sets(test)
34
+ @stage_sets = @sets.select { |user| user['role'].include?(test.stage.split("_").map(&:capitalize).join(" ")) }
35
+ end
36
+
37
+ def fetch_group_sets(product_group)
38
+ @group_sets = @stage_sets.select { |user| user['role'].include?(product_group.split("_").map { |word| word == 'and' ? word : word.capitalize }.join(" ")) }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -101,6 +101,13 @@ module Gitlab
101
101
  end
102
102
  end
103
103
 
104
+ def find_user_id(username:)
105
+ handle_gitlab_client_exceptions do
106
+ user = Gitlab.users(username: username)&.first
107
+ user['id'] unless user.nil?
108
+ end
109
+ end
110
+
104
111
  def upload_file(file_fullpath:)
105
112
  ignore_gitlab_client_exceptions do
106
113
  Gitlab.upload_file(project, file_fullpath)
@@ -3,12 +3,15 @@
3
3
  require 'nokogiri'
4
4
  require 'active_support/core_ext/enumerable'
5
5
  require 'rubygems/text'
6
+ require 'active_support/core_ext/integer/time'
6
7
 
7
8
  module Gitlab
8
9
  module QA
9
10
  module Report
10
11
  # Uses the API to create or update GitLab issues with the results of tests from RSpec report files.
11
12
  class RelateFailureIssue < ReportAsIssue
13
+ include FindSetDri
14
+
12
15
  DEFAULT_MAX_DIFF_RATIO_FOR_DETECTION = 0.15
13
16
  FAILURE_STACKTRACE_REGEX = %r{((.*Failure\/Error:(?<stacktrace>.+))|(?<stacktrace>.+))}m.freeze
14
17
  ISSUE_STACKTRACE_REGEX = /### Stack trace\s*(```)#{FAILURE_STACKTRACE_REGEX}(```)/m.freeze
@@ -74,6 +77,8 @@ module Gitlab
74
77
 
75
78
  post_or_update_failed_job_note(issue, test)
76
79
 
80
+ assign_dri(issue, test)
81
+
77
82
  issue
78
83
  end
79
84
 
@@ -218,6 +223,17 @@ module Gitlab
218
223
 
219
224
  section
220
225
  end
226
+
227
+ def assign_dri(issue, test)
228
+ if test.product_group?
229
+ dri = set_dri_via_group(test.product_group, test)
230
+ dri_id = gitlab.find_user_id(username: dri)
231
+ gitlab.edit_issue(iid: issue.iid, options: { assignee_id: dri_id, due_date: Date.today + 1.month })
232
+ puts " => Assigning #{dri} as DRI for the issue."
233
+ else
234
+ puts " => No product group metadata found for test '#{test.name}'"
235
+ end
236
+ end
221
237
  end
222
238
  end
223
239
  end
@@ -32,7 +32,7 @@ module Gitlab
32
32
  end
33
33
 
34
34
  def new_issue_labels(test)
35
- ['Quality', "devops::#{test.stage}", 'status::automated']
35
+ %w[Quality status::automated]
36
36
  end
37
37
 
38
38
  def search_term(test)
@@ -103,6 +103,14 @@ module Gitlab
103
103
  report['screenshot']['image'] if screenshot?
104
104
  end
105
105
 
106
+ def product_group?
107
+ report['product_group'].present?
108
+ end
109
+
110
+ def product_group
111
+ report['product_group'] if product_group?
112
+ end
113
+
106
114
  private
107
115
 
108
116
  # rubocop:disable Metrics/AbcSize
@@ -94,6 +94,7 @@ module Gitlab
94
94
  'CI_NODE_TOTAL' => :ci_node_total,
95
95
  'CI_PROJECT_ID' => :ci_project_id,
96
96
  'CI_PROJECT_NAME' => :ci_project_name,
97
+ 'CI_PROJECT_PATH' => :ci_project_path,
97
98
  'CI_SLACK_WEBHOOK_URL' => :ci_slack_webhook_url,
98
99
  'CI_PIPELINE_ID' => :ci_pipeline_id,
99
100
  'CI_PIPELINE_SOURCE' => :ci_pipeline_source,
@@ -272,12 +273,10 @@ module Gitlab
272
273
  raise ArgumentError, "Please provide CI_SLACK_WEBHOOK_URL"
273
274
  end
274
275
 
275
- def require_kubernetes_environment!
276
- %w[GCLOUD_ACCOUNT_EMAIL GCLOUD_ACCOUNT_KEY CLOUDSDK_CORE_PROJECT].each do |env_key|
277
- unless ENV.key?(env_key)
278
- raise ArgumentError, "Environment variable #{env_key} must be set to run kubernetes specs"
279
- end
280
- end
276
+ def require_qa_container_registry_access_token!
277
+ return unless env_var_value_if_defined('GITLAB_QA_CONTAINER_REGISTRY_ACCESS_TOKEN').to_s.strip.empty?
278
+
279
+ raise ArgumentError, "Please provide GITLAB_QA_CONTAINER_REGISTRY_ACCESS_TOKEN"
281
280
  end
282
281
 
283
282
  def require_aws_s3_environment!
@@ -313,14 +312,6 @@ module Gitlab
313
312
  )
314
313
  end
315
314
 
316
- def require_ssh_tunnel!
317
- %w[TUNNEL_SSH_PRIVATE_KEY TUNNEL_SERVER_HOSTNAME TUNNEL_SSH_USER].each do |env_key|
318
- unless ENV.key?(env_key)
319
- raise ArgumentError, "Environment variable #{env_key} must be set to run tunnel specs"
320
- end
321
- end
322
- end
323
-
324
315
  def override_default_password!
325
316
  require_initial_password!
326
317
 
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Scenario
6
+ module Test
7
+ module Integration
8
+ class SuggestedReviewer < Scenario::Template
9
+ attr_reader :spec_suite
10
+
11
+ def initialize
12
+ @spec_suite = 'Test::Instance::All'
13
+ @network = 'test'
14
+ @env = {}
15
+ @tag = 'suggested_reviewer'
16
+ @gitlab_name = 'gitlab-suggested-reviewer'
17
+ end
18
+
19
+ def perform(release, *rspec_args)
20
+ Component::Gitlab.perform do |gitlab|
21
+ gitlab.release = QA::Release.new(release)
22
+ gitlab.name = @gitlab_name
23
+ gitlab.network = @network
24
+
25
+ gitlab.instance do
26
+ # Wait for the suggested reviewer services to be ready before attempting to run specs
27
+ @cluster = suggested_reviewer_cluster
28
+ @cluster.wait_until_ready
29
+
30
+ Runtime::Logger.info('Running Suggested Reviewer specs!')
31
+
32
+ if @tag
33
+ rspec_args << "--" unless rspec_args.include?('--')
34
+ rspec_args << "--tag" << @tag
35
+ end
36
+
37
+ Component::Specs.perform do |specs|
38
+ specs.suite = spec_suite
39
+ specs.release = gitlab.release
40
+ specs.network = gitlab.network
41
+ specs.args = [gitlab.address, *rspec_args]
42
+ specs.env = @env
43
+ end
44
+ end
45
+ end
46
+ ensure
47
+ @cluster&.teardown if @cluster&.teardown?
48
+ end
49
+
50
+ def suggested_reviewer_cluster
51
+ Component::SuggestedReviewer.new.tap do |sr|
52
+ sr.prepare
53
+ sr.create_cluster
54
+ sr.deploy_services
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -94,7 +94,7 @@ module Gitlab
94
94
  specs.network = gitlab.network
95
95
  specs.args = [gitlab.address, *rspec_args]
96
96
  end
97
- rescue Docker::Shellout::StatusError => e
97
+ rescue Support::ShellCommand::StatusError => e
98
98
  raise e if release == current_release # only fail on current release
99
99
 
100
100
  Runtime::Logger.warn("Test run for release '#{gitlab.release}' finished with errors!")
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Service
6
+ module ClusterProvider
7
+ class Base
8
+ include Support::Shellout
9
+
10
+ GITLAB_REGISTRY = 'registry.gitlab.com'
11
+
12
+ attr_accessor :create_args
13
+
14
+ def cluster_name
15
+ @cluster_name ||= "qa-cluster-#{Time.now.utc.strftime('%Y%m%d')}-#{SecureRandom.hex(4)}"
16
+ end
17
+
18
+ def validate_dependencies
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def setup
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def teardown
27
+ raise NotImplementedError
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end