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 { +
+

{{ __('Last 24 hours') }}

+ +
+
diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue index e3784cc8b92..0c9a98f3b33 100644 --- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue +++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue @@ -30,10 +30,12 @@ import { } from '../events_tracking'; import { I18N_ERROR_TRACKING_LIST } from '../constants'; import ErrorTrackingActions from './error_tracking_actions.vue'; +import TimelineChart from './timeline_chart.vue'; const isValidErrorId = (errorId) => { return /^[0-9]+$/.test(errorId); }; +export const tableDataClass = 'gl-display-flex gl-md-display-table-cell gl-align-items-center'; export default { FIRST_PAGE: 1, PREV_PAGE: 1, @@ -43,30 +45,37 @@ export default { { key: 'error', label: __('Error'), - thClass: 'w-60p', + thClass: 'gl-w-40p', + tdClass: `${tableDataClass}`, + }, + { + key: 'timeline', + label: __('Timeline'), + thClass: 'gl-text-center gl-w-20p', + tdClass: `${tableDataClass} gl-text-center`, }, { key: 'events', label: __('Events'), - thClass: 'gl-text-right', - tdClass: 'gl-text-right', + thClass: 'gl-text-center gl-w-10p', + tdClass: `${tableDataClass} gl-text-center`, }, { key: 'users', label: __('Users'), - thClass: 'gl-text-right', - tdClass: 'gl-text-right', + thClass: 'gl-text-center gl-w-10p', + tdClass: `${tableDataClass} gl-text-center`, }, { key: 'lastSeen', label: __('Last seen'), - thClass: 'gl-w-15p', - tdClass: 'gl-text-left', + thClass: 'gl-text-center gl-w-10p', + tdClass: `${tableDataClass} gl-text-center`, }, { key: 'status', label: '', - tdClass: 'gl-text-center', + tdClass: `${tableDataClass}`, }, ], statusFilters: { @@ -95,6 +104,7 @@ export default { GlPagination, TimeAgo, ErrorTrackingActions, + TimelineChart, }, directives: { GlTooltip: GlTooltipDirective, @@ -438,6 +448,14 @@ export default { + + diff --git a/app/assets/javascripts/error_tracking/components/timeline_chart.vue b/app/assets/javascripts/error_tracking/components/timeline_chart.vue new file mode 100644 index 00000000000..51e0c900e4b --- /dev/null +++ b/app/assets/javascripts/error_tracking/components/timeline_chart.vue @@ -0,0 +1,129 @@ + + + diff --git a/app/assets/javascripts/error_tracking/queries/details.query.graphql b/app/assets/javascripts/error_tracking/queries/details.query.graphql index dd21b0f9c92..5745491c32d 100644 --- a/app/assets/javascripts/error_tracking/queries/details.query.graphql +++ b/app/assets/javascripts/error_tracking/queries/details.query.graphql @@ -20,6 +20,10 @@ query errorDetails($fullPath: ID!, $errorId: GitlabErrorTrackingDetailedErrorID! externalUrl externalBaseUrl firstReleaseVersion + frequency { + count + time + } lastReleaseVersion gitlabCommit gitlabCommitPath diff --git a/app/assets/javascripts/members/components/table/role_dropdown.vue b/app/assets/javascripts/members/components/table/role_dropdown.vue index a85bb09e17b..4571c4172e5 100644 --- a/app/assets/javascripts/members/components/table/role_dropdown.vue +++ b/app/assets/javascripts/members/components/table/role_dropdown.vue @@ -1,5 +1,5 @@ diff --git a/app/assets/javascripts/profile/components/user_achievements.vue b/app/assets/javascripts/profile/components/user_achievements.vue index fd42b64f4c5..13a1b797a83 100644 --- a/app/assets/javascripts/profile/components/user_achievements.vue +++ b/app/assets/javascripts/profile/components/user_achievements.vue @@ -1,6 +1,7 @@