gitlab-qa 6.12.0 → 6.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +22 -24
- data/.gitlab/merge_request_templates/Release.md +1 -1
- data/docs/release_process.md +7 -6
- data/lib/gitlab/qa/report/generate_test_session.rb +36 -4
- data/lib/gitlab/qa/report/prepare_stage_reports.rb +4 -1
- data/lib/gitlab/qa/report/relate_failure_issue.rb +10 -19
- data/lib/gitlab/qa/report/report_as_issue.rb +15 -0
- data/lib/gitlab/qa/runtime/env.rb +10 -2
- data/lib/gitlab/qa/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 946c39f638a57c7e2a1ba24dffe836a3b124b0e12dd3b8c18b07a73a5626282a
|
|
4
|
+
data.tar.gz: 3d8adfbf3589e92ad6aaeafa535bc679bad341202eab354ff842e518116b758a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cd31b62d6d3b78d6384f1884f9f210d95c4cebcb4704a7eb9c2e652180a1d029e8f567addeec03ede879d27dc8de42a297cf3be7e4d8e8ad4899d612243c0e6d
|
|
7
|
+
data.tar.gz: 304ee3fa3f5bb12d1c3f4064f8d3aa3b573bb95ea511648ac391023991884fc220f8fb0fbdca2a70dba9ab82903d37b60c7068558f529251a49f039f012fffc3
|
data/.gitlab-ci.yml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
stages:
|
|
2
2
|
- check
|
|
3
|
-
- release
|
|
4
3
|
- test
|
|
5
4
|
- report
|
|
5
|
+
- deploy
|
|
6
6
|
- notify
|
|
7
7
|
|
|
8
8
|
default:
|
|
@@ -35,13 +35,6 @@ workflow:
|
|
|
35
35
|
# For triggers from GitLab MR pipelines (and pipelines from other projects), create a pipeline
|
|
36
36
|
- if: '$CI_PIPELINE_SOURCE == "pipeline"'
|
|
37
37
|
|
|
38
|
-
.default-rules:
|
|
39
|
-
rules:
|
|
40
|
-
- if: '$CI_COMMIT_TAG || $RELEASE'
|
|
41
|
-
when: never
|
|
42
|
-
- if: '$RELEASE == null && $CI_JOB_NAME =~ /staging/'
|
|
43
|
-
when: manual
|
|
44
|
-
|
|
45
38
|
variables:
|
|
46
39
|
DOCKER_DRIVER: overlay2
|
|
47
40
|
DOCKER_HOST: tcp://docker:2375
|
|
@@ -65,21 +58,6 @@ rubocop:
|
|
|
65
58
|
rspec:
|
|
66
59
|
extends: .check-base
|
|
67
60
|
|
|
68
|
-
release:
|
|
69
|
-
stage: release
|
|
70
|
-
rules:
|
|
71
|
-
- if: '$CI_COMMIT_TAG'
|
|
72
|
-
script:
|
|
73
|
-
- gem update --system
|
|
74
|
-
- ruby --version
|
|
75
|
-
- gem env version
|
|
76
|
-
- gem build gitlab-qa.gemspec
|
|
77
|
-
- gem push gitlab-qa*.gem
|
|
78
|
-
artifacts:
|
|
79
|
-
paths:
|
|
80
|
-
- gitlab-qa*.gem
|
|
81
|
-
expire_in: 30 days
|
|
82
|
-
|
|
83
61
|
.test:
|
|
84
62
|
stage: test
|
|
85
63
|
services:
|
|
@@ -107,6 +85,10 @@ release:
|
|
|
107
85
|
variables:
|
|
108
86
|
DEFAULT_RELEASE: "CE"
|
|
109
87
|
rules:
|
|
88
|
+
# Don't run E2E jobs on release pipelines
|
|
89
|
+
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab-qa" && $RELEASE == null'
|
|
90
|
+
changes: ["lib/**/version.rb"]
|
|
91
|
+
when: never
|
|
110
92
|
- if: '$CI_COMMIT_TAG || $RELEASE =~ /gitlab-ee/'
|
|
111
93
|
when: never
|
|
112
94
|
- if: '$RELEASE == null && $CI_JOB_NAME =~ /quarantine|custom/'
|
|
@@ -121,6 +103,10 @@ release:
|
|
|
121
103
|
variables:
|
|
122
104
|
DEFAULT_RELEASE: "EE"
|
|
123
105
|
rules:
|
|
106
|
+
# Don't run E2E jobs on release pipelines
|
|
107
|
+
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab-qa" && $RELEASE == null'
|
|
108
|
+
changes: ["lib/**/version.rb"]
|
|
109
|
+
when: never
|
|
124
110
|
- if: '$CI_COMMIT_TAG || $RELEASE =~ /gitlab-ce/'
|
|
125
111
|
when: never
|
|
126
112
|
- if: '$RELEASE == null && $CI_JOB_NAME =~ /quarantine|custom/'
|
|
@@ -132,7 +118,15 @@ release:
|
|
|
132
118
|
- if: '$RELEASE == null || $RELEASE =~ /gitlab-ee/ || $CI_MERGE_REQUEST_ID || $CI_COMMIT_REF_NAME == "master"'
|
|
133
119
|
|
|
134
120
|
.only-qa:
|
|
135
|
-
|
|
121
|
+
rules:
|
|
122
|
+
# Don't run E2E jobs on release pipelines
|
|
123
|
+
- if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab-qa" && $RELEASE == null'
|
|
124
|
+
changes: ["lib/**/version.rb"]
|
|
125
|
+
when: never
|
|
126
|
+
- if: '$CI_COMMIT_TAG || $RELEASE'
|
|
127
|
+
when: never
|
|
128
|
+
- if: '$RELEASE == null && $CI_JOB_NAME =~ /staging/'
|
|
129
|
+
when: manual
|
|
136
130
|
|
|
137
131
|
.high-capacity:
|
|
138
132
|
tags:
|
|
@@ -1012,3 +1006,7 @@ notify_slack:
|
|
|
1012
1006
|
- echo "CI_PIPELINE_URL is $CI_PIPELINE_URL"
|
|
1013
1007
|
- echo "TOP_UPSTREAM_SOURCE_JOB is $TOP_UPSTREAM_SOURCE_JOB"
|
|
1014
1008
|
- 'bin/slack $NOTIFY_CHANNEL "☠️ QA against $RELEASE failed! ☠️ See the test session report: $(cat REPORT_ISSUE_URL), and pipeline: $CI_PIPELINE_URL (triggered from $TOP_UPSTREAM_SOURCE_JOB)" ci_failing'
|
|
1009
|
+
|
|
1010
|
+
include:
|
|
1011
|
+
- project: 'gitlab-org/quality/pipeline-common'
|
|
1012
|
+
file: '/ci/gem-release.yml'
|
|
@@ -30,6 +30,6 @@ with the latest commit from https://gitlab.com/gitlab-org/gitlab-qa/commits/mast
|
|
|
30
30
|
- [ ] Release notes are accurate.
|
|
31
31
|
|
|
32
32
|
- Checklist after merging:
|
|
33
|
-
- [ ] [
|
|
33
|
+
- [ ] [Update the release notes for the newly created tag](docs/release_process.md#how-to).
|
|
34
34
|
|
|
35
35
|
/label ~Quality ~"feature::maintenance"
|
data/docs/release_process.md
CHANGED
|
@@ -24,12 +24,13 @@ when we make a change - no matter the size of the change.
|
|
|
24
24
|
- If not, update [`lib/gitlab/qa/version.rb`] to an appropriate [semantic version](https://semver.org) in a new merge request using the [release template](https://gitlab.com/gitlab-org/gitlab-qa/blob/master/.gitlab/merge_request_templates/Release.md)
|
|
25
25
|
and title the MR like `"Bump version to <version>"`.
|
|
26
26
|
- Merge the merge request.
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
* **Message**: Set it to "Version x.y.z", e.g. if the version is `4.7.1`, the message would be "Version 4.7.1".
|
|
27
|
+
- The new version should automatically be tagged and pushed to Rubygems by the `gem-release` job in the merge commit pipeline.
|
|
28
|
+
- Update the release notes for the newly created tag (https://gitlab.com/gitlab-org/gitlab-qa/-/tags):
|
|
30
29
|
* **Release notes**: Copy the release notes from the merge request.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
|
|
31
|
+
Note: The `gem-release` job uses:
|
|
32
|
+
|
|
33
|
+
- the `GITLAB_API_TOKEN` environment variable to authenticate against GitLab.com's API in order to create the tag
|
|
34
|
+
- the `GEM_HOST_API_KEY` environment variable to authenticate against Rubygems.org's API in order to release the gem
|
|
34
35
|
|
|
35
36
|
[`lib/gitlab/qa/version.rb`]: https://gitlab.com/gitlab-org/gitlab-qa/blob/master/lib/gitlab/qa/version.rb#L3
|
|
@@ -6,6 +6,7 @@ module Gitlab
|
|
|
6
6
|
class GenerateTestSession < ReportAsIssue
|
|
7
7
|
private
|
|
8
8
|
|
|
9
|
+
# rubocop:disable Metrics/AbcSize
|
|
9
10
|
def run!
|
|
10
11
|
puts "Generating test results in `#{files.join(',')}` as issues in project `#{project}` via the API at `#{Runtime::Env.gitlab_api_base}`."
|
|
11
12
|
|
|
@@ -16,22 +17,26 @@ module Gitlab
|
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
issue = gitlab.create_issue(
|
|
19
|
-
title: "Test session report | #{
|
|
20
|
+
title: "Test session report | #{pipeline}",
|
|
20
21
|
description: generate_description(tests),
|
|
21
|
-
labels: ['Quality', 'QA', 'triage report']
|
|
22
|
+
labels: ['Quality', 'QA', 'triage report', pipeline_name_label]
|
|
22
23
|
)
|
|
23
24
|
|
|
24
25
|
File.write('REPORT_ISSUE_URL', issue.web_url)
|
|
25
26
|
end
|
|
27
|
+
# rubocop:enable Metrics/AbcSize
|
|
26
28
|
|
|
27
29
|
def generate_description(tests)
|
|
28
30
|
<<~MARKDOWN
|
|
29
31
|
## Session summary
|
|
30
32
|
|
|
31
33
|
* Deploy version: #{Runtime::Env.deploy_version}
|
|
32
|
-
*
|
|
34
|
+
* Deploy environment: #{Runtime::Env.deploy_environment}
|
|
35
|
+
* Pipeline: #{Runtime::Env.pipeline_from_project_name} [#{Runtime::Env.ci_pipeline_id}](#{Runtime::Env.ci_pipeline_url})
|
|
33
36
|
#{generate_summary(tests: tests)}
|
|
34
37
|
|
|
38
|
+
#{generate_failed_jobs_listing}
|
|
39
|
+
|
|
35
40
|
#{generate_stages_listing(tests)}
|
|
36
41
|
|
|
37
42
|
## Release QA issue
|
|
@@ -55,6 +60,33 @@ module Gitlab
|
|
|
55
60
|
MARKDOWN
|
|
56
61
|
end
|
|
57
62
|
|
|
63
|
+
def generate_failed_jobs_listing
|
|
64
|
+
failed_jobs = []
|
|
65
|
+
|
|
66
|
+
client = Gitlab.client(
|
|
67
|
+
endpoint: Runtime::Env.ci_api_v4_url,
|
|
68
|
+
private_token: Runtime::Env.gitlab_ci_api_token)
|
|
69
|
+
|
|
70
|
+
gitlab.handle_gitlab_client_exceptions do
|
|
71
|
+
failed_jobs = client.pipeline_jobs(
|
|
72
|
+
Runtime::Env.ci_project_id,
|
|
73
|
+
Runtime::Env.ci_pipeline_id,
|
|
74
|
+
scope: 'failed')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
listings = failed_jobs.map do |job|
|
|
78
|
+
allowed_to_fail = ' (allowed to fail)' if job.allow_failure
|
|
79
|
+
|
|
80
|
+
"* [#{job.name}](#{job.web_url})#{allowed_to_fail}"
|
|
81
|
+
end.join("\n")
|
|
82
|
+
|
|
83
|
+
<<~MARKDOWN.chomp if failed_jobs.any?
|
|
84
|
+
## Failed jobs
|
|
85
|
+
|
|
86
|
+
#{listings}
|
|
87
|
+
MARKDOWN
|
|
88
|
+
end
|
|
89
|
+
|
|
58
90
|
def generate_stages_listing(tests)
|
|
59
91
|
generate_tests_by_stage(tests).map do |stage, tests_for_stage|
|
|
60
92
|
tests_by_status = tests_for_stage.group_by(&:status)
|
|
@@ -185,7 +217,7 @@ module Gitlab
|
|
|
185
217
|
tests_with_same_testcase.select(&:failure_issue)
|
|
186
218
|
|
|
187
219
|
if tests_having_failure_issue.any?
|
|
188
|
-
items = tests_having_failure_issue.map do |test|
|
|
220
|
+
items = tests_having_failure_issue.uniq(&:failure_issue).map do |test|
|
|
189
221
|
"<li>[ ] [failure issue](#{test.failure_issue})</li>"
|
|
190
222
|
end.join(' ')
|
|
191
223
|
|
|
@@ -34,7 +34,10 @@ module Gitlab
|
|
|
34
34
|
# /qa/specs/features/ee/api/<stage>
|
|
35
35
|
# /qa/specs/features/ee/browser_ui/<stage>
|
|
36
36
|
# For now we assume the Stage is whatever follows api/ or browser_ui/
|
|
37
|
-
|
|
37
|
+
test_path_match = test['file'].match(%r{(api|browser_ui)/([a-z0-9_]+)}i)
|
|
38
|
+
next unless test_path_match
|
|
39
|
+
|
|
40
|
+
stage = strip_number_prefix(test_path_match[2])
|
|
38
41
|
testcases[stage] = [] unless testcases.key?(stage)
|
|
39
42
|
testcases[stage] << test
|
|
40
43
|
end
|
|
@@ -88,7 +88,12 @@ module Gitlab
|
|
|
88
88
|
diff_ratio = (distance.to_f / first_test_failure_stacktrace.size).round(3)
|
|
89
89
|
if diff_ratio <= max_diff_ratio
|
|
90
90
|
puts " => [DEBUG] Issue #{issue} has an acceptable diff ratio of #{(diff_ratio * 100).round(2)}%."
|
|
91
|
-
|
|
91
|
+
# The `Gitlab::ObjectifiedHash` class overrides `#hash` which is used by `Hash#[]=` to compute the hash key.
|
|
92
|
+
# This leads to a `TypeError Exception: no implicit conversion of Hash into Integer` error, so we convert the object to a hash before using it as a Hash key.
|
|
93
|
+
# See:
|
|
94
|
+
# - https://gitlab.com/gitlab-org/gitlab-qa/-/merge_requests/587#note_453336995
|
|
95
|
+
# - https://github.com/NARKOZ/gitlab/commit/cbdbd1e32623f018a8fae39932a8e3bc4d929abb?_pjax=%23js-repo-pjax-container#r44484494
|
|
96
|
+
memo[issue.to_h] = diff_ratio
|
|
92
97
|
else
|
|
93
98
|
puts " => [DEBUG] Found issue #{issue.web_url} but stacktraces are too different (#{(diff_ratio * 100).round(2)}%)."
|
|
94
99
|
end
|
|
@@ -116,6 +121,9 @@ module Gitlab
|
|
|
116
121
|
raise(MultipleIssuesFound, %(Too many issues found for test '#{test.name}' (`#{test.file}`)!))
|
|
117
122
|
end
|
|
118
123
|
|
|
124
|
+
# Re-instantiate a `Gitlab::ObjectifiedHash` object after having converted it to a hash in #find_relevant_failure_issues above.
|
|
125
|
+
best_matching_issue = Gitlab::ObjectifiedHash.new(best_matching_issue)
|
|
126
|
+
|
|
119
127
|
test.failure_issue ||= best_matching_issue.web_url
|
|
120
128
|
|
|
121
129
|
[best_matching_issue, smaller_diff_ratio]
|
|
@@ -129,29 +137,12 @@ module Gitlab
|
|
|
129
137
|
].join("\n\n")
|
|
130
138
|
end
|
|
131
139
|
|
|
132
|
-
def deploy_environment_label
|
|
133
|
-
environment = Runtime::Env.deploy_environment
|
|
134
|
-
|
|
135
|
-
case environment
|
|
136
|
-
when 'production'
|
|
137
|
-
'found:gitlab.com'
|
|
138
|
-
when 'canary', 'staging'
|
|
139
|
-
"found:#{environment}.gitlab.com"
|
|
140
|
-
when 'preprod'
|
|
141
|
-
'found:pre.gitlab.com'
|
|
142
|
-
when 'staging-orchestrated', 'nightly', 'master'
|
|
143
|
-
"found:#{environment}"
|
|
144
|
-
else
|
|
145
|
-
raise "No `found:*` label for the `#{environment}` environment!"
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
140
|
def new_issue_labels(test)
|
|
150
141
|
NEW_ISSUE_LABELS + up_to_date_labels(test: test)
|
|
151
142
|
end
|
|
152
143
|
|
|
153
144
|
def up_to_date_labels(test:, issue: nil)
|
|
154
|
-
super <<
|
|
145
|
+
super << pipeline_name_label
|
|
155
146
|
end
|
|
156
147
|
|
|
157
148
|
def post_failed_job_note(issue, test)
|
|
@@ -104,6 +104,21 @@ module Gitlab
|
|
|
104
104
|
labels
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
+
def pipeline_name_label
|
|
108
|
+
case pipeline
|
|
109
|
+
when 'production'
|
|
110
|
+
'found:gitlab.com'
|
|
111
|
+
when 'canary', 'staging'
|
|
112
|
+
"found:#{pipeline}.gitlab.com"
|
|
113
|
+
when 'preprod'
|
|
114
|
+
'found:pre.gitlab.com'
|
|
115
|
+
when 'staging-orchestrated', 'nightly', 'master'
|
|
116
|
+
"found:#{pipeline}"
|
|
117
|
+
else
|
|
118
|
+
raise "No `found:*` label for the `#{pipeline}` pipeline!"
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
107
122
|
def ee_test?(test)
|
|
108
123
|
test.file =~ %r{features/ee/(api|browser_ui)}
|
|
109
124
|
end
|
|
@@ -116,6 +116,14 @@ module Gitlab
|
|
|
116
116
|
ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
+
def gitlab_ci_api_token
|
|
120
|
+
ENV['GITLAB_CI_API_TOKEN']
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def ci_api_v4_url
|
|
124
|
+
ENV['CI_API_V4_URL']
|
|
125
|
+
end
|
|
126
|
+
|
|
119
127
|
def ci_job_name
|
|
120
128
|
ENV['CI_JOB_NAME']
|
|
121
129
|
end
|
|
@@ -136,8 +144,8 @@ module Gitlab
|
|
|
136
144
|
ENV['CI_PIPELINE_ID']
|
|
137
145
|
end
|
|
138
146
|
|
|
139
|
-
def
|
|
140
|
-
ENV['
|
|
147
|
+
def ci_project_id
|
|
148
|
+
ENV['CI_PROJECT_ID']
|
|
141
149
|
end
|
|
142
150
|
|
|
143
151
|
def ci_commit_ref_name
|
data/lib/gitlab/qa/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gitlab-qa
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.
|
|
4
|
+
version: 6.15.2
|
|
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-
|
|
11
|
+
date: 2020-12-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: climate_control
|