gitlab-qa 4.17.0 → 4.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5672c0e755fe027bb4848cb20e9df5b67c43d9855411e46c72ffc4d0c8b960c2
4
- data.tar.gz: c0994879e81941382496597036a79067f0e959f197a98ba2852162f6f98134a7
3
+ metadata.gz: 2b8e33bf4d877487bb51ea8065ebf88f3d994d185e7ae726231de792f940eb7b
4
+ data.tar.gz: 629036685c9ca7bb1e5bb95e2969bf406b91968d237f80af57e312c7a68b9018
5
5
  SHA512:
6
- metadata.gz: 833284d43adec815bf2fe2c518d88c3d3786200f17fa4234d949a90ffc9602752846106c821532a1932dcccbbcc16cb5e1e42ae8e6c6b352356229683143cad2
7
- data.tar.gz: 07a4d40365d3e56e9e0f5a8ecd49a5658274691d0fe2c8a64310be30075851a78d28941a31566016a32c41dc828cf5769e7475d7ebed2403c932c4e37a065ea8
6
+ metadata.gz: d3bd1fa727d5b757183ab56eec1caedc7371abc2721db21d5d461fee75dde415788437162211ab7aa7bdaf21c1cf754fb7a040a0296a1c1ae9fd4494156feb3a
7
+ data.tar.gz: 459de3a08075be669907795af61fb2dd253268f90b9600e15b0386a1d8f61192e5e203ec3fe9b3ec1c2332140b9fe1bf3bb8e7c07ec5ddb00ab347fa8a95c7f8
@@ -61,12 +61,16 @@ check:rspec:
61
61
  junit: gitlab-qa-run-*/**/rspec-*.xml
62
62
 
63
63
  .ce-qa:
64
+ variables:
65
+ DEFAULT_RELEASE: "CE"
64
66
  only:
65
67
  variables:
66
68
  - $RELEASE == null
67
69
  - $RELEASE =~ /gitlab-ce/
68
70
 
69
71
  .ee-qa:
72
+ variables:
73
+ DEFAULT_RELEASE: "EE"
70
74
  only:
71
75
  variables:
72
76
  - $RELEASE == null
@@ -98,6 +102,14 @@ check:rspec:
98
102
  allow_failure: true
99
103
  when: manual
100
104
 
105
+ .echo-custom-variables-before-calling-gitlab-qa:
106
+ script:
107
+ - echo "${QA_SCENARIO:=Test::Instance::Image}"
108
+ - echo "${QA_TESTS}"
109
+ - echo "${QA_RSPEC_TAGS}"
110
+ - echo "${RELEASE:=$DEFAULT_RELEASE}"
111
+ - exe/gitlab-qa ${QA_SCENARIO} ${RELEASE} -- ${QA_TESTS} ${QA_RSPEC_TAGS} $RSPEC_REPORT_OPTS
112
+
101
113
  ce:sanity-framework:
102
114
  script:
103
115
  - ./bin/expect_exit_code_and_text "exe/gitlab-qa Test::Instance::Image ${RELEASE:=CE} -- --tag framework" 1 "2 examples, 1 failure"
@@ -114,25 +126,25 @@ ee:sanity-framework:
114
126
  - .high-capacity
115
127
  - .ee-qa
116
128
 
117
- ce:custom:
118
- script:
119
- - exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=CE} -- ${QA_TESTS} ${QA_RSPEC_TAGS} $RSPEC_REPORT_OPTS
129
+ ce:custom-parallel:
120
130
  extends:
121
131
  - .test
122
132
  - .high-capacity
123
133
  - .ce-qa
124
134
  - .rspec-report-opts
135
+ - .echo-custom-variables-before-calling-gitlab-qa
125
136
  when: manual
137
+ parallel: 10
126
138
 
127
- ee:custom:
128
- script:
129
- - exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=EE} -- ${QA_TESTS} ${QA_RSPEC_TAGS} $RSPEC_REPORT_OPTS
139
+ ee:custom-parallel:
130
140
  extends:
131
141
  - .test
132
142
  - .high-capacity
133
143
  - .ee-qa
134
144
  - .rspec-report-opts
145
+ - .echo-custom-variables-before-calling-gitlab-qa
135
146
  when: manual
147
+ parallel: 10
136
148
 
137
149
  ce:instance:
138
150
  script:
@@ -4,21 +4,28 @@ To run the `Test::Instance::Any` scenario against your local GDK, you'll need to
4
4
  make a few changes to your `gdk/gitlab/config/gitlab.yml` file.
5
5
 
6
6
  1. Retrieve your current local IP with `ifconfig`, e.g. `192.168.0.12`.
7
- 1. Create a file named `host` in your GDK directory containing your IP. E.g.:
8
- `echo "192.168.0.12" > host`
9
- 1. Edit `gdk/gitlab/config/gitlab.yml` and
10
- - replace `host: localhost` under `production:gitlab` with `host: 192.168.0.12`.
11
- - replace `ssh_host: localhost` under `production:gitlab_shell` with
12
- `ssh_host: 192.168.0.12`.
13
- - replace `host: localhost` under `production:webpack:dev_server` with
14
- `host: 192.168.0.12`.
15
- 1. Edit `Procfile` in your GDK directory and
16
- - enable the `sshd` service by uncommenting the relevant line
17
- 1. Edit `openssh/sshd_config` in your GDK directory and
18
- - set `ListenAddress` to `192.168.0.12:2222`
19
- - add `AcceptEnv GIT_PROTOCOL` to allow the use of the [Git protocol v2][Git protocol]
20
- 1. Restart your GDK
21
- 1. Run the QA scenario as follows:
7
+ 2. In your gdk directory, create file `gdk.yml`. Within `gdk.yml` add:
8
+ ```yaml
9
+ ---
10
+ gdk:
11
+ overwrite_changes: true
12
+ hostname: 192.168.0.12
13
+ sshd:
14
+ enabled: true
15
+ listen_address: 192.168.0.12
16
+ webpack:
17
+ host: 192.168.0.12
18
+ ```
19
+ 3. Run `gdk reconfigure`
20
+ - This should update `localhost` in your `gitlab/config/gitlab.yml`.
21
+ and `gdk/Procfile` as well as `gdk/openssh/sshd_config` to the provided IP address.
22
+ 4. Edit `gdk/gitlab/config/gitlab.yml` and
23
+ - Replace `ssh_host: localhost` under `production:gitlab_shell` with `ssh_host: 192.168.0.12`.
24
+ 5. Edit `openssh/sshd_config` in your GDK directory and
25
+ - Add `AcceptEnv GIT_PROTOCOL` to allow the use of the [Git protocol v2][Git protocol]
26
+ 6. Restart your GDK by running `gdk restart`
27
+ - If reconfigure is successful, you should now be able to browse to `http://192.168.0.12:3000` instead of `http://localhost:3000`
28
+ 7. Run the QA scenario as follows:
22
29
 
23
30
  ```
24
31
  $ gitlab-qa Test::Instance::Any CE http://192.168.0.12:3000 -- qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'rubocop', '~> 0.54.0'
28
28
  spec.add_development_dependency 'rubocop-rspec', '1.20.1'
29
29
  spec.add_development_dependency 'webmock', '3.7.0'
30
+ spec.add_runtime_dependency 'nokogiri', '~> 1.10'
30
31
  end
@@ -82,5 +82,9 @@ module Gitlab
82
82
  autoload :Shellout, 'gitlab/qa/docker/shellout'
83
83
  autoload :Volumes, 'gitlab/qa/docker/volumes'
84
84
  end
85
+
86
+ module Report
87
+ autoload :PrepareStageReports, 'gitlab/qa/report/prepare_stage_reports'
88
+ end
85
89
  end
86
90
  end
@@ -5,7 +5,7 @@ module Gitlab
5
5
  include Scenario::Actable
6
6
 
7
7
  ELASTIC_IMAGE = 'docker.elastic.co/elasticsearch/elasticsearch'.freeze
8
- ELASTIC_IMAGE_TAG = '6.8.1'.freeze
8
+ ELASTIC_IMAGE_TAG = '6.4.2'.freeze
9
9
 
10
10
  attr_reader :docker
11
11
  attr_accessor :environment, :network
@@ -0,0 +1,81 @@
1
+ require 'nokogiri'
2
+
3
+ module Gitlab
4
+ module QA
5
+ module Report
6
+ class PrepareStageReports
7
+ def initialize(input_files:)
8
+ @input_files = input_files
9
+ end
10
+
11
+ # Create a new JUnit report file for each Stage, containing tests from that Stage alone
12
+ def invoke!
13
+ collate_test_cases(@input_files).each do |stage, tests|
14
+ filename = "#{stage}.xml"
15
+
16
+ File.write(filename, new_junit_report(tests))
17
+
18
+ puts "Saved #{filename}"
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def collate_test_cases(input_files)
25
+ # Collect the test cases from the original reports and group them by Stage
26
+ testcases = {}
27
+
28
+ Dir.glob(input_files).each do |rspec_report_file|
29
+ report = Nokogiri::XML(File.open(rspec_report_file))
30
+ report.xpath('//testcase').each do |test|
31
+ # The test file paths could start with any of
32
+ # /qa/specs/features/api/<stage>
33
+ # /qa/specs/features/browser_ui/<stage>
34
+ # /qa/specs/features/ee/api/<stage>
35
+ # /qa/specs/features/ee/browser_ui/<stage>
36
+ # For now we assume the Stage is whatever follows api/ or browser_ui/
37
+ stage = strip_number_prefix(test['file'].match(%r{(api|browser_ui)/([a-z0-9_]+)}i)[2])
38
+ testcases[stage] = [] unless testcases.key?(stage)
39
+ testcases[stage] << test
40
+ end
41
+ end
42
+
43
+ testcases
44
+ end
45
+
46
+ def strip_number_prefix(stage)
47
+ stage.sub(/^\d+_/, '')
48
+ end
49
+
50
+ def new_junit_report(testcases)
51
+ report = Nokogiri::XML::Document.new
52
+ testsuite_node = report.create_element('testsuite', name: 'rspec', **collect_stats(testcases))
53
+ report.root = testsuite_node
54
+
55
+ testcases.each do |test|
56
+ testsuite_node.add_child(test)
57
+ end
58
+
59
+ report.to_s
60
+ end
61
+
62
+ def collect_stats(testcases)
63
+ stats = {
64
+ tests: testcases.size,
65
+ failures: 0,
66
+ errors: 0,
67
+ skipped: 0
68
+ }
69
+
70
+ testcases.each do |test|
71
+ stats[:failures] += 1 unless test.search('failure').empty?
72
+ stats[:errors] += 1 unless test.search('error').empty?
73
+ stats[:skipped] += 1 unless test.search('skipped').empty?
74
+ end
75
+
76
+ stats
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -15,6 +15,8 @@ module Gitlab
15
15
 
16
16
  # rubocop:disable Metrics/AbcSize
17
17
  def self.run(args)
18
+ report_options = {}
19
+
18
20
  options = OptionParser.new do |opts|
19
21
  opts.banner = 'Usage: gitlab-qa [options] Scenario URL [[--] path] [rspec_options]'
20
22
 
@@ -22,6 +24,11 @@ module Gitlab
22
24
  opts.on(*opt)
23
25
  end
24
26
 
27
+ opts.on('--prepare-stage-reports FILES', 'Prepare separate reports for each Stage from the provided JUnit XML files') do |files|
28
+ report_options[:prepare_stage_reports] = true
29
+ report_options[:input_files] = files if files
30
+ end
31
+
25
32
  opts.on_tail('-v', '--version', 'Show the version') do
26
33
  require 'gitlab/qa/version'
27
34
  puts "#{$PROGRAM_NAME} : #{VERSION}"
@@ -37,6 +44,13 @@ module Gitlab
37
44
  end
38
45
 
39
46
  if args.size >= 1
47
+ if report_options[:prepare_stage_reports]
48
+ report_options.delete(:prepare_stage_reports)
49
+ Gitlab::QA::Report::PrepareStageReports.new(**report_options).invoke!
50
+
51
+ exit
52
+ end
53
+
40
54
  Scenario
41
55
  .const_get(args.shift)
42
56
  .perform(*args)
@@ -8,6 +8,8 @@ module Gitlab
8
8
  class ObjectStorage < Scenario::Template
9
9
  include Scenario::CLICommands
10
10
 
11
+ TYPES = %w[artifacts external_diffs lfs uploads packages dependency_proxy].freeze
12
+
11
13
  def perform(release, *rspec_args)
12
14
  Component::Gitlab.perform do |gitlab|
13
15
  gitlab.release = release
@@ -16,26 +18,12 @@ module Gitlab
16
18
 
17
19
  Component::Minio.perform do |minio|
18
20
  minio.network = 'test'
19
- ['upload-bucket', 'lfs-bucket'].each do |bucket_name|
20
- minio.add_bucket(bucket_name)
21
+
22
+ TYPES.each do |bucket_name|
23
+ minio.add_bucket("#{bucket_name}-bucket")
21
24
  end
22
25
 
23
- gitlab.omnibus_config = <<~OMNIBUS
24
- gitlab_rails['uploads_object_store_enabled'] = true;
25
- gitlab_rails['uploads_object_store_remote_directory'] = 'upload-bucket';
26
- gitlab_rails['uploads_object_store_background_upload'] = false;
27
- gitlab_rails['uploads_object_store_direct_upload'] = true;
28
- gitlab_rails['uploads_object_store_proxy_download'] = true;
29
- gitlab_rails['uploads_object_store_connection'] = #{minio.to_config};
30
- gitlab_rails['lfs_enabled'] = true;
31
- gitlab_rails['lfs_storage_path'] = '/var/opt/gitlab/gitlab-rails/shared/lfs-objects';
32
- gitlab_rails['lfs_object_store_enabled'] = true;
33
- gitlab_rails['lfs_object_store_direct_upload'] = true;
34
- gitlab_rails['lfs_object_store_background_upload'] = false;
35
- gitlab_rails['lfs_object_store_proxy_download'] = false;
36
- gitlab_rails['lfs_object_store_remote_directory'] = 'lfs-bucket';
37
- gitlab_rails['lfs_object_store_connection'] = #{minio.to_config};
38
- OMNIBUS
26
+ gitlab.omnibus_config = object_storage_config(minio)
39
27
  gitlab.exec_commands = git_lfs_install_commands
40
28
 
41
29
  minio.instance do
@@ -53,6 +41,21 @@ module Gitlab
53
41
  end
54
42
  end
55
43
  end
44
+
45
+ def object_storage_config(minio)
46
+ TYPES.map do |object_type|
47
+ <<~OMNIBUS
48
+ gitlab_rails['#{object_type}_enabled'] = true;
49
+ gitlab_rails['#{object_type}_storage_path'] = '/var/opt/gitlab/gitlab-rails/shared/#{object_type}';
50
+ gitlab_rails['#{object_type}_object_store_enabled'] = true;
51
+ gitlab_rails['#{object_type}_object_store_remote_directory'] = '#{object_type}-bucket';
52
+ gitlab_rails['#{object_type}_object_store_background_upload'] = false;
53
+ gitlab_rails['#{object_type}_object_store_direct_upload'] = true;
54
+ gitlab_rails['#{object_type}_object_store_proxy_download'] = true;
55
+ gitlab_rails['#{object_type}_object_store_connection'] = #{minio.to_config};
56
+ OMNIBUS
57
+ end.join("\n")
58
+ end
56
59
  end
57
60
  end
58
61
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module QA
3
- VERSION = '4.17.0'.freeze
3
+ VERSION = '4.18.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: 4.17.0
4
+ version: 4.18.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-01-07 00:00:00.000000000 Z
11
+ date: 2020-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
124
  version: 3.7.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: nokogiri
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.10'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.10'
125
139
  description:
126
140
  email:
127
141
  - grzesiek.bizon@gmail.com
@@ -180,6 +194,7 @@ files:
180
194
  - lib/gitlab/qa/docker/shellout.rb
181
195
  - lib/gitlab/qa/docker/volumes.rb
182
196
  - lib/gitlab/qa/release.rb
197
+ - lib/gitlab/qa/report/prepare_stage_reports.rb
183
198
  - lib/gitlab/qa/runner.rb
184
199
  - lib/gitlab/qa/runtime/env.rb
185
200
  - lib/gitlab/qa/scenario/actable.rb