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 +4 -4
- data/Gemfile.lock +47 -55
- data/docs/what_tests_can_be_run.md +7 -30
- data/gitlab-qa.gemspec +6 -1
- data/lib/gitlab/qa/component/ldap.rb +2 -1
- data/lib/gitlab/qa/component/{minio.rb → silo.rb} +10 -11
- data/lib/gitlab/qa/runtime/omnibus_configurations/object_storage.rb +6 -6
- data/lib/gitlab/qa/support/gitlab_upgrade_path.rb +78 -2
- data/lib/gitlab/qa/version.rb +1 -1
- metadata +8 -8
- data/lib/gitlab/qa/component/chaos.rb +0 -76
- data/lib/gitlab/qa/scenario/test/integration/chaos.rb +0 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8a010f513b5a21083ffc19a88bd9c462ac94b0a79dc6854a67adb11a62b27158
|
|
4
|
+
data.tar.gz: 3e5984e97c8fd28bed2dd8438f0a3fad1d96c4549fd589ada0320379f1246986
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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.
|
|
30
|
-
public_suffix (>= 2.0.2, <
|
|
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
|
-
|
|
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 (
|
|
56
|
+
colored2 (>= 3.1, < 5)
|
|
55
57
|
cork (~> 0.1)
|
|
56
|
-
faraday (>= 0.9.0, <
|
|
58
|
+
faraday (>= 0.9.0, < 3.0)
|
|
57
59
|
faraday-http-cache (~> 2.0)
|
|
58
|
-
git (
|
|
59
|
-
kramdown (
|
|
60
|
+
git (>= 1.13)
|
|
61
|
+
kramdown (>= 2.5.1, < 3.0)
|
|
60
62
|
kramdown-parser-gfm (~> 1.0)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
terminal-table (>= 1, <
|
|
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 (
|
|
74
|
-
faraday-
|
|
75
|
-
|
|
76
|
-
|
|
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-
|
|
91
|
-
|
|
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 (
|
|
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.
|
|
127
|
-
|
|
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.
|
|
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
|
-
|
|
144
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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 (~>
|
|
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
|
-
|
|
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
|
|
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', '~>
|
|
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
|
-
|
|
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
|
|
8
|
-
#
|
|
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
|
|
13
|
-
DOCKER_IMAGE = '
|
|
13
|
+
class Silo < Base
|
|
14
|
+
DOCKER_IMAGE = 'pgsty/silo'
|
|
14
15
|
DOCKER_IMAGE_TAG = 'latest'
|
|
15
|
-
# These are secrets used in a local
|
|
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, '
|
|
51
|
+
File.join(base_dir, 'silo')
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
def name
|
|
54
|
-
@name ||= "
|
|
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
|
|
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
|
-
|
|
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'] = #{
|
|
19
|
+
gitlab_rails['object_store']['connection'] = #{silo.to_config}
|
|
20
20
|
OMNIBUS
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def prepare
|
|
24
|
-
|
|
24
|
+
silo.network = Runtime::Env.docker_network
|
|
25
25
|
|
|
26
26
|
TYPES.each do |bucket_name|
|
|
27
|
-
|
|
27
|
+
silo.add_bucket("#{bucket_name}-bucket")
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
|
|
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
|
|
40
|
-
@
|
|
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
|
data/lib/gitlab/qa/version.rb
CHANGED
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.
|
|
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-
|
|
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: '
|
|
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: '
|
|
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
|