gitlab-qa 7.29.1 → 7.32.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: 6f3a8d250f26a5899d776475ac349829311045b51aeed7b73f1a40fc41cd23dc
4
- data.tar.gz: 2258303729505a302fe0a6d05b57f5deee6efe21f0d7cbfb2542e92febfe2dc7
3
+ metadata.gz: 7af4e17998896415aa9c217a012124b8fa4ce8727d781a3ef47ea2801c9c6632
4
+ data.tar.gz: '0162299be6ab6e7f40d83a7f0c8a1d4d76879e7cf8d7181e3e8f027285fba8a0'
5
5
  SHA512:
6
- metadata.gz: 2ad81f0b8d7bcb59ff76963f0463ae2d221be28b262455c22e6ee11ad91a9c6b768291639ed25b9ff756c9b319566f4aa596281ca2c09d470a5a1374174f3929
7
- data.tar.gz: 6e5a9601b50167f4cae9c87fe1415b1a6a740c855e56580cc553559d481842f6ed9feced7760a0403bb7993ef5ba7e11c1fd5723d2812a06227d1a64b87aefd1
6
+ metadata.gz: 82aeb884f959762a0de031bf0f44d050b32a576cb92adff50b9af7902ed481dab0ce0ad295338238fb61108e58be1a85b10b27f59209bb36e8655cde13d5f460
7
+ data.tar.gz: 1964ac96d147d43a008ee2619d49a53b661851c1c4cb09b74701b52bf680c4f376c52aa1a68f62a08d51080199385e34cb322e4036d9d7daa7d166bf447ca620
data/.gitignore CHANGED
@@ -8,6 +8,9 @@
8
8
  /.idea
9
9
  .ruby-version
10
10
  .ruby-gemset
11
+ .DS_Store
12
+ .rakeTasks
13
+ .tool-versions
11
14
 
12
15
  # ignore built gems
13
16
  *.gem
@@ -70,6 +70,8 @@ workflow:
70
70
  variables:
71
71
  DOCKER_DRIVER: overlay2
72
72
  DOCKER_HOST: tcp://docker:2375
73
+ COLORIZED_LOGS: "true"
74
+ QA_DEBUG: "false"
73
75
  QA_CAN_TEST_GIT_PROTOCOL_V2: "true"
74
76
  QA_CAN_TEST_PRAEFECT: "false"
75
77
  QA_GENERATE_ALLURE_REPORT: "true"
@@ -11,7 +11,7 @@ ee:cloud-activation:
11
11
  - .combined-gitlab-qa-options-script
12
12
  variables:
13
13
  QA_RSPEC_TAGS: "--tag cloud_activation"
14
- GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --no-admin-token --seed-db license*.rb"
14
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --seed-db license*.rb"
15
15
 
16
16
  ee:cloud-activation-quarantine:
17
17
  before_script:
@@ -27,4 +27,4 @@ ee:cloud-activation-quarantine:
27
27
  - .combined-gitlab-qa-options-script
28
28
  variables:
29
29
  QA_RSPEC_TAGS: "--tag cloud_activation"
30
- GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --no-admin-token --seed-db license*.rb"
30
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --seed-db license*.rb"
@@ -0,0 +1,25 @@
1
+ ce:decomposition_multiple_db:
2
+ extends:
3
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
4
+ - .rules:ce-never-when-qa-tests-specified
5
+ - .test
6
+ - .high-capacity
7
+ - .ce-variables
8
+ - .rspec-report-opts
9
+ - .combined-gitlab-qa-options-script
10
+ parallel: 5
11
+ variables:
12
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config decomposition_multiple_db"
13
+
14
+ ee:decomposition_multiple_db:
15
+ extends:
16
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
17
+ - .rules:ee-never-when-qa-tests-specified
18
+ - .test
19
+ - .ee-variables
20
+ - .high-capacity
21
+ - .rspec-report-opts
22
+ - .combined-gitlab-qa-options-script
23
+ parallel: 5
24
+ variables:
25
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config decomposition_multiple_db"
@@ -1,4 +1,4 @@
1
- ce:ci_decomposition:
1
+ ce:decomposition_single_db:
2
2
  extends:
3
3
  - .rules:ce-never-when-triggered-by-feature-flag-definition-change
4
4
  - .rules:ce-never-when-qa-tests-specified
@@ -9,9 +9,9 @@ ce:ci_decomposition:
9
9
  - .combined-gitlab-qa-options-script
10
10
  parallel: 5
11
11
  variables:
12
- GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config ci_decomposition"
12
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config decomposition_single_db"
13
13
 
14
- ee:ci_decomposition:
14
+ ee:decomposition_single_db:
15
15
  extends:
16
16
  - .rules:ee-never-when-triggered-by-feature-flag-definition-change
17
17
  - .rules:ee-never-when-qa-tests-specified
@@ -22,4 +22,4 @@ ee:ci_decomposition:
22
22
  - .combined-gitlab-qa-options-script
23
23
  parallel: 5
24
24
  variables:
25
- GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config ci_decomposition"
25
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config decomposition_single_db"
data/.rubocop.yml CHANGED
@@ -36,3 +36,6 @@ Style/SignalException:
36
36
 
37
37
  Layout/SpaceBeforeFirstArg:
38
38
  Enabled: false
39
+
40
+ RSpec/MultipleMemoizedHelpers:
41
+ Enabled: false
data/.rubocop_todo.yml CHANGED
@@ -89,11 +89,6 @@ RSpec/LeakyConstantDeclaration:
89
89
  Exclude:
90
90
  - 'spec/gitlab/qa/scenario/test/instance/deployment_base_spec.rb'
91
91
 
92
- # Offense count: 221
93
- # Configuration parameters: AllowSubject.
94
- RSpec/MultipleMemoizedHelpers:
95
- Max: 22
96
-
97
92
  # Offense count: 1
98
93
  # Cop supports --auto-correct.
99
94
  Style/ExplicitBlockArgument:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-qa (7.29.1)
4
+ gitlab-qa (7.32.0)
5
5
  activesupport (~> 6.1)
6
6
  gitlab (~> 4.18.0)
7
7
  http (~> 5.0)
@@ -997,12 +997,20 @@ This scenario is a composition of two orchestrated scenarios. It tests the conta
997
997
  GITLAB_TLS_CERTIFICATE=$(cat /path/to/certificate.crt) gitlab-qa Test::Integration::RegistryTLS EE --omnibus-config object_storage_aws
998
998
  ```
999
999
 
1000
- ### Test::Instance::Image EE --omnibus-config ci_decomposition
1000
+ ### Test::Instance::Image EE --omnibus-config decomposition_single_db
1001
1001
 
1002
- This scenario is to run tests against GitLab instance with [decomposed database](https://gitlab.com/groups/gitlab-org/-/epics/6160) on a single Postgres:
1002
+ This scenario is to run tests against a GitLab instance with a [decomposed database](https://gitlab.com/groups/gitlab-org/-/epics/6160) using a single database:
1003
1003
 
1004
1004
  ```ruby
1005
- gitlab-qa Test::Instance::Image EE --omnibus-config ci_decomposition
1005
+ gitlab-qa Test::Instance::Image EE --omnibus-config decomposition_single_db
1006
+ ```
1007
+
1008
+ ### Test::Instance::Image EE --omnibus-config decomposition_multiple_db
1009
+
1010
+ This scenario is to run tests against a GitLab instance with a [decomposed database](https://gitlab.com/groups/gitlab-org/-/epics/6160) using multiple databases:
1011
+
1012
+ ```ruby
1013
+ gitlab-qa Test::Instance::Image EE --omnibus-config decomposition_multiple_db
1006
1014
  ```
1007
1015
 
1008
1016
  ### `Test::Instance::Geo EE|<full image address>:nightly|latest|any_tag http://geo-primary.gitlab http://geo-secondary.gitlab`
@@ -176,6 +176,7 @@ module Gitlab
176
176
  exec_commands << seed_admin_token_command if seed_admin_token
177
177
  exec_commands << seed_test_data_command if seed_db
178
178
  exec_commands << Runtime::Scenario.omnibus_exec_commands
179
+ exec_commands << add_git_server_hooks unless Runtime::Scenario.skip_server_hooks
179
180
 
180
181
  commands = exec_commands.flatten.uniq
181
182
  return if commands.empty?
@@ -184,14 +185,17 @@ module Gitlab
184
185
  commands.each { |command| @docker.exec(name, command) }
185
186
  end
186
187
 
187
- def sha_version
188
+ def rails_version
188
189
  json = @docker.read_file(
189
190
  @release.image, @release.tag,
190
191
  '/opt/gitlab/version-manifest.json'
191
192
  )
192
193
 
193
194
  manifest = JSON.parse(json)
194
- manifest['software']['gitlab-rails']['locked_version']
195
+ {
196
+ sha: manifest['software']['gitlab-rails']['locked_version'],
197
+ source: manifest['software']['gitlab-rails']['locked_source']['git']
198
+ }
195
199
  end
196
200
 
197
201
  def copy_key_file(env_key)
@@ -243,6 +247,25 @@ module Gitlab
243
247
  ["gitlab-rails runner #{DATA_PATH}/admin_access_token_seed.rb"]
244
248
  end
245
249
 
250
+ def add_git_server_hooks
251
+ global_server_prereceive_hook = <<~SCRIPT
252
+ #!/usr/bin/env bash
253
+
254
+ if [[ \\\$GL_PROJECT_PATH =~ 'reject-prereceive' ]]; then
255
+ echo 'GL-HOOK-ERR: Custom error message rejecting prereceive hook for projects with GL_PROJECT_PATH matching pattern reject-prereceive'
256
+ exit 1
257
+ fi
258
+ SCRIPT
259
+
260
+ [
261
+ @docker.exec(name, 'mkdir -p /opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d'),
262
+ @docker.write_files(name) do |f|
263
+ f.write('/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/pre-receive.d', global_server_prereceive_hook, false)
264
+ end,
265
+ @docker.exec(name, 'chmod +x /opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/*')
266
+ ]
267
+ end
268
+
246
269
  class Availability
247
270
  def initialize(name, relative_path: '', scheme: 'http', protocol_port: 80)
248
271
  @docker = Docker::Engine.new
@@ -61,8 +61,15 @@ module Gitlab
61
61
  def write_files(name)
62
62
  exec(name, yield(
63
63
  Class.new do
64
- def self.write(file, contents)
65
- %(echo "#{contents}" > #{file};)
64
+ # @param file The name of the file
65
+ # @param contents The content of the file to write
66
+ # @param expand_vars Set false if you need to write an environment variable '$' to a file. The variable should be escaped \\\$
67
+ def self.write(file, contents, expand_vars = true)
68
+ if expand_vars
69
+ %(echo "#{contents}" > #{file};)
70
+ else
71
+ %(echo '#{contents}' > #{file};)
72
+ end
66
73
  end
67
74
 
68
75
  def self.append(file, contents)
@@ -210,10 +210,10 @@ module Gitlab
210
210
 
211
211
  failure = full_stacktrace(test)
212
212
 
213
- if test.screenshot? && !failure.include?('500 Internal Server Error') && !failure.include?('fabricate_via_api!')
213
+ if test.screenshot? && !['500 Internal Server Error', 'fabricate_via_api!', 'Error Code 500'].any? { |e| failure.include?(e) }
214
214
  relative_url = gitlab.upload_file(file_fullpath: test.failure_screenshot)
215
215
 
216
- section = "### Screenshot: #{relative_url.markdown}"
216
+ section = "### Screenshot: #{relative_url.markdown}" if relative_url
217
217
  end
218
218
 
219
219
  section
@@ -7,7 +7,9 @@ module Gitlab
7
7
  class ReportResults < ReportAsIssue
8
8
  attr_accessor :testcase_project_reporter, :results_issue_project_reporter, :files, :test_case_project, :results_issue_project, :gitlab
9
9
 
10
- def initialize(token:, input_files:, test_case_project:, results_issue_project:, dry_run: false, **kwargs)
10
+ IGNORE_EXCEPTIONS = ['Net::ReadTimeout'].freeze
11
+
12
+ def initialize(token:, input_files:, test_case_project: nil, results_issue_project: nil, dry_run: false, **kwargs)
11
13
  @testcase_project_reporter = Gitlab::QA::Report::ResultsInTestCases.new(token: token, input_files: input_files, project: test_case_project, dry_run: dry_run, **kwargs)
12
14
  @results_issue_project_reporter = Gitlab::QA::Report::ResultsInIssues.new(token: token, input_files: input_files, project: results_issue_project, dry_run: dry_run, **kwargs)
13
15
  @test_case_project = test_case_project
@@ -32,7 +34,7 @@ module Gitlab
32
34
  test_results.each do |test|
33
35
  puts "Reporting test: #{test.file} | #{test.name}\n"
34
36
 
35
- report_test(test) unless test.skipped
37
+ report_test(test) if should_report?(test)
36
38
  end
37
39
 
38
40
  test_results.write
@@ -54,6 +56,40 @@ module Gitlab
54
56
  testcase_project_reporter.update_testcase(testcase, test)
55
57
  results_issue_project_reporter.update_issue(issue, test)
56
58
  end
59
+
60
+ # Checks if a test result should be reported.
61
+ #
62
+ # @return [Boolean] false if the test was skipped or failed because of a transient error that can be ignored.
63
+ # Otherwise returns true.
64
+ def should_report?(test)
65
+ return false if test.skipped
66
+
67
+ if test.report.key?('exceptions')
68
+ reason = ignore_failure_reason(test.report['exceptions'])
69
+
70
+ if reason
71
+ puts "Issue update skipped because #{reason}"
72
+
73
+ return false
74
+ end
75
+ end
76
+
77
+ true
78
+ end
79
+
80
+ # Determine any reason to ignore a failure.
81
+ #
82
+ # @param [Array<Hash>] exceptions the exceptions associated with the failure.
83
+ # @return [String] the reason to ignore the exceptions, or `nil` if any exceptions should not be ignored.
84
+ def ignore_failure_reason(exceptions)
85
+ exception_classes = exceptions
86
+ .filter_map { |exception| exception['class'] if IGNORE_EXCEPTIONS.include?(exception['class']) }
87
+ .compact
88
+ return if exception_classes.empty? || exception_classes.size < exceptions.size
89
+
90
+ msg = exception_classes.many? ? 'the errors were' : 'the error was'
91
+ "#{msg} #{exception_classes.join(', ')}"
92
+ end
57
93
  end
58
94
  end
59
95
  end
@@ -35,7 +35,7 @@ module Gitlab
35
35
  note_posted = note_status(issue, test)
36
36
 
37
37
  if labels_updated || note_posted
38
- puts "Issue updated."
38
+ puts "Issue updated: #{issue.web_url}"
39
39
  else
40
40
  puts "Test passed, no results issue update needed."
41
41
  end
@@ -115,7 +115,7 @@ module Gitlab
115
115
  end
116
116
 
117
117
  exception['message'].gsub!(/(private_token=)[\w-]+/, '********')
118
- exception['message_lines'].each { |line| line.gsub!(/(private_token=)([\w-]+)/, '********') }
118
+ Array(exception['message_lines']).each { |line| line.gsub!(/(private_token=)([\w-]+)/, '********') }
119
119
 
120
120
  {
121
121
  'message' => "#{exception['class']}: #{exception['message']}",
@@ -15,6 +15,7 @@ module Gitlab
15
15
  Runtime::Scenario.define(:seed_db, false)
16
16
  Runtime::Scenario.define(:seed_admin_token, true) # Create an admin access token for root user by default
17
17
  Runtime::Scenario.define(:omnibus_exec_commands, [])
18
+ Runtime::Scenario.define(:skip_server_hooks, false)
18
19
 
19
20
  # Omnibus Configurators specified by flags
20
21
  @active_configurators = []
@@ -37,6 +38,10 @@ module Gitlab
37
38
  Runtime::Scenario.define(:seed_admin_token, false)
38
39
  end
39
40
 
41
+ opts.on('--skip-server-hooks', 'Skip adding global git server hooks') do
42
+ Runtime::Scenario.define(:skip_server_hooks, true)
43
+ end
44
+
40
45
  opts.on('--qa-image QA_IMAGE', String, 'Specifies a QA image to be used instead of inferring it from the GitLab image. See Gitlab::QA::Release#qa_image') do |value|
41
46
  Runtime::Scenario.define(:qa_image, value)
42
47
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'forwardable'
4
+ require 'fileutils'
4
5
 
5
6
  module Gitlab
6
7
  module QA
@@ -4,7 +4,7 @@ module Gitlab
4
4
  module QA
5
5
  module Runtime
6
6
  module OmnibusConfigurations
7
- class CiDecomposition < Default
7
+ class DecompositionMultipleDb < Default
8
8
  def configuration
9
9
  # HACK: commenting commands out as these commands should be run *after* the first
10
10
  # reconfiguration (see first command in #exec_commands)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Runtime
6
+ module OmnibusConfigurations
7
+ class DecompositionSingleDb < Default
8
+ def configuration
9
+ <<~OMNIBUS
10
+ gitlab_rails['databases']['main']['enable'] = true
11
+ gitlab_rails['databases']['ci']['enable'] = true
12
+ gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production'
13
+ OMNIBUS
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -12,22 +12,43 @@ module Gitlab
12
12
  # the window defined by the `weekday_hours` method.
13
13
  # We perform a single API call to get the commit
14
14
  class Version < Scenario::Template
15
+ SOURCE_MAP = {
16
+ 'git@dev.gitlab.org:gitlab/gitlab-ee.git' => {
17
+ host: 'dev.gitlab.org',
18
+ project: 'gitlab/gitlab-ee'
19
+ },
20
+ 'git@dev.gitlab.org:gitlab/gitlabhq.git' => {
21
+ host: 'dev.gitlab.org',
22
+ project: 'gitlab/gitlabhq'
23
+ },
24
+ 'git@gitlab.com:gitlab-org/gitlab.git' => {
25
+ host: 'gitlab.com',
26
+ project: 'gitlab-org/gitlab'
27
+ },
28
+ 'git@gitlab.com:gitlab-org/gitlab-foss.git' => {
29
+ host: 'gitlab.com',
30
+ project: 'gitlab-org/gitlab-foss'
31
+ }
32
+ }.freeze
33
+
15
34
  def perform(release = 'ce')
16
35
  version = Component::Gitlab.perform do |gitlab|
17
36
  gitlab.release = release
18
37
  gitlab.act do
19
38
  pull
20
- sha_version
39
+ rails_version
21
40
  end
22
41
  end
23
42
 
24
- project = "gitlab-org/#{QA::Release.new(release).api_project_name}"
25
- commit = api_commit_detail(project, version)
43
+ project = SOURCE_MAP[version[:source]][:project]
44
+ host = SOURCE_MAP[version[:source]][:host]
45
+ sha = version[:sha]
46
+ commit = api_commit_detail(host, project, sha)
26
47
 
27
48
  if commit_within_hours?(commit['created_at'], weekday_hours(commit['created_at']))
28
- puts "Found commit #{version} in recent history of #{project}"
49
+ puts "Found commit #{sha} in recent history of #{project} on #{host}"
29
50
  else
30
- puts "Did not find #{version} in recent history of #{project}"
51
+ puts "Did not find #{sha} in recent history of #{project} on #{host}"
31
52
  exit 1
32
53
  end
33
54
  end
@@ -51,9 +72,14 @@ module Gitlab
51
72
  Time.at(Time.parse(commit_time_string).utc).to_datetime > Time.at((Time.now - hours * 60 * 60).utc).to_datetime
52
73
  end
53
74
 
54
- def api_commit_detail(project, commit_id)
55
- api = 'https://gitlab.com/api/v4'
56
- url = "#{api}/projects/#{CGI.escape(project)}/repository/commits/#{commit_id}"
75
+ def api_commit_detail(host, project, sha)
76
+ url = "https://#{host}/api/v4/projects/#{CGI.escape(project)}/repository/commits/#{sha}"
77
+
78
+ if host == 'dev.gitlab.org'
79
+ Runtime::Env.require_qa_dev_access_token!
80
+
81
+ url = "#{url}?private_token=#{Runtime::Env.qa_dev_access_token}"
82
+ end
57
83
 
58
84
  JSON.parse(Net::HTTP.get(URI(url)))
59
85
  end
@@ -68,12 +68,13 @@ module Gitlab
68
68
 
69
69
  # Log message prefix
70
70
  #
71
+ # @note when outputted, the date will be formatted as "Jun 07 2022 11:30:00 UTC"
71
72
  # @param [DateTime] date
72
73
  # @param [String] source
73
74
  # @param [String] severity
74
75
  # @return [String]
75
76
  def message_prefix(date, source, severity)
76
- "[date=#{date} from=#{source}] #{severity.ljust(5)} -- "
77
+ "[#{date.strftime('%h %d %Y %H:%M:%S %Z')} (#{source})] #{severity.ljust(5)} -- "
77
78
  end
78
79
  end
79
80
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module QA
5
- VERSION = '7.29.1'
5
+ VERSION = '7.32.0'
6
6
  end
7
7
  end
data/lib/gitlab/qa.rb CHANGED
@@ -20,7 +20,8 @@ module Gitlab
20
20
  autoload :ObjectStorageGcs, 'gitlab/qa/runtime/omnibus_configurations/object_storage_gcs'
21
21
  autoload :LicenseMode, 'gitlab/qa/runtime/omnibus_configurations/license_mode'
22
22
  autoload :RegistryObjectStorage, 'gitlab/qa/runtime/omnibus_configurations/registry_object_storage'
23
- autoload :CiDecomposition, 'gitlab/qa/runtime/omnibus_configurations/ci_decomposition'
23
+ autoload :DecompositionSingleDb, 'gitlab/qa/runtime/omnibus_configurations/decomposition_single_db'
24
+ autoload :DecompositionMultipleDb, 'gitlab/qa/runtime/omnibus_configurations/decomposition_multiple_db'
24
25
  end
25
26
  end
26
27
 
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'yaml'
4
+
3
5
  class GenerateQAJobs
4
6
  def initialize(no_of_example_files)
5
7
  @no_of_example_files = no_of_example_files
@@ -7,63 +9,82 @@ class GenerateQAJobs
7
9
  end
8
10
 
9
11
  # rubocop:disable Metrics/AbcSize
10
- # rubocop:disable Metrics/PerceivedComplexity
11
- # rubocop:disable Metrics/CyclomaticComplexity
12
12
  def execute
13
13
  jobs = load_yml_contents('base')
14
- jobs.concat(load_yml_contents('sanity_framework'))
15
- jobs.concat(load_yml_contents('custom_parallel'))
16
- jobs.concat(load_yml_contents('instance')) if should_run?('test_instance_all')
17
- jobs.concat(load_yml_contents('relative_url')) if should_run?('test_instance_all')
18
- jobs.concat(load_yml_contents('ci_decomposition')) if should_run?('test_instance_all')
19
- jobs.concat(load_yml_contents('repository_storage')) if should_run?('test_instance_all_repository_storage')
20
- jobs.concat(load_yml_contents('omnibus_image'))
21
- jobs.concat(load_yml_contents('update')) if should_run?('test_instance_all')
22
- jobs.concat(load_yml_contents('omnibus_upgrade'))
23
- jobs.concat(load_yml_contents('ee_previous_to_ce_update'))
24
- jobs.concat(load_yml_contents('mattermost')) if should_run?('test_integration_mattermost')
25
- jobs.concat(load_yml_contents('service_ping_disabled')) if should_run?('test_integration_servicepingdisabled')
26
- jobs.concat(load_yml_contents('ldap_no_tls')) if should_run?('test_integration_ldapnotls')
27
- jobs.concat(load_yml_contents('ldap_tls')) if should_run?('test_integration_ldaptls')
28
- jobs.concat(load_yml_contents('ldap_no_server')) if should_run?('test_integration_ldapnoserver')
29
- jobs.concat(load_yml_contents('instance_saml')) if should_run?('test_integration_instancesaml')
30
- jobs.concat(load_yml_contents('group_saml')) if should_run?('test_integration_groupsaml')
31
- jobs.concat(load_yml_contents('object_storage')) if should_run?('test_instance_all_object_storage')
32
- jobs.concat(load_yml_contents('object_storage_aws')) if should_run?('test_instance_all_object_storage')
33
- jobs.concat(load_yml_contents('object_storage_gcs')) if should_run?('test_instance_all_object_storage')
34
- jobs.concat(load_yml_contents('object_storage_registry_tls')) if should_run?('test_integration_registrytls')
35
- jobs.concat(load_yml_contents('registry')) if should_run?('test_integration_registry')
36
- jobs.concat(load_yml_contents('packages')) if should_run?('test_instance_all_packages')
37
- jobs.concat(load_yml_contents('elasticsearch')) if should_run?('test_integration_elasticsearch')
38
- jobs.concat(load_yml_contents('praefect')) if should_run?('test_instance_all')
39
- jobs.concat(load_yml_contents('gitaly_cluster')) if should_run?('test_instance_all')
40
- jobs.concat(load_yml_contents('mtls')) if should_run?('test_instance_all_mtls')
41
- jobs.concat(load_yml_contents('smtp')) if should_run?('test_integration_smtp')
42
- jobs.concat(load_yml_contents('jira')) if should_run?('test_instance_all_jira')
43
- jobs.concat(load_yml_contents('integrations')) if should_run?('test_instance_all_integrations')
44
- jobs.concat(load_yml_contents('large_setup')) if should_run?('test_instance_all_can_use_large_setup')
45
- jobs.concat(load_yml_contents('cloud_activation')) if should_run?('test_instance_all_cloud_activation')
46
- jobs.concat(load_yml_contents('registry_with_cdn')) if should_run?('test_integration_registrywithcdn')
47
- jobs.concat(load_yml_contents('staging'))
14
+ jobs.merge!(load_yml_contents('sanity_framework'))
15
+ jobs.merge!(load_yml_contents('custom_parallel'))
16
+ jobs.merge!(load_yml_contents('instance', should_automatically_run?('test_instance_all')))
17
+ jobs.merge!(load_yml_contents('relative_url', should_automatically_run?('test_instance_all')))
18
+ jobs.merge!(load_yml_contents('decomposition_single_db', should_automatically_run?('test_instance_all')))
19
+ jobs.merge!(load_yml_contents('decomposition_multiple_db', should_automatically_run?('test_instance_all')))
20
+ jobs.merge!(load_yml_contents('repository_storage', should_automatically_run?('test_instance_all_repository_storage')))
21
+ jobs.merge!(load_yml_contents('omnibus_image'))
22
+ jobs.merge!(load_yml_contents('update', should_automatically_run?('test_instance_all')))
23
+ jobs.merge!(load_yml_contents('omnibus_upgrade'))
24
+ jobs.merge!(load_yml_contents('ee_previous_to_ce_update'))
25
+ jobs.merge!(load_yml_contents('mattermost', should_automatically_run?('test_integration_mattermost')))
26
+ jobs.merge!(load_yml_contents('service_ping_disabled', should_automatically_run?('test_integration_servicepingdisabled')))
27
+ jobs.merge!(load_yml_contents('ldap_no_tls', should_automatically_run?('test_integration_ldapnotls')))
28
+ jobs.merge!(load_yml_contents('ldap_tls', should_automatically_run?('test_integration_ldaptls')))
29
+ jobs.merge!(load_yml_contents('ldap_no_server', should_automatically_run?('test_integration_ldapnoserver')))
30
+ jobs.merge!(load_yml_contents('instance_saml', should_automatically_run?('test_integration_instancesaml')))
31
+ jobs.merge!(load_yml_contents('group_saml', should_automatically_run?('test_integration_groupsaml')))
32
+ jobs.merge!(load_yml_contents('object_storage', should_automatically_run?('test_instance_all_object_storage')))
33
+ jobs.merge!(load_yml_contents('object_storage_aws', should_automatically_run?('test_instance_all_object_storage')))
34
+ jobs.merge!(load_yml_contents('object_storage_gcs', should_automatically_run?('test_instance_all_object_storage')))
35
+ jobs.merge!(load_yml_contents('object_storage_registry_tls', should_automatically_run?('test_integration_registrytls')))
36
+ jobs.merge!(load_yml_contents('registry', should_automatically_run?('test_integration_registry')))
37
+ jobs.merge!(load_yml_contents('packages', should_automatically_run?('test_instance_all_packages')))
38
+ jobs.merge!(load_yml_contents('elasticsearch', should_automatically_run?('test_integration_elasticsearch')))
39
+ jobs.merge!(load_yml_contents('praefect', should_automatically_run?('test_instance_all')))
40
+ jobs.merge!(load_yml_contents('gitaly_cluster', should_automatically_run?('test_instance_all')))
41
+ jobs.merge!(load_yml_contents('mtls', should_automatically_run?('test_instance_all_mtls')))
42
+ jobs.merge!(load_yml_contents('smtp', should_automatically_run?('test_integration_smtp')))
43
+ jobs.merge!(load_yml_contents('jira', should_automatically_run?('test_instance_all_jira')))
44
+ jobs.merge!(load_yml_contents('integrations', should_automatically_run?('test_instance_all_integrations')))
45
+ jobs.merge!(load_yml_contents('large_setup', should_automatically_run?('test_instance_all_can_use_large_setup')))
46
+ jobs.merge!(load_yml_contents('cloud_activation', should_automatically_run?('test_instance_all_cloud_activation')))
47
+ jobs.merge!(load_yml_contents('registry_with_cdn', should_automatically_run?('test_integration_registrywithcdn')))
48
+ jobs.merge!(load_yml_contents('staging'))
48
49
 
49
50
  # Disabling geo jobs temporarily due to https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/774
50
- # base.concat(load_yml_contents('geo')) if should_run?('scenario_test_geo')
51
+ # jobs.merge!(load_yml_contents('geo', should_automatically_run?('scenario_test_geo')))
52
+
53
+ yaml_string = jobs.to_yaml
54
+ de_stringify_reference(yaml_string)
51
55
 
52
- jobs
56
+ yaml_string
53
57
  end
58
+
54
59
  # rubocop:enable Metrics/AbcSize
55
- # rubocop:enable Metrics/PerceivedComplexity
56
- # rubocop:enable Metrics/CyclomaticComplexity
57
60
 
58
61
  private
59
62
 
60
- def should_run?(example_file_name)
63
+ def should_automatically_run?(example_file_name)
61
64
  @no_of_example_files.include?(example_file_name)
62
65
  end
63
66
 
64
- def load_yml_contents(file_prefix)
67
+ def load_yml_contents(file_prefix, automatic = true)
65
68
  jobs_dir_path = File.expand_path('../.gitlab/ci/jobs', __dir__)
66
- File.read(File.join(jobs_dir_path, "#{file_prefix}.gitlab-ci.yml"))
69
+ file_contents = File.read(File.join(jobs_dir_path, "#{file_prefix}.gitlab-ci.yml"))
70
+
71
+ # Enclose !reference in double quotes at it is not supported with YAML.load
72
+ stringify_reference(file_contents)
73
+ yaml_hash = YAML.safe_load(file_contents)
74
+
75
+ yaml_hash.each { |key, value| value.merge!("when" => "manual") } unless automatic
76
+
77
+ yaml_hash
78
+ end
79
+
80
+ def stringify_reference(str)
81
+ match_data = str.match(/!reference \[[a-zA-Z_, ]*\]/)
82
+ str.gsub!(match_data[0], "\"#{match_data[0]}\"") if match_data
83
+ end
84
+
85
+ def de_stringify_reference(str)
86
+ match_data = str.match(/"(!reference \[[a-zA-Z_, ]*\])"/)
87
+ str.gsub!(match_data[0], match_data[1]) if match_data
67
88
  end
68
89
  end
69
90
 
@@ -51,6 +51,7 @@ class LicenseUsageSeed
51
51
  roles = Gitlab::Access.values
52
52
 
53
53
  GroupMember.create(user_id: user.id, access_level: roles.sample, source_id: group_id)
54
+ Users::UpdateHighestMemberRoleService.new(user).execute
54
55
  end
55
56
 
56
57
  def self.seed_users
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.29.1
4
+ version: 7.32.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab Quality
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-31 00:00:00.000000000 Z
11
+ date: 2022-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -219,9 +219,10 @@ files:
219
219
  - ".gitignore"
220
220
  - ".gitlab-ci.yml"
221
221
  - ".gitlab/ci/jobs/base.gitlab-ci.yml"
222
- - ".gitlab/ci/jobs/ci_decomposition.gitlab-ci.yml"
223
222
  - ".gitlab/ci/jobs/cloud_activation.gitlab-ci.yml"
224
223
  - ".gitlab/ci/jobs/custom_parallel.gitlab-ci.yml"
224
+ - ".gitlab/ci/jobs/decomposition_multiple_db.gitlab-ci.yml"
225
+ - ".gitlab/ci/jobs/decomposition_single_db.gitlab-ci.yml"
225
226
  - ".gitlab/ci/jobs/ee_previous_to_ce_update.gitlab-ci.yml"
226
227
  - ".gitlab/ci/jobs/elasticsearch.gitlab-ci.yml"
227
228
  - ".gitlab/ci/jobs/geo.gitlab-ci.yml"
@@ -336,7 +337,8 @@ files:
336
337
  - lib/gitlab/qa/runtime/env.rb
337
338
  - lib/gitlab/qa/runtime/logger.rb
338
339
  - lib/gitlab/qa/runtime/omnibus_configuration.rb
339
- - lib/gitlab/qa/runtime/omnibus_configurations/ci_decomposition.rb
340
+ - lib/gitlab/qa/runtime/omnibus_configurations/decomposition_multiple_db.rb
341
+ - lib/gitlab/qa/runtime/omnibus_configurations/decomposition_single_db.rb
340
342
  - lib/gitlab/qa/runtime/omnibus_configurations/default.rb
341
343
  - lib/gitlab/qa/runtime/omnibus_configurations/license_mode.rb
342
344
  - lib/gitlab/qa/runtime/omnibus_configurations/object_storage.rb