diff --git a/.gitlab/ci/gitlab-gems.gitlab-ci.yml b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
new file mode 100644
index 00000000000..adab179d2a2
--- /dev/null
+++ b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
@@ -0,0 +1,7 @@
+gems gitlab-rspec:
+ extends:
+ - .gems:rules:gitlab-rspec
+ needs: []
+ trigger:
+ include: gems/gitlab-rspec/.gitlab-ci.yml
+ strategy: depend
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 0df6ef0cacd..d12b62ca0a8 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -326,6 +326,10 @@ rspec:artifact-collector remainder:
optional: true
- job: rspec background_migration pg14 # 4 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:ee-and-foss-integration', rules]
+ - !reference ['.rails:rules:ee-and-foss-migration', rules]
+ - !reference ['.rails:rules:ee-and-foss-background-migration', rules]
rspec:artifact-collector as-if-foss unit:
extends:
@@ -351,6 +355,10 @@ rspec:artifact-collector as-if-foss remainder:
optional: true
- job: rspec background_migration pg14-as-if-foss # 4 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:as-if-foss-integration', rules]
+ - !reference ['.rails:rules:as-if-foss-migration', rules]
+ - !reference ['.rails:rules:as-if-foss-background-migration', rules]
rspec:artifact-collector single-redis:
extends:
@@ -370,6 +378,7 @@ rspec:artifact-collector system single-redis:
rspec:artifact-collector ee single-redis:
extends:
- .artifact-collector
+ - .rails:rules:single-redis
needs:
- job: rspec-ee unit pg14 single-redis # 18 jobs
optional: true
@@ -392,6 +401,12 @@ rspec:artifact-collector ee:
optional: true
- job: rspec-ee system pg14 # 10 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:ee-only-migration', rules]
+ - !reference ['.rails:rules:ee-only-background-migration', rules]
+ - !reference ['.rails:rules:ee-only-unit', rules]
+ - !reference ['.rails:rules:ee-only-integration', rules]
+ - !reference ['.rails:rules:ee-only-system', rules]
rspec:coverage:
extends:
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 1c1f6cfa96a..6313f5d5681 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -2128,6 +2128,15 @@
- <<: *if-merge-request
changes: *code-backstage-qa-patterns
+########################
+# GitLab monorepo gems #
+########################
+
+.gems:rules:gitlab-rspec:
+ rules:
+ - <<: *if-merge-request
+ changes: ["gems/gitlab-rspec/**/*"]
+
#######################
# Vendored gems rules #
#######################
diff --git a/.rubocop.yml b/.rubocop.yml
index 95240342be3..a7ebc87f4b3 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -675,7 +675,6 @@ RSpec/EnvMocking:
- 'ee/spec/**/fast_spec_helper.rb'
- 'spec/**/spec_helper.rb'
- 'ee/spec/**/spec_helper.rb'
- - 'spec/support/helpers/stub_env.rb'
RSpec/BeSuccessMatcher:
Enabled: true
diff --git a/.rubocop_todo/search/namespaced_class.yml b/.rubocop_todo/search/namespaced_class.yml
index 65890e096e3..ba2dbafb3c7 100644
--- a/.rubocop_todo/search/namespaced_class.yml
+++ b/.rubocop_todo/search/namespaced_class.yml
@@ -21,6 +21,7 @@ Search/NamespacedClass:
- 'ee/app/graphql/types/iteration_searchable_field_enum.rb'
- 'ee/app/helpers/ee/search_helper.rb'
- 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/elastic/maintain_elasticsearch_on_group_update.rb'
- 'ee/app/models/concerns/elastic/namespace_update.rb'
- 'ee/app/models/concerns/elastic/projects_search.rb'
- 'ee/app/models/concerns/elastic/repositories_search.rb'
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 2cced985770..eaf8c0c6be1 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-b967c1ee24740ab58d8111f0f46bd3fcfa3467a5
+40d411cfea1d40ae2525268896ae75fe026c3e9e
diff --git a/Gemfile b/Gemfile
index 75401ffc4dd..f14f85066b4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -363,7 +363,7 @@ gem 'snowplow-tracker', '~> 0.8.0'
# Metrics
gem 'webrick', '~> 1.8.1', require: false
-gem 'prometheus-client-mmap', '~> 0.24', require: 'prometheus/client'
+gem 'prometheus-client-mmap', '~> 0.25', require: 'prometheus/client'
gem 'warning', '~> 1.3.0'
@@ -453,6 +453,7 @@ group :test do
gem 'rspec_profiling', '~> 0.0.6'
gem 'rspec-benchmark', '~> 0.6.0'
gem 'rspec-parameterized', '~> 1.0', require: false
+ gem 'gitlab-rspec', path: 'gems/gitlab-rspec'
gem 'capybara', '~> 3.39', '>= 3.39.1'
gem 'capybara-screenshot', '~> 1.0.26'
diff --git a/Gemfile.checksum b/Gemfile.checksum
index e5ed8ebcdf8..b2c07e5a201 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -452,11 +452,11 @@
{"name":"premailer","version":"1.16.0","platform":"ruby","checksum":"03e4402c448e6bae13fb5f6301a8bde4f3508e1bff90ae7c0972c7be94694786"},
{"name":"premailer-rails","version":"1.10.3","platform":"ruby","checksum":"7cdcb97027866f7a81c490c6d15ada7f39666b5f6375f0821b7e97e0483b112f"},
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
-{"name":"prometheus-client-mmap","version":"0.24.5","platform":"aarch64-linux","checksum":"20977bd3dff89e2e4b5d7eb3420a1ea8a002a601390a08a1c0e5065a05c4a36c"},
-{"name":"prometheus-client-mmap","version":"0.24.5","platform":"arm64-darwin","checksum":"15d7e86d4595d24f2c5aa41a0b6d8564d78a1219bd01cba09ef721f304f64ebc"},
-{"name":"prometheus-client-mmap","version":"0.24.5","platform":"ruby","checksum":"a288fb5bd7551fb0008d77eb923e64ad4f583d56fec90de68efd75369d152676"},
-{"name":"prometheus-client-mmap","version":"0.24.5","platform":"x86_64-darwin","checksum":"7e3d1a79c3a1083e5f427399c5afc5316c207fd785c4b8a13134f7af50f0fd84"},
-{"name":"prometheus-client-mmap","version":"0.24.5","platform":"x86_64-linux","checksum":"09d9a3e5598886ff6ad34562745b79823a0bbf6ea59c22535d819ec32275f207"},
+{"name":"prometheus-client-mmap","version":"0.25.0","platform":"aarch64-linux","checksum":"0548954d183b0749ecd0983ea5e046a22137ae8accd5c86c64bc6d0ec57ef5c6"},
+{"name":"prometheus-client-mmap","version":"0.25.0","platform":"arm64-darwin","checksum":"3d5e5665d9de0488cf09663c5a2583470ab726cead90011b1b11571057507157"},
+{"name":"prometheus-client-mmap","version":"0.25.0","platform":"ruby","checksum":"d75dc28326633d780dc43f93be610253fab654ab35f876138cd35080b54fa092"},
+{"name":"prometheus-client-mmap","version":"0.25.0","platform":"x86_64-darwin","checksum":"c33859d23a5f925a76a79d63b50d94e5e181b4ed03b0f8836d23208aec655446"},
+{"name":"prometheus-client-mmap","version":"0.25.0","platform":"x86_64-linux","checksum":"2ea418c3ac327d28506d01898d9fa9cae967317244c39ebdb34680ac6cb0c1e9"},
{"name":"pry","version":"0.14.2","platform":"java","checksum":"fd780670977ba04ff7ee32dabd4d02fe4bf02e977afe8809832d5dca1412862e"},
{"name":"pry","version":"0.14.2","platform":"ruby","checksum":"c4fe54efedaca1d351280b45b8849af363184696fcac1c72e0415f9bdac4334d"},
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
diff --git a/Gemfile.lock b/Gemfile.lock
index c18ac70599e..26594b29704 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,9 @@
+PATH
+ remote: gems/gitlab-rspec
+ specs:
+ gitlab-rspec (0.1.0)
+ rspec (~> 3.0)
+
PATH
remote: vendor/gems/attr_encrypted
specs:
@@ -1154,7 +1160,7 @@ GEM
coderay
parser
unparser
- prometheus-client-mmap (0.24.5)
+ prometheus-client-mmap (0.25.0)
rb_sys (~> 0.9)
pry (0.14.2)
coderay (~> 1.1)
@@ -1759,6 +1765,7 @@ DEPENDENCIES
gitlab-mail_room (~> 0.0.23)
gitlab-markup (~> 1.9.0)
gitlab-net-dns (~> 0.9.2)
+ gitlab-rspec!
gitlab-sidekiq-fetcher!
gitlab-styles (~> 10.0.0)
gitlab_chronic_duration (~> 0.10.6.2)
@@ -1874,7 +1881,7 @@ DEPENDENCIES
pg_query (~> 4.2.1)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
- prometheus-client-mmap (~> 0.24)
+ prometheus-client-mmap (~> 0.25)
pry-byebug
pry-rails (~> 0.3.9)
pry-shell (~> 0.6.1)
diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue
index 182090e64f9..0151dbb0bf7 100644
--- a/app/assets/javascripts/error_tracking/components/error_details.vue
+++ b/app/assets/javascripts/error_tracking/components/error_details.vue
@@ -24,6 +24,7 @@ import {
import { severityLevel, severityLevelVariant, errorStatus } from '../constants';
import Stacktrace from './stacktrace.vue';
import ErrorDetailsInfo from './error_details_info.vue';
+import TimelineChart from './timeline_chart.vue';
const SENTRY_TIMEOUT = 10000;
@@ -42,6 +43,7 @@ export default {
GlDropdownDivider,
TimeAgoTooltip,
ErrorDetailsInfo,
+ TimelineChart,
},
props: {
issueUpdatePath: {
@@ -375,6 +377,11 @@ export default {