Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
b3fdfcadfc
commit
40c3be6a9f
|
|
@ -1205,3 +1205,7 @@ Rails/StrongParams:
|
|||
Include:
|
||||
- 'app/controllers/**/*'
|
||||
- 'ee/app/controllers/**/*'
|
||||
|
||||
QA/FabricateUsage:
|
||||
Include:
|
||||
- 'qa/qa/specs/**/*_spec.rb'
|
||||
|
|
|
|||
|
|
@ -347,10 +347,6 @@ Gitlab/BoundedContexts:
|
|||
- 'app/graphql/resolvers/project_milestones_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_packages_protection_rules_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_packages_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipeline_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipeline_schedules_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipeline_statistics_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipelines_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_resolver.rb'
|
||||
- 'app/graphql/resolvers/projects_resolver.rb'
|
||||
- 'app/graphql/resolvers/recent_boards_resolver.rb'
|
||||
|
|
@ -2311,8 +2307,6 @@ Gitlab/BoundedContexts:
|
|||
- 'ee/app/graphql/ee/resolvers/issues_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/namespace_projects_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/pending_group_members_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/project_pipeline_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/project_pipelines_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/projects_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/validate_codeowner_file_resolver.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/work_items_resolver.rb'
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ Layout/ArrayAlignment:
|
|||
- 'ee/app/controllers/projects/push_rules_controller.rb'
|
||||
- 'ee/app/finders/autocomplete/project_invited_groups_finder.rb'
|
||||
- 'ee/app/finders/ee/issues_finder/params.rb'
|
||||
- 'ee/app/graphql/ee/resolvers/project_pipelines_resolver.rb'
|
||||
- 'ee/app/models/concerns/geo/verification_state.rb'
|
||||
- 'ee/app/models/dast_site_profile.rb'
|
||||
- 'ee/app/models/dora/base_metric.rb'
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ Layout/ClassStructure:
|
|||
- 'app/graphql/resolvers/group_resolver.rb'
|
||||
- 'app/graphql/resolvers/namespace_projects_resolver.rb'
|
||||
- 'app/graphql/resolvers/namespace_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipeline_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_resolver.rb'
|
||||
- 'app/graphql/resolvers/releases_resolver.rb'
|
||||
- 'app/graphql/resolvers/work_items/work_item_discussions_resolver.rb'
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ Layout/EmptyLineAfterMagicComment:
|
|||
- 'app/graphql/resolvers/group_packages_resolver.rb'
|
||||
- 'app/graphql/resolvers/merge_request_pipelines_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_packages_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipelines_resolver.rb'
|
||||
- 'app/graphql/types/access_level_type.rb'
|
||||
- 'app/graphql/types/ci/detailed_status_type.rb'
|
||||
- 'app/graphql/types/ci/status_action_type.rb'
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ Layout/LineBreakAfterFinalMixin:
|
|||
- 'app/controllers/snippets/blobs_controller.rb'
|
||||
- 'app/graphql/mutations/integrations/exclusions/create.rb'
|
||||
- 'app/graphql/resolvers/integrations/exclusions_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipeline_statistics_resolver.rb'
|
||||
- 'app/graphql/resolvers/projects/deploy_key_resolver.rb'
|
||||
- 'app/models/alert_management/metric_image.rb'
|
||||
- 'app/models/ci/pipeline.rb'
|
||||
|
|
|
|||
|
|
@ -2,17 +2,6 @@
|
|||
# Cop supports --autocorrect.
|
||||
Layout/SpaceInsideParens:
|
||||
Exclude:
|
||||
- 'spec/finders/events_finder_spec.rb'
|
||||
- 'spec/finders/labels_finder_spec.rb'
|
||||
- 'spec/helpers/application_helper_spec.rb'
|
||||
- 'spec/helpers/badges_helper_spec.rb'
|
||||
- 'spec/helpers/dev_ops_report_helper_spec.rb'
|
||||
- 'spec/helpers/git_helper_spec.rb'
|
||||
- 'spec/helpers/gitlab_routing_helper_spec.rb'
|
||||
- 'spec/helpers/gitlab_script_tag_helper_spec.rb'
|
||||
- 'spec/helpers/tab_helper_spec.rb'
|
||||
- 'spec/initializers/carrierwave_s3_encryption_headers_patch_spec.rb'
|
||||
- 'spec/lib/api/entities/snippet_spec.rb'
|
||||
- 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
|
||||
- 'spec/lib/banzai/filter/references/feature_flag_reference_filter_spec.rb'
|
||||
- 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
---
|
||||
QA/FabricateUsage:
|
||||
Include:
|
||||
- 'qa/qa/specs/**/*_spec.rb'
|
||||
Exclude:
|
||||
- 'qa/qa/resource/fork.rb'
|
||||
- 'qa/qa/resource/group_runner.rb'
|
||||
- 'qa/qa/runtime/search.rb'
|
||||
- 'qa/qa/support/helpers/mask_token.rb'
|
||||
|
|
@ -929,7 +929,6 @@ RSpec/BeforeAllRoleAssignment:
|
|||
- 'spec/graphql/resolvers/blobs_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/board_list_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/ci/config_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/crm/contact_state_counts_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/crm/contacts_resolver_spec.rb'
|
||||
|
|
@ -947,11 +946,7 @@ RSpec/BeforeAllRoleAssignment:
|
|||
- 'spec/graphql/resolvers/merge_requests_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/nested_groups_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_issues_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_jobs_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_milestones_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipelines_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/projects/services_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/snippets_resolver_spec.rb'
|
||||
|
|
|
|||
|
|
@ -1329,7 +1329,6 @@ RSpec/ContextWording:
|
|||
- 'spec/graphql/resolvers/namespace_projects_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_merge_requests_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_milestones_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/snippets/blobs_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/snippets_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/terraform/states_resolver_spec.rb'
|
||||
|
|
|
|||
|
|
@ -1649,10 +1649,6 @@ RSpec/FeatureCategory:
|
|||
- 'spec/graphql/resolvers/project_merge_requests_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_milestones_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_packages_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_schedules_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_pipelines_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/project_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/projects/fork_targets_resolver_spec.rb'
|
||||
- 'spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb'
|
||||
|
|
|
|||
|
|
@ -186,7 +186,6 @@ Style/InlineDisableAnnotation:
|
|||
- 'app/graphql/resolvers/merge_request_pipelines_resolver.rb'
|
||||
- 'app/graphql/resolvers/nested_groups_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_packages_resolver.rb'
|
||||
- 'app/graphql/resolvers/project_pipelines_resolver.rb'
|
||||
- 'app/graphql/types/access_level_type.rb'
|
||||
- 'app/graphql/types/admin/sidekiq_queues/delete_jobs_response_type.rb'
|
||||
- 'app/graphql/types/alert_management/alert_type.rb'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<script>
|
||||
import {
|
||||
GlBadge,
|
||||
GlDisclosureDropdown,
|
||||
GlDisclosureDropdownItem,
|
||||
GlTooltipDirective,
|
||||
|
|
@ -20,6 +21,7 @@ import JobItem from './job_item.vue';
|
|||
export default {
|
||||
components: {
|
||||
JobItem,
|
||||
GlBadge,
|
||||
GlDisclosureDropdown,
|
||||
GlDisclosureDropdownItem,
|
||||
},
|
||||
|
|
@ -130,17 +132,16 @@ export default {
|
|||
>
|
||||
<template #toggle>
|
||||
<button type="button" :class="cssClassJobName" class="gl-w-full gl-bg-transparent gl-pr-4">
|
||||
<div class="gl-display-flex gl-align-items-stretch gl-justify-content-space-between">
|
||||
<div class="gl-flex gl-items-stretch gl-justify-between">
|
||||
<job-item
|
||||
:type="$options.jobItemTypes.jobDropdown"
|
||||
:job="group"
|
||||
:stage-name="stageName"
|
||||
hide-tooltip
|
||||
/>
|
||||
|
||||
<div class="gl-font-size-lg -gl-ml-4 gl-align-self-center">
|
||||
<gl-badge variant="muted" class="-gl-ml-5 -gl-mr-2 gl-self-center">
|
||||
{{ group.size }}
|
||||
</div>
|
||||
</gl-badge>
|
||||
</div>
|
||||
</button>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -339,7 +339,7 @@ export default {
|
|||
:title="tooltipText"
|
||||
:class="jobClasses"
|
||||
:href="detailsPath"
|
||||
class="menu-item gl-text-gray-900 gl-active-text-decoration-none gl-focus-text-decoration-none gl-hover-text-decoration-none gl-hover-bg-gray-50 gl-focus-bg-gray-50 gl-w-full"
|
||||
class="menu-item gl-text-gray-900 active:gl-no-underline focus:gl-no-underline hover:gl-no-underline hover:gl-bg-strong focus:gl-bg-strong gl-w-full gl-rounded"
|
||||
data-testid="ci-job-item-content"
|
||||
@click="jobItemClick"
|
||||
@mouseout="hideTooltips"
|
||||
|
|
|
|||
|
|
@ -79,9 +79,9 @@ export default {
|
|||
jobClasses: [
|
||||
'gl-p-3',
|
||||
'gl-border-0',
|
||||
'gl-rounded-base',
|
||||
'gl-hover-bg-gray-50',
|
||||
'gl-focus-bg-gray-50',
|
||||
'gl-rounded',
|
||||
'hover:gl-bg-strong',
|
||||
'focus:gl-bg-strong',
|
||||
'gl-hover-text-gray-900',
|
||||
'gl-focus-text-gray-900',
|
||||
],
|
||||
|
|
|
|||
|
|
@ -318,6 +318,12 @@
|
|||
&,
|
||||
.gl-new-dropdown-custom-toggle {
|
||||
width: 100%;
|
||||
|
||||
.gl-badge.badge-muted {
|
||||
.gl-dark & {
|
||||
@apply gl-bg-gray-100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reset padding, as inner element will
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
module Ci
|
||||
class ProjectPipelineAnalyticsResolver < BaseResolver
|
||||
include Gitlab::Graphql::Authorize::AuthorizeResource
|
||||
|
||||
type Types::Ci::AnalyticsType, null: true
|
||||
|
||||
authorizes_object!
|
||||
authorize :read_ci_cd_analytics
|
||||
|
||||
def resolve
|
||||
weekly_stats = Gitlab::Ci::Charts::WeekChart.new(object)
|
||||
monthly_stats = Gitlab::Ci::Charts::MonthChart.new(object)
|
||||
yearly_stats = Gitlab::Ci::Charts::YearChart.new(object)
|
||||
pipeline_times = Gitlab::Ci::Charts::PipelineTime.new(object)
|
||||
|
||||
{
|
||||
week_pipelines_labels: weekly_stats.labels,
|
||||
week_pipelines_totals: weekly_stats.total,
|
||||
week_pipelines_successful: weekly_stats.success,
|
||||
month_pipelines_labels: monthly_stats.labels,
|
||||
month_pipelines_totals: monthly_stats.total,
|
||||
month_pipelines_successful: monthly_stats.success,
|
||||
year_pipelines_labels: yearly_stats.labels,
|
||||
year_pipelines_totals: yearly_stats.total,
|
||||
year_pipelines_successful: yearly_stats.success,
|
||||
pipeline_times_labels: pipeline_times.labels,
|
||||
pipeline_times_values: pipeline_times.pipeline_times
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
module Ci
|
||||
class ProjectPipelineResolver < BaseResolver
|
||||
include LooksAhead
|
||||
|
||||
type ::Types::Ci::PipelineType, null: true
|
||||
|
||||
alias_method :project, :object
|
||||
|
||||
argument :iid, GraphQL::Types::ID,
|
||||
required: false,
|
||||
description: 'IID of the Pipeline. For example, "1".'
|
||||
|
||||
argument :sha, GraphQL::Types::String,
|
||||
required: false,
|
||||
description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
|
||||
|
||||
def self.resolver_complexity(args, child_complexity:)
|
||||
complexity = super
|
||||
complexity - 10
|
||||
end
|
||||
|
||||
def ready?(iid: nil, sha: nil, **args)
|
||||
raise Gitlab::Graphql::Errors::ArgumentError, 'Provide one of an IID or SHA' unless iid.present? ^ sha.present?
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def resolve(iid: nil, sha: nil, **args)
|
||||
self.lookahead = args.delete(:lookahead)
|
||||
|
||||
if iid
|
||||
BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader|
|
||||
finder = ::Ci::PipelinesFinder.new(project, current_user, iids: iids)
|
||||
|
||||
apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
|
||||
end
|
||||
else
|
||||
BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader|
|
||||
finder = ::Ci::PipelinesFinder.new(project, current_user, sha: shas)
|
||||
|
||||
apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def unconditional_includes
|
||||
[
|
||||
{ statuses: [:needs] }
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
module Ci
|
||||
class ProjectPipelineSchedulesResolver < BaseResolver
|
||||
alias_method :project, :object
|
||||
|
||||
type ::Types::Ci::PipelineScheduleType.connection_type, null: true
|
||||
|
||||
argument :status, ::Types::Ci::PipelineScheduleStatusEnum,
|
||||
required: false,
|
||||
description: 'Filter pipeline schedules by active status.'
|
||||
|
||||
argument :ids, [GraphQL::Types::ID],
|
||||
required: false,
|
||||
default_value: nil,
|
||||
description: 'Filter pipeline schedules by IDs.'
|
||||
|
||||
argument :sort, ::Types::Ci::PipelineScheduleSortEnum,
|
||||
required: false, default_value: :id_desc,
|
||||
description: 'List pipeline schedules by sort order. Default is `id_desc`.'
|
||||
|
||||
def resolve(status: nil, ids: nil, sort: :id_desc)
|
||||
::Ci::PipelineSchedulesFinder.new(project, sort: sort).execute(scope: status, ids: ids)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# rubocop: disable Graphql/ResolverType -- The GraphQL type here gets defined in
|
||||
# https://gitlab.com/gitlab-org/gitlab/blob/master/app/graphql/resolvers/concerns/resolves_pipelines.rb#L7
|
||||
|
||||
module Resolvers
|
||||
module Ci
|
||||
class ProjectPipelinesResolver < BaseResolver
|
||||
include LooksAhead
|
||||
include ResolvesPipelines
|
||||
|
||||
alias_method :project, :object
|
||||
|
||||
def resolve_with_lookahead(**args)
|
||||
apply_lookahead(resolve_pipelines(project, args))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def preloads
|
||||
{
|
||||
jobs: { statuses_order_id_desc: [:needs] },
|
||||
upstream: [:triggered_by_pipeline],
|
||||
downstream: [:triggered_pipelines]
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable Graphql/ResolverType
|
||||
|
||||
Resolvers::Ci::ProjectPipelinesResolver.prepend_mod
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
class ProjectPipelineResolver < BaseResolver
|
||||
include LooksAhead
|
||||
|
||||
type ::Types::Ci::PipelineType, null: true
|
||||
|
||||
alias_method :project, :object
|
||||
|
||||
argument :iid, GraphQL::Types::ID,
|
||||
required: false,
|
||||
description: 'IID of the Pipeline. For example, "1".'
|
||||
|
||||
argument :sha, GraphQL::Types::String,
|
||||
required: false,
|
||||
description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
|
||||
|
||||
def ready?(iid: nil, sha: nil, **args)
|
||||
raise Gitlab::Graphql::Errors::ArgumentError, 'Provide one of an IID or SHA' unless iid.present? ^ sha.present?
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def resolve(iid: nil, sha: nil, **args)
|
||||
self.lookahead = args.delete(:lookahead)
|
||||
|
||||
if iid
|
||||
BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader|
|
||||
finder = ::Ci::PipelinesFinder.new(project, current_user, iids: iids)
|
||||
|
||||
apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
|
||||
end
|
||||
else
|
||||
BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader|
|
||||
finder = ::Ci::PipelinesFinder.new(project, current_user, sha: shas)
|
||||
|
||||
apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def unconditional_includes
|
||||
[
|
||||
{ statuses: [:needs] }
|
||||
]
|
||||
end
|
||||
|
||||
def self.resolver_complexity(args, child_complexity:)
|
||||
complexity = super
|
||||
complexity - 10
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
class ProjectPipelineSchedulesResolver < BaseResolver
|
||||
alias_method :project, :object
|
||||
|
||||
type ::Types::Ci::PipelineScheduleType.connection_type, null: true
|
||||
|
||||
argument :status, ::Types::Ci::PipelineScheduleStatusEnum,
|
||||
required: false,
|
||||
description: 'Filter pipeline schedules by active status.'
|
||||
|
||||
argument :ids, [GraphQL::Types::ID],
|
||||
required: false,
|
||||
default_value: nil,
|
||||
description: 'Filter pipeline schedules by IDs.'
|
||||
|
||||
argument :sort, ::Types::Ci::PipelineScheduleSortEnum,
|
||||
required: false, default_value: :id_desc,
|
||||
description: 'List pipeline schedules by sort order. Default is `id_desc`.'
|
||||
|
||||
def resolve(status: nil, ids: nil, sort: :id_desc)
|
||||
::Ci::PipelineSchedulesFinder.new(project, sort: sort).execute(scope: status, ids: ids)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Resolvers
|
||||
class ProjectPipelineStatisticsResolver < BaseResolver
|
||||
include Gitlab::Graphql::Authorize::AuthorizeResource
|
||||
type Types::Ci::AnalyticsType, null: true
|
||||
|
||||
authorizes_object!
|
||||
authorize :read_ci_cd_analytics
|
||||
|
||||
def resolve
|
||||
weekly_stats = Gitlab::Ci::Charts::WeekChart.new(object)
|
||||
monthly_stats = Gitlab::Ci::Charts::MonthChart.new(object)
|
||||
yearly_stats = Gitlab::Ci::Charts::YearChart.new(object)
|
||||
pipeline_times = Gitlab::Ci::Charts::PipelineTime.new(object)
|
||||
|
||||
{
|
||||
week_pipelines_labels: weekly_stats.labels,
|
||||
week_pipelines_totals: weekly_stats.total,
|
||||
week_pipelines_successful: weekly_stats.success,
|
||||
month_pipelines_labels: monthly_stats.labels,
|
||||
month_pipelines_totals: monthly_stats.total,
|
||||
month_pipelines_successful: monthly_stats.success,
|
||||
year_pipelines_labels: yearly_stats.labels,
|
||||
year_pipelines_totals: yearly_stats.total,
|
||||
year_pipelines_successful: yearly_stats.success,
|
||||
pipeline_times_labels: pipeline_times.labels,
|
||||
pipeline_times_values: pipeline_times.pipeline_times
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
# The GraphQL type here gets defined in
|
||||
# https://gitlab.com/gitlab-org/gitlab/blob/master/app/graphql/resolvers/concerns/resolves_pipelines.rb#L7
|
||||
# rubocop: disable Graphql/ResolverType
|
||||
|
||||
module Resolvers
|
||||
class ProjectPipelinesResolver < BaseResolver
|
||||
include LooksAhead
|
||||
include ResolvesPipelines
|
||||
|
||||
alias_method :project, :object
|
||||
|
||||
def resolve_with_lookahead(**args)
|
||||
apply_lookahead(resolve_pipelines(project, args))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def preloads
|
||||
{
|
||||
jobs: { statuses_order_id_desc: [:needs] },
|
||||
upstream: [:triggered_by_pipeline],
|
||||
downstream: [:triggered_pipelines]
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable Graphql/ResolverType
|
||||
|
||||
Resolvers::ProjectPipelinesResolver.prepend_mod
|
||||
|
|
@ -364,13 +364,13 @@ module Types
|
|||
null: true,
|
||||
description: 'Build pipelines of the project.',
|
||||
extras: [:lookahead],
|
||||
resolver: Resolvers::ProjectPipelinesResolver
|
||||
resolver: Resolvers::Ci::ProjectPipelinesResolver
|
||||
|
||||
field :pipeline_schedules,
|
||||
type: Types::Ci::PipelineScheduleType.connection_type,
|
||||
null: true,
|
||||
description: 'Pipeline schedules of the project. This field can only be resolved for one project per request.',
|
||||
resolver: Resolvers::ProjectPipelineSchedulesResolver
|
||||
resolver: Resolvers::Ci::ProjectPipelineSchedulesResolver
|
||||
|
||||
field :pipeline_triggers,
|
||||
Types::Ci::PipelineTriggerType.connection_type,
|
||||
|
|
@ -383,7 +383,7 @@ module Types
|
|||
null: true,
|
||||
description: 'Build pipeline of the project.',
|
||||
extras: [:lookahead],
|
||||
resolver: Resolvers::ProjectPipelineResolver
|
||||
resolver: Resolvers::Ci::ProjectPipelineResolver
|
||||
|
||||
field :pipeline_counts, Types::Ci::PipelineCountsType,
|
||||
null: true,
|
||||
|
|
@ -544,7 +544,7 @@ module Types
|
|||
field :pipeline_analytics, Types::Ci::AnalyticsType,
|
||||
null: true,
|
||||
description: 'Pipeline analytics.',
|
||||
resolver: Resolvers::ProjectPipelineStatisticsResolver
|
||||
resolver: Resolvers::Ci::ProjectPipelineAnalyticsResolver
|
||||
|
||||
field :ci_template, Types::Ci::TemplateType,
|
||||
null: true,
|
||||
|
|
|
|||
|
|
@ -8,19 +8,29 @@ module Ci
|
|||
@pipeline = pipeline
|
||||
end
|
||||
|
||||
def execute
|
||||
scope = pipeline.builds.latest
|
||||
iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: scope)
|
||||
|
||||
iterator.each_batch(of: 100) do |records|
|
||||
upsert_records(records)
|
||||
end
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord -- plucking attributes is more efficient than loading the records
|
||||
# rubocop: disable Database/AvoidUsingPluckWithoutLimit -- plucking on batch
|
||||
def execute
|
||||
def upsert_records(batch)
|
||||
keys = %i[build_id partition_id name project_id]
|
||||
pipeline.builds.latest.each_batch(of: 50) do |batch|
|
||||
|
||||
builds_upsert_data =
|
||||
batch
|
||||
.pluck(:id, :partition_id, :name, :project_id)
|
||||
.map { |values| Hash[keys.zip(values)] }
|
||||
|
||||
return unless builds_upsert_data.any?
|
||||
|
||||
Ci::BuildName.upsert_all(builds_upsert_data, unique_by: [:build_id, :partition_id])
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
# rubocop: enable Database/AvoidUsingPluckWithoutLimit
|
||||
end
|
||||
|
|
|
|||
|
|
@ -18,7 +18,10 @@ module Files
|
|||
@previous_path = params[:previous_path]
|
||||
|
||||
@file_content = params[:file_content]
|
||||
@file_content = Base64.decode64(@file_content) if params[:file_content_encoding] == 'base64'
|
||||
|
||||
if params[:file_content_encoding] == 'base64' && @file_content.present?
|
||||
@file_content = Base64.decode64(@file_content)
|
||||
end
|
||||
|
||||
@execute_filemode = params[:execute_filemode]
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
---
|
||||
name: track_ai_metrics_in_usage_data
|
||||
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/457504
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/155973
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/466664
|
||||
milestone: '17.1'
|
||||
group: group::optimize
|
||||
type: beta
|
||||
default_enabled: false
|
||||
|
|
@ -466,10 +466,11 @@ job_name:
|
|||
|
||||
[Service containers](../docker/using_docker_images.md) can use CI/CD variables, but
|
||||
by default can only access [variables saved in the `.gitlab-ci.yml` file](#define-a-cicd-variable-in-the-gitlab-ciyml-file).
|
||||
Variables [set in the GitLab UI](#define-a-cicd-variable-in-the-ui) are not available to
|
||||
service containers, because service containers are not trusted by default.
|
||||
|
||||
Variables [set in the GitLab UI](#define-a-cicd-variable-in-the-ui) by default are not available to
|
||||
service containers. To make a UI-defined variable available in a service container,
|
||||
re-assign it in your `.gitlab-ci.yml`:
|
||||
To make a UI-defined variable available in a service container, you can re-assign
|
||||
it to another variable in your `.gitlab-ci.yml`:
|
||||
|
||||
```yaml
|
||||
variables:
|
||||
|
|
|
|||
|
|
@ -108,9 +108,7 @@ module API
|
|||
.fetch(:additional_properties, Gitlab::InternalEvents::DEFAULT_ADDITIONAL_PROPERTIES)
|
||||
.symbolize_keys
|
||||
|
||||
if Feature.enabled?(:track_ai_metrics_in_usage_data) && # rubocop:disable Gitlab/FeatureFlagWithoutActor -- beta
|
||||
!Gitlab::Tracking::AiTracking.track_via_code_suggestions?(event_name, current_user)
|
||||
|
||||
unless Gitlab::Tracking::AiTracking.track_via_code_suggestions?(event_name, current_user)
|
||||
Gitlab::Tracking::AiTracking.track_event(event_name, additional_properties.merge(user: current_user))
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@ RSpec.describe 'Dashboard Issues', :js, feature_category: :team_planning do
|
|||
project: project
|
||||
end
|
||||
|
||||
it 'passes axe automated accessibility testing' do
|
||||
it 'passes axe automated accessibility testing',
|
||||
quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/468892' do
|
||||
expect(page).to be_axe_clean.within('#content-body')
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ RSpec.describe EventsFinder do
|
|||
let!(:closed_issue_event2) { create(:event, :closed, project: project1, author: user, target: closed_issue, created_at: Date.new(2016, 2, 2)) }
|
||||
let!(:opened_merge_request_event2) { create(:event, :created, project: project2, author: user, target: opened_merge_request, created_at: Date.new(2017, 2, 2)) }
|
||||
let(:opened_merge_request3) { create(:merge_request, source_project: project1, author: other_user) }
|
||||
let!(:other_developer_event) { create(:event, :created, project: project1, author: other_user, target: opened_merge_request3 ) }
|
||||
let!(:other_developer_event) { create(:event, :created, project: project1, author: other_user, target: opened_merge_request3) }
|
||||
|
||||
let_it_be(:public_project) { create(:project, :public, creator_id: user.id, namespace: user.namespace) }
|
||||
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ RSpec.describe LabelsFinder, feature_category: :team_planning do
|
|||
|
||||
context 'filtering by project_id' do
|
||||
context 'when include_ancestor_groups is true' do
|
||||
let!(:sub_project) { create(:project, namespace: private_subgroup_1 ) }
|
||||
let!(:sub_project) { create(:project, namespace: private_subgroup_1) }
|
||||
let!(:project_label) { create(:label, project: sub_project, title: 'Label 5') }
|
||||
let(:finder) { described_class.new(user, project_id: sub_project.id, include_ancestor_groups: true) }
|
||||
|
||||
|
|
|
|||
|
|
@ -219,9 +219,9 @@ describe('graph component', () => {
|
|||
const jobClasses = [
|
||||
'gl-p-3',
|
||||
'gl-border-0',
|
||||
'gl-rounded-base',
|
||||
'gl-hover-bg-gray-50',
|
||||
'gl-focus-bg-gray-50',
|
||||
'gl-rounded',
|
||||
'hover:gl-bg-strong',
|
||||
'focus:gl-bg-strong',
|
||||
'gl-hover-text-gray-900',
|
||||
'gl-focus-text-gray-900',
|
||||
];
|
||||
|
|
|
|||
|
|
@ -2,25 +2,21 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Resolvers::ProjectPipelineStatisticsResolver do
|
||||
RSpec.describe Resolvers::Ci::ProjectPipelineAnalyticsResolver, feature_category: :fleet_visibility do
|
||||
include GraphqlHelpers
|
||||
|
||||
let_it_be(:public_project) { create(:project, :public) }
|
||||
let_it_be(:project) { create(:project, :private) }
|
||||
let_it_be(:guest) { create(:user) }
|
||||
let_it_be(:reporter) { create(:user) }
|
||||
let_it_be(:guest) { create(:user, guest_of: [project, public_project]) }
|
||||
let_it_be(:reporter) { create(:user, reporter_of: [project, public_project]) }
|
||||
|
||||
let(:current_user) { reporter }
|
||||
|
||||
before do
|
||||
project.add_guest(guest)
|
||||
project.add_reporter(reporter)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect(described_class).to have_nullable_graphql_type(::Types::Ci::AnalyticsType)
|
||||
end
|
||||
|
||||
shared_examples 'returns the pipelines statistics for a given project' do
|
||||
shared_examples 'returns the pipeline analytics for a given project' do
|
||||
it do
|
||||
result = resolve_statistics(project, {})
|
||||
expect(result.keys).to contain_exactly(
|
||||
|
|
@ -53,7 +49,7 @@ RSpec.describe Resolvers::ProjectPipelineStatisticsResolver do
|
|||
end
|
||||
|
||||
describe '#resolve' do
|
||||
it_behaves_like 'returns the pipelines statistics for a given project'
|
||||
it_behaves_like 'returns the pipeline analytics for a given project'
|
||||
|
||||
context 'when the user does not have access to the CI/CD analytics data' do
|
||||
let(:current_user) { guest }
|
||||
|
|
@ -62,41 +58,41 @@ RSpec.describe Resolvers::ProjectPipelineStatisticsResolver do
|
|||
end
|
||||
|
||||
context 'when the project is public' do
|
||||
let_it_be(:project) { create(:project, :public) }
|
||||
let(:project) { public_project }
|
||||
|
||||
context 'public pipelines are disabled' do
|
||||
context 'when public pipelines are disabled' do
|
||||
before do
|
||||
project.update!(public_builds: false)
|
||||
end
|
||||
|
||||
context 'user is not a member' do
|
||||
context 'when user is not a member' do
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
it_behaves_like 'it returns nils'
|
||||
end
|
||||
|
||||
context 'user is a guest' do
|
||||
context 'when user is a guest' do
|
||||
let(:current_user) { guest }
|
||||
|
||||
it_behaves_like 'it returns nils'
|
||||
end
|
||||
|
||||
context 'user is a reporter or above' do
|
||||
context 'when user is a reporter or above' do
|
||||
let(:current_user) { reporter }
|
||||
|
||||
it_behaves_like 'returns the pipelines statistics for a given project'
|
||||
it_behaves_like 'returns the pipeline analytics for a given project'
|
||||
end
|
||||
end
|
||||
|
||||
context 'public pipelines are enabled' do
|
||||
context 'when public pipelines are enabled' do
|
||||
before do
|
||||
project.update!(public_builds: true)
|
||||
end
|
||||
|
||||
context 'user is not a member' do
|
||||
context 'when user is not a member' do
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
it_behaves_like 'returns the pipelines statistics for a given project'
|
||||
it_behaves_like 'returns the pipeline analytics for a given project'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -5,8 +5,6 @@ require 'spec_helper'
|
|||
RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver, feature_category: :continuous_integration do
|
||||
include GraphqlHelpers
|
||||
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
let_it_be(:project) { create(:project, :private) }
|
||||
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
||||
let_it_be(:failed_pipeline) { create(:ci_pipeline, :failed, project: project) }
|
||||
|
|
@ -15,9 +13,7 @@ RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver, feature_category: :
|
|||
let_it_be(:sha_pipeline) { create(:ci_pipeline, :running, project: project, sha: 'deadbeef') }
|
||||
let_it_be(:on_demand_dast_scan) { create(:ci_pipeline, :success, project: project, source: 'ondemand_dast_scan') }
|
||||
|
||||
before do
|
||||
project.add_developer(current_user)
|
||||
end
|
||||
let(:current_user) { create(:user, developer_of: project) }
|
||||
|
||||
describe '#resolve' do
|
||||
it 'counts pipelines' do
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Resolvers::ProjectPipelineResolver do
|
||||
RSpec.describe Resolvers::Ci::ProjectPipelineResolver, feature_category: :continuous_integration do
|
||||
include GraphqlHelpers
|
||||
|
||||
let_it_be(:project) { create(:project) }
|
||||
|
|
@ -10,11 +10,7 @@ RSpec.describe Resolvers::ProjectPipelineResolver do
|
|||
let_it_be(:other_project_pipeline) { create(:ci_pipeline, project: project, iid: '1235', sha: 'sha2') }
|
||||
let_it_be(:other_pipeline) { create(:ci_pipeline) }
|
||||
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
before do
|
||||
project.add_developer(current_user)
|
||||
end
|
||||
let(:current_user) { create(:user, developer_of: project) }
|
||||
|
||||
specify do
|
||||
expect(described_class).to have_nullable_graphql_type(::Types::Ci::PipelineType)
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Resolvers::ProjectPipelineSchedulesResolver do
|
||||
RSpec.describe Resolvers::Ci::ProjectPipelineSchedulesResolver, feature_category: :continuous_integration do
|
||||
include GraphqlHelpers
|
||||
|
||||
let_it_be(:developer) { create(:user) }
|
||||
|
|
@ -2,19 +2,17 @@
|
|||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Resolvers::ProjectPipelinesResolver do
|
||||
RSpec.describe Resolvers::Ci::ProjectPipelinesResolver, feature_category: :continuous_integration do
|
||||
include GraphqlHelpers
|
||||
|
||||
let_it_be(:project) { create(:project) }
|
||||
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
||||
let_it_be(:other_pipeline) { create(:ci_pipeline) }
|
||||
let_it_be(:developer) { create(:user, developer_of: project) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
context 'when the user does have access' do
|
||||
before do
|
||||
project.add_developer(current_user)
|
||||
end
|
||||
context 'when the user has access' do
|
||||
let(:current_user) { developer }
|
||||
|
||||
it 'resolves only MRs for the passed merge request' do
|
||||
expect(resolve_pipelines).to contain_exactly(pipeline)
|
||||
|
|
@ -22,6 +20,8 @@ RSpec.describe Resolvers::ProjectPipelinesResolver do
|
|||
end
|
||||
|
||||
context 'when the user does not have access' do
|
||||
let(:current_user) { user }
|
||||
|
||||
it 'does not return pipeline data' do
|
||||
expect(resolve_pipelines).to be_empty
|
||||
end
|
||||
|
|
@ -13,18 +13,15 @@ RSpec.describe Resolvers::ProjectJobsResolver, feature_category: :continuous_int
|
|||
let_it_be(:successful_build_two) { create(:ci_build, :with_build_name, :success, name: 'Build Two', pipeline: pipeline) }
|
||||
let_it_be(:failed_build) { create(:ci_build, :failed, :with_build_name, name: 'Build Three', pipeline: pipeline) }
|
||||
let_it_be(:pending_build) { create(:ci_build, :pending, :with_build_name, name: 'Build Three', pipeline: pipeline) }
|
||||
let_it_be(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) }
|
||||
|
||||
let(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) }
|
||||
describe '#resolve' do
|
||||
let(:args) { {} }
|
||||
let(:current_user) { create(:user) }
|
||||
|
||||
subject { resolve_jobs(args) }
|
||||
|
||||
describe '#resolve' do
|
||||
context 'with authorized user' do
|
||||
before do
|
||||
project.add_developer(current_user)
|
||||
end
|
||||
let_it_be(:current_user) { create(:user, developer_of: project) }
|
||||
|
||||
context 'with statuses argument' do
|
||||
let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } }
|
||||
|
|
|
|||
|
|
@ -513,7 +513,7 @@ RSpec.describe GitlabSchema.types['Project'], feature_category: :groups_and_proj
|
|||
subject { described_class.fields['pipelineAnalytics'] }
|
||||
|
||||
it { is_expected.to have_graphql_type(Types::Ci::AnalyticsType) }
|
||||
it { is_expected.to have_graphql_resolver(Resolvers::ProjectPipelineStatisticsResolver) }
|
||||
it { is_expected.to have_graphql_resolver(Resolvers::Ci::ProjectPipelineAnalyticsResolver) }
|
||||
end
|
||||
|
||||
describe 'jobs field' do
|
||||
|
|
|
|||
|
|
@ -871,7 +871,7 @@ RSpec.describe ApplicationHelper do
|
|||
|
||||
describe 'stylesheet_link_tag_defer' do
|
||||
it 'uses media="all" in stylesheet' do
|
||||
expect(helper.stylesheet_link_tag_defer('test')).to eq( '<link rel="stylesheet" href="/stylesheets/test.css" media="all" />')
|
||||
expect(helper.stylesheet_link_tag_defer('test')).to eq('<link rel="stylesheet" href="/stylesheets/test.css" media="all" />')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ RSpec.describe BadgesHelper do
|
|||
end
|
||||
|
||||
it 'adds custom classes' do
|
||||
expect(helper.gl_badge_tag(label, nil, class: "test-class" )).to match(%r{class=".*test-class.*"})
|
||||
expect(helper.gl_badge_tag(label, nil, class: "test-class")).to match(%r{class=".*test-class.*"})
|
||||
end
|
||||
|
||||
describe 'variants' do
|
||||
|
|
|
|||
|
|
@ -5,16 +5,16 @@ require 'spec_helper'
|
|||
RSpec.describe DevOpsReportHelper do
|
||||
subject { DevOpsReport::MetricPresenter.new(metric) }
|
||||
|
||||
let(:metric) { build(:dev_ops_report_metric, created_at: DateTime.new(2021, 4, 3, 2, 1, 0) ) }
|
||||
let(:metric) { build(:dev_ops_report_metric, created_at: DateTime.new(2021, 4, 3, 2, 1, 0)) }
|
||||
|
||||
describe '#devops_score_metrics' do
|
||||
let(:devops_score_metrics) { helper.devops_score_metrics(subject) }
|
||||
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status-alert", label: "Moderate", variant: "warning" }, value: "55.9" } ) }
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status-alert", label: "Moderate", variant: "warning" }, value: "55.9" }) }
|
||||
|
||||
it { expect(devops_score_metrics[:cards].first).to eq({ leadInstance: "9.3", score: "13.3", scoreLevel: { label: "Low", variant: "muted" }, title: "Issues created per active user", usage: "1.2" } ) }
|
||||
it { expect(devops_score_metrics[:cards].second).to eq({ leadInstance: "30.3", score: "92.7", scoreLevel: { label: "High", variant: "success" }, title: "Comments created per active user", usage: "28.1" } ) }
|
||||
it { expect(devops_score_metrics[:cards].fourth).to eq({ leadInstance: "5.2", score: "62.4", scoreLevel: { label: "Moderate", variant: "neutral" }, title: "Boards created per active user", usage: "3.3" } ) }
|
||||
it { expect(devops_score_metrics[:cards].first).to eq({ leadInstance: "9.3", score: "13.3", scoreLevel: { label: "Low", variant: "muted" }, title: "Issues created per active user", usage: "1.2" }) }
|
||||
it { expect(devops_score_metrics[:cards].second).to eq({ leadInstance: "30.3", score: "92.7", scoreLevel: { label: "High", variant: "success" }, title: "Comments created per active user", usage: "28.1" }) }
|
||||
it { expect(devops_score_metrics[:cards].fourth).to eq({ leadInstance: "5.2", score: "62.4", scoreLevel: { label: "Moderate", variant: "neutral" }, title: "Boards created per active user", usage: "3.3" }) }
|
||||
|
||||
it { expect(devops_score_metrics[:createdAt]).to eq("2021-04-03 02:01") }
|
||||
|
||||
|
|
@ -22,14 +22,14 @@ RSpec.describe DevOpsReportHelper do
|
|||
let(:low_metric) { double(average_percentage_score: 2, cards: subject.cards, created_at: subject.created_at) }
|
||||
let(:devops_score_metrics) { helper.devops_score_metrics(low_metric) }
|
||||
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status-failed", label: "Low", variant: "danger" }, value: "2.0" } ) }
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status-failed", label: "Low", variant: "danger" }, value: "2.0" }) }
|
||||
end
|
||||
|
||||
describe 'with high average score' do
|
||||
let(:high_metric) { double(average_percentage_score: 82, cards: subject.cards, created_at: subject.created_at) }
|
||||
let(:devops_score_metrics) { helper.devops_score_metrics(high_metric) }
|
||||
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status_success_solid", label: "High", variant: "success" }, value: "82.0" } ) }
|
||||
it { expect(devops_score_metrics[:averageScore]).to eq({ scoreLevel: { icon: "status_success_solid", label: "High", variant: "success" }, value: "82.0" }) }
|
||||
end
|
||||
|
||||
describe 'with blank metrics' do
|
||||
|
|
|
|||
|
|
@ -11,19 +11,19 @@ RSpec.describe GitHelper do
|
|||
|
||||
describe '#strip_signature' do
|
||||
context 'strips PGP SIGNATURE' do
|
||||
let(:strip_signature) { helper.strip_signature( pgp_signature_tag ) }
|
||||
let(:strip_signature) { helper.strip_signature(pgp_signature_tag) }
|
||||
|
||||
it { expect(strip_signature).to eq("Version 1.69.0\n\n") }
|
||||
end
|
||||
|
||||
context 'strips PGP MESSAGE' do
|
||||
let(:strip_signature) { helper.strip_signature( pgp_message_tag ) }
|
||||
let(:strip_signature) { helper.strip_signature(pgp_message_tag) }
|
||||
|
||||
it { expect(strip_signature).to eq("Version 1.69.0\n\n") }
|
||||
end
|
||||
|
||||
context 'strips SIGNED MESSAGE' do
|
||||
let(:strip_signature) { helper.strip_signature( x509_message_tag ) }
|
||||
let(:strip_signature) { helper.strip_signature(x509_message_tag) }
|
||||
|
||||
it { expect(strip_signature).to eq("this is Roger's signed tag\n\n") }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -365,7 +365,7 @@ RSpec.describe GitlabRoutingHelper do
|
|||
context 'GraphQL ETag paths' do
|
||||
context 'with pipelines' do
|
||||
let(:sha) { 'b08774cb1a11ecdc27a82c5f444a69ea7e038ede' }
|
||||
let(:pipeline) { double(id: 5 ) }
|
||||
let(:pipeline) { double(id: 5) }
|
||||
|
||||
it 'returns an ETag path for a pipeline sha' do
|
||||
expect(graphql_etag_pipeline_sha_path(sha)).to eq('/api/graphql:pipelines/sha/b08774cb1a11ecdc27a82c5f444a69ea7e038ede')
|
||||
|
|
|
|||
|
|
@ -43,12 +43,12 @@ RSpec.describe GitlabScriptTagHelper do
|
|||
end
|
||||
|
||||
it 'returns a script tag with a nonce using argument syntax with options' do
|
||||
expect(helper.javascript_tag( 'alert(1)', type: 'application/javascript').to_s).to eq tag_with_nonce_and_type
|
||||
expect(helper.javascript_tag('alert(1)', type: 'application/javascript').to_s).to eq tag_with_nonce_and_type
|
||||
end
|
||||
|
||||
# This scenario does not really make sense, but it's supported so we test it
|
||||
it 'returns a script tag with a nonce using argument and block syntax with options' do
|
||||
expect(helper.javascript_tag( '// ignored', type: 'application/javascript') { 'alert(1)' }.to_s).to eq tag_with_nonce_and_type
|
||||
expect(helper.javascript_tag('// ignored', type: 'application/javascript') { 'alert(1)' }.to_s).to eq tag_with_nonce_and_type
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ RSpec.describe TabHelper do
|
|||
end
|
||||
|
||||
it 'adds custom class' do
|
||||
expect(helper.gl_tabs_nav(class: 'my-class' )).to match(/class=".*my-class.*"/)
|
||||
expect(helper.gl_tabs_nav(class: 'my-class')).to match(/class=".*my-class.*"/)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ RSpec.describe 'CarrierWave::Storage::Fog::File', feature_category: :shared do
|
|||
let(:storage) { CarrierWave::Storage::Fog.new(uploader) }
|
||||
let(:bucket_name) { 'some-bucket' }
|
||||
let(:connection) { ::Fog::Storage.new(connection_options) }
|
||||
let(:bucket) { connection.directories.new(key: bucket_name ) }
|
||||
let(:bucket) { connection.directories.new(key: bucket_name) }
|
||||
let(:test_filename) { 'test' }
|
||||
let(:test_data) { File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) }
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ require 'spec_helper'
|
|||
|
||||
RSpec.describe ::API::Entities::Snippet, feature_category: :source_code_management do
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:personal_snippet) { create(:personal_snippet, :repository, author: user ) }
|
||||
let_it_be(:personal_snippet) { create(:personal_snippet, :repository, author: user) }
|
||||
let_it_be(:project_snippet) { create(:project_snippet, :repository, author: user) }
|
||||
|
||||
let(:entity) { described_class.new(snippet) }
|
||||
|
|
|
|||
|
|
@ -1194,6 +1194,18 @@ RSpec.describe API::Files, feature_category: :source_code_management do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when base64 encoding with a nil content' do
|
||||
let(:params) { super().merge(content: nil, encoding: 'base64') }
|
||||
|
||||
it 'updates a file with an empty content' do
|
||||
put api(route(file_path), user), params: params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
updated_blob = project.repository.blob_at('master', CGI.unescape(file_path))
|
||||
expect(updated_blob.data).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
context 'when updating an existing file with stale last commit id' do
|
||||
let(:params_with_stale_id) { params.merge(last_commit_id: last_commit_for_path.parent_id) }
|
||||
|
||||
|
|
|
|||
|
|
@ -4227,7 +4227,10 @@
|
|||
- './spec/graphql/resolvers/ci/group_runners_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/jobs_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/project_pipeline_analytics_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/project_pipeline_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/project_pipelines_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb'
|
||||
|
|
@ -4292,9 +4295,6 @@
|
|||
- './spec/graphql/resolvers/project_merge_requests_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_milestones_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_packages_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_pipeline_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_pipelines_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/project_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/projects/fork_targets_resolver_spec.rb'
|
||||
- './spec/graphql/resolvers/projects/grafana_integration_resolver_spec.rb'
|
||||
|
|
|
|||
Loading…
Reference in New Issue