gitlab-qa 15.8.0 → 15.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f712be690928e97a469fb1845b7032a8064df288ea7110c98aa782a01c84a41
4
- data.tar.gz: df0a1fc951cacee6d314fcbdc9e02b1b7e7628d8ae489807a42a1b8713bbb3b4
3
+ metadata.gz: 8a010f513b5a21083ffc19a88bd9c462ac94b0a79dc6854a67adb11a62b27158
4
+ data.tar.gz: 3e5984e97c8fd28bed2dd8438f0a3fad1d96c4549fd589ada0320379f1246986
5
5
  SHA512:
6
- metadata.gz: 057716e20ffafc661fdb6489dc7f23cdb57252f097b8b9c6cf55f62dadcf326140d3725010418c3121f403771779b9ebd8b7f4df290030dd6a906b372df05dc7
7
- data.tar.gz: 660b043282d0d028ea8790c52ec10f0696c1236a15533e469b7514355bfba98f1870144c08b682b40a720464cc1153b5d0a69ca5f75a4f3651920454aabcda81
6
+ metadata.gz: 6be0df446e12c04a6e9c8e36ada004de0fdf56efa8f1df3c7512edad1823da9dcbf31f147a5e8b8a1fd1f986d1e0332694677f4d0f55fedf632242b45293555f
7
+ data.tar.gz: c5330a156dcbeed4c69cc6176b5204418753fa3b6649e8ec67243440bc356cd92ed84fb6bf974730b34c27d288ee62f78b22be4ce0e28cdb1f67c7c16c02ebd2
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-qa (15.8.0)
4
+ gitlab-qa (15.10.0)
5
5
  activesupport (>= 6.1, < 8)
6
6
  ffi (~> 1.17)
7
7
  gitlab (~> 4.19)
@@ -26,8 +26,8 @@ GEM
26
26
  minitest (>= 5.1)
27
27
  securerandom (>= 0.3)
28
28
  tzinfo (~> 2.0, >= 2.0.5)
29
- addressable (2.8.1)
30
- public_suffix (>= 2.0.2, < 6.0)
29
+ addressable (2.9.0)
30
+ public_suffix (>= 2.0.2, < 8.0)
31
31
  ast (2.4.2)
32
32
  backport (1.2.0)
33
33
  base64 (0.3.0)
@@ -48,19 +48,21 @@ GEM
48
48
  colored2 (~> 3.1)
49
49
  crack (0.4.5)
50
50
  rexml
51
- danger (9.1.0)
51
+ csv (3.3.6)
52
+ danger (9.6.1)
53
+ base64 (~> 0.2)
52
54
  claide (~> 1.0)
53
55
  claide-plugins (>= 0.9.2)
54
- colored2 (~> 3.1)
56
+ colored2 (>= 3.1, < 5)
55
57
  cork (~> 0.1)
56
- faraday (>= 0.9.0, < 2.0)
58
+ faraday (>= 0.9.0, < 3.0)
57
59
  faraday-http-cache (~> 2.0)
58
- git (~> 1.7)
59
- kramdown (~> 2.3)
60
+ git (>= 1.13)
61
+ kramdown (>= 2.5.1, < 3.0)
60
62
  kramdown-parser-gfm (~> 1.0)
61
- no_proxy_fix
62
- octokit (~> 5.0)
63
- terminal-table (>= 1, < 4)
63
+ octokit (>= 4.0)
64
+ pstore (~> 0.1)
65
+ terminal-table (>= 1, < 5)
64
66
  danger-gitlab (8.0.0)
65
67
  danger
66
68
  gitlab (~> 4.2, >= 4.2.0)
@@ -70,37 +72,22 @@ GEM
70
72
  unf (>= 0.0.5, < 1.0.0)
71
73
  drb (2.2.3)
72
74
  e2mmap (0.1.0)
73
- faraday (1.10.2)
74
- faraday-em_http (~> 1.0)
75
- faraday-em_synchrony (~> 1.0)
76
- faraday-excon (~> 1.1)
77
- faraday-httpclient (~> 1.0)
78
- faraday-multipart (~> 1.0)
79
- faraday-net_http (~> 1.0)
80
- faraday-net_http_persistent (~> 1.0)
81
- faraday-patron (~> 1.0)
82
- faraday-rack (~> 1.0)
83
- faraday-retry (~> 1.0)
84
- ruby2_keywords (>= 0.0.4)
85
- faraday-em_http (1.0.0)
86
- faraday-em_synchrony (1.0.0)
87
- faraday-excon (1.1.0)
75
+ faraday (2.14.4)
76
+ faraday-net_http (>= 2.0, < 3.5)
77
+ json
78
+ logger
88
79
  faraday-http-cache (2.4.1)
89
80
  faraday (>= 0.8)
90
- faraday-httpclient (1.0.1)
91
- faraday-multipart (1.0.4)
92
- multipart-post (~> 2)
93
- faraday-net_http (1.0.1)
94
- faraday-net_http_persistent (1.2.0)
95
- faraday-patron (1.0.0)
96
- faraday-rack (1.0.0)
97
- faraday-retry (1.0.3)
81
+ faraday-net_http (3.4.4)
82
+ net-http (~> 0.5)
98
83
  ffi (1.17.0)
99
84
  ffi-compiler (1.0.1)
100
85
  ffi (>= 1.0.0)
101
86
  rake
102
- git (1.12.0)
87
+ git (2.3.3)
88
+ activesupport (>= 5.0)
103
89
  addressable (~> 2.8)
90
+ process_executer (~> 1.1)
104
91
  rchardet (~> 1.8)
105
92
  gitlab (4.19.0)
106
93
  httparty (~> 0.20)
@@ -123,15 +110,16 @@ GEM
123
110
  http-cookie (1.0.5)
124
111
  domain_name (~> 0.5)
125
112
  http-form_data (2.3.0)
126
- httparty (0.20.0)
127
- mime-types (~> 3.0)
113
+ httparty (0.24.3)
114
+ csv
115
+ mini_mime (>= 1.0.0)
128
116
  multi_xml (>= 0.5.2)
129
117
  i18n (1.14.7)
130
118
  concurrent-ruby (~> 1.0)
131
119
  jaro_winkler (1.5.6)
132
120
  json (2.6.3)
133
- kramdown (2.4.0)
134
- rexml
121
+ kramdown (2.5.2)
122
+ rexml (>= 3.4.4)
135
123
  kramdown-parser-gfm (1.1.0)
136
124
  kramdown (~> 2.0)
137
125
  lefthook (1.2.6)
@@ -140,17 +128,18 @@ GEM
140
128
  rake (~> 13.0)
141
129
  logger (1.7.0)
142
130
  method_source (1.0.0)
143
- mime-types (3.4.1)
144
- mime-types-data (~> 3.2015)
145
- mime-types-data (3.2022.0105)
146
- mini_portile2 (2.8.0)
131
+ mini_mime (1.1.5)
132
+ mini_portile2 (2.8.9)
147
133
  minitest (5.26.1)
148
134
  multi_xml (0.6.0)
149
- multipart-post (2.2.3)
150
135
  nap (1.1.0)
151
- no_proxy_fix (0.1.2)
152
- nokogiri (1.13.9)
153
- mini_portile2 (~> 2.8.0)
136
+ net-http (0.10.0)
137
+ net-protocol (>= 0.3.0)
138
+ uri (>= 0.11.1)
139
+ net-protocol (0.4.0)
140
+ timeout
141
+ nokogiri (1.17.2)
142
+ mini_portile2 (~> 2.8.2)
154
143
  racc (~> 1.4)
155
144
  octokit (5.6.1)
156
145
  faraday (>= 1, < 3)
@@ -159,23 +148,25 @@ GEM
159
148
  parallel (1.22.1)
160
149
  parser (3.2.2.1)
161
150
  ast (~> 2.4.1)
151
+ process_executer (1.1.2)
162
152
  pry (0.14.1)
163
153
  coderay (~> 1.1)
164
154
  method_source (~> 1.0)
165
155
  pry-byebug (3.10.1)
166
156
  byebug (~> 11.0)
167
157
  pry (>= 0.13, < 0.15)
168
- public_suffix (5.0.0)
169
- racc (1.6.0)
170
- rack (3.0.7)
158
+ pstore (0.2.1)
159
+ public_suffix (6.0.2)
160
+ racc (1.8.1)
161
+ rack (3.2.7)
171
162
  rainbow (3.1.1)
172
163
  rake (13.0.6)
173
164
  rbs (2.8.4)
174
- rchardet (1.8.0)
165
+ rchardet (1.10.2)
175
166
  regexp_parser (2.6.1)
176
167
  reverse_markdown (2.1.1)
177
168
  nokogiri
178
- rexml (3.2.5)
169
+ rexml (3.4.4)
179
170
  rspec (3.13.0)
180
171
  rspec-core (~> 3.13.0)
181
172
  rspec-expectations (~> 3.13.0)
@@ -219,7 +210,6 @@ GEM
219
210
  rubocop-capybara (~> 2.17)
220
211
  rubocop-factory_bot (~> 2.22)
221
212
  ruby-progressbar (1.11.0)
222
- ruby2_keywords (0.0.5)
223
213
  sawyer (0.9.2)
224
214
  addressable (>= 2.3.5)
225
215
  faraday (>= 0.17.3, < 3)
@@ -228,7 +218,7 @@ GEM
228
218
  docile (~> 1.1)
229
219
  simplecov-html (~> 0.11)
230
220
  simplecov_json_formatter (~> 0.1)
231
- simplecov-cobertura (2.1.0)
221
+ simplecov-cobertura (3.2.0)
232
222
  rexml
233
223
  simplecov (~> 0.19)
234
224
  simplecov-html (0.12.3)
@@ -255,12 +245,14 @@ GEM
255
245
  thor (1.2.1)
256
246
  tilt (2.0.11)
257
247
  timecop (0.9.6)
248
+ timeout (0.6.1)
258
249
  tzinfo (2.0.6)
259
250
  concurrent-ruby (~> 1.0)
260
251
  unf (0.1.4)
261
252
  unf_ext
262
253
  unf_ext (0.0.8.2)
263
254
  unicode-display_width (2.4.2)
255
+ uri (1.1.2)
264
256
  webmock (3.7.0)
265
257
  addressable (>= 2.3.6)
266
258
  crack (>= 0.3.2)
@@ -284,7 +276,7 @@ DEPENDENCIES
284
276
  rake (~> 13.0)
285
277
  rspec (~> 3.13)
286
278
  simplecov (~> 0.22)
287
- simplecov-cobertura (~> 2.1)
279
+ simplecov-cobertura (~> 3.0)
288
280
  solargraph (~> 0.41)
289
281
  timecop (~> 0.9.5)
290
282
  webmock (= 3.7.0)
@@ -304,8 +304,12 @@ Scenario verifies upgrade from previous (major|minor|patch) version to current r
304
304
 
305
305
  - Deploys previous (major|minor|patch) version and runs Health Check test suite (Smoke test suite if below 17.1.0)
306
306
  to populate data in database before upgrade
307
- - Generates upgrade path following current GitLab recommendations
308
- from ['gitlab.com/gitlab-org/gitlab'](https://gitlab.com/gitlab-org/gitlab/-/raw/master/config/upgrade_path.yml) project
307
+ - Generates upgrade path following current GitLab recommendations.
308
+ The upgrade path is resolved in this order:
309
+ 1. `QA_UPGRADE_PATH_FILE` env var — explicit path to a local YAML file.
310
+ 2. `$CI_PROJECT_DIR/config/upgrade_path.yml` — set automatically in GitLab CI when running inside a `gitlab-org/gitlab` pipeline.
311
+ 3. `../config/upgrade_path.yml` relative to the working directory — covers running from the `qa/` subdirectory of a gitlab checkout.
312
+ 4. Remote fetch from [`gitlab.com/gitlab-org/gitlab`](https://gitlab.com/gitlab-org/gitlab/-/raw/master/config/upgrade_path.yml) (fallback when no local file is found).
309
313
  - Gradually upgrades GitLab instances to `<current_version>`
310
314
  associated with provided `<full image address>` and runs tests against it
311
315
 
@@ -1042,7 +1046,7 @@ $ gitlab-qa Test::Instance::Airgapped EE -- --tag smoke
1042
1046
 
1043
1047
  ### `Test::Instance::Image CE|EE|<full image address> --omnibus-config object_storage`
1044
1048
 
1045
- This orchestrated scenario runs tests from the test suite against a GitLab instance which has object storage configured instead of using local storage. The omnibus configuration `object_storage` ([configurator](configuring_omnibus.md)), uses Minio and `object_storage_aws` uses an AWS S3 account with credentials configured in the pipeline as CI Variables. To use Google Cloud Storage pass `--omnibus-config object_storage_gcp`. According to the storage selected it requires:
1049
+ This orchestrated scenario runs tests from the test suite against a GitLab instance which has object storage configured instead of using local storage. The omnibus configuration `object_storage` ([configurator](configuring_omnibus.md)), uses [Silo](https://github.com/pgsty/silo) (a MinIO fork) and `object_storage_aws` uses an AWS S3 account with credentials configured in the pipeline as CI Variables. To use Google Cloud Storage pass `--omnibus-config object_storage_gcp`. According to the storage selected it requires:
1046
1050
 
1047
1051
  | Scenario | Variable | Description |
1048
1052
  |-----------------------|---------------------|--------------------------------------|
@@ -1135,33 +1139,6 @@ $ export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
1135
1139
  $ gitlab-qa Test::Instance::Geo EE https://primary.gitlab.com https://secondary.gitlab.com
1136
1140
  ```
1137
1141
 
1138
- ### `Test::Instance::Chaos`
1139
-
1140
- This scenario will run a limited number of tests that are tagged with `:chaos`.
1141
-
1142
- These tests are designed to verify that our systems can gracefully handle scenarios which may occur if
1143
- networking or connectivity type issues occur in various Gitlab components.
1144
- They make use of [toxiproxy](https://github.com/Shopify/toxiproxy) to act as a proxy allowing us to introduce
1145
- connectivity issues, via the [toxiproxy ruby client](https://github.com/Shopify/toxiproxy-ruby) in an E2E spec.
1146
-
1147
- Sample Test:
1148
-
1149
- ```ruby
1150
- context 'when a gitaly node is experiencing high latency' do
1151
- it 'can create a project' do
1152
- Toxiproxy[:gitaly1].toxic(:latency, latency: 30000).apply do
1153
- expect(create_a_project).to be true
1154
- end
1155
- end
1156
- end
1157
- ```
1158
-
1159
- Example:
1160
-
1161
- ```shell
1162
- $ gitlab-qa Test::Instance::Chaos
1163
- ```
1164
-
1165
1142
  ### `Test::Integration::Import`
1166
1143
 
1167
1144
  This scenario will run specs tagged with `:import` tags.
data/gitlab-qa.gemspec CHANGED
@@ -16,6 +16,11 @@ Gem::Specification.new do |spec|
16
16
  spec.homepage = 'http://about.gitlab.com/'
17
17
  spec.license = 'MIT'
18
18
 
19
+ spec.metadata = {
20
+ 'source_code_uri' => 'https://gitlab.com/gitlab-org/gitlab-qa',
21
+ 'bug_tracker_uri' => 'https://gitlab.com/gitlab-org/gitlab-qa/-/issues'
22
+ }
23
+
19
24
  spec.files = `git ls-files -z`
20
25
  .split("\x0").reject { |f| f.match(%r{^spec/}) }
21
26
  spec.bindir = 'exe'
@@ -31,7 +36,7 @@ Gem::Specification.new do |spec|
31
36
  spec.add_development_dependency 'rake', '~> 13.0'
32
37
  spec.add_development_dependency 'rspec', '~> 3.13'
33
38
  spec.add_development_dependency 'simplecov', '~> 0.22'
34
- spec.add_development_dependency 'simplecov-cobertura', '~> 2.1'
39
+ spec.add_development_dependency 'simplecov-cobertura', '~> 3.0'
35
40
  spec.add_development_dependency 'solargraph', '~> 0.41'
36
41
  spec.add_development_dependency 'timecop', '~> 0.9.5'
37
42
  spec.add_development_dependency 'webmock', '3.7.0'
@@ -104,7 +104,8 @@ module Gitlab
104
104
  #
105
105
  # @return [String]
106
106
  def working_dir_tmp_fixture_path
107
- @local_fixture_path ||= Dir.mktmpdir('ldap', FileUtils.mkdir_p("#{Dir.pwd}/tmp"))
107
+ FileUtils.mkdir_p("#{Dir.pwd}/tmp")
108
+ @local_fixture_path ||= Dir.mktmpdir('ldap', "#{Dir.pwd}/tmp")
108
109
  end
109
110
 
110
111
  # Copy fixtures to current working directory
@@ -4,15 +4,16 @@ require 'securerandom'
4
4
  require 'fileutils'
5
5
  require 'yaml'
6
6
 
7
- # This component sets up the Minio (https://hub.docker.com/r/minio/minio)
8
- # image with the proper configuration for GitLab users to use object storage.
7
+ # This component sets up Silo (https://github.com/pgsty/silo), a community-maintained
8
+ # MinIO fork, with the proper configuration for GitLab users to use object storage.
9
+ # The public minio/minio Docker images are no longer published.
9
10
  module Gitlab
10
11
  module QA
11
12
  module Component
12
- class Minio < Base
13
- DOCKER_IMAGE = 'minio/minio'
13
+ class Silo < Base
14
+ DOCKER_IMAGE = 'pgsty/silo'
14
15
  DOCKER_IMAGE_TAG = 'latest'
15
- # These are secrets used in a local Minio container, they're not used for any online S3 server.
16
+ # These are secrets used in a local Silo container, they're not used for any online S3 server.
16
17
  AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE'
17
18
  AWS_SECRET_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
18
19
  DATA_DIR = '/data'
@@ -47,11 +48,11 @@ module Gitlab
47
48
  def host_data_dir
48
49
  base_dir = ENV['CI_PROJECT_DIR'] || '/tmp'
49
50
 
50
- File.join(base_dir, 'minio')
51
+ File.join(base_dir, 'silo')
51
52
  end
52
53
 
53
54
  def name
54
- @name ||= "minio-#{SecureRandom.hex(4)}"
55
+ @name ||= "silo-#{SecureRandom.hex(4)}"
55
56
  end
56
57
 
57
58
  def port
@@ -64,15 +65,13 @@ module Gitlab
64
65
  FileUtils.mkdir_p(host_data_dir)
65
66
 
66
67
  @buckets.each do |bucket|
67
- Runtime::Logger.info("Creating Minio bucket: #{bucket}")
68
+ Runtime::Logger.info("Creating Silo bucket: #{bucket}")
68
69
  FileUtils.mkdir_p(File.join(host_data_dir, bucket))
69
70
  end
70
71
  end
71
72
 
72
73
  def start # rubocop:disable Metrics/AbcSize
73
- # --compat needed until https://gitlab.com/gitlab-org/gitlab-workhorse/issues/210
74
- # is resolved
75
- docker.run(image: image, tag: tag, args: ["server", "--compat", DATA_DIR]) do |command|
74
+ docker.run(image: image, tag: tag, args: ["server", DATA_DIR]) do |command|
76
75
  command << '-d '
77
76
  command << "--name #{name}"
78
77
  command << "--net #{network}"
@@ -16,18 +16,18 @@ module Gitlab
16
16
  config << <<~OMNIBUS
17
17
  gitlab_rails['object_store']['enabled'] = true
18
18
  gitlab_rails['object_store']['proxy_download'] = true
19
- gitlab_rails['object_store']['connection'] = #{minio.to_config}
19
+ gitlab_rails['object_store']['connection'] = #{silo.to_config}
20
20
  OMNIBUS
21
21
  end
22
22
 
23
23
  def prepare
24
- minio.network = Runtime::Env.docker_network
24
+ silo.network = Runtime::Env.docker_network
25
25
 
26
26
  TYPES.each do |bucket_name|
27
- minio.add_bucket("#{bucket_name}-bucket")
27
+ silo.add_bucket("#{bucket_name}-bucket")
28
28
  end
29
29
 
30
- minio
30
+ silo
31
31
  end
32
32
 
33
33
  def exec_commands
@@ -36,8 +36,8 @@ module Gitlab
36
36
 
37
37
  private
38
38
 
39
- def minio
40
- @minio ||= Component::Minio.new
39
+ def silo
40
+ @silo ||= Component::Silo.new
41
41
  end
42
42
  end
43
43
  end
@@ -209,20 +209,82 @@ module Gitlab
209
209
  UPGRADE_PATH_URL = "https://gitlab.com/gitlab-org/gitlab/-/raw/master/config/upgrade_path.yml"
210
210
  UPGRADE_PATH_RETRIES = 3
211
211
  UPGRADE_PATH_RETRY_DELAY = 5
212
+ UPGRADE_PATH_RELATIVE_FILE = "config/upgrade_path.yml"
212
213
 
213
214
  # Upgrade path yml
214
215
  #
215
216
  # @return [String]
216
217
  def upgrade_path_yml
217
- @upgrade_path_yml ||= fetch_upgrade_path_with_retry
218
+ @upgrade_path_yml ||= read_local_upgrade_path || fetch_upgrade_path_with_retry
218
219
  end
219
220
 
221
+ # Attempt to read upgrade_path.yml from a local checkout, trying candidate
222
+ # paths in order:
223
+ # 1. The file pointed to by the QA_UPGRADE_PATH_FILE env var (explicit override).
224
+ # 2. $CI_PROJECT_DIR/config/upgrade_path.yml (set by GitLab CI when gitlab-qa
225
+ # runs inside a gitlab checkout pipeline).
226
+ # 3. ../config/upgrade_path.yml relative to the working directory (gitlab-qa
227
+ # typically runs from the qa/ subdirectory of a gitlab checkout).
228
+ #
229
+ # Returns the file contents as a String when a readable file is found, or nil
230
+ # when none of the candidates exist so the caller can fall back to a remote fetch.
231
+ #
232
+ # @return [String, nil]
233
+ def read_local_upgrade_path
234
+ warn_if_explicit_override_missing
235
+
236
+ candidates = local_upgrade_path_candidates.select { |path| File.file?(path) }
237
+ return if candidates.empty?
238
+
239
+ path = candidates.first
240
+ content = File.read(path)
241
+
242
+ if content.strip.empty?
243
+ logger.warn("Local upgrade path file is empty, falling back to remote fetch: #{path}")
244
+ return
245
+ end
246
+
247
+ logger.info("Reading gitlab upgrade path from local file: #{path}")
248
+ content
249
+ end
250
+
251
+ # Ordered list of local file path candidates for upgrade_path.yml.
252
+ #
253
+ # @return [Array<String>]
254
+ def local_upgrade_path_candidates
255
+ candidates = []
256
+ candidates << ENV["QA_UPGRADE_PATH_FILE"] if ENV["QA_UPGRADE_PATH_FILE"]
257
+ candidates << File.join(ENV["CI_PROJECT_DIR"], UPGRADE_PATH_RELATIVE_FILE) if ENV["CI_PROJECT_DIR"]
258
+ candidates << File.expand_path(File.join("..", UPGRADE_PATH_RELATIVE_FILE))
259
+ candidates
260
+ end
261
+
262
+ # Log a warning when QA_UPGRADE_PATH_FILE is explicitly set but does not point
263
+ # to a readable file. A typo'd or stale path would otherwise silently fall
264
+ # through to the CI_PROJECT_DIR / relative-path candidates (or the remote
265
+ # fetch), producing a different upgrade path than the user intended.
266
+ #
267
+ # @return [void]
268
+ def warn_if_explicit_override_missing
269
+ explicit = ENV.fetch("QA_UPGRADE_PATH_FILE", nil)
270
+ return unless explicit
271
+ return if File.file?(explicit)
272
+
273
+ logger.warn("QA_UPGRADE_PATH_FILE is set to '#{explicit}' but the file does not exist; " \
274
+ "falling through to other candidates")
275
+ end
276
+
277
+ # Fetch upgrade_path.yml from the remote GitLab repository, retrying on
278
+ # transient errors. Raises after UPGRADE_PATH_RETRIES failed attempts.
279
+ #
280
+ # @return [String]
220
281
  def fetch_upgrade_path_with_retry
221
282
  retries = 0
283
+ headers = upgrade_path_request_headers
222
284
 
223
285
  logger.info("Fetching gitlab upgrade path from 'gitlab.com/gitlab-org/gitlab' project")
224
286
  begin
225
- HttpRequest.make_http_request(url: UPGRADE_PATH_URL).body
287
+ HttpRequest.make_http_request(url: UPGRADE_PATH_URL, headers: headers).body
226
288
  rescue StandardError => e
227
289
  retries += 1
228
290
  if retries <= UPGRADE_PATH_RETRIES
@@ -234,6 +296,20 @@ module Gitlab
234
296
  raise "Failed to fetch gitlab upgrade path after #{UPGRADE_PATH_RETRIES} retries: #{e.message}"
235
297
  end
236
298
  end
299
+
300
+ # Build request headers for the upgrade path HTTP fetch.
301
+ #
302
+ # Includes a User-Agent header when GITLAB_QA_USER_AGENT is set, so the
303
+ # request matches the Cloudflare bypass rule already in place for GitLab QA.
304
+ #
305
+ # @return [Hash]
306
+ def upgrade_path_request_headers
307
+ user_agent = Runtime::Env.gitlab_qa_user_agent.to_s.strip
308
+ return {} if user_agent.empty?
309
+
310
+ logger.info("Using GITLAB_QA_USER_AGENT for upgrade path fetch")
311
+ { "User-Agent" => user_agent }
312
+ end
237
313
  end
238
314
  end
239
315
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Gitlab
4
4
  module QA
5
- VERSION = '15.8.0'
5
+ VERSION = '15.10.0'
6
6
  end
7
7
  end
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: 15.8.0
4
+ version: 15.10.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: 2026-07-10 00:00:00.000000000 Z
11
+ date: 2026-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '2.1'
145
+ version: '3.0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '2.1'
152
+ version: '3.0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: solargraph
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -402,7 +402,6 @@ files:
402
402
  - lib/gitlab/qa/component/ai_gateway.rb
403
403
  - lib/gitlab/qa/component/alpine.rb
404
404
  - lib/gitlab/qa/component/base.rb
405
- - lib/gitlab/qa/component/chaos.rb
406
405
  - lib/gitlab/qa/component/duo_workflow_service.rb
407
406
  - lib/gitlab/qa/component/elasticsearch.rb
408
407
  - lib/gitlab/qa/component/gitaly.rb
@@ -412,7 +411,6 @@ files:
412
411
  - lib/gitlab/qa/component/ldap.rb
413
412
  - lib/gitlab/qa/component/license_ops.rb
414
413
  - lib/gitlab/qa/component/mail_hog.rb
415
- - lib/gitlab/qa/component/minio.rb
416
414
  - lib/gitlab/qa/component/mock_server.rb
417
415
  - lib/gitlab/qa/component/opensearch.rb
418
416
  - lib/gitlab/qa/component/pipeline_ops.rb
@@ -425,6 +423,7 @@ files:
425
423
  - lib/gitlab/qa/component/runner_ops.rb
426
424
  - lib/gitlab/qa/component/saml.rb
427
425
  - lib/gitlab/qa/component/selenoid.rb
426
+ - lib/gitlab/qa/component/silo.rb
428
427
  - lib/gitlab/qa/component/specs.rb
429
428
  - lib/gitlab/qa/component/staging.rb
430
429
  - lib/gitlab/qa/component/staging_ref.rb
@@ -468,7 +467,6 @@ files:
468
467
  - lib/gitlab/qa/scenario/test/integration/ai_gateway_no_add_on.rb
469
468
  - lib/gitlab/qa/scenario/test/integration/ai_gateway_no_license.rb
470
469
  - lib/gitlab/qa/scenario/test/integration/ai_gateway_no_seat_assigned.rb
471
- - lib/gitlab/qa/scenario/test/integration/chaos.rb
472
470
  - lib/gitlab/qa/scenario/test/integration/client_ssl.rb
473
471
  - lib/gitlab/qa/scenario/test/integration/continuous_vulnerability_scanning.rb
474
472
  - lib/gitlab/qa/scenario/test/integration/duo_agent_platform.rb
@@ -536,7 +534,9 @@ files:
536
534
  homepage: http://about.gitlab.com/
537
535
  licenses:
538
536
  - MIT
539
- metadata: {}
537
+ metadata:
538
+ source_code_uri: https://gitlab.com/gitlab-org/gitlab-qa
539
+ bug_tracker_uri: https://gitlab.com/gitlab-org/gitlab-qa/-/issues
540
540
  post_install_message:
541
541
  rdoc_options: []
542
542
  require_paths:
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
-
5
- module Gitlab
6
- module QA
7
- module Component
8
- class Chaos < Base
9
- DOCKER_IMAGE = 'ghcr.io/shopify/toxiproxy'
10
- DOCKER_IMAGE_TAG = '2.5.0'
11
-
12
- def initialize
13
- super
14
- @network = Runtime::Env.docker_network
15
- end
16
-
17
- def name
18
- @name ||= "chaos"
19
- end
20
-
21
- def start
22
- prepare
23
- docker.run(image: image, tag: tag) do |command|
24
- command << '-d '
25
- command << "--name #{name}"
26
- command << "--network #{@network}"
27
- command << "--publish 8474:8474"
28
- end
29
-
30
- QA::Support::Shellout.shell <<~CMD
31
- docker run --network #{@network} --rm curlimages/curl:7.85.0 \
32
- -i -s \
33
- -X POST http://#{name}:8474/populate \
34
- -H 'Content-Type: application/json' \
35
- -d '#{proxies.to_json}'
36
- CMD
37
- end
38
-
39
- def proxies
40
- [
41
- {
42
- name: "postgres",
43
- listen: "[::]:5432",
44
- upstream: "postgres.test:5432",
45
- enabled: true
46
- },
47
- {
48
- name: "praefect",
49
- listen: "[::]:2305",
50
- upstream: "praefect.test:2305",
51
- enabled: true
52
- },
53
- {
54
- name: "gitaly1",
55
- listen: "[::]:8076",
56
- upstream: "gitaly1.test:8076",
57
- enabled: true
58
- },
59
- {
60
- name: "gitaly2",
61
- listen: "[::]:8077",
62
- upstream: "gitaly2.test:8077",
63
- enabled: true
64
- },
65
- {
66
- name: "gitaly3",
67
- listen: "[::]:8078",
68
- upstream: "gitaly3.test:8078",
69
- enabled: true
70
- }
71
- ]
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gitlab
4
- module QA
5
- module Scenario
6
- module Test
7
- module Integration
8
- class Chaos < Praefect
9
- def initialize
10
- super
11
-
12
- @praefect_addr = "chaos.test"
13
- @database_addr = "chaos.test"
14
- @primary_node_addr = "chaos.test"
15
- @primary_node_port = 8076
16
- @secondary_node_addr = "chaos.test"
17
- @secondary_node_port = 8077
18
- @tertiary_node_addr = "chaos.test"
19
- @tertiary_node_port = 8078
20
- end
21
-
22
- def perform(release, *rspec_args)
23
- @chaos_node = Component::Chaos.new.tap(&:start)
24
-
25
- run_gitaly_cluster(release, rspec_args)
26
- ensure
27
- @chaos_node&.teardown
28
- @praefect_node&.teardown
29
- @sql_node&.teardown
30
- @gitaly_primary_node&.teardown
31
- @gitaly_secondary_node&.teardown
32
- @gitaly_tertiary_node&.teardown
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end