gitlab-qa 6.3.0 → 6.7.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: 5c99ceb7cdd5d4c53dabf353157bbaf334c7c67febb2afc93620e8bca0fe3774
4
- data.tar.gz: a0d26ee7c892402f37cb9bc0e311f649687878fb088bca8c881ce64a5a0bcd54
3
+ metadata.gz: 1615e54144d0b669245a15b6a5874efc1d00157fe859dbc6ff2e723380e9da10
4
+ data.tar.gz: f3ccd0528987c838c793d1bbc2f742833584756bf7a87c58c29b60fa2f7b6ac3
5
5
  SHA512:
6
- metadata.gz: 6984d1bcbfb7939d2b806f9857b6403db776458eba0c89ee719be35f563b4a96076a80ca2cf8bb765e4eccf819e7554343c59b08c702d8d45d4d0c85bcde618c
7
- data.tar.gz: 4c44818ae663d2eece632825d8efd12535312f71a98e7211ab8b431b8dec5d8561d339a1b69e3884797f3324cb049b64164da4be4c0064c329de600cf731d020
6
+ metadata.gz: 47fce0af7a769ccb9dca14c87f3d1f169495324f753f3db60bb8aa10fc6e05a4612f0bc1704e884dca3d7349bd6d0972d5ca77421bba71f60fd03258e24bc52b
7
+ data.tar.gz: f1d65176693a0091989392eec19425a34d2cbc1ee92cb428178ee22ca438b19e7246fd1306bfdaaa73f5d531a6c01ad5a6b2ee1324ca72ef0ba9b255ae4782f3
@@ -5,7 +5,7 @@ stages:
5
5
  - notify
6
6
 
7
7
  default:
8
- image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-ruby-2.6
8
+ image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-ruby-2.7
9
9
  tags:
10
10
  - gitlab-org
11
11
  cache:
@@ -729,6 +729,44 @@ ee:packages-quarantine:
729
729
  variables:
730
730
  QA_SCENARIO: "Test::Integration::Packages"
731
731
 
732
+ ce:actioncable:
733
+ extends:
734
+ - .test
735
+ - .high-capacity
736
+ - .ce-qa
737
+ - .rspec-report-opts
738
+ variables:
739
+ QA_SCENARIO: "Test::Integration::Actioncable"
740
+
741
+ ce:actioncable-quarantine:
742
+ extends:
743
+ - .test
744
+ - .high-capacity
745
+ - .ce-qa
746
+ - .quarantine
747
+ - .rspec-report-opts
748
+ variables:
749
+ QA_SCENARIO: "Test::Integration::Actioncable"
750
+
751
+ ee:actioncable:
752
+ extends:
753
+ - .test
754
+ - .high-capacity
755
+ - .ee-qa
756
+ - .rspec-report-opts
757
+ variables:
758
+ QA_SCENARIO: "Test::Integration::Actioncable"
759
+
760
+ ee:actioncable-quarantine:
761
+ extends:
762
+ - .test
763
+ - .high-capacity
764
+ - .ee-qa
765
+ - .quarantine
766
+ - .rspec-report-opts
767
+ variables:
768
+ QA_SCENARIO: "Test::Integration::Actioncable"
769
+
732
770
  ee:elasticsearch:
733
771
  extends:
734
772
  - .test
@@ -32,4 +32,4 @@ with the latest commit from https://gitlab.com/gitlab-org/gitlab-qa/commits/mast
32
32
  - Checklist after merging:
33
33
  - [ ] [Create a tag for the new release version](docs/release_process.md#how-to).
34
34
 
35
- /label ~Quality ~backstage
35
+ /label ~Quality ~"feature::maintenance"
@@ -1,3 +1,5 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  require:
2
4
  # Due to a probably bug in rubocop (https://github.com/bbatsov/rubocop/issues/5251)
3
5
  # we need to require rubocop-rspec a second time so that RSpec/FilePath does
@@ -0,0 +1,98 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-10-31 07:26:03 -0700 using RuboCop version 0.82.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 51
10
+ # Cop supports --auto-correct.
11
+ # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
12
+ # URISchemes: http, https
13
+ Layout/LineLength:
14
+ Max: 210
15
+
16
+ # Offense count: 2
17
+ # Cop supports --auto-correct.
18
+ Lint/RedundantCopDisableDirective:
19
+ Exclude:
20
+ - 'lib/gitlab/qa/component/staging.rb'
21
+ - 'lib/gitlab/qa/runtime/scenario.rb'
22
+
23
+ # Offense count: 1
24
+ # Cop supports --auto-correct.
25
+ # Configuration parameters: PreferredName.
26
+ Naming/RescuedExceptionsVariableName:
27
+ Exclude:
28
+ - 'lib/gitlab/qa/component/staging.rb'
29
+
30
+ # Offense count: 1
31
+ # Cop supports --auto-correct.
32
+ Performance/RegexpMatch:
33
+ Exclude:
34
+ - 'lib/gitlab/qa/component/gitlab.rb'
35
+
36
+ # Offense count: 3
37
+ # Cop supports --auto-correct.
38
+ RSpec/EmptyLineAfterLetBlock:
39
+ Exclude:
40
+ - 'spec/gitlab/qa/support/dev_eeqa_image_spec.rb'
41
+
42
+ # Offense count: 4
43
+ # Cop supports --auto-correct.
44
+ # Configuration parameters: CustomTransform, IgnoredWords.
45
+ RSpec/ExampleWording:
46
+ Exclude:
47
+ - 'spec/gitlab/qa/component/gitlab_spec.rb'
48
+
49
+ # Offense count: 2
50
+ RSpec/LeakyConstantDeclaration:
51
+ Exclude:
52
+ - 'spec/gitlab/qa/scenario/test/instance/deployment_base_spec.rb'
53
+
54
+ # Offense count: 93
55
+ # Cop supports --auto-correct.
56
+ # Configuration parameters: EnforcedStyle.
57
+ # SupportedStyles: always, always_true, never
58
+ Style/FrozenStringLiteralComment:
59
+ Enabled: false
60
+
61
+ # Offense count: 1
62
+ # Cop supports --auto-correct.
63
+ Style/HashTransformKeys:
64
+ Exclude:
65
+ - 'lib/gitlab/qa/docker/volumes.rb'
66
+
67
+ # Offense count: 6
68
+ # Cop supports --auto-correct.
69
+ Style/IfUnlessModifier:
70
+ Exclude:
71
+ - 'lib/gitlab/qa/component/gitlab.rb'
72
+ - 'lib/gitlab/qa/release.rb'
73
+ - 'lib/gitlab/qa/runtime/env.rb'
74
+ - 'lib/gitlab/qa/runtime/scenario.rb'
75
+ - 'lib/gitlab/qa/scenario/test/omnibus/upgrade.rb'
76
+ - 'lib/gitlab/qa/support/http_request.rb'
77
+
78
+ # Offense count: 1
79
+ Style/MethodMissingSuper:
80
+ Exclude:
81
+ - 'lib/gitlab/qa/runtime/scenario.rb'
82
+
83
+ # Offense count: 1
84
+ Style/MissingRespondToMissing:
85
+ Exclude:
86
+ - 'lib/gitlab/qa/runtime/scenario.rb'
87
+
88
+ # Offense count: 5
89
+ # Cop supports --auto-correct.
90
+ # Configuration parameters: EnforcedStyle.
91
+ # SupportedStyles: literals, strict
92
+ Style/MutableConstant:
93
+ Exclude:
94
+ - 'db/migrate/**/*'
95
+ - 'db/post_migrate/**/*'
96
+ - 'db/geo/migrate/**/*'
97
+ - 'lib/gitlab/qa/release.rb'
98
+ - 'lib/gitlab/qa/report/update_screenshot_path.rb'
@@ -545,6 +545,23 @@ $ export EE_LICENSE=$(cat /path/to/GitLab.gitlab_license)
545
545
  $ gitlab-qa Test::Integration::Jira EE
546
546
  ```
547
547
 
548
+ ### `Test::Integration::Actioncable CE|EE|<full image address>`
549
+
550
+ This tests the real-time assignees feature by setting
551
+ `actioncable['enable'] = true` in the Omnibus configuration
552
+ before starting the GitLab container.
553
+
554
+ To run tests against the GitLab container, a GitLab QA (`gitlab/gitlab-qa`)
555
+ container is spun up and tests are run from it by running the
556
+ `Test::Instance::All` scenario with the `--tag actioncable` RSpec parameter,
557
+ which runs only the tests with `:actioncable` metadata.
558
+
559
+ Example:
560
+
561
+ ```
562
+ $ gitlab-qa Test::Integration::Actioncable CE
563
+ ```
564
+
548
565
  ### `Test::Instance::Any CE|EE|<full image address>:nightly|latest|any_tag http://your.instance.gitlab`
549
566
 
550
567
  This tests that a live GitLab instance works as expected by running tests
@@ -20,12 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  # Some dependencies are pinned, to prevent new cops from breaking the CI pipelines
22
22
  spec.add_development_dependency 'climate_control', '~> 0.2'
23
- spec.add_development_dependency 'gitlab-styles', '2.4.0'
23
+ spec.add_development_dependency 'gitlab-styles', '~> 4.3.0'
24
24
  spec.add_development_dependency 'pry', '~> 0.11'
25
25
  spec.add_development_dependency 'rake', '~> 12.2'
26
26
  spec.add_development_dependency 'rspec', '~> 3.7'
27
- spec.add_development_dependency 'rubocop', '~> 0.54.0'
28
- spec.add_development_dependency 'rubocop-rspec', '1.20.1'
27
+ spec.add_development_dependency 'rubocop', '~> 0.82.0'
28
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.36'
29
29
  spec.add_development_dependency 'webmock', '3.7.0'
30
30
  spec.add_runtime_dependency 'activesupport', '~> 6.0.2'
31
31
  spec.add_runtime_dependency 'gitlab', '~> 4.11.0'
@@ -39,6 +39,7 @@ module Gitlab
39
39
  end
40
40
 
41
41
  module Integration
42
+ autoload :Actioncable, 'gitlab/qa/scenario/test/integration/actioncable'
42
43
  autoload :Geo, 'gitlab/qa/scenario/test/integration/geo'
43
44
  autoload :LDAP, 'gitlab/qa/scenario/test/integration/ldap'
44
45
  autoload :LDAPNoTLS, 'gitlab/qa/scenario/test/integration/ldap_no_tls'
@@ -98,6 +99,7 @@ module Gitlab
98
99
 
99
100
  module Report
100
101
  autoload :GitlabIssueClient, 'gitlab/qa/report/gitlab_issue_client'
102
+ autoload :BaseTestResults, 'gitlab/qa/report/base_test_results'
101
103
  autoload :JsonTestResults, 'gitlab/qa/report/json_test_results'
102
104
  autoload :JUnitTestResults, 'gitlab/qa/report/junit_test_results'
103
105
  autoload :PrepareStageReports, 'gitlab/qa/report/prepare_stage_reports'
@@ -61,7 +61,7 @@ module Gitlab
61
61
  end
62
62
 
63
63
  def prepare_network
64
- if runner_network && !docker.network_exists?(runner_network)
64
+ if runner_network && !docker.network_exists?(runner_network) # rubocop:disable Style/IfUnlessModifier
65
65
  docker.network_create("--driver=bridge --internal #{runner_network}")
66
66
  end
67
67
 
@@ -128,10 +128,10 @@ module Gitlab
128
128
  end
129
129
  end
130
130
 
131
- def wait
131
+ def wait_until_ready
132
132
  return if skip_availability_check
133
133
 
134
- if Availability.new(name, relative_path: relative_path, scheme: scheme, protocol_port: port.to_i).check(180)
134
+ if Availability.new(name, relative_path: relative_path, scheme: scheme, protocol_port: port.to_i).check(300)
135
135
  sleep 12 # TODO, handle that better
136
136
  puts ' -> GitLab is available.'
137
137
  else
@@ -30,7 +30,8 @@ module Gitlab
30
30
  begin
31
31
  run_psql 'template1'
32
32
  rescue StandardError
33
- retry if Time.now - start < 30
33
+ sleep 5
34
+ retry if Time.now - start < 60
34
35
  raise
35
36
  end
36
37
  end
@@ -27,7 +27,7 @@ module Gitlab
27
27
  end
28
28
  end
29
29
 
30
- if wait.value.exited? && wait.value.exitstatus.nonzero?
30
+ if wait.value.exited? && wait.value.exitstatus.nonzero? # rubocop:disable Style/IfUnlessModifier
31
31
  raise StatusError, "Docker command `#{@command.mask_secrets}` failed!"
32
32
  end
33
33
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Report
6
+ class BaseTestResults
7
+ include Enumerable
8
+
9
+ def initialize(path)
10
+ @results = parse(path)
11
+ @testcases = process
12
+ end
13
+
14
+ def each(&block)
15
+ testcases.each(&block)
16
+ end
17
+
18
+ def write(path)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :results, :testcases
25
+
26
+ def parse(path)
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def process
31
+ raise NotImplementedError
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -5,15 +5,23 @@ require 'json'
5
5
  module Gitlab
6
6
  module QA
7
7
  module Report
8
- class JsonTestResults
9
- include Enumerable
8
+ class JsonTestResults < BaseTestResults
9
+ def write(path)
10
+ json = results.merge('examples' => testcases.map(&:report))
10
11
 
11
- def initialize(file)
12
- @testcases = JSON.parse(File.read(file))['examples'].map { |test| TestResult.from_json(test) }
12
+ File.write(path, JSON.pretty_generate(json))
13
13
  end
14
14
 
15
- def each(&block)
16
- @testcases.each(&block)
15
+ private
16
+
17
+ def parse(path)
18
+ JSON.parse(File.read(path))
19
+ end
20
+
21
+ def process
22
+ results['examples'].map do |test|
23
+ TestResult.from_json(test)
24
+ end
17
25
  end
18
26
  end
19
27
  end
@@ -5,15 +5,21 @@ require 'nokogiri'
5
5
  module Gitlab
6
6
  module QA
7
7
  module Report
8
- class JUnitTestResults
9
- include Enumerable
8
+ class JUnitTestResults < BaseTestResults
9
+ def write(path)
10
+ # Ignore it for now
11
+ end
12
+
13
+ private
10
14
 
11
- def initialize(file)
12
- @testcases = Nokogiri::XML(File.read(file)).xpath('//testcase').map { |test| TestResult.from_junit(test) }
15
+ def parse(path)
16
+ Nokogiri::XML.parse(File.read(path))
13
17
  end
14
18
 
15
- def each(&block)
16
- @testcases.each(&block)
19
+ def process
20
+ results.xpath('//testcase').map do |test|
21
+ TestResult.from_junit(test)
22
+ end
17
23
  end
18
24
  end
19
25
  end
@@ -15,15 +15,15 @@ module Gitlab
15
15
  def run!
16
16
  puts "Reporting test results in `#{files.join(',')}` as issues in project `#{project}` via the API at `#{Runtime::Env.gitlab_api_base}`."
17
17
 
18
- Dir.glob(files).each do |file|
19
- puts "Reporting tests in #{file}"
20
- extension = File.extname(file)
18
+ Dir.glob(files).each do |path|
19
+ puts "Reporting tests in #{path}"
20
+ extension = File.extname(path)
21
21
 
22
22
  case extension
23
23
  when '.json'
24
- test_results = Report::JsonTestResults.new(file)
24
+ test_results = Report::JsonTestResults.new(path)
25
25
  when '.xml'
26
- test_results = Report::JUnitTestResults.new(file)
26
+ test_results = Report::JUnitTestResults.new(path)
27
27
  else
28
28
  raise "Unknown extension #{extension}"
29
29
  end
@@ -31,6 +31,8 @@ module Gitlab
31
31
  test_results.each do |test|
32
32
  report_test(test)
33
33
  end
34
+
35
+ test_results.write(path)
34
36
  end
35
37
  end
36
38
 
@@ -48,6 +50,8 @@ module Gitlab
48
50
  puts "Created new issue: #{issue.web_url}"
49
51
  end
50
52
 
53
+ test.testcase ||= issue.web_url
54
+
51
55
  update_labels(issue, test)
52
56
  note_status(issue, test)
53
57
 
@@ -4,60 +4,114 @@ module Gitlab
4
4
  module QA
5
5
  module Report
6
6
  class TestResult
7
- attr_accessor :name, :file, :skipped, :failures, :testcase
8
-
9
- def self.from_json(test)
10
- new.tap do |test_result|
11
- test_result.name = test['full_description']
12
- test_result.file = test['file_path']
13
- test_result.skipped = test['status'] == 'pending'
14
- test_result.failures = failures_from_json_exceptions(test)
15
- test_result.testcase = test['testcase']
16
- end
7
+ def self.from_json(report)
8
+ JsonTestResult.new(report)
17
9
  end
18
10
 
19
- def self.from_junit(test)
20
- new.tap do |test_result|
21
- test_result.name = test['name']
22
- test_result.file = test['file']
23
- test_result.skipped = test.search('skipped').any?
24
- test_result.failures = failures_from_junit_exceptions(test)
25
- end
11
+ def self.from_junit(report)
12
+ JUnitTestResult.new(report)
26
13
  end
27
14
 
28
- def self.failures_from_json_exceptions(test)
29
- return [] unless test.key?('exceptions')
15
+ attr_accessor :report, :failures
30
16
 
31
- test['exceptions'].map do |exception|
32
- spec_file_first_index = exception['backtrace'].rindex do |line|
33
- line.include?(File.basename(test['file_path']))
34
- end
17
+ def initialize(report)
18
+ self.report = report
19
+ self.failures = failures_from_exceptions
20
+ end
35
21
 
36
- {
37
- 'message' => "#{exception['class']}: #{exception['message']}",
38
- 'stacktrace' => "#{exception['message_lines'].join("\n")}\n#{exception['backtrace'].slice(0..spec_file_first_index).join("\n")}"
39
- }
40
- end
22
+ def name
23
+ raise NotImplementedError
41
24
  end
42
- private_class_method :failures_from_json_exceptions
43
25
 
44
- def self.failures_from_junit_exceptions(test)
45
- failures = test.search('failure')
46
- return [] if failures.empty?
26
+ def file
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def skipped
31
+ raise NotImplementedError
32
+ end
33
+
34
+ private
35
+
36
+ def failures_from_exceptions
37
+ raise NotImplementedError
38
+ end
39
+
40
+ class JsonTestResult < TestResult
41
+ def name
42
+ report['full_description']
43
+ end
44
+
45
+ def file
46
+ report['file_path']
47
+ end
48
+
49
+ def skipped
50
+ report['status'] == 'pending'
51
+ end
52
+
53
+ def testcase
54
+ report['testcase']
55
+ end
47
56
 
48
- failures.map do |exception|
49
- trace = exception.content.split("\n").map(&:strip)
50
- spec_file_first_index = trace.rindex do |line|
51
- line.include?(File.basename(test['file']))
57
+ def testcase=(new_testcase)
58
+ report['testcase'] = new_testcase
59
+ end
60
+
61
+ private
62
+
63
+ # rubocop:disable Metrics/AbcSize
64
+ def failures_from_exceptions
65
+ return [] unless report.key?('exceptions')
66
+
67
+ report['exceptions'].map do |exception|
68
+ spec_file_first_index = exception['backtrace'].rindex do |line|
69
+ line.include?(File.basename(report['file_path']))
70
+ end
71
+
72
+ {
73
+ 'message' => "#{exception['class']}: #{exception['message']}",
74
+ 'stacktrace' => "#{exception['message_lines'].join("\n")}\n#{exception['backtrace'].slice(0..spec_file_first_index).join("\n")}"
75
+ }
52
76
  end
77
+ end
78
+ # rubocop:enable Metrics/AbcSize
79
+ end
80
+
81
+ class JUnitTestResult < TestResult
82
+ def name
83
+ report['name']
84
+ end
53
85
 
54
- {
55
- 'message' => "#{exception['type']}: #{exception['message']}",
56
- 'stacktrace' => trace.slice(0..spec_file_first_index).join("\n")
57
- }
86
+ def file
87
+ report['file']
88
+ end
89
+
90
+ def skipped
91
+ report.search('skipped').any?
92
+ end
93
+
94
+ attr_accessor :testcase # Ignore it for now
95
+
96
+ private
97
+
98
+ def failures_from_exceptions
99
+ failures = report.search('failure')
100
+ return [] if failures.empty?
101
+
102
+ failures.map do |exception|
103
+ trace = exception.content.split("\n").map(&:strip)
104
+ spec_file_first_index = trace.rindex do |line|
105
+ line.include?(File.basename(report['file']))
106
+ end
107
+
108
+ {
109
+ 'message' => "#{exception['type']}: #{exception['message']}",
110
+ 'stacktrace' => trace.slice(0..spec_file_first_index).join("\n")
111
+ }
112
+ end
58
113
  end
59
114
  end
60
- private_class_method :failures_from_junit_exceptions
61
115
  end
62
116
  end
63
117
  end
@@ -62,6 +62,8 @@ module Gitlab
62
62
  'KNAPSACK_TEST_FILE_PATTERN' => :knapsack_test_file_pattern,
63
63
  'KNAPSACK_TEST_DIR' => :knapsack_test_dir,
64
64
  'CI' => :ci,
65
+ 'CI_JOB_ID' => :ci_job_id,
66
+ 'CI_JOB_URL' => :ci_job_url,
65
67
  'CI_RUNNER_ID' => :ci_runner_id,
66
68
  'CI_SERVER_HOST' => :ci_server_host,
67
69
  'CI_SERVER_PERSONAL_ACCESS_TOKEN' => :ci_server_personal_access_token,
@@ -85,8 +87,12 @@ module Gitlab
85
87
  'DEPLOY_VERSION' => :deploy_version
86
88
  }.freeze
87
89
 
88
- ENV_VARIABLES.each_value do |accessor|
89
- send(:attr_accessor, accessor) # rubocop:disable GitlabSecurity/PublicSend
90
+ ENV_VARIABLES.each do |env_name, method_name|
91
+ attr_writer(method_name)
92
+
93
+ define_method(method_name) do
94
+ ENV[env_name] || instance_variable_get("@#{method_name}")
95
+ end
90
96
  end
91
97
 
92
98
  def gitlab_username
@@ -113,10 +119,6 @@ module Gitlab
113
119
  ENV['CI_JOB_TOKEN']
114
120
  end
115
121
 
116
- def ci_job_url
117
- ENV['CI_JOB_URL']
118
- end
119
-
120
122
  def ci_pipeline_source
121
123
  ENV['CI_PIPELINE_SOURCE']
122
124
  end
@@ -125,30 +127,14 @@ module Gitlab
125
127
  ENV['CI_PROJECT_NAME']
126
128
  end
127
129
 
128
- def ci_slack_webhook_url
129
- ENV['CI_SLACK_WEBHOOK_URL']
130
- end
131
-
132
130
  def pipeline_from_project_name
133
131
  ci_project_name.to_s.start_with?('gitlab-qa') ? 'master' : ci_project_name
134
132
  end
135
133
 
136
- def slack_qa_channel
137
- ENV['SLACK_QA_CHANNEL']
138
- end
139
-
140
- def slack_icon_emoji
141
- ENV['SLACK_ICON_EMOJI']
142
- end
143
-
144
134
  def run_id
145
135
  @run_id ||= "gitlab-qa-run-#{Time.now.strftime('%Y-%m-%d-%H-%M-%S')}-#{SecureRandom.hex(4)}"
146
136
  end
147
137
 
148
- def qa_access_token
149
- ENV['GITLAB_QA_ACCESS_TOKEN']
150
- end
151
-
152
138
  def dev_access_token_variable
153
139
  env_value_if_defined('GITLAB_QA_DEV_ACCESS_TOKEN')
154
140
  end
@@ -228,10 +214,6 @@ module Gitlab
228
214
  enabled?(ENV['QA_SKIP_PULL'], default: false)
229
215
  end
230
216
 
231
- def gitlab_qa_formless_login_token
232
- env_value_if_defined('GITLAB_QA_FORMLESS_LOGIN_TOKEN')
233
- end
234
-
235
217
  private
236
218
 
237
219
  def enabled?(value, default: true)
@@ -0,0 +1,36 @@
1
+ module Gitlab
2
+ module QA
3
+ module Scenario
4
+ module Test
5
+ module Integration
6
+ class Actioncable < Scenario::Template
7
+ def perform(release, *rspec_args)
8
+ Component::Gitlab.perform do |gitlab|
9
+ gitlab.release = QA::Release.new(release)
10
+ gitlab.name = 'gitlab-actioncable'
11
+ gitlab.network = 'test'
12
+ gitlab.omnibus_config = <<~OMNIBUS
13
+ actioncable['enable'] = true;
14
+ OMNIBUS
15
+
16
+ gitlab.instance do
17
+ puts "Running actioncable specs!"
18
+
19
+ rspec_args << "--" unless rspec_args.include?('--')
20
+ rspec_args << %w[--tag actioncable]
21
+
22
+ Component::Specs.perform do |specs|
23
+ specs.suite = 'Test::Instance::All'
24
+ specs.release = gitlab.release
25
+ specs.network = gitlab.network
26
+ specs.args = [gitlab.address, *rspec_args]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -15,6 +15,8 @@ module Gitlab
15
15
  @database = 'postgres'
16
16
  @spec_suite = 'Test::Instance::All'
17
17
  @network = 'test'
18
+ @env = {}
19
+ @tag = 'gitaly_cluster'
18
20
  end
19
21
 
20
22
  # rubocop:disable Metrics/AbcSize
@@ -51,14 +53,17 @@ module Gitlab
51
53
  gitlab.instance do
52
54
  puts "Running Gitaly Cluster specs!"
53
55
 
54
- rspec_args << "--" unless rspec_args.include?('--')
55
- rspec_args << %w[--tag gitaly_cluster]
56
+ if @tag
57
+ rspec_args << "--" unless rspec_args.include?('--')
58
+ rspec_args << "--tag" << @tag
59
+ end
56
60
 
57
61
  Component::Specs.perform do |specs|
58
62
  specs.suite = spec_suite
59
63
  specs.release = gitlab.release
60
64
  specs.network = gitlab.network
61
65
  specs.args = [gitlab.address, *rspec_args]
66
+ specs.env = @env
62
67
  end
63
68
  end
64
69
  end
@@ -3,105 +3,62 @@ module Gitlab
3
3
  module Scenario
4
4
  module Test
5
5
  module Integration
6
- class Praefect < Scenario::Template
7
- # rubocop:disable Metrics/AbcSize
8
- def perform(release, *rspec_args)
9
- Docker::Volumes.new.with_temporary_volumes do |volumes|
10
- # Create the Praefect database before enabling Praefect
11
- Component::Gitlab.perform do |gitlab|
12
- gitlab.release = QA::Release.new(release)
13
- gitlab.name = 'gitlab'
14
- gitlab.network = 'test'
15
- gitlab.volumes = volumes
16
- gitlab.exec_commands = [
17
- 'gitlab-psql -d template1 -c "CREATE DATABASE praefect_production OWNER gitlab"',
18
- 'mkdir -p /var/opt/gitlab/git-data/repositories/praefect',
19
- 'chown -R git:root /var/opt/gitlab/git-data/repositories'
20
- ]
6
+ class Praefect < GitalyCluster
7
+ attr_reader :gitlab_name, :spec_suite
21
8
 
22
- gitlab.act do
23
- prepare
24
- start
25
- reconfigure
26
- process_exec_commands
27
- wait
28
- teardown!
29
- end
30
- end
9
+ def initialize
10
+ super
31
11
 
32
- # Restart GitLab with Praefect enabled and then run the tests
33
- Component::Gitlab.perform do |gitlab|
34
- gitlab.release = QA::Release.new(release)
35
- gitlab.name = 'gitlab'
36
- gitlab.network = 'test'
37
- gitlab.volumes = volumes
38
- gitlab.omnibus_config = omnibus_config_with_praefect
39
-
40
- gitlab.act do
41
- prepare_gitlab_omnibus_config
42
- start
43
- reconfigure
44
- wait
45
-
46
- puts "Running Praefect specs!"
47
-
48
- Component::Specs.perform do |specs|
49
- specs.suite = 'Test::Instance::All'
50
- specs.release = gitlab.release
51
- specs.network = gitlab.network
52
- specs.args = [gitlab.address, *rspec_args]
53
- specs.env = { QA_PRAEFECT_REPOSITORY_STORAGE: 'default' }
54
- end
55
-
56
- teardown
57
- end
58
- end
59
- end
12
+ @tag = nil
13
+ @env = { QA_PRAEFECT_REPOSITORY_STORAGE: 'default' }
60
14
  end
61
- # rubocop:enable Metrics/AbcSize
62
-
63
- private
64
15
 
65
- def omnibus_config_with_praefect
16
+ def gitlab_omnibus_configuration
66
17
  <<~OMNIBUS
67
- gitaly['enable'] = true;
18
+ external_url 'http://#{@gitlab_name}.#{@network}';
19
+
20
+ git_data_dirs({
21
+ 'default' => {
22
+ 'gitaly_address' => 'tcp://#{@praefect_node_name}.#{@network}:2305',
23
+ 'gitaly_token' => 'PRAEFECT_EXTERNAL_TOKEN'
24
+ },
25
+ 'gitaly' => {
26
+ 'gitaly_address' => 'tcp://#{@gitlab_name}.#{@network}:8075',
27
+ 'path' => '/var/opt/gitlab/git-data'
28
+ }
29
+ });
68
30
  gitaly['listen_addr'] = '0.0.0.0:8075';
69
31
  gitaly['auth_token'] = 'secret-token';
70
32
  gitaly['storage'] = [
71
- {
72
- 'name' => 'praefect-gitaly-0',
73
- 'path' => '/var/opt/gitlab/git-data/repositories/praefect'
74
- },
75
33
  {
76
34
  'name' => 'gitaly',
77
- 'path' => '/var/opt/gitlab/git-data/repositories/gitaly'
35
+ 'path' => '/var/opt/gitlab/git-data/repositories'
78
36
  }
79
37
  ];
80
- praefect['enable'] = true;
81
- praefect['listen_addr'] = '0.0.0.0:2305';
82
- praefect['auth_token'] = 'secret-token';
83
- praefect['virtual_storages'] = {
84
- 'default' => {
85
- 'praefect-gitaly-0' => {
86
- 'address' => 'tcp://localhost:8075',
87
- 'token' => 'secret-token',
88
- 'primary' => true
89
- }
90
- }
91
- };
92
- praefect['database_host'] = '/var/opt/gitlab/postgresql';
93
- praefect['database_user'] = 'gitlab';
94
- praefect['database_dbname'] = 'praefect_production';
95
- praefect['postgres_queue_enabled'] = true;
96
38
  gitlab_rails['gitaly_token'] = 'secret-token';
97
- git_data_dirs({
98
- 'default' => {
99
- 'gitaly_address' => 'tcp://localhost:2305'
39
+ gitlab_shell['secret_token'] = 'GITLAB_SHELL_SECRET_TOKEN';
40
+ prometheus['scrape_configs'] = [
41
+ {
42
+ 'job_name' => 'praefect',
43
+ 'static_configs' => [
44
+ 'targets' => [
45
+ '#{@praefect_node_name}.#{@network}:9652'
46
+ ]
47
+ ]
100
48
  },
101
- 'gitaly' => {
102
- 'path' => '/var/opt/gitlab/git-data/repositories/gitaly'
49
+ {
50
+ 'job_name' => 'praefect-gitaly',
51
+ 'static_configs' => [
52
+ 'targets' => [
53
+ '#{@primary_node_name}.#{@network}:9236',
54
+ '#{@secondary_node_name}.#{@network}:9236',
55
+ '#{@tertiary_node_name}.#{@network}:9236'
56
+ ]
57
+ ]
103
58
  }
104
- });
59
+ ];
60
+ grafana['disable_login_form'] = false;
61
+ grafana['admin_password'] = 'GRAFANA_ADMIN_PASSWORD';
105
62
  OMNIBUS
106
63
  end
107
64
  end
@@ -15,7 +15,7 @@ module Gitlab
15
15
  reconfigure
16
16
 
17
17
  restart
18
- wait
18
+ wait_until_ready
19
19
  teardown
20
20
  end
21
21
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '6.3.0'.freeze
3
+ VERSION = '6.7.0'.freeze
4
4
  end
5
5
  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: 6.3.0
4
+ version: 6.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grzegorz Bizon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2020-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: gitlab-styles
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.4.0
33
+ version: 4.3.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.4.0
40
+ version: 4.3.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.54.0
89
+ version: 0.82.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.54.0
96
+ version: 0.82.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop-rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '='
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.20.1
103
+ version: '1.36'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '='
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.20.1
110
+ version: '1.36'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: webmock
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -207,6 +207,7 @@ files:
207
207
  - ".gitlab/merge_request_templates/Release.md"
208
208
  - ".rspec"
209
209
  - ".rubocop.yml"
210
+ - ".rubocop_todo.yml"
210
211
  - ".travis.yml"
211
212
  - CONTRIBUTING.md
212
213
  - Gemfile
@@ -257,6 +258,7 @@ files:
257
258
  - lib/gitlab/qa/docker/shellout.rb
258
259
  - lib/gitlab/qa/docker/volumes.rb
259
260
  - lib/gitlab/qa/release.rb
261
+ - lib/gitlab/qa/report/base_test_results.rb
260
262
  - lib/gitlab/qa/report/gitlab_issue_client.rb
261
263
  - lib/gitlab/qa/report/json_test_results.rb
262
264
  - lib/gitlab/qa/report/junit_test_results.rb
@@ -287,6 +289,7 @@ files:
287
289
  - lib/gitlab/qa/scenario/test/instance/smoke.rb
288
290
  - lib/gitlab/qa/scenario/test/instance/staging.rb
289
291
  - lib/gitlab/qa/scenario/test/instance/staging_geo.rb
292
+ - lib/gitlab/qa/scenario/test/integration/actioncable.rb
290
293
  - lib/gitlab/qa/scenario/test/integration/elasticsearch.rb
291
294
  - lib/gitlab/qa/scenario/test/integration/geo.rb
292
295
  - lib/gitlab/qa/scenario/test/integration/gitaly_cluster.rb