gitlab-qa 7.24.6 → 7.26.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/jobs/actioncable.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/base.gitlab-ci.yml +281 -0
- data/.gitlab/ci/jobs/cloud_activation.gitlab-ci.yml +30 -0
- data/.gitlab/ci/jobs/custom_parallel.gitlab-ci.yml +21 -0
- data/.gitlab/ci/jobs/ee_previous_to_ce_update.gitlab-ci.yml +18 -0
- data/.gitlab/ci/jobs/elasticsearch.gitlab-ci.yml +20 -0
- data/.gitlab/ci/jobs/geo.gitlab-ci.yml +18 -0
- data/.gitlab/ci/jobs/gitaly_cluster.gitlab-ci.yml +45 -0
- data/.gitlab/ci/jobs/group_saml.gitlab-ci.yml +20 -0
- data/.gitlab/ci/jobs/instance.gitlab-ci.yml +55 -0
- data/.gitlab/ci/jobs/instance_saml.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/integrations.gitlab-ci.yml +14 -0
- data/.gitlab/ci/jobs/jira.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/large_setup.gitlab-ci.yml +19 -0
- data/.gitlab/ci/jobs/ldap_no_server.gitlab-ci.yml +20 -0
- data/.gitlab/ci/jobs/ldap_no_tls.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/ldap_tls.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/mattermost.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/mtls.gitlab-ci.yml +17 -0
- data/.gitlab/ci/jobs/object_storage.gitlab-ci.yml +49 -0
- data/.gitlab/ci/jobs/object_storage_aws.gitlab-ci.yml +25 -0
- data/.gitlab/ci/jobs/object_storage_gcs.gitlab-ci.yml +23 -0
- data/.gitlab/ci/jobs/object_storage_registry_tls.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/omnibus_image.gitlab-ci.yml +15 -0
- data/.gitlab/ci/jobs/omnibus_upgrade.gitlab-ci.yml +28 -0
- data/.gitlab/ci/jobs/packages.gitlab-ci.yml +25 -0
- data/.gitlab/ci/jobs/praefect.gitlab-ci.yml +71 -0
- data/.gitlab/ci/jobs/registry.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/registry_with_cdn.gitlab-ci.yml +43 -0
- data/.gitlab/ci/jobs/relative_url.gitlab-ci.yml +65 -0
- data/.gitlab/ci/jobs/repository_storage.gitlab-ci.yml +41 -0
- data/.gitlab/ci/jobs/sanity_framework.gitlab-ci.yml +24 -0
- data/.gitlab/ci/jobs/service_ping_disabled.gitlab-ci.yml +19 -0
- data/.gitlab/ci/jobs/smtp.gitlab-ci.yml +19 -0
- data/.gitlab/ci/jobs/staging.gitlab-ci.yml +10 -0
- data/.gitlab/ci/jobs/update.gitlab-ci.yml +60 -0
- data/.gitlab/ci/rules.gitlab-ci.yml +19 -6
- data/.gitlab/issue_templates/Default.md +2 -0
- data/.gitlab/merge_request_templates/Default.md +2 -0
- data/.gitlab-ci.yml +110 -1333
- data/bin/notify_upstream +98 -0
- data/docs/what_tests_can_be_run.md +15 -0
- data/lib/gitlab/qa/component/base.rb +0 -1
- data/lib/gitlab/qa/component/gitlab.rb +48 -1
- data/lib/gitlab/qa/component/staging_ref.rb +1 -0
- data/lib/gitlab/qa/docker/engine.rb +4 -0
- data/lib/gitlab/qa/release.rb +1 -1
- data/lib/gitlab/qa/report/gitlab_issue_client.rb +12 -0
- data/lib/gitlab/qa/report/relate_failure_issue.rb +17 -2
- data/lib/gitlab/qa/report/test_result.rb +8 -0
- data/lib/gitlab/qa/report/update_screenshot_path.rb +28 -6
- data/lib/gitlab/qa/runner.rb +17 -0
- data/lib/gitlab/qa/runtime/env.rb +14 -1
- data/lib/gitlab/qa/runtime/omnibus_configuration.rb +1 -1
- data/lib/gitlab/qa/runtime/omnibus_configurations/ci_decomposition.rb +32 -0
- data/lib/gitlab/qa/scenario/test/instance/deployment_base.rb +5 -0
- data/lib/gitlab/qa/scenario/test/instance/staging_ref_geo.rb +27 -0
- data/lib/gitlab/qa/scenario/test/integration/geo.rb +2 -1
- data/lib/gitlab/qa/scenario/test/integration/gitaly_cluster.rb +2 -0
- data/lib/gitlab/qa/scenario/test/integration/mattermost.rb +5 -1
- data/lib/gitlab/qa/scenario/test/integration/mtls.rb +1 -0
- data/lib/gitlab/qa/scenario/test/integration/registry_with_cdn.rb +42 -0
- data/lib/gitlab/qa/scenario/test/omnibus/update.rb +1 -0
- data/lib/gitlab/qa/version.rb +1 -1
- data/lib/gitlab/qa.rb +3 -0
- data/scripts/generate-qa-jobs.rb +72 -0
- data/support/data/admin_access_token_seed.rb +24 -0
- data/support/data/license_usage_seed.rb +75 -0
- metadata +45 -3
- data/bin/notify_upstream_commit +0 -61
data/bin/notify_upstream
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'gitlab'
|
5
|
+
|
6
|
+
# Default to "Multi-pipeline (from 'gitlab-org/gitlab-qa' 'notify_upstream:*' jobs)" from current project
|
7
|
+
api_token = ENV.fetch('GITLAB_QA_PROJECT_ACCESS_TOKEN') do
|
8
|
+
puts "The $GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN variable is deprecated in favor of a dedicated project access token: $GITLAB_QA_PROJECT_ACCESS_TOKEN."
|
9
|
+
puts "See https://gitlab.com/groups/gitlab-org/quality/-/epics/17 for more details."
|
10
|
+
ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
|
11
|
+
end
|
12
|
+
|
13
|
+
# Configure credentials to be used with gitlab gem
|
14
|
+
Gitlab.configure do |config|
|
15
|
+
config.endpoint = 'https://gitlab.com/api/v4'
|
16
|
+
config.private_token = api_token
|
17
|
+
end
|
18
|
+
|
19
|
+
class CommitComment
|
20
|
+
UPSTREAM_COMMENT = <<~COMMENT
|
21
|
+
- The [`gitlab-qa-mirror` downstream pipeline](%<pipeline_url>s) for https://gitlab.com/%<project_path>s/-/merge_requests/%<mr_iid>s/diffs?commit_id=%<commit_sha>s %<status_with_icon>s
|
22
|
+
COMMENT
|
23
|
+
IDENTIFIABLE_NOTE_TAG = 'gitlab-qa:upstream-notification-note'
|
24
|
+
|
25
|
+
def self.mr?
|
26
|
+
ENV.key?('TOP_UPSTREAM_SOURCE_PROJECT') &&
|
27
|
+
ENV.key?('TOP_UPSTREAM_MERGE_REQUEST_IID') &&
|
28
|
+
ENV.key?('TOP_UPSTREAM_SOURCE_SHA') &&
|
29
|
+
!ENV['TOP_UPSTREAM_SOURCE_PROJECT'].to_s.empty? &&
|
30
|
+
!ENV['TOP_UPSTREAM_MERGE_REQUEST_IID'].to_s.empty? &&
|
31
|
+
!ENV['TOP_UPSTREAM_SOURCE_SHA'].to_s.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.post!(status)
|
35
|
+
unless mr?
|
36
|
+
puts "All the 'TOP_UPSTREAM_SOURCE_PROJECT', 'TOP_UPSTREAM_MERGE_REQUEST_IID', and 'TOP_UPSTREAM_SOURCE_SHA' environment variables need to be present. We cannot post a comment on the upstream merge request."
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
# Look for an existing note
|
41
|
+
upstream_notification_note = Gitlab.merge_request_notes(project_path, mr_iid).auto_paginate.find do |note|
|
42
|
+
note.body.include?(IDENTIFIABLE_NOTE_TAG)
|
43
|
+
end
|
44
|
+
|
45
|
+
if upstream_notification_note
|
46
|
+
Gitlab.edit_merge_request_note(project_path, mr_iid, upstream_notification_note.id, [upstream_notification_note.body, build_comment(status)].join("\n"))
|
47
|
+
else
|
48
|
+
Gitlab.create_merge_request_comment(project_path, mr_iid, "<!-- #{IDENTIFIABLE_NOTE_TAG} -->\n#{build_comment(status)}")
|
49
|
+
end
|
50
|
+
rescue Gitlab::Error::Error => error
|
51
|
+
puts "Ignoring the following error: #{error}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.project_path
|
55
|
+
ENV['TOP_UPSTREAM_SOURCE_PROJECT']
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.mr_iid
|
59
|
+
ENV['TOP_UPSTREAM_MERGE_REQUEST_IID']
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.pipeline_url
|
63
|
+
ENV['CI_PIPELINE_URL']
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.commit_sha
|
67
|
+
ENV['TOP_UPSTREAM_SOURCE_SHA']
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.build_comment(status)
|
71
|
+
format(UPSTREAM_COMMENT,
|
72
|
+
project_path: project_path,
|
73
|
+
mr_iid: mr_iid,
|
74
|
+
pipeline_url: pipeline_url,
|
75
|
+
status_with_icon: status_with_icon(status),
|
76
|
+
commit_sha: commit_sha
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.status_with_icon(status)
|
81
|
+
case status
|
82
|
+
when :success
|
83
|
+
"passed. :white_check_mark:"
|
84
|
+
when :failure
|
85
|
+
"failed! :boom:"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.post_to_mr(project_id, mr_iid, comment)
|
90
|
+
Gitlab.create_merge_request_comment(project_id, mr_iid, comment)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
status = ARGV.shift.to_s.strip
|
95
|
+
|
96
|
+
abort "Please provide a status!" if status == ''
|
97
|
+
|
98
|
+
CommitComment.post!(status.to_sym)
|
@@ -818,6 +818,21 @@ $ export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
|
|
818
818
|
$ gitlab-qa Test::Instance::StagingGeo
|
819
819
|
```
|
820
820
|
|
821
|
+
### `Test::Instance::StagingRefGeo`
|
822
|
+
|
823
|
+
This scenario tests that the Geo staging deployment (with [`staging-ref.gitlab.com`](https://staging-ref.gitlab.com) as the primary site and [`geo.staging-ref.gitlab.com`](https://geo.staging-ref.gitlab.com) as the secondary site) works as expected by running tests tagged `:geo` against it. This is done by spinning up a GitLab QA (`gitlab/gitlab-qa`) container and running the `QA::EE::Scenario::Test::Geo` scenario. Note that the Geo setup steps in the `QA::EE::Scenario::Test::Geo` scenario are skipped when testing a live Geo deployment.
|
824
|
+
|
825
|
+
Scenario requirements are the same as [`Test::Instance::StagingGeo`](#testinstancestaginggeo) described above.
|
826
|
+
|
827
|
+
```
|
828
|
+
$ export GITLAB_QA_ACCESS_TOKEN=your_api_access_token
|
829
|
+
$ export GITLAB_QA_DEV_ACCESS_TOKEN=your_dev_registry_access_token
|
830
|
+
$ export GITLAB_USERNAME="gitlab-qa"
|
831
|
+
$ export GITLAB_PASSWORD="$GITLAB_QA_PASSWORD"
|
832
|
+
|
833
|
+
$ gitlab-qa Test::Instance::StagingRefGeo
|
834
|
+
```
|
835
|
+
|
821
836
|
### `Test::Instance::Production`
|
822
837
|
|
823
838
|
This scenario functions the same as `Test::Instance::Staging`
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
# rubocop:disable Metrics/AbcSize
|
2
3
|
|
3
4
|
require 'securerandom'
|
4
5
|
require 'net/http'
|
5
6
|
require 'uri'
|
6
7
|
require 'forwardable'
|
7
8
|
require 'openssl'
|
9
|
+
require 'tempfile'
|
8
10
|
|
9
11
|
module Gitlab
|
10
12
|
module QA
|
@@ -13,15 +15,17 @@ module Gitlab
|
|
13
15
|
extend Forwardable
|
14
16
|
|
15
17
|
attr_reader :release, :omnibus_configuration, :omnibus_gitlab_rails_env
|
16
|
-
attr_accessor :tls, :skip_availability_check, :runner_network
|
18
|
+
attr_accessor :tls, :skip_availability_check, :runner_network, :seed_admin_token, :seed_db
|
17
19
|
attr_writer :name, :relative_path
|
18
20
|
|
19
21
|
def_delegators :release, :tag, :image, :edition
|
20
22
|
|
21
23
|
CERTIFICATES_PATH = File.expand_path('../../../../tls_certificates', __dir__)
|
24
|
+
DATA_SEED_PATH = File.expand_path('../../../../support/data', __dir__)
|
22
25
|
|
23
26
|
SSL_PATH = '/etc/gitlab/ssl'
|
24
27
|
TRUSTED_PATH = '/etc/gitlab/trusted-certs'
|
28
|
+
DATA_PATH = '/tmp/data-seeds'
|
25
29
|
|
26
30
|
def initialize
|
27
31
|
super
|
@@ -39,6 +43,9 @@ module Gitlab
|
|
39
43
|
@volumes[@gitlab_cert_path] = SSL_PATH
|
40
44
|
@volumes[@authority_cert_path] = TRUSTED_PATH
|
41
45
|
|
46
|
+
@seed_admin_token = Runtime::Scenario.seed_admin_token
|
47
|
+
@seed_db = Runtime::Scenario.seed_db
|
48
|
+
|
42
49
|
self.release = 'CE'
|
43
50
|
end
|
44
51
|
|
@@ -166,6 +173,16 @@ module Gitlab
|
|
166
173
|
end
|
167
174
|
end
|
168
175
|
|
176
|
+
def process_exec_commands
|
177
|
+
@docker.copy(name, DATA_SEED_PATH, DATA_PATH) if seed_admin_token || seed_db
|
178
|
+
|
179
|
+
self.exec_commands += seed_admin_token_command if seed_admin_token
|
180
|
+
self.exec_commands += seed_test_data_command if seed_db
|
181
|
+
|
182
|
+
Runtime::Logger.info("Running exec_commands...")
|
183
|
+
exec_commands.flatten.uniq.each { |command| @docker.exec(name, command) }
|
184
|
+
end
|
185
|
+
|
169
186
|
def sha_version
|
170
187
|
json = @docker.read_file(
|
171
188
|
@release.image, @release.tag,
|
@@ -176,6 +193,19 @@ module Gitlab
|
|
176
193
|
manifest['software']['gitlab-rails']['locked_version']
|
177
194
|
end
|
178
195
|
|
196
|
+
def copy_key_file(env_key)
|
197
|
+
key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir
|
198
|
+
key_file = Tempfile.new(env_key.downcase, key_dir)
|
199
|
+
key_file.write(ENV.fetch(env_key))
|
200
|
+
key_file.close
|
201
|
+
|
202
|
+
File.chmod(0o744, key_file.path)
|
203
|
+
|
204
|
+
@volumes[key_file.path] = key_file.path
|
205
|
+
|
206
|
+
key_file.path
|
207
|
+
end
|
208
|
+
|
179
209
|
private
|
180
210
|
|
181
211
|
# Copy certs to a temporary directory in current working directory.
|
@@ -196,6 +226,22 @@ module Gitlab
|
|
196
226
|
end
|
197
227
|
end
|
198
228
|
|
229
|
+
def seed_test_data_command
|
230
|
+
cmd = []
|
231
|
+
|
232
|
+
Runtime::Scenario.seed_db.each do |file_patterns|
|
233
|
+
Dir["#{DATA_SEED_PATH}/#{file_patterns}"].map { |f| File.basename f }.each do |file|
|
234
|
+
cmd << "gitlab-rails runner #{DATA_PATH}/#{file}"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
cmd.uniq
|
239
|
+
end
|
240
|
+
|
241
|
+
def seed_admin_token_command
|
242
|
+
["gitlab-rails runner #{DATA_PATH}/admin_access_token_seed.rb"]
|
243
|
+
end
|
244
|
+
|
199
245
|
class Availability
|
200
246
|
def initialize(name, relative_path: '', scheme: 'http', protocol_port: 80)
|
201
247
|
@docker = Docker::Engine.new
|
@@ -241,3 +287,4 @@ module Gitlab
|
|
241
287
|
end
|
242
288
|
end
|
243
289
|
end
|
290
|
+
# rubocop:enable Metrics/AbcSize
|
@@ -76,6 +76,10 @@ module Gitlab
|
|
76
76
|
Docker::Command.execute("attach --sig-proxy=false #{name}", &block)
|
77
77
|
end
|
78
78
|
|
79
|
+
def copy(name, src_path, dest_path)
|
80
|
+
Docker::Command.execute("cp #{src_path} #{name}:#{dest_path}")
|
81
|
+
end
|
82
|
+
|
79
83
|
def restart(name)
|
80
84
|
Docker::Command.execute("restart #{name}")
|
81
85
|
end
|
data/lib/gitlab/qa/release.rb
CHANGED
@@ -147,7 +147,7 @@ module Gitlab
|
|
147
147
|
registry: DEV_REGISTRY
|
148
148
|
}
|
149
149
|
elsif omnibus_mirror?
|
150
|
-
username, password = if Runtime::Env.ci_job_token && Runtime::Env.ci_pipeline_source
|
150
|
+
username, password = if Runtime::Env.ci_job_token && Runtime::Env.ci_pipeline_source.include?('pipeline')
|
151
151
|
['gitlab-ci-token', Runtime::Env.ci_job_token]
|
152
152
|
elsif Runtime::Env.qa_container_registry_access_token
|
153
153
|
[Runtime::Env.gitlab_username, Runtime::Env.qa_container_registry_access_token]
|
@@ -101,6 +101,18 @@ module Gitlab
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
+
def upload_file(file_fullpath:)
|
105
|
+
ignore_gitlab_client_exceptions do
|
106
|
+
Gitlab.upload_file(project, file_fullpath)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def ignore_gitlab_client_exceptions
|
111
|
+
yield
|
112
|
+
rescue StandardError, SystemCallError, OpenSSL::SSL::SSLError, Net::OpenTimeout, Net::ReadTimeout, Gitlab::Error::Error => e
|
113
|
+
puts "Ignoring the following error: #{e}"
|
114
|
+
end
|
115
|
+
|
104
116
|
def handle_gitlab_client_exceptions
|
105
117
|
yield
|
106
118
|
rescue Gitlab::Error::NotFound
|
@@ -47,7 +47,7 @@ module Gitlab
|
|
47
47
|
puts " => Searching issues for test '#{test.name}'..."
|
48
48
|
|
49
49
|
begin
|
50
|
-
issue = find_and_link_issue(test) || create_issue(test)
|
50
|
+
issue = test.quarantine? ? find_and_link_issue(test) : find_and_link_issue(test) || create_issue(test)
|
51
51
|
return unless issue
|
52
52
|
|
53
53
|
update_labels(issue, test)
|
@@ -72,6 +72,8 @@ module Gitlab
|
|
72
72
|
issue = super
|
73
73
|
puts "for test '#{test.name}'."
|
74
74
|
|
75
|
+
post_or_update_failed_job_note(issue, test)
|
76
|
+
|
75
77
|
issue
|
76
78
|
end
|
77
79
|
|
@@ -158,7 +160,8 @@ module Gitlab
|
|
158
160
|
"\n\n### Stack trace",
|
159
161
|
"```\n#{test.failures.first['message_lines'].join("\n")}\n```",
|
160
162
|
"First happened in #{test.ci_job_url}.",
|
161
|
-
"Related test case: #{test.testcase}."
|
163
|
+
"Related test case: #{test.testcase}.",
|
164
|
+
screenshot_section(test)
|
162
165
|
].join("\n\n")
|
163
166
|
end
|
164
167
|
|
@@ -194,6 +197,18 @@ module Gitlab
|
|
194
197
|
|
195
198
|
false
|
196
199
|
end
|
200
|
+
|
201
|
+
def screenshot_section(test)
|
202
|
+
section = ''
|
203
|
+
|
204
|
+
if test.screenshot? && !test.failures.first['message'].include?('500 Internal Server Error')
|
205
|
+
relative_url = gitlab.upload_file(file_fullpath: test.failure_screenshot)
|
206
|
+
|
207
|
+
section = "### Screenshot: #{relative_url.markdown}"
|
208
|
+
end
|
209
|
+
|
210
|
+
section
|
211
|
+
end
|
197
212
|
end
|
198
213
|
end
|
199
214
|
end
|
@@ -95,6 +95,14 @@ module Gitlab
|
|
95
95
|
report['quarantine']['issue'] if quarantine?
|
96
96
|
end
|
97
97
|
|
98
|
+
def screenshot?
|
99
|
+
report['screenshot'].present?
|
100
|
+
end
|
101
|
+
|
102
|
+
def failure_screenshot
|
103
|
+
report['screenshot']['image'] if screenshot?
|
104
|
+
end
|
105
|
+
|
98
106
|
private
|
99
107
|
|
100
108
|
# rubocop:disable Metrics/AbcSize
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'nokogiri'
|
2
|
+
require 'json'
|
3
|
+
require 'active_support/core_ext/object/blank'
|
2
4
|
|
3
5
|
module Gitlab
|
4
6
|
module QA
|
@@ -9,30 +11,50 @@ module Gitlab
|
|
9
11
|
end
|
10
12
|
|
11
13
|
REGEX = %r{(?<gitlab_qa_run>gitlab-qa-run-.*?(?=\/))\/(?<gitlab_ce_ee_qa>gitlab-(ee|ce)-qa-.*?(?=\/))}
|
14
|
+
CONTAINER_PATH = File.join(Docker::Volumes::QA_CONTAINER_WORKDIR, 'tmp').freeze
|
12
15
|
|
13
16
|
def invoke!
|
14
17
|
Dir.glob(@files).each do |rspec_report_file|
|
15
|
-
|
18
|
+
match_data = rspec_report_file.match(REGEX)
|
19
|
+
artifact_path = "#{match_data[:gitlab_qa_run]}/#{match_data[:gitlab_ce_ee_qa]}"
|
16
20
|
|
17
|
-
|
21
|
+
xml_report = rewrite_each_xml_screenshot_path(rspec_report_file, artifact_path)
|
22
|
+
|
23
|
+
File.write(rspec_report_file, xml_report)
|
18
24
|
|
19
25
|
puts "Saved #{rspec_report_file}"
|
26
|
+
|
27
|
+
json_rspec_report_file = rspec_report_file.gsub('.xml', '.json')
|
28
|
+
json_report = rewrite_each_json_screenshot_path(json_rspec_report_file, artifact_path)
|
29
|
+
|
30
|
+
File.write(json_rspec_report_file, json_report)
|
31
|
+
|
32
|
+
puts "Saved #{json_rspec_report_file}"
|
20
33
|
end
|
21
34
|
end
|
22
35
|
|
23
36
|
private
|
24
37
|
|
25
|
-
def
|
38
|
+
def rewrite_each_xml_screenshot_path(rspec_report_file, artifact_path)
|
26
39
|
report = Nokogiri::XML(File.open(rspec_report_file))
|
27
40
|
|
28
|
-
match_data = rspec_report_file.match(REGEX)
|
29
|
-
|
30
41
|
report.xpath('//system-out').each do |system_out|
|
31
|
-
system_out.content = system_out.content.gsub(
|
42
|
+
system_out.content = system_out.content.gsub(CONTAINER_PATH, artifact_path)
|
32
43
|
end
|
33
44
|
|
34
45
|
report.to_s
|
35
46
|
end
|
47
|
+
|
48
|
+
def rewrite_each_json_screenshot_path(json_rspec_report_file, artifact_path)
|
49
|
+
report = JSON.parse(File.read(json_rspec_report_file))
|
50
|
+
examples = report['examples']
|
51
|
+
|
52
|
+
examples.each do |example|
|
53
|
+
example['screenshot']['image'] = example['screenshot']['image'].gsub(CONTAINER_PATH, artifact_path) if example['screenshot'].present?
|
54
|
+
end
|
55
|
+
|
56
|
+
JSON.pretty_generate(report)
|
57
|
+
end
|
36
58
|
end
|
37
59
|
end
|
38
60
|
end
|
data/lib/gitlab/qa/runner.rb
CHANGED
@@ -12,9 +12,13 @@ module Gitlab
|
|
12
12
|
Runtime::Scenario.define(:run_tests, true)
|
13
13
|
Runtime::Scenario.define(:qa_image, Runtime::Env.qa_image) if Runtime::Env.qa_image
|
14
14
|
Runtime::Scenario.define(:omnibus_configuration, Runtime::OmnibusConfiguration.new)
|
15
|
+
Runtime::Scenario.define(:seed_db, false)
|
16
|
+
Runtime::Scenario.define(:seed_admin_token, true) # Create an admin access token for root user by default
|
17
|
+
Runtime::Scenario.define(:omnibus_exec_commands, [])
|
15
18
|
|
16
19
|
# Omnibus Configurators specified by flags
|
17
20
|
@active_configurators = []
|
21
|
+
@seed_scripts = []
|
18
22
|
@omnibus_configurations = %w[default] # always load default configuration
|
19
23
|
|
20
24
|
@options = OptionParser.new do |opts|
|
@@ -29,6 +33,10 @@ module Gitlab
|
|
29
33
|
Runtime::Scenario.define(:teardown, false)
|
30
34
|
end
|
31
35
|
|
36
|
+
opts.on('--no-admin-token', 'Skip admin token creation for root user') do
|
37
|
+
Runtime::Scenario.define(:seed_admin_token, false)
|
38
|
+
end
|
39
|
+
|
32
40
|
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|
|
33
41
|
Runtime::Scenario.define(:qa_image, value)
|
34
42
|
end
|
@@ -45,6 +53,14 @@ module Gitlab
|
|
45
53
|
end
|
46
54
|
end
|
47
55
|
|
56
|
+
opts.on('--seed-db search_pattern1[,search_pattern2,...]', 'Seed application database with sample test data') do |file_pattern|
|
57
|
+
file_pattern.split(',').each do |pattern|
|
58
|
+
@seed_scripts << pattern
|
59
|
+
end
|
60
|
+
|
61
|
+
Runtime::Scenario.define(:seed_db, @seed_scripts)
|
62
|
+
end
|
63
|
+
|
48
64
|
opts.on_tail('-h', '--help', 'Show the usage') do
|
49
65
|
puts opts
|
50
66
|
exit
|
@@ -125,6 +141,7 @@ module Gitlab
|
|
125
141
|
# # Runtime::OmnibusConfiguration::Packages
|
126
142
|
# gitlab_rails['packages_enabled'] = true
|
127
143
|
Runtime::Scenario.omnibus_configuration << "# #{configurator.class.name}"
|
144
|
+
Runtime::Scenario.omnibus_exec_commands << configurator.exec_commands
|
128
145
|
|
129
146
|
# Load the configuration
|
130
147
|
configurator.configuration.split("\n").each { |c| Runtime::Scenario.omnibus_configuration << c }
|
@@ -127,6 +127,11 @@ module Gitlab
|
|
127
127
|
'GOOGLE_PROJECT' => :google_project,
|
128
128
|
'GOOGLE_CLIENT_EMAIL' => :google_client_email,
|
129
129
|
'GOOGLE_JSON_KEY' => :google_json_key,
|
130
|
+
'GOOGLE_CDN_JSON_KEY' => :google_cdn_json_key,
|
131
|
+
'GOOGLE_CDN_LB' => :google_cdn_load_balancer,
|
132
|
+
'GOOGLE_CDN_SIGNURL_KEY' => :google_cdn_signurl_key,
|
133
|
+
'GOOGLE_CDN_SIGNURL_KEY_NAME' => :google_cdn_signurl_key_name,
|
134
|
+
'GCS_CDN_BUCKET_NAME' => :gcs_cdn_bucket_name,
|
130
135
|
'GCS_BUCKET_NAME' => :gcs_bucket_name,
|
131
136
|
'SMOKE_ONLY' => :smoke_only,
|
132
137
|
'NO_ADMIN' => :no_admin,
|
@@ -212,7 +217,7 @@ module Gitlab
|
|
212
217
|
end
|
213
218
|
|
214
219
|
def elastic_version
|
215
|
-
env_var_value_if_defined('ELASTIC_VERSION') || '
|
220
|
+
env_var_value_if_defined('ELASTIC_VERSION') || '7.17.0'.freeze
|
216
221
|
end
|
217
222
|
|
218
223
|
def require_license!
|
@@ -275,6 +280,14 @@ module Gitlab
|
|
275
280
|
end
|
276
281
|
end
|
277
282
|
|
283
|
+
def require_gcs_with_cdn_environment!
|
284
|
+
%w[GOOGLE_CDN_JSON_KEY GCS_CDN_BUCKET_NAME GOOGLE_CDN_LB GOOGLE_CDN_SIGNURL_KEY GOOGLE_CDN_SIGNURL_KEY_NAME].each do |env_key|
|
285
|
+
unless ENV.key?(env_key)
|
286
|
+
raise ArgumentError, "Environment variable #{env_key} must be set to run GCS with CDN enabled scenario"
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
278
291
|
def require_initial_password!
|
279
292
|
return unless env_var_value_if_defined('GITLAB_INITIAL_ROOT_PASSWORD').to_s.strip.empty?
|
280
293
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gitlab
|
4
|
+
module QA
|
5
|
+
module Runtime
|
6
|
+
module OmnibusConfigurations
|
7
|
+
class CiDecomposition < Default
|
8
|
+
def configuration
|
9
|
+
# HACK: commenting commands out as these commands should be run *after* the first
|
10
|
+
# reconfiguration (see first command in #exec_commands)
|
11
|
+
<<~OMNIBUS
|
12
|
+
#gitlab_rails['databases']['main']['enable'] = true
|
13
|
+
#gitlab_rails['databases']['ci']['enable'] = true
|
14
|
+
#gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
|
15
|
+
OMNIBUS
|
16
|
+
end
|
17
|
+
|
18
|
+
def exec_commands
|
19
|
+
[
|
20
|
+
"sed -i 's/#gitlab_rails/gitlab_rails/g' /etc/gitlab/gitlab.rb",
|
21
|
+
"gitlab-ctl reconfigure",
|
22
|
+
"gitlab-psql -c 'create database gitlabhq_production_ci owner gitlab'",
|
23
|
+
"gitlab-psql -d gitlabhq_production_ci -c 'create extension btree_gist'",
|
24
|
+
"gitlab-psql -d gitlabhq_production_ci -c 'create extension pg_trgm'",
|
25
|
+
"gitlab-rake db:structure:load:ci"
|
26
|
+
].freeze
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -27,6 +27,7 @@ module Gitlab
|
|
27
27
|
specs.suite = @suite
|
28
28
|
specs.release = release
|
29
29
|
specs.args = non_rspec_args.push(*args)
|
30
|
+
specs.volumes[host_knapsack_report_path] = "/home/gitlab/qa/knapsack" if host_knapsack_report_path
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -37,6 +38,10 @@ module Gitlab
|
|
37
38
|
def deployment_component
|
38
39
|
raise NotImplementedError, 'Please define the Component for the deployment environment associated with this scenario.'
|
39
40
|
end
|
41
|
+
|
42
|
+
def host_knapsack_report_path
|
43
|
+
ENV["QA_KNAPSACK_REPORT_PATH"]
|
44
|
+
end
|
40
45
|
end
|
41
46
|
end
|
42
47
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Gitlab
|
2
|
+
module QA
|
3
|
+
module Scenario
|
4
|
+
module Test
|
5
|
+
module Instance
|
6
|
+
class StagingRefGeo < DeploymentBase
|
7
|
+
def initialize
|
8
|
+
@suite = 'QA::EE::Scenario::Test::Geo'
|
9
|
+
end
|
10
|
+
|
11
|
+
def deployment_component
|
12
|
+
Component::StagingRef
|
13
|
+
end
|
14
|
+
|
15
|
+
def non_rspec_args
|
16
|
+
[
|
17
|
+
'--primary-address', deployment_component::ADDRESS,
|
18
|
+
'--secondary-address', deployment_component::GEO_SECONDARY_ADDRESS,
|
19
|
+
'--without-setup'
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -16,6 +16,7 @@ module Gitlab
|
|
16
16
|
primary.release = release
|
17
17
|
primary.name = 'gitlab-primary'
|
18
18
|
primary.network = 'geo'
|
19
|
+
primary.seed_admin_token = false
|
19
20
|
primary.omnibus_configuration << <<~OMNIBUS
|
20
21
|
gitlab_rails['db_key_base'] = '4dd58204865eb41bca93bd38131d51cc';
|
21
22
|
geo_primary_role['enable'] = true;
|
@@ -54,7 +55,7 @@ module Gitlab
|
|
54
55
|
sidekiq['concurrency'] = 2;
|
55
56
|
puma['worker_processes'] = 2;
|
56
57
|
OMNIBUS
|
57
|
-
secondary.exec_commands
|
58
|
+
secondary.exec_commands += fast_ssh_key_lookup_commands + QA::Scenario::CLICommands.git_lfs_install_commands
|
58
59
|
|
59
60
|
secondary.act do
|
60
61
|
# TODO, we do not wait for secondary to start because of
|
@@ -37,6 +37,7 @@ module Gitlab
|
|
37
37
|
praefect.name = @praefect_node_name
|
38
38
|
praefect.network = @network
|
39
39
|
praefect.skip_availability_check = true
|
40
|
+
praefect.seed_admin_token = false
|
40
41
|
|
41
42
|
praefect.omnibus_configuration << praefect_omnibus_configuration
|
42
43
|
|
@@ -196,6 +197,7 @@ module Gitlab
|
|
196
197
|
gitaly.name = name
|
197
198
|
gitaly.network = @network
|
198
199
|
gitaly.skip_availability_check = true
|
200
|
+
gitaly.seed_admin_token = false
|
199
201
|
gitaly.omnibus_configuration << gitaly_omnibus_configuration
|
200
202
|
gitaly.instance(skip_teardown: true)
|
201
203
|
end
|
@@ -22,7 +22,11 @@ module Gitlab
|
|
22
22
|
specs.suite = 'Test::Integration::Mattermost'
|
23
23
|
specs.release = gitlab.release
|
24
24
|
specs.network = gitlab.network
|
25
|
-
specs.args = [
|
25
|
+
specs.args = [
|
26
|
+
gitlab.address,
|
27
|
+
"--mattermost-address", mattermost_external_url,
|
28
|
+
*rspec_args
|
29
|
+
]
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|