gitlab-qa 9.1.1 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +106 -149
- data/.simplecov +9 -0
- data/Gemfile.lock +15 -1
- data/README.md +5 -4
- data/docs/what_tests_can_be_run.md +73 -35
- data/gitlab-qa.gemspec +3 -0
- data/lib/gitlab/qa/component/base.rb +8 -1
- data/lib/gitlab/qa/component/gitaly.rb +1 -1
- data/lib/gitlab/qa/component/gitlab.rb +2 -2
- data/lib/gitlab/qa/component/mock_server.rb +13 -0
- data/lib/gitlab/qa/report/gitlab_issue_client.rb +1 -1
- data/lib/gitlab/qa/report/relate_failure_issue.rb +95 -17
- data/lib/gitlab/qa/report/report_as_issue.rb +1 -1
- data/lib/gitlab/qa/runtime/env.rb +17 -4
- data/lib/gitlab/qa/runtime/omnibus_configurations/decomposition_multiple_db.rb +1 -1
- data/lib/gitlab/qa/runtime/omnibus_configurations/object_storage_aws.rb +1 -1
- data/lib/gitlab/qa/scenario/test/integration/oauth.rb +68 -0
- data/lib/gitlab/qa/scenario/test/omnibus/update_from_previous.rb +3 -2
- data/lib/gitlab/qa/version.rb +1 -1
- data/scripts/build-package-and-test-env +15 -0
- metadata +47 -47
- data/.gitlab/ci/jobs/airgapped.gitlab-ci.yml +0 -23
- data/.gitlab/ci/jobs/base.gitlab-ci.yml +0 -273
- data/.gitlab/ci/jobs/chaos.gitlab-ci.yml +0 -22
- data/.gitlab/ci/jobs/cloud_activation.gitlab-ci.yml +0 -24
- data/.gitlab/ci/jobs/custom_parallel.gitlab-ci.yml +0 -21
- data/.gitlab/ci/jobs/decomposition_multiple_db.gitlab-ci.yml +0 -27
- data/.gitlab/ci/jobs/decomposition_single_db.gitlab-ci.yml +0 -25
- data/.gitlab/ci/jobs/ee_previous_to_ce_update.gitlab-ci.yml +0 -18
- data/.gitlab/ci/jobs/elasticsearch.gitlab-ci.yml +0 -20
- data/.gitlab/ci/jobs/geo.gitlab-ci.yml +0 -18
- data/.gitlab/ci/jobs/gitaly_cluster.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/gitlab_pages.gitlab-ci.yml +0 -19
- data/.gitlab/ci/jobs/group_saml.gitlab-ci.yml +0 -20
- data/.gitlab/ci/jobs/instance.gitlab-ci.yml +0 -55
- data/.gitlab/ci/jobs/instance_saml.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/integrations.gitlab-ci.yml +0 -14
- data/.gitlab/ci/jobs/jira.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/large_setup.gitlab-ci.yml +0 -19
- data/.gitlab/ci/jobs/ldap_no_server.gitlab-ci.yml +0 -20
- data/.gitlab/ci/jobs/ldap_no_tls.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/ldap_tls.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/mattermost.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/metrics.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/mtls.gitlab-ci.yml +0 -19
- data/.gitlab/ci/jobs/object_storage.gitlab-ci.yml +0 -49
- data/.gitlab/ci/jobs/object_storage_aws.gitlab-ci.yml +0 -25
- data/.gitlab/ci/jobs/object_storage_gcs.gitlab-ci.yml +0 -23
- data/.gitlab/ci/jobs/object_storage_registry_tls.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/omnibus_image.gitlab-ci.yml +0 -15
- data/.gitlab/ci/jobs/omnibus_upgrade.gitlab-ci.yml +0 -28
- data/.gitlab/ci/jobs/opensearch.gitlab-ci.yml +0 -20
- data/.gitlab/ci/jobs/packages.gitlab-ci.yml +0 -25
- data/.gitlab/ci/jobs/praefect.gitlab-ci.yml +0 -71
- data/.gitlab/ci/jobs/registry.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/registry_with_cdn.gitlab-ci.yml +0 -55
- data/.gitlab/ci/jobs/relative_url.gitlab-ci.yml +0 -65
- data/.gitlab/ci/jobs/repository_storage.gitlab-ci.yml +0 -41
- data/.gitlab/ci/jobs/sanity_framework.gitlab-ci.yml +0 -24
- data/.gitlab/ci/jobs/service_ping_disabled.gitlab-ci.yml +0 -19
- data/.gitlab/ci/jobs/smtp.gitlab-ci.yml +0 -19
- data/.gitlab/ci/jobs/staging.gitlab-ci.yml +0 -10
- data/.gitlab/ci/jobs/update.gitlab-ci.yml +0 -60
- data/.gitlab/ci/rules.gitlab-ci.yml +0 -183
- data/lib/gitlab/qa/scenario/test/omnibus/update.rb +0 -72
- data/scripts/generate-qa-jobs.rb +0 -99
@@ -13,8 +13,11 @@ module Gitlab
|
|
13
13
|
include FindSetDri
|
14
14
|
|
15
15
|
DEFAULT_MAX_DIFF_RATIO_FOR_DETECTION = 0.15
|
16
|
+
SPAM_THRESHOLD_FOR_FAILURE_ISSUES = 3
|
16
17
|
FAILURE_STACKTRACE_REGEX = %r{((.*Failure\/Error:(?<stacktrace>.+))|(?<stacktrace>.+))}m.freeze
|
17
18
|
ISSUE_STACKTRACE_REGEX = /### Stack trace\s*(```)#{FAILURE_STACKTRACE_REGEX}(```)/m.freeze
|
19
|
+
FAILED_JOB_DESCRIPTION_REGEX = %r{First happened in https?:\/\/\S+\.}m.freeze
|
20
|
+
FAILED_JOB_NOTE_REGEX = %r{Failed most recently in \D+ pipeline: https?:\/\/\S+}.freeze
|
18
21
|
NEW_ISSUE_LABELS = Set.new(%w[QA Quality test failure::new priority::2]).freeze
|
19
22
|
IGNORE_EXCEPTIONS = ['Net::ReadTimeout'].freeze
|
20
23
|
|
@@ -60,17 +63,34 @@ module Gitlab
|
|
60
63
|
|
61
64
|
def find_and_link_issue(test)
|
62
65
|
issue, diff_ratio = find_failure_issue(test)
|
66
|
+
issue_already_commented = issue ? @commented_issue_list.include?(issue.web_url) : nil
|
63
67
|
|
64
|
-
if issue
|
68
|
+
if issue && !issue_already_commented
|
65
69
|
puts " => Found issue #{issue.web_url} for test '#{test.name}' with a diff ratio of #{(diff_ratio * 100).round(2)}%."
|
66
|
-
|
70
|
+
post_or_update_failed_job_note(issue, test)
|
67
71
|
@commented_issue_list.add(issue.web_url)
|
72
|
+
else
|
73
|
+
puts " => Failure already commented on issue." if issue_already_commented
|
74
|
+
|
75
|
+
return false
|
68
76
|
end
|
69
77
|
|
70
78
|
issue
|
71
79
|
end
|
72
80
|
|
73
81
|
def create_issue(test)
|
82
|
+
similar_issues = pipeline_issues_with_similar_stacktrace(test)
|
83
|
+
|
84
|
+
if similar_issues.size >= SPAM_THRESHOLD_FOR_FAILURE_ISSUES
|
85
|
+
puts " => Similar failure issues have already been opened for same pipeline environment"
|
86
|
+
puts " => Will not create new issue for this failing spec"
|
87
|
+
similar_issues.each do |similar_issue|
|
88
|
+
puts "Please check issue: #{similar_issue.web_url}"
|
89
|
+
gitlab.create_issue_note(iid: similar_issue.iid, note: "This failed job is most likely related: #{test.ci_job_url}")
|
90
|
+
end
|
91
|
+
return
|
92
|
+
end
|
93
|
+
|
74
94
|
issue = super
|
75
95
|
puts "for test '#{test.name}'."
|
76
96
|
|
@@ -81,6 +101,50 @@ module Gitlab
|
|
81
101
|
issue
|
82
102
|
end
|
83
103
|
|
104
|
+
def pipeline_issues_with_similar_stacktrace(test)
|
105
|
+
gitlab.find_issues(options: { state: 'opened', labels: 'QA,failure::new', created_after: past_timestamp(2) }).select do |issue|
|
106
|
+
job_url_from_issue = failed_issue_job_url(issue)
|
107
|
+
next unless pipeline == pipeline_env_from_job_url(job_url_from_issue)
|
108
|
+
|
109
|
+
stack_trace_from_issue = cleaned_stack_trace_from_issue(issue)
|
110
|
+
stack_trace_from_test = cleaned_stacktrace_from_test(test)
|
111
|
+
diff_ratio = compare_stack_traces(stack_trace_from_test, stack_trace_from_issue)
|
112
|
+
diff_ratio < max_diff_ratio
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def failed_issue_job_url(issue)
|
117
|
+
existing_note = existing_failure_note(issue)
|
118
|
+
if existing_note
|
119
|
+
job_url_string = existing_note.body
|
120
|
+
matched = job_url_string.match(FAILED_JOB_NOTE_REGEX)
|
121
|
+
else
|
122
|
+
job_url_string = issue.description
|
123
|
+
matched = job_url_string.match(FAILED_JOB_DESCRIPTION_REGEX)
|
124
|
+
end
|
125
|
+
|
126
|
+
return unless matched
|
127
|
+
|
128
|
+
job_url = matched[0].chop.split(" ").last
|
129
|
+
puts "=> Found failed job url in the issue: #{job_url}"
|
130
|
+
job_url
|
131
|
+
end
|
132
|
+
|
133
|
+
def pipeline_env_from_job_url(job_url)
|
134
|
+
return if job_url.nil?
|
135
|
+
|
136
|
+
if job_url.include?('/quality/')
|
137
|
+
job_url.partition('/quality/').last.partition('/').first
|
138
|
+
else
|
139
|
+
'master'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def past_timestamp(hours_ago)
|
144
|
+
timestamp = Time.now - (hours_ago * 60 * 60)
|
145
|
+
timestamp.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
146
|
+
end
|
147
|
+
|
84
148
|
def failure_issues(test)
|
85
149
|
gitlab.find_issues(options: { state: 'opened', labels: 'QA' }).select do |issue|
|
86
150
|
issue_title = issue.title.strip
|
@@ -96,20 +160,36 @@ module Gitlab
|
|
96
160
|
end
|
97
161
|
end
|
98
162
|
|
99
|
-
def
|
100
|
-
|
163
|
+
def cleaned_stack_trace_from_issue(issue)
|
164
|
+
relevant_issue_stacktrace = find_issue_stacktrace(issue)
|
165
|
+
return unless relevant_issue_stacktrace
|
166
|
+
|
167
|
+
remove_unique_resource_names(relevant_issue_stacktrace)
|
168
|
+
end
|
169
|
+
|
170
|
+
def cleaned_stacktrace_from_test(test)
|
101
171
|
first_test_failure_stacktrace = sanitize_stacktrace(full_stacktrace(test), FAILURE_STACKTRACE_REGEX) || full_stacktrace(test)
|
102
|
-
|
172
|
+
remove_unique_resource_names(first_test_failure_stacktrace)
|
173
|
+
end
|
174
|
+
|
175
|
+
def compare_stack_traces(stack_trace_first, stack_trace_second)
|
176
|
+
calculate_diff_ratio(stack_trace_first, stack_trace_second)
|
177
|
+
end
|
103
178
|
|
179
|
+
def calculate_diff_ratio(stack_trace_first, stack_trace_second)
|
180
|
+
ld = Class.new.extend(Gem::Text).method(:levenshtein_distance)
|
181
|
+
distance = ld.call(stack_trace_first, stack_trace_second)
|
182
|
+
distance.zero? ? 0.0 : (distance.to_f / stack_trace_first.size).round(3)
|
183
|
+
end
|
184
|
+
|
185
|
+
def find_relevant_failure_issues(test) # rubocop:disable Metrics/AbcSize
|
186
|
+
clean_first_test_failure_stacktrace = cleaned_stacktrace_from_test(test)
|
104
187
|
# Search with the `search` param returns 500 errors, so we filter by ~QA and then filter further in Ruby
|
105
188
|
failure_issues(test).each_with_object({}) do |issue, memo|
|
106
|
-
|
107
|
-
next
|
108
|
-
|
109
|
-
clean_relevant_issue_stacktrace = remove_unique_resource_names(relevant_issue_stacktrace)
|
110
|
-
distance = ld.call(clean_first_test_failure_stacktrace, clean_relevant_issue_stacktrace)
|
111
|
-
diff_ratio = distance.zero? ? 0.0 : (distance.to_f / clean_first_test_failure_stacktrace.size).round(3)
|
189
|
+
clean_relevant_issue_stacktrace = cleaned_stack_trace_from_issue(issue)
|
190
|
+
next if clean_relevant_issue_stacktrace.nil?
|
112
191
|
|
192
|
+
diff_ratio = compare_stack_traces(clean_first_test_failure_stacktrace, clean_relevant_issue_stacktrace)
|
113
193
|
if diff_ratio <= max_diff_ratio
|
114
194
|
puts " => [DEBUG] Issue #{issue.web_url} has an acceptable diff ratio of #{(diff_ratio * 100).round(2)}%."
|
115
195
|
# The `Gitlab::ObjectifiedHash` class overrides `#hash` which is used by `Hash#[]=` to compute the hash key.
|
@@ -120,8 +200,8 @@ module Gitlab
|
|
120
200
|
memo[issue.to_h] = diff_ratio
|
121
201
|
else
|
122
202
|
puts " => [DEBUG] Found issue #{issue.web_url} but stacktraces are too different (#{(diff_ratio * 100).round(2)}%).\n"
|
123
|
-
puts " => [DEBUG] Issue stacktrace:\n----------------\n#{
|
124
|
-
puts " => [DEBUG] Failure stacktrace:\n----------------\n#{
|
203
|
+
puts " => [DEBUG] Issue stacktrace:\n----------------\n#{clean_relevant_issue_stacktrace}\n----------------\n"
|
204
|
+
puts " => [DEBUG] Failure stacktrace:\n----------------\n#{clean_first_test_failure_stacktrace}\n----------------\n"
|
125
205
|
end
|
126
206
|
end
|
127
207
|
end
|
@@ -202,11 +282,9 @@ module Gitlab
|
|
202
282
|
end
|
203
283
|
|
204
284
|
def existing_failure_note(issue)
|
205
|
-
gitlab.find_issue_notes(iid: issue.iid)
|
206
|
-
|
285
|
+
gitlab.find_issue_notes(iid: issue.iid)&.find do |note|
|
286
|
+
note.body.include?('Failed most recently in')
|
207
287
|
end
|
208
|
-
|
209
|
-
false
|
210
288
|
end
|
211
289
|
|
212
290
|
def screenshot_section(test)
|
@@ -73,8 +73,8 @@ module Gitlab
|
|
73
73
|
'GITLAB_QA_PASSWORD_1' => :gitlab_qa_password_1,
|
74
74
|
'GITLAB_QA_USERNAME_2' => :gitlab_qa_username_2,
|
75
75
|
'GITLAB_QA_PASSWORD_2' => :gitlab_qa_password_2,
|
76
|
-
'
|
77
|
-
'
|
76
|
+
'QA_GITHUB_USERNAME' => :qa_github_username,
|
77
|
+
'QA_GITHUB_PASSWORD' => :qa_github_password,
|
78
78
|
'KNAPSACK_GENERATE_REPORT' => :knapsack_generate_report,
|
79
79
|
'KNAPSACK_REPORT_PATH' => :knapsack_report_path,
|
80
80
|
'KNAPSACK_TEST_FILE_PATTERN' => :knapsack_test_file_pattern,
|
@@ -138,7 +138,13 @@ module Gitlab
|
|
138
138
|
'CHROME_DISABLE_DEV_SHM' => :chrome_disable_dev_shm,
|
139
139
|
'COLORIZED_LOGS' => :colorized_logs,
|
140
140
|
'FIPS' => :fips,
|
141
|
-
'JH_ENV' => :jh_env
|
141
|
+
'JH_ENV' => :jh_env,
|
142
|
+
'QA_GITHUB_OAUTH_APP_ID' => :github_oauth_app_id,
|
143
|
+
'QA_GITHUB_OAUTH_APP_SECRET' => :github_oauth_app_secret,
|
144
|
+
'QA_1P_EMAIL' => :qa_1p_email,
|
145
|
+
'QA_1P_PASSWORD' => :qa_1p_password,
|
146
|
+
'QA_1P_SECRET' => :qa_1p_secret,
|
147
|
+
'QA_1P_GITHUB_UUID' => :qa_1p_github_uuid
|
142
148
|
}.freeze
|
143
149
|
|
144
150
|
ENV_VARIABLES.each do |env_name, method_name|
|
@@ -304,6 +310,13 @@ module Gitlab
|
|
304
310
|
end
|
305
311
|
end
|
306
312
|
|
313
|
+
def require_oauth_environment!
|
314
|
+
%w[QA_GITHUB_OAUTH_APP_ID QA_GITHUB_OAUTH_APP_SECRET QA_GITHUB_USERNAME
|
315
|
+
QA_GITHUB_PASSWORD QA_1P_EMAIL QA_1P_PASSWORD QA_1P_SECRET QA_1P_GITHUB_UUID].each do |env_key|
|
316
|
+
raise ArgumentError, "Environment variable #{env_key} must be set to run OAuth specs" unless ENV.key?(env_key)
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
307
320
|
def require_initial_password!
|
308
321
|
return unless env_var_value_if_defined('GITLAB_INITIAL_ROOT_PASSWORD').to_s.strip.empty?
|
309
322
|
|
@@ -406,7 +419,7 @@ module Gitlab
|
|
406
419
|
end
|
407
420
|
|
408
421
|
def mock_github_enabled?
|
409
|
-
enabled?(env_var_value_if_defined('QA_MOCK_GITHUB'), default:
|
422
|
+
enabled?(env_var_value_if_defined('QA_MOCK_GITHUB'), default: true)
|
410
423
|
end
|
411
424
|
|
412
425
|
private
|
@@ -32,7 +32,7 @@ module Gitlab
|
|
32
32
|
"gitlab-psql -d gitlabhq_production_ci -c 'create extension if not exists btree_gist'",
|
33
33
|
"gitlab-psql -d gitlabhq_production_ci -c 'create extension if not exists pg_trgm'",
|
34
34
|
# Load schema only if it does not exist.
|
35
|
-
"#{SCHEMA_EXISTENCE_CHECK_COMMAND} || gitlab-rake db:
|
35
|
+
"#{SCHEMA_EXISTENCE_CHECK_COMMAND} || DISABLE_DATABASE_ENVIRONMENT_CHECK=1 gitlab-rake db:schema:load:ci",
|
36
36
|
"gitlab-ctl restart"
|
37
37
|
].freeze
|
38
38
|
end
|
@@ -10,7 +10,7 @@ module Gitlab
|
|
10
10
|
|
11
11
|
<<~OMNIBUS
|
12
12
|
gitlab_rails['object_store']['enabled'] = true
|
13
|
-
gitlab_rails['object_store']['proxy_download'] =
|
13
|
+
gitlab_rails['object_store']['proxy_download'] = false
|
14
14
|
gitlab_rails['object_store']['connection'] = { 'provider' => 'AWS', 'region' => '#{Runtime::Env.aws_s3_region}', 'aws_access_key_id' => '#{Runtime::Env.aws_s3_key_id}', 'aws_secret_access_key' => '#{Runtime::Env.aws_s3_access_key}' }
|
15
15
|
|
16
16
|
gitlab_rails['object_store']['objects']['artifacts']['bucket'] = '#{Runtime::Env.aws_s3_bucket_name}'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Gitlab
|
6
|
+
module QA
|
7
|
+
module Scenario
|
8
|
+
module Test
|
9
|
+
module Integration
|
10
|
+
class OAuth < Scenario::Template
|
11
|
+
attr_reader :gitlab_name
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@gitlab_name = 'gitlab-oauth'
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform(release, *rspec_args)
|
18
|
+
Runtime::Env.require_oauth_environment!
|
19
|
+
|
20
|
+
release = Release.new(release)
|
21
|
+
|
22
|
+
Component::Gitlab.perform do |gitlab|
|
23
|
+
gitlab.release = release
|
24
|
+
gitlab.network = 'test'
|
25
|
+
gitlab.name = gitlab_name
|
26
|
+
|
27
|
+
gitlab.omnibus_configuration << gitlab_omnibus_configuration
|
28
|
+
|
29
|
+
gitlab.instance do
|
30
|
+
Runtime::Logger.info('Running OAuth specs!')
|
31
|
+
|
32
|
+
Component::Specs.perform do |specs|
|
33
|
+
rspec_args << '--' unless rspec_args.include?('--')
|
34
|
+
rspec_args << %w[--tag oauth]
|
35
|
+
specs.suite = 'Test::Instance::All'
|
36
|
+
specs.release = release
|
37
|
+
specs.network = gitlab.network
|
38
|
+
specs.args = [gitlab.address, *rspec_args]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def gitlab_omnibus_configuration
|
47
|
+
<<~OMNIBUS
|
48
|
+
gitlab_rails['omniauth_enabled'] = true;
|
49
|
+
gitlab_rails['omniauth_allow_single_sign_on'] = ['github'];
|
50
|
+
gitlab_rails['omniauth_block_auto_created_users'] = false;
|
51
|
+
gitlab_rails['omniauth_providers'] = [
|
52
|
+
{
|
53
|
+
name: 'github',
|
54
|
+
app_id: '$QA_GITHUB_OAUTH_APP_ID',
|
55
|
+
app_secret: '$QA_GITHUB_OAUTH_APP_SECRET',
|
56
|
+
url: 'https://github.com/',
|
57
|
+
verify_ssl: false,
|
58
|
+
args: { scope: 'user:email' }
|
59
|
+
}
|
60
|
+
];
|
61
|
+
OMNIBUS
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -18,14 +18,15 @@ module Gitlab
|
|
18
18
|
# @param [String] release current release docker image
|
19
19
|
# @param [String] current_version current gitlab version associated with docker image
|
20
20
|
# @param [String] semver_component semver component for N - 1 version detection, major|minor|patch
|
21
|
+
# @param [String] from_edition gitlab edition to update from
|
21
22
|
# @param [Array] *rspec_args rspec arguments
|
22
23
|
# @return [void]
|
23
|
-
def perform(release, current_version, semver_component, *rspec_args)
|
24
|
+
def perform(release, current_version, semver_component, from_edition = nil, *rspec_args)
|
24
25
|
@current_release = QA::Release.new(release)
|
25
26
|
@upgrade_path = Support::GitlabUpgradePath.new(
|
26
27
|
current_version,
|
27
28
|
semver_component,
|
28
|
-
@current_release.edition
|
29
|
+
from_edition || @current_release.edition
|
29
30
|
).fetch
|
30
31
|
|
31
32
|
upgrade_info = "#{[*upgrade_path, current_release].join(' => ')} (#{current_version})".bright
|
data/lib/gitlab/qa/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
# set custom qa cache key because upstream template by default installs gitlab-qa from rubygems and uses cache key
|
4
|
+
# based on globally defined gitlab-qa version
|
5
|
+
#
|
6
|
+
# UPDATE_QA_CACHE needs to be passed to included child pipeline because e2e specs run on separate runners which don't share
|
7
|
+
# same infrastructure and this variable allows to populate cache for e2e spec specific runners
|
8
|
+
qa_cache_key="${RUBY_VERSION}-$(md5sum Gemfile.lock | awk '{ print $1 }')"
|
9
|
+
|
10
|
+
echo "Saving environment variables for package-and-test trigger"
|
11
|
+
echo "GITLAB_QA_CACHE_KEY=$qa_cache_key" > $BUILD_ENV
|
12
|
+
echo "UPDATE_QA_CACHE=$UPDATE_QA_CACHE" >> $BUILD_ENV
|
13
|
+
|
14
|
+
echo "Created $BUILD_ENV file:"
|
15
|
+
cat $BUILD_ENV
|
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:
|
4
|
+
version: 10.0.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: 2023-
|
11
|
+
date: 2023-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -108,6 +108,34 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '3.7'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.22'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.22'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov-cobertura
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.1'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: solargraph
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +150,20 @@ dependencies:
|
|
122
150
|
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0.41'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: timecop
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.9.5
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.9.5
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
168
|
name: webmock
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -278,55 +320,13 @@ files:
|
|
278
320
|
- ".dockerignore"
|
279
321
|
- ".gitignore"
|
280
322
|
- ".gitlab-ci.yml"
|
281
|
-
- ".gitlab/ci/jobs/airgapped.gitlab-ci.yml"
|
282
|
-
- ".gitlab/ci/jobs/base.gitlab-ci.yml"
|
283
|
-
- ".gitlab/ci/jobs/chaos.gitlab-ci.yml"
|
284
|
-
- ".gitlab/ci/jobs/cloud_activation.gitlab-ci.yml"
|
285
|
-
- ".gitlab/ci/jobs/custom_parallel.gitlab-ci.yml"
|
286
|
-
- ".gitlab/ci/jobs/decomposition_multiple_db.gitlab-ci.yml"
|
287
|
-
- ".gitlab/ci/jobs/decomposition_single_db.gitlab-ci.yml"
|
288
|
-
- ".gitlab/ci/jobs/ee_previous_to_ce_update.gitlab-ci.yml"
|
289
|
-
- ".gitlab/ci/jobs/elasticsearch.gitlab-ci.yml"
|
290
|
-
- ".gitlab/ci/jobs/geo.gitlab-ci.yml"
|
291
|
-
- ".gitlab/ci/jobs/gitaly_cluster.gitlab-ci.yml"
|
292
|
-
- ".gitlab/ci/jobs/gitlab_pages.gitlab-ci.yml"
|
293
|
-
- ".gitlab/ci/jobs/group_saml.gitlab-ci.yml"
|
294
|
-
- ".gitlab/ci/jobs/instance.gitlab-ci.yml"
|
295
|
-
- ".gitlab/ci/jobs/instance_saml.gitlab-ci.yml"
|
296
|
-
- ".gitlab/ci/jobs/integrations.gitlab-ci.yml"
|
297
|
-
- ".gitlab/ci/jobs/jira.gitlab-ci.yml"
|
298
|
-
- ".gitlab/ci/jobs/large_setup.gitlab-ci.yml"
|
299
|
-
- ".gitlab/ci/jobs/ldap_no_server.gitlab-ci.yml"
|
300
|
-
- ".gitlab/ci/jobs/ldap_no_tls.gitlab-ci.yml"
|
301
|
-
- ".gitlab/ci/jobs/ldap_tls.gitlab-ci.yml"
|
302
|
-
- ".gitlab/ci/jobs/mattermost.gitlab-ci.yml"
|
303
|
-
- ".gitlab/ci/jobs/metrics.gitlab-ci.yml"
|
304
|
-
- ".gitlab/ci/jobs/mtls.gitlab-ci.yml"
|
305
|
-
- ".gitlab/ci/jobs/object_storage.gitlab-ci.yml"
|
306
|
-
- ".gitlab/ci/jobs/object_storage_aws.gitlab-ci.yml"
|
307
|
-
- ".gitlab/ci/jobs/object_storage_gcs.gitlab-ci.yml"
|
308
|
-
- ".gitlab/ci/jobs/object_storage_registry_tls.gitlab-ci.yml"
|
309
|
-
- ".gitlab/ci/jobs/omnibus_image.gitlab-ci.yml"
|
310
|
-
- ".gitlab/ci/jobs/omnibus_upgrade.gitlab-ci.yml"
|
311
|
-
- ".gitlab/ci/jobs/opensearch.gitlab-ci.yml"
|
312
|
-
- ".gitlab/ci/jobs/packages.gitlab-ci.yml"
|
313
|
-
- ".gitlab/ci/jobs/praefect.gitlab-ci.yml"
|
314
|
-
- ".gitlab/ci/jobs/registry.gitlab-ci.yml"
|
315
|
-
- ".gitlab/ci/jobs/registry_with_cdn.gitlab-ci.yml"
|
316
|
-
- ".gitlab/ci/jobs/relative_url.gitlab-ci.yml"
|
317
|
-
- ".gitlab/ci/jobs/repository_storage.gitlab-ci.yml"
|
318
|
-
- ".gitlab/ci/jobs/sanity_framework.gitlab-ci.yml"
|
319
|
-
- ".gitlab/ci/jobs/service_ping_disabled.gitlab-ci.yml"
|
320
|
-
- ".gitlab/ci/jobs/smtp.gitlab-ci.yml"
|
321
|
-
- ".gitlab/ci/jobs/staging.gitlab-ci.yml"
|
322
|
-
- ".gitlab/ci/jobs/update.gitlab-ci.yml"
|
323
|
-
- ".gitlab/ci/rules.gitlab-ci.yml"
|
324
323
|
- ".gitlab/issue_templates/Default.md"
|
325
324
|
- ".gitlab/merge_request_templates/Default.md"
|
326
325
|
- ".gitlab/merge_request_templates/Release.md"
|
327
326
|
- ".rspec"
|
328
327
|
- ".rubocop.yml"
|
329
328
|
- ".rubocop_todo.yml"
|
329
|
+
- ".simplecov"
|
330
330
|
- CONTRIBUTING.md
|
331
331
|
- Dangerfile
|
332
332
|
- Gemfile
|
@@ -459,6 +459,7 @@ files:
|
|
459
459
|
- lib/gitlab/qa/scenario/test/integration/mattermost.rb
|
460
460
|
- lib/gitlab/qa/scenario/test/integration/metrics.rb
|
461
461
|
- lib/gitlab/qa/scenario/test/integration/mtls.rb
|
462
|
+
- lib/gitlab/qa/scenario/test/integration/oauth.rb
|
462
463
|
- lib/gitlab/qa/scenario/test/integration/opensearch.rb
|
463
464
|
- lib/gitlab/qa/scenario/test/integration/praefect.rb
|
464
465
|
- lib/gitlab/qa/scenario/test/integration/registry.rb
|
@@ -469,7 +470,6 @@ files:
|
|
469
470
|
- lib/gitlab/qa/scenario/test/integration/smtp.rb
|
470
471
|
- lib/gitlab/qa/scenario/test/integration/suggested_reviewer.rb
|
471
472
|
- lib/gitlab/qa/scenario/test/omnibus/image.rb
|
472
|
-
- lib/gitlab/qa/scenario/test/omnibus/update.rb
|
473
473
|
- lib/gitlab/qa/scenario/test/omnibus/update_from_previous.rb
|
474
474
|
- lib/gitlab/qa/scenario/test/omnibus/upgrade.rb
|
475
475
|
- lib/gitlab/qa/scenario/test/sanity/version.rb
|
@@ -487,7 +487,7 @@ files:
|
|
487
487
|
- lib/gitlab/qa/support/shellout.rb
|
488
488
|
- lib/gitlab/qa/test_logger.rb
|
489
489
|
- lib/gitlab/qa/version.rb
|
490
|
-
- scripts/
|
490
|
+
- scripts/build-package-and-test-env
|
491
491
|
- support/data/admin_access_token_seed.rb
|
492
492
|
- support/data/license_usage_seed.rb
|
493
493
|
- support/manifests/suggested_reviewer/authenticator.yaml
|
@@ -1,23 +0,0 @@
|
|
1
|
-
ce:airgapped:
|
2
|
-
extends:
|
3
|
-
- .rules:ce-never-when-triggered-by-feature-flag-definition-change
|
4
|
-
- .test
|
5
|
-
- .high-capacity
|
6
|
-
- .ce-variables
|
7
|
-
- .rspec-report-opts
|
8
|
-
parallel: 10
|
9
|
-
variables:
|
10
|
-
QA_SCENARIO: "Test::Instance::Airgapped"
|
11
|
-
QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
|
12
|
-
|
13
|
-
ee:airgapped:
|
14
|
-
extends:
|
15
|
-
- .rules:ee-never-when-triggered-by-feature-flag-definition-change
|
16
|
-
- .test
|
17
|
-
- .high-capacity
|
18
|
-
- .ee-variables
|
19
|
-
- .rspec-report-opts
|
20
|
-
parallel: 10
|
21
|
-
variables:
|
22
|
-
QA_SCENARIO: "Test::Instance::Airgapped"
|
23
|
-
QA_RSPEC_TAGS: "--tag '~github' --tag '~skip_live_env'"
|