Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
669c24d927
commit
045c0f9554
29 changed files with 5757 additions and 73 deletions
|
@ -1,3 +1,7 @@
|
|||
# Make sure to update all the similar conditions in other CI config files if you modify these conditions
|
||||
.if-canonical-gitlab-schedule: &if-canonical-gitlab-schedule
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_PIPELINE_SOURCE == "schedule"'
|
||||
|
||||
.notify:
|
||||
image: ruby:2.6-alpine
|
||||
stage: notification
|
||||
|
@ -11,13 +15,13 @@
|
|||
variables:
|
||||
COMMIT_NOTES_URL: "https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/commit/${CI_COMMIT_SHA}#notes-list"
|
||||
|
||||
schedule:package-and-qa:notify-failure:
|
||||
extends:
|
||||
- .only:variables_refs-canonical-dot-com-schedules
|
||||
- .notify
|
||||
package-and-qa:notify-failure:
|
||||
extends: .notify
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-schedule
|
||||
when: manual # TODO: remove notify job if not necessary
|
||||
script:
|
||||
- 'export NOTIFICATION_MESSAGE=":skull_and_crossbones: Scheduled QA against master failed! :skull_and_crossbones: See ${CI_PIPELINE_URL}. For downstream pipelines, see ${COMMIT_NOTES_URL}"'
|
||||
- 'notify_on_job_failure schedule:package-and-qa qa-master "${NOTIFICATION_MESSAGE}" ci_failing'
|
||||
needs: ["schedule:package-and-qa"]
|
||||
- 'notify_on_job_failure package-and-qa qa-master "${NOTIFICATION_MESSAGE}" ci_failing'
|
||||
needs: ["package-and-qa"]
|
||||
allow_failure: true
|
||||
when: manual # TODO: remove notify job if not necessary
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
# Make sure to update all the similar conditions in other CI config files if you modify these conditions
|
||||
.if-canonical-gitlab-and-merge-request: &if-canonical-gitlab-and-merge-request
|
||||
.if-canonical-gitlab-schedule: &if-canonical-gitlab-schedule
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_PIPELINE_SOURCE == "schedule"'
|
||||
|
||||
# Make sure to update all the similar conditions in other CI config files if you modify these conditions
|
||||
.if-canonical-gitlab-merge-request: &if-canonical-gitlab-merge-request
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_MERGE_REQUEST_IID'
|
||||
|
||||
# Make sure to update all the similar patterns in other CI config files if you modify these patterns
|
||||
|
@ -68,19 +72,13 @@ qa:selectors-foss:
|
|||
package-and-qa:
|
||||
extends: .package-and-qa-base
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-patterns
|
||||
when: manual
|
||||
needs: ["build-qa-image", "gitlab:assets:compile pull-cache"]
|
||||
allow_failure: true
|
||||
|
||||
schedule:package-and-qa:
|
||||
extends:
|
||||
- .package-and-qa-base
|
||||
- .default-only
|
||||
- .only:variables_refs-canonical-dot-com-schedules
|
||||
- <<: *if-canonical-gitlab-schedule
|
||||
when: on_success
|
||||
needs: ["build-qa-image", "gitlab:assets:compile pull-cache"]
|
||||
allow_failure: true
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Make sure to update all the similar conditions in other CI config files if you modify these conditions
|
||||
.if-canonical-gitlab: &if-canonical-gitlab
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/'
|
||||
.if-canonical-gitlab-schedule: &if-canonical-gitlab-schedule
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_PIPELINE_SOURCE == "schedule"'
|
||||
|
||||
# Make sure to update all the similar conditions in other CI config files if you modify these conditions
|
||||
.if-canonical-gitlab-and-merge-request: &if-canonical-gitlab-and-merge-request
|
||||
.if-canonical-gitlab-merge-request: &if-canonical-gitlab-merge-request
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_MERGE_REQUEST_IID'
|
||||
|
||||
# Make sure to update all the similar patterns in other CI config files if you modify these patterns
|
||||
|
@ -44,9 +44,11 @@ build-qa-image:
|
|||
extends: .review-docker
|
||||
stage: prepare
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-canonical-gitlab-schedule
|
||||
when: on_success
|
||||
script:
|
||||
- '[[ ! -d "ee/" ]] || export GITLAB_EDITION="ee"'
|
||||
- export QA_MASTER_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab/gitlab-${GITLAB_EDITION}-qa:master"
|
||||
|
@ -157,7 +159,7 @@ schedule:review-build-cng:
|
|||
review-deploy:
|
||||
extends: .review-deploy-base
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
|
||||
|
@ -184,7 +186,7 @@ review-stop-failed-deployment:
|
|||
extends: .base-review-stop
|
||||
stage: prepare
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
script:
|
||||
|
@ -194,7 +196,7 @@ review-stop:
|
|||
extends: .base-review-stop
|
||||
stage: review
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
@ -235,7 +237,7 @@ review-stop:
|
|||
review-qa-smoke:
|
||||
extends: .review-qa-base
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
script:
|
||||
|
@ -244,7 +246,7 @@ review-qa-smoke:
|
|||
review-qa-all:
|
||||
extends: .review-qa-base
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
parallel: 5
|
||||
|
@ -276,7 +278,7 @@ review-qa-all:
|
|||
review-performance:
|
||||
extends: .review-performance-base
|
||||
rules:
|
||||
- <<: *if-canonical-gitlab-and-merge-request
|
||||
- <<: *if-canonical-gitlab-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
needs: ["review-deploy"]
|
||||
|
|
|
@ -24,7 +24,7 @@ const EMPTY_STAGE_TEXTS = {
|
|||
'The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time.',
|
||||
),
|
||||
production: __(
|
||||
'The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle.',
|
||||
'The total stage shows the time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle.',
|
||||
),
|
||||
};
|
||||
|
||||
|
|
|
@ -55,9 +55,18 @@ jQuery.ajaxSetup({
|
|||
},
|
||||
});
|
||||
|
||||
function disableJQueryAnimations() {
|
||||
$.fx.off = true;
|
||||
}
|
||||
|
||||
// Disable jQuery animations
|
||||
if (gon && gon.disable_animations) {
|
||||
disableJQueryAnimations();
|
||||
}
|
||||
|
||||
// inject test utilities if necessary
|
||||
if (process.env.NODE_ENV !== 'production' && gon && gon.test_env) {
|
||||
$.fx.off = true;
|
||||
disableJQueryAnimations();
|
||||
import(/* webpackMode: "eager" */ './test_utils/');
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,8 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
push_frontend_feature_flag(:vue_issuable_sidebar, project.group)
|
||||
end
|
||||
|
||||
around_action :allow_gitaly_ref_name_caching, only: [:discussions]
|
||||
|
||||
respond_to :html
|
||||
|
||||
alias_method :designs, :show
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
= stylesheet_link_tag "application", media: "all"
|
||||
= stylesheet_link_tag "print", media: "print"
|
||||
= stylesheet_link_tag "test", media: "all" if Rails.env.test?
|
||||
= stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations']
|
||||
= stylesheet_link_tag 'performance_bar' if performance_bar_enabled?
|
||||
|
||||
= stylesheet_link_tag "highlight/themes/#{user_color_scheme}", media: "all"
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
%i.has-tooltip.fa.fa-question-circle{ "data-placement" => "top", title: _("The collection of events added to the data gathered for that stage."), "aria-hidden" => "true" }
|
||||
%li.total-time-header.pr-5.text-right
|
||||
%span.stage-name.font-weight-bold
|
||||
{{ __('Total Time') }}
|
||||
{{ __('Time') }}
|
||||
%i.has-tooltip.fa.fa-question-circle{ "data-placement" => "top", title: _("The time taken by each data entry gathered by that stage."), "aria-hidden" => "true" }
|
||||
.stage-panel-body
|
||||
%nav.stage-nav
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix for 500 when error stack trace is empty
|
||||
merge_request: 119205
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Reduce Gitaly calls needed for issue discussions
|
||||
merge_request:
|
||||
author:
|
||||
type: performance
|
5
changelogs/unreleased/shl-disable-animations-config.yml
Normal file
5
changelogs/unreleased/shl-disable-animations-config.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add a config for disabling CSS and jQuery animations
|
||||
merge_request: 22217
|
||||
author:
|
||||
type: added
|
|
@ -166,7 +166,7 @@ module Gitlab
|
|||
config.assets.precompile << "page_bundles/xterm.css"
|
||||
config.assets.precompile << "performance_bar.css"
|
||||
config.assets.precompile << "lib/ace.js"
|
||||
config.assets.precompile << "test.css"
|
||||
config.assets.precompile << "disable_animations.css"
|
||||
config.assets.precompile << "snippets.css"
|
||||
config.assets.precompile << "locale/**/app.js"
|
||||
config.assets.precompile << "emoji_sprites.css"
|
||||
|
|
|
@ -150,6 +150,9 @@ production: &base
|
|||
## Impersonation settings
|
||||
impersonation_enabled: true
|
||||
|
||||
## Disable jQuery and CSS animations
|
||||
# disable_animations: true
|
||||
|
||||
## Reply by email
|
||||
# Allow users to comment on issues and merge requests by replying to notification emails.
|
||||
# For documentation on how to set this up, see http://doc.gitlab.com/ce/administration/reply_by_email.html
|
||||
|
|
|
@ -77,8 +77,8 @@ end
|
|||
|
||||
Some start/end event pairs are not "compatible" with each other. For example:
|
||||
|
||||
- "Issue created" to "Merge Request created": The event classes are defined on different domain models, the `object_type` method is different.
|
||||
- "Issue closed" to "Issue created": Issue must be created first before it can be closed.
|
||||
- "Issue created" to "Merge Request created": The event classes are defined on different domain models, the `object_type` method is different.
|
||||
- "Issue closed" to "Issue created": Issue must be created first before it can be closed.
|
||||
- "Issue closed" to "Issue closed": Duration is always 0.
|
||||
|
||||
The `StageEvents` module describes the allowed `start_event` and `end_event` pairings (`PAIRING_RULES` constant). If a new event is added, it needs to be registered in this module.
|
||||
|
|
|
@ -156,7 +156,7 @@ This is similar to the `.only:variables-canonical-dot-com` + `.except:refs-maste
|
|||
CI definitions:
|
||||
|
||||
```yaml
|
||||
.if-canonical-gitlab-and-merge-request: &if-canonical-gitlab-and-merge-request
|
||||
.if-canonical-gitlab-merge-request: &if-canonical-gitlab-merge-request
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/)/ && $CI_MERGE_REQUEST_IID'
|
||||
```
|
||||
|
||||
|
@ -210,9 +210,7 @@ graph RL;
|
|||
M[coverage];
|
||||
N[pages];
|
||||
O[static-analysis];
|
||||
P["schedule:package-and-qa<br/>(master schedule only)"];
|
||||
Q[package-and-qa];
|
||||
R[package-and-qa-manual];
|
||||
S["RSpec<br/>(e.g. rspec unit pg9)"]
|
||||
T[retrieve-tests-metadata];
|
||||
|
||||
|
@ -259,10 +257,6 @@ subgraph "`review` stage"
|
|||
subgraph "`qa` stage"
|
||||
Q --> |needs| C;
|
||||
Q --> |needs| F;
|
||||
R --> |needs| C;
|
||||
R --> |needs| F;
|
||||
P --> |needs| C;
|
||||
P --> |needs| F;
|
||||
review-qa-smoke -.-> |needs and depends on| G;
|
||||
review-qa-all -.-> |needs and depends on| G;
|
||||
review-performance -.-> |needs and depends on| G;
|
||||
|
@ -271,8 +265,7 @@ subgraph "`qa` stage"
|
|||
end
|
||||
|
||||
subgraph "`notification` stage"
|
||||
NOTIFICATION1["schedule:package-and-qa:notify-success<br>(on_success)"] -.-> |needs| P;
|
||||
NOTIFICATION2["schedule:package-and-qa:notify-failure<br>(on_failure)"] -.-> |needs| P;
|
||||
NOTIFICATION2["package-and-qa:notify-failure<br>(manual)"] -.-> |needs| Q;
|
||||
end
|
||||
|
||||
subgraph "`post-test` stage"
|
||||
|
|
|
@ -27,11 +27,11 @@ You can find these nightly pipelines at `https://gitlab.com/gitlab-org/quality/s
|
|||
|
||||
### Testing code in merge requests
|
||||
|
||||
#### Using the `package-and-qa-manual` job
|
||||
#### Using the `package-and-qa` job
|
||||
|
||||
It is possible to run end-to-end tests for a merge request, eventually being run in
|
||||
a pipeline in the [`gitlab-qa`](https://gitlab.com/gitlab-org/gitlab-qa/) project,
|
||||
by triggering the `package-and-qa-manual` manual action in the `test` stage (not
|
||||
by triggering the `package-and-qa` manual action in the `test` stage (not
|
||||
available for forks).
|
||||
|
||||
**This runs end-to-end tests against a custom Omnibus package built from your
|
||||
|
@ -53,7 +53,7 @@ graph LR
|
|||
B2[`Trigger-qa` stage<br>`Trigger:qa-test` job] -.->|2. Triggers a gitlab-qa pipeline and wait for it to be done| A3
|
||||
|
||||
subgraph "gitlab-foss/gitlab pipeline"
|
||||
A1[`test` stage<br>`package-and-qa-manual` job]
|
||||
A1[`test` stage<br>`package-and-qa` job]
|
||||
end
|
||||
|
||||
subgraph "omnibus-gitlab pipeline"
|
||||
|
@ -61,7 +61,7 @@ subgraph "omnibus-gitlab pipeline"
|
|||
end
|
||||
|
||||
subgraph "gitlab-qa pipeline"
|
||||
A3>QA jobs run] -.->|3. Reports back the pipeline result to the `package-and-qa-manual` job<br>and post the result on the original commit tested| A1
|
||||
A3>QA jobs run] -.->|3. Reports back the pipeline result to the `package-and-qa` job<br>and post the result on the original commit tested| A1
|
||||
end
|
||||
```
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ the time it would take to build packages and test everything.
|
|||
That is why when someone changes `t.text_field :login` to
|
||||
`t.text_field :username` in the _new session_ view we won't know about this
|
||||
change until our GitLab QA nightly pipeline fails, or until someone triggers
|
||||
`package-and-qa-manual` action in their merge request.
|
||||
`package-and-qa` action in their merge request.
|
||||
|
||||
Obviously such a change would break all tests. We call this problem a _fragile
|
||||
tests problem_.
|
||||
|
|
|
@ -44,8 +44,8 @@ There are seven stages that are tracked as part of the Cycle Analytics calculati
|
|||
- Time spent on code review
|
||||
- **Staging** (Continuous Deployment)
|
||||
- Time between merging and deploying to production
|
||||
- **Production** (Total)
|
||||
- Total lifecycle time; i.e. the velocity of the project or team
|
||||
- **Total** (Total)
|
||||
- Total lifecycle time. That is, the velocity of the project or team. [Previously known](https://gitlab.com/gitlab-org/gitlab/issues/38317) as **Production**.
|
||||
|
||||
## Date ranges
|
||||
|
||||
|
@ -60,12 +60,12 @@ GitLab provides the ability to filter analytics based on a date range. To filter
|
|||
## How the data is measured
|
||||
|
||||
Cycle Analytics records cycle time and data based on the project issues with the
|
||||
exception of the staging and production stages, where only data deployed to
|
||||
exception of the staging and total stages, where only data deployed to
|
||||
production are measured.
|
||||
|
||||
Specifically, if your CI is not set up and you have not defined a `production`
|
||||
or `production/*` [environment](../../ci/yaml/README.md#environment), then you will not have any
|
||||
data for those stages.
|
||||
data for this stage.
|
||||
|
||||
Each stage of Cycle Analytics is further described in the table below.
|
||||
|
||||
|
@ -77,7 +77,7 @@ Each stage of Cycle Analytics is further described in the table below.
|
|||
| Test | Measures the median time to run the entire pipeline for that project. It's related to the time GitLab CI takes to run every job for the commits pushed to that merge request defined in the previous stage. It is basically the start->finish time for all pipelines. |
|
||||
| Review | Measures the median time taken to review the merge request that has closing issue pattern, between its creation and until it's merged. |
|
||||
| Staging | Measures the median time between merging the merge request with closing issue pattern until the very first deployment to production. It's tracked by the environment set to `production` or matching `production/*` (case-sensitive, `Production` won't work) in your GitLab CI configuration. If there isn't a production environment, this is not tracked. |
|
||||
| Production| The sum of all time (medians) taken to run the entire process, from issue creation to deploying the code to production. |
|
||||
| Total | The sum of all time (medians) taken to run the entire process, from issue creation to deploying the code to production. [Previously known](https://gitlab.com/gitlab-org/gitlab/issues/38317) as **Production**. |
|
||||
|
||||
How this works, behind the scenes:
|
||||
|
||||
|
@ -124,7 +124,7 @@ environments is configured.
|
|||
1. Now that the merge request is merged, a deployment to the `production`
|
||||
environment starts and finishes at 19:30 (stop of **Staging** stage).
|
||||
1. The cycle completes and the sum of the median times of the previous stages
|
||||
is recorded to the **Production** stage. That is the time between creating an
|
||||
is recorded to the **Total** stage. That is the time between creating an
|
||||
issue and deploying its relevant merge request to production.
|
||||
|
||||
From the above example you can conclude the time it took each stage to complete
|
||||
|
@ -136,10 +136,10 @@ as long as their total time:
|
|||
- **Test**: 5min
|
||||
- **Review**: 5h (19:00 - 14:00)
|
||||
- **Staging**: 30min (19:30 - 19:00)
|
||||
- **Production**: Since this stage measures the sum of median time off all
|
||||
- **Total**: Since this stage measures the sum of median time of all
|
||||
previous stages, we cannot calculate it if we don't know the status of the
|
||||
stages before. In case this is the very first cycle that is run in the project,
|
||||
then the **Production** time is 10h 30min (19:30 - 09:00)
|
||||
then the **Total** time is 10h 30min (19:30 - 09:00)
|
||||
|
||||
A few notes:
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ module Gitlab
|
|||
end
|
||||
|
||||
def title
|
||||
s_('CycleAnalyticsStage|Production')
|
||||
s_('CycleAnalyticsStage|Total')
|
||||
end
|
||||
|
||||
def legend
|
||||
|
|
|
@ -28,6 +28,7 @@ module Gitlab
|
|||
gon.sprite_file_icons = IconsHelper.sprite_file_icons_path
|
||||
gon.emoji_sprites_css_path = ActionController::Base.helpers.stylesheet_path('emoji_sprites')
|
||||
gon.test_env = Rails.env.test?
|
||||
gon.disable_animations = Gitlab.config.gitlab['disable_animations']
|
||||
gon.suggested_label_colors = LabelsHelper.suggested_colors
|
||||
gon.first_day_of_week = current_user&.first_day_of_week || Gitlab::CurrentSettings.first_day_of_week
|
||||
gon.ee = Gitlab.ee?
|
||||
|
|
|
@ -187,13 +187,13 @@ module Sentry
|
|||
|
||||
def parse_stack_trace(event)
|
||||
exception_entry = event.dig('entries')&.detect { |h| h['type'] == 'exception' }
|
||||
return unless exception_entry
|
||||
return [] unless exception_entry
|
||||
|
||||
exception_values = exception_entry.dig('data', 'values')
|
||||
stack_trace_entry = exception_values&.detect { |h| h['stacktrace'].present? }
|
||||
return unless stack_trace_entry
|
||||
return [] unless stack_trace_entry
|
||||
|
||||
stack_trace_entry.dig('stacktrace', 'frames')
|
||||
stack_trace_entry.dig('stacktrace', 'frames') || []
|
||||
end
|
||||
|
||||
def map_to_error(issue)
|
||||
|
|
|
@ -5508,9 +5508,6 @@ msgstr ""
|
|||
msgid "CycleAnalyticsStage|Plan"
|
||||
msgstr ""
|
||||
|
||||
msgid "CycleAnalyticsStage|Production"
|
||||
msgstr ""
|
||||
|
||||
msgid "CycleAnalyticsStage|Review"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5520,6 +5517,9 @@ msgstr ""
|
|||
msgid "CycleAnalyticsStage|Test"
|
||||
msgstr ""
|
||||
|
||||
msgid "CycleAnalyticsStage|Total"
|
||||
msgstr ""
|
||||
|
||||
msgid "CycleAnalyticsStage|is not available for the selected group"
|
||||
msgstr ""
|
||||
|
||||
|
@ -18158,6 +18158,9 @@ msgstr ""
|
|||
msgid "The time taken by each data entry gathered by that stage."
|
||||
msgstr ""
|
||||
|
||||
msgid "The total stage shows the time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
|
||||
msgstr ""
|
||||
|
||||
msgid "The unique identifier for the Geo node. Must match `geo_node_name` if it is set in gitlab.rb, otherwise it must match `external_url` with a trailing slash"
|
||||
msgstr ""
|
||||
|
||||
|
@ -19146,9 +19149,6 @@ msgstr ""
|
|||
msgid "Total Contributions"
|
||||
msgstr ""
|
||||
|
||||
msgid "Total Time"
|
||||
msgstr ""
|
||||
|
||||
msgid "Total artifacts size: %{total_size}"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ and corresponding views / partials / selectors in CE / EE.
|
|||
|
||||
Whenever `qa:selectors` job fails in your merge request, you are supposed to
|
||||
fix [page objects](../doc/development/testing_guide/end_to_end/page_objects.md). You should also trigger end-to-end tests
|
||||
using `package-and-qa-manual` manual action, to test if everything works fine.
|
||||
using `package-and-qa` manual action, to test if everything works fine.
|
||||
|
||||
## How can I use it?
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ describe 'Cycle Analytics', :js do
|
|||
click_stage('Staging')
|
||||
expect_build_to_be_present
|
||||
|
||||
click_stage('Production')
|
||||
click_stage('Total')
|
||||
expect_issue_to_be_present
|
||||
end
|
||||
|
||||
|
|
300
spec/fixtures/sentry/issue_latest_event_no_stack_sample_response.json
vendored
Normal file
300
spec/fixtures/sentry/issue_latest_event_no_stack_sample_response.json
vendored
Normal file
|
@ -0,0 +1,300 @@
|
|||
{
|
||||
"eventID": "333b98e3b91341d8a6247edff171d8cf",
|
||||
"dist": null,
|
||||
"userReport": null,
|
||||
"projectID": "1788822",
|
||||
"previousEventID": "d32f1ce60de14911beec5109d9b5bdbd",
|
||||
"message": null,
|
||||
"id": "333b98e3b91341d8a6247edff171d8cf",
|
||||
"size": 77202,
|
||||
"errors": [
|
||||
{
|
||||
"data": {
|
||||
"reason": "the cookie is missing a name/value pair",
|
||||
"name": "request.cookies",
|
||||
"value": "********"
|
||||
},
|
||||
"message": "Discarded invalid value",
|
||||
"type": "invalid_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"reason": "the cookie is missing a name/value pair",
|
||||
"name": "request.cookies",
|
||||
"value": "********"
|
||||
},
|
||||
"message": "Discarded invalid value",
|
||||
"type": "invalid_data"
|
||||
}
|
||||
],
|
||||
"culprit": "/",
|
||||
"title": "ActiveRecord::NoDatabaseError: FATAL: database \"test_development\" does not exist",
|
||||
"sdkUpdates": [],
|
||||
"platform": "ruby",
|
||||
"location": "active_record/connection_adapters/postgresql_adapter.rb",
|
||||
"nextEventID": null,
|
||||
"type": "error",
|
||||
"metadata": {
|
||||
"function": "rescue in connect",
|
||||
"type": "ActiveRecord::NoDatabaseError",
|
||||
"value": "FATAL: database \"test_development\" does not exist\n",
|
||||
"filename": "active_record/connection_adapters/postgresql_adapter.rb"
|
||||
},
|
||||
"groupingConfig": {
|
||||
"enhancements": "eJybzDhxY3J-bm5-npWRgaGlroGxrpHxBABcTQcY",
|
||||
"id": "newstyle:2019-05-08"
|
||||
},
|
||||
"crashFile": null,
|
||||
"tags": [
|
||||
{
|
||||
"value": "Chrome 78.0.3904",
|
||||
"key": "browser",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "Chrome",
|
||||
"key": "browser.name",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "Mac OS X 10.15.1",
|
||||
"key": "client_os",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "Mac OS X",
|
||||
"key": "client_os.name",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "development",
|
||||
"key": "environment",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "error",
|
||||
"key": "level",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "ruby",
|
||||
"key": "logger",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "b56ae26",
|
||||
"key": "release",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "Seans-MBP.fritz.box",
|
||||
"key": "server_name",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "/",
|
||||
"key": "transaction",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"value": "http://localhost:3001/",
|
||||
"key": "url",
|
||||
"_meta": null
|
||||
},
|
||||
{
|
||||
"query": "user.ip:\"::1\"",
|
||||
"value": "ip:::1",
|
||||
"key": "user",
|
||||
"_meta": null
|
||||
}
|
||||
],
|
||||
"dateCreated": "2019-12-08T21:48:07Z",
|
||||
"dateReceived": "2019-12-08T21:48:08.579417Z",
|
||||
"user": {
|
||||
"username": null,
|
||||
"name": null,
|
||||
"ip_address": "::1",
|
||||
"email": null,
|
||||
"data": null,
|
||||
"id": null
|
||||
},
|
||||
"entries": [],
|
||||
"packages": {
|
||||
"coffee-script": "2.4.1",
|
||||
"uglifier": "4.1.20",
|
||||
"ffi": "1.11.1",
|
||||
"actioncable": "5.2.3",
|
||||
"io-like": "0.3.0",
|
||||
"rb-inotify": "0.10.0",
|
||||
"spring": "2.1.0",
|
||||
"loofah": "2.2.3",
|
||||
"selenium-webdriver": "3.142.3",
|
||||
"marcel": "0.3.3",
|
||||
"sass-listen": "4.0.0",
|
||||
"nokogiri": "1.10.4",
|
||||
"activestorage": "5.2.3",
|
||||
"activejob": "5.2.3",
|
||||
"mimemagic": "0.3.3",
|
||||
"faraday": "0.17.1",
|
||||
"execjs": "2.7.0",
|
||||
"activesupport": "5.2.3",
|
||||
"rails-html-sanitizer": "1.2.0",
|
||||
"byebug": "11.0.1",
|
||||
"xpath": "3.2.0",
|
||||
"msgpack": "1.3.1",
|
||||
"childprocess": "1.0.1",
|
||||
"rails-dom-testing": "2.0.3",
|
||||
"public_suffix": "3.1.1",
|
||||
"mini_mime": "1.0.2",
|
||||
"arel": "9.0.0",
|
||||
"coffee-rails": "4.2.2",
|
||||
"bundler": "1.17.3",
|
||||
"rails": "5.2.3",
|
||||
"globalid": "0.4.2",
|
||||
"sentry-raven": "2.12.3",
|
||||
"concurrent-ruby": "1.1.5",
|
||||
"capybara": "3.28.0",
|
||||
"regexp_parser": "1.6.0",
|
||||
"sprockets-rails": "3.2.1",
|
||||
"tzinfo": "1.2.5",
|
||||
"mail": "2.7.1",
|
||||
"actionview": "5.2.3",
|
||||
"rubyzip": "1.2.3",
|
||||
"coffee-script-source": "1.12.2",
|
||||
"listen": "3.1.5",
|
||||
"i18n": "1.6.0",
|
||||
"erubi": "1.8.0",
|
||||
"rake": "12.3.3",
|
||||
"nio4r": "2.4.0",
|
||||
"activemodel": "5.2.3",
|
||||
"web-console": "3.7.0",
|
||||
"ruby_dep": "1.5.0",
|
||||
"turbolinks": "5.2.0",
|
||||
"archive-zip": "0.12.0",
|
||||
"method_source": "0.9.2",
|
||||
"minitest": "5.11.3",
|
||||
"puma": "3.12.1",
|
||||
"sass-rails": "5.1.0",
|
||||
"chromedriver-helper": "2.1.1",
|
||||
"sprockets": "3.7.2",
|
||||
"bindex": "0.8.1",
|
||||
"actionmailer": "5.2.3",
|
||||
"rack-test": "1.1.0",
|
||||
"bootsnap": "1.4.4",
|
||||
"railties": "5.2.3",
|
||||
"mini_portile2": "2.4.0",
|
||||
"crass": "1.0.4",
|
||||
"websocket-extensions": "0.1.4",
|
||||
"multipart-post": "2.1.1",
|
||||
"rb-fsevent": "0.10.3",
|
||||
"jbuilder": "2.9.1",
|
||||
"pg": "1.1.4",
|
||||
"sass": "3.7.4",
|
||||
"activerecord": "5.2.3",
|
||||
"builder": "3.2.3",
|
||||
"spring-watcher-listen": "2.0.1",
|
||||
"websocket-driver": "0.7.1",
|
||||
"thor": "0.20.3",
|
||||
"thread_safe": "0.3.6",
|
||||
"addressable": "2.6.0",
|
||||
"prometheus-client-mmap": "0.9.8",
|
||||
"tilt": "2.0.9",
|
||||
"actionpack": "5.2.3",
|
||||
"rack": "2.0.7",
|
||||
"turbolinks-source": "5.2.0"
|
||||
},
|
||||
"sdk": {
|
||||
"version": "2.12.3",
|
||||
"name": "raven-ruby"
|
||||
},
|
||||
"_meta": {
|
||||
"user": null,
|
||||
"context": null,
|
||||
"entries": {
|
||||
"1": {
|
||||
"data": {
|
||||
"": null,
|
||||
"cookies": {
|
||||
"": {
|
||||
"err": [
|
||||
[
|
||||
"invalid_data",
|
||||
{
|
||||
"reason": "the cookie is missing a name/value pair"
|
||||
}
|
||||
]
|
||||
],
|
||||
"val": "********"
|
||||
}
|
||||
},
|
||||
"url": null,
|
||||
"headers": null,
|
||||
"env": null,
|
||||
"query": null,
|
||||
"data": null,
|
||||
"method": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"contexts": null,
|
||||
"message": null,
|
||||
"packages": null,
|
||||
"tags": {},
|
||||
"sdk": null
|
||||
},
|
||||
"contexts": {
|
||||
"browser": {
|
||||
"version": "78.0.3904",
|
||||
"type": "browser",
|
||||
"name": "Chrome"
|
||||
},
|
||||
"client_os": {
|
||||
"version": "10.15.1",
|
||||
"type": "os",
|
||||
"name": "Mac OS X"
|
||||
}
|
||||
},
|
||||
"fingerprints": [
|
||||
"6aa133ea51857634f2d113de52b5cc61",
|
||||
"e1613eeb169241eab95b76ab52a80c68"
|
||||
],
|
||||
"context": {
|
||||
"server": {
|
||||
"runtime": {
|
||||
"version": "ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]",
|
||||
"name": "ruby"
|
||||
},
|
||||
"os": {
|
||||
"kernel_version": "Darwin Seans-MBP.fritz.box 19.0.0 Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64 x86_64",
|
||||
"version": "Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64",
|
||||
"build": "19.0.0",
|
||||
"name": "Darwin"
|
||||
}
|
||||
}
|
||||
},
|
||||
"release": {
|
||||
"dateReleased": null,
|
||||
"commitCount": 0,
|
||||
"url": null,
|
||||
"data": {},
|
||||
"lastDeploy": null,
|
||||
"deployCount": 0,
|
||||
"dateCreated": "2019-12-08T21:47:47Z",
|
||||
"lastEvent": "2019-12-09T21:52:05Z",
|
||||
"version": "b56ae26",
|
||||
"firstEvent": "2019-12-08T21:47:47Z",
|
||||
"lastCommit": null,
|
||||
"shortVersion": "b56ae26",
|
||||
"authors": [],
|
||||
"owner": null,
|
||||
"newGroups": 26,
|
||||
"ref": null,
|
||||
"projects": [
|
||||
{
|
||||
"slug": "gitlab-03",
|
||||
"name": "gitlab-03"
|
||||
}
|
||||
]
|
||||
},
|
||||
"groupID": "1378364652"
|
||||
}
|
5299
spec/fixtures/sentry/issue_latest_event_sample_response.json
vendored
Normal file
5299
spec/fixtures/sentry/issue_latest_event_sample_response.json
vendored
Normal file
File diff suppressed because it is too large
Load diff
|
@ -4,7 +4,7 @@ require 'spec_helper'
|
|||
require 'lib/gitlab/cycle_analytics/shared_stage_spec'
|
||||
|
||||
describe Gitlab::CycleAnalytics::ProductionStage do
|
||||
let(:stage_name) { :production }
|
||||
let(:stage_name) { 'Total' }
|
||||
|
||||
it_behaves_like 'base stage'
|
||||
end
|
||||
|
|
|
@ -218,4 +218,62 @@ describe Sentry::Client do
|
|||
it_behaves_like 'issues has correct length', 1
|
||||
end
|
||||
end
|
||||
|
||||
describe '#issue_latest_event' do
|
||||
let(:sample_response) do
|
||||
Gitlab::Utils.deep_indifferent_access(
|
||||
JSON.parse(fixture_file('sentry/issue_latest_event_sample_response.json'))
|
||||
)
|
||||
end
|
||||
|
||||
let(:issue_id) { '1234' }
|
||||
let(:sentry_api_response) { sample_response }
|
||||
let(:sentry_url) { 'https://sentrytest.gitlab.com/api/0' }
|
||||
let(:sentry_request_url) { sentry_url + "/issues/#{issue_id}/events/latest/" }
|
||||
|
||||
let!(:sentry_api_request) { stub_sentry_request(sentry_request_url, body: sentry_api_response) }
|
||||
|
||||
subject { client.issue_latest_event(issue_id: issue_id) }
|
||||
|
||||
it_behaves_like 'calls sentry api'
|
||||
|
||||
it 'has correct return type' do
|
||||
expect(subject).to be_a(Gitlab::ErrorTracking::ErrorEvent)
|
||||
end
|
||||
|
||||
shared_examples 'assigns error tracking event correctly' do
|
||||
using RSpec::Parameterized::TableSyntax
|
||||
|
||||
where(:event_object, :sentry_response) do
|
||||
:issue_id | :groupID
|
||||
:date_received | :dateReceived
|
||||
end
|
||||
|
||||
with_them do
|
||||
it { expect(subject.public_send(event_object)).to eq(sentry_api_response.dig(*sentry_response)) }
|
||||
end
|
||||
end
|
||||
|
||||
context 'error object created from sentry response' do
|
||||
it_behaves_like 'assigns error tracking event correctly'
|
||||
|
||||
it 'parses the stack trace' do
|
||||
expect(subject.stack_trace_entries).to be_a Array
|
||||
expect(subject.stack_trace_entries).not_to be_empty
|
||||
end
|
||||
|
||||
context 'error without stack trace' do
|
||||
before do
|
||||
sample_response['entries'] = []
|
||||
stub_sentry_request(sentry_request_url, body: sample_response)
|
||||
end
|
||||
|
||||
it_behaves_like 'assigns error tracking event correctly'
|
||||
|
||||
it 'returns an empty array for stack_trace_entries' do
|
||||
expect(subject.stack_trace_entries).to eq []
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue