Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
975eac4992
commit
e7b6cfeafe
150 changed files with 671 additions and 1314 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,6 +3,7 @@
|
|||
*.mo
|
||||
*.edit.po
|
||||
*.rej
|
||||
.dir-locals.el
|
||||
.DS_Store
|
||||
.bundle
|
||||
.chef
|
||||
|
|
|
@ -38,6 +38,8 @@ Are there any other stages or teams involved that need to be kept in the loop?
|
|||
<!-- If applicable, any groups/projects that are happy to have this feature turned on early. Some organizations may wish to test big changes they are interested in with a small subset of users ahead of time for example. -->
|
||||
|
||||
- `gitlab-org/gitlab` project
|
||||
- `gitlab-org/gitlab-foss` project
|
||||
- `gitlab-com/www-gitlab-com` project
|
||||
- `gitlab-org`/`gitlab-com` groups
|
||||
- ...
|
||||
|
||||
|
@ -79,19 +81,24 @@ Are there any other stages or teams involved that need to be kept in the loop?
|
|||
- [ ] Ensure that documentation has been updated ([More info](https://docs.gitlab.com/ee/development/documentation/feature_flags.html#features-that-became-enabled-by-default)).
|
||||
- [ ] Announce on [the feature issue](ISSUE LINK) an estimated time this will be enabled on GitLab.com.
|
||||
- [ ] If the feature might impact the user experience, notify `#support_gitlab-com` and your team channel ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)).
|
||||
- [ ] If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), enable it on GitLab.com for [testing groups/projects](#testing-groupsprojectsusers).
|
||||
- [ ] `/chatops run feature set --<actor-type>=<actor> <feature-flag-name> true`
|
||||
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
|
||||
|
||||
### Global rollout on production
|
||||
|
||||
All `/chatops` commands that target production should be done in the `#production` slack channel for visibility.
|
||||
|
||||
- [ ] Confirm the feature flag is enabled on `staging` without incident
|
||||
- [ ] Roll out the feature to targeted testing projects/groups first
|
||||
- [ ] `/chatops run feature set --project=gitlab-org/gitlab <feature-flag-name> true`
|
||||
- [ ] `/chatops run feature set --project=gitlab-org/gitlab-foss <feature-flag-name> true`
|
||||
- [ ] `/chatops run feature set --project=gitlab-com/www-gitlab-com <feature-flag-name> true`
|
||||
|
||||
- [ ] [Incrementally roll out](https://docs.gitlab.com/ee/development/feature_flags/controls.html#process) the feature.
|
||||
- If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform **actor-based** rollout.
|
||||
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage> --actors`
|
||||
- If the feature flag in code does **NOT** have [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform time-based rollout (**random** rollout).
|
||||
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage>`
|
||||
- Enable the feature globally on production environment.
|
||||
- [ ] `/chatops run feature set <feature-flag-name> true`
|
||||
- [ ] Verify the change has the desired outcome with the limited rollout before enabling the feature globally on production.
|
||||
- [ ] Enable the feature globally on production environment. `/chatops run feature set <feature-flag-name> true`
|
||||
- [ ] Announce on [the feature issue](ISSUE LINK) that the feature has been globally enabled.
|
||||
- [ ] Wait for [at least one day for the verification term](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release).
|
||||
|
||||
|
|
|
@ -23,30 +23,6 @@ Graphql/Descriptions:
|
|||
- 'ee/app/graphql/types/vulnerability_severity_enum.rb'
|
||||
- 'ee/app/graphql/types/vulnerability_state_enum.rb'
|
||||
- 'ee/app/graphql/types/vulnerability_confidence_enum.rb'
|
||||
- 'app/graphql/types/design_management/design_at_version_type.rb'
|
||||
- 'app/graphql/types/design_management/design_fields.rb'
|
||||
- 'app/graphql/types/diff_paths_input_type.rb'
|
||||
- 'app/graphql/types/environment_type.rb'
|
||||
- 'app/graphql/types/eventable_type.rb'
|
||||
- 'app/graphql/types/group_type.rb'
|
||||
- 'app/graphql/types/merge_request_type.rb'
|
||||
- 'app/graphql/types/metadata/kas_type.rb'
|
||||
- 'app/graphql/types/milestone_wildcard_id_enum.rb'
|
||||
- 'app/graphql/types/namespace_type.rb'
|
||||
- 'app/graphql/types/notes/note_type.rb'
|
||||
- 'app/graphql/types/notes/position_type_enum.rb'
|
||||
- 'app/graphql/types/packages/composer/json_type.rb'
|
||||
- 'app/graphql/types/packages/package_details_type.rb'
|
||||
- 'app/graphql/types/packages/package_file_type.rb'
|
||||
- 'app/graphql/types/packages/package_tag_type.rb'
|
||||
- 'app/graphql/types/packages/package_type.rb'
|
||||
- 'app/graphql/types/project_type.rb'
|
||||
- 'app/graphql/types/prometheus_alert_type.rb'
|
||||
- 'app/graphql/types/query_type.rb'
|
||||
- 'app/graphql/types/range_input_type.rb'
|
||||
- 'app/graphql/types/release_asset_link_shared_input_arguments.rb'
|
||||
- 'app/graphql/types/release_assets_input_type.rb'
|
||||
- 'app/graphql/types/release_type.rb'
|
||||
- 'app/graphql/types/repository/blob_type.rb'
|
||||
- 'app/graphql/types/root_storage_statistics_type.rb'
|
||||
- 'app/graphql/types/snippet_type.rb'
|
||||
|
|
4
Gemfile
4
Gemfile
|
@ -310,7 +310,7 @@ gem 'pg_query', '~> 2.1'
|
|||
gem 'premailer-rails', '~> 1.10.3'
|
||||
|
||||
# LabKit: Tracing and Correlation
|
||||
gem 'gitlab-labkit', '~> 0.21.0'
|
||||
gem 'gitlab-labkit', '~> 0.21.1'
|
||||
# Thrift is a dependency of gitlab-labkit, we want a version higher than 0.14.0
|
||||
# because of https://gitlab.com/gitlab-org/gitlab/-/issues/321900
|
||||
gem 'thrift', '>= 0.14.0'
|
||||
|
@ -479,7 +479,7 @@ gem 'gitaly', '~> 14.2.0.pre.rc2'
|
|||
# KAS GRPC protocol definitions
|
||||
gem 'kas-grpc', '~> 0.0.2'
|
||||
|
||||
gem 'grpc', '~> 1.38.0'
|
||||
gem 'grpc', '~> 1.30.2'
|
||||
|
||||
gem 'google-protobuf', '~> 3.17.1'
|
||||
|
||||
|
|
12
Gemfile.lock
12
Gemfile.lock
|
@ -475,10 +475,10 @@ GEM
|
|||
fog-json (~> 1.2.0)
|
||||
mime-types
|
||||
ms_rest_azure (~> 0.12.0)
|
||||
gitlab-labkit (0.21.0)
|
||||
gitlab-labkit (0.21.1)
|
||||
actionpack (>= 5.0.0, < 7.0.0)
|
||||
activesupport (>= 5.0.0, < 7.0.0)
|
||||
grpc (~> 1.38)
|
||||
grpc (~> 1.30.2)
|
||||
jaeger-client (~> 1.1)
|
||||
opentracing (~> 0.4)
|
||||
pg_query (~> 2.1)
|
||||
|
@ -573,8 +573,8 @@ GEM
|
|||
graphql (~> 1.6)
|
||||
html-pipeline (~> 2.8)
|
||||
sass (~> 3.4)
|
||||
grpc (1.38.0)
|
||||
google-protobuf (~> 3.15)
|
||||
grpc (1.30.2)
|
||||
google-protobuf (~> 3.12)
|
||||
googleapis-common-protos-types (~> 1.0)
|
||||
gssapi (1.2.0)
|
||||
ffi (>= 1.0.1)
|
||||
|
@ -1477,7 +1477,7 @@ DEPENDENCIES
|
|||
gitlab-dangerfiles (~> 2.3.0)
|
||||
gitlab-experiment (~> 0.6.4)
|
||||
gitlab-fog-azure-rm (~> 1.1.1)
|
||||
gitlab-labkit (~> 0.21.0)
|
||||
gitlab-labkit (~> 0.21.1)
|
||||
gitlab-license (~> 2.0)
|
||||
gitlab-mail_room (~> 0.0.9)
|
||||
gitlab-markup (~> 1.7.1)
|
||||
|
@ -1499,7 +1499,7 @@ DEPENDENCIES
|
|||
graphlient (~> 0.4.0)
|
||||
graphql (~> 1.11.8)
|
||||
graphql-docs (~> 1.6.0)
|
||||
grpc (~> 1.38.0)
|
||||
grpc (~> 1.30.2)
|
||||
gssapi
|
||||
guard-rspec
|
||||
haml_lint (~> 0.36.0)
|
||||
|
|
|
@ -315,9 +315,9 @@ fieldset:disabled a.btn {
|
|||
-moz-appearance: none;
|
||||
}
|
||||
.gl-form-input:disabled,
|
||||
.gl-form-input:not(.form-control-plaintext):read-only,
|
||||
.gl-form-input:not(.form-control-plaintext):not([type="color"]):read-only,
|
||||
.gl-form-input.form-control:disabled,
|
||||
.gl-form-input.form-control:not(.form-control-plaintext):read-only {
|
||||
.gl-form-input.form-control:not(.form-control-plaintext):not([type="color"]):read-only {
|
||||
background-color: #fafafa;
|
||||
color: #868686;
|
||||
box-shadow: inset 0 0 0 1px #dbdbdb;
|
||||
|
|
|
@ -18,12 +18,12 @@ module Types
|
|||
field :version,
|
||||
Types::DesignManagement::VersionType,
|
||||
null: false,
|
||||
description: 'The version this design-at-versions is pinned to.'
|
||||
description: 'Version this design-at-versions is pinned to.'
|
||||
|
||||
field :design,
|
||||
Types::DesignManagement::DesignType,
|
||||
null: false,
|
||||
description: 'The underlying design.'
|
||||
description: 'Underlying design.'
|
||||
|
||||
def cached_stateful_version(_parent)
|
||||
version
|
||||
|
|
|
@ -7,12 +7,12 @@ module Types
|
|||
|
||||
field_class Types::BaseField
|
||||
|
||||
field :id, GraphQL::Types::ID, description: 'The ID of this design.', null: false
|
||||
field :project, Types::ProjectType, null: false, description: 'The project the design belongs to.'
|
||||
field :issue, Types::IssueType, null: false, description: 'The issue the design belongs to.'
|
||||
field :filename, GraphQL::Types::String, null: false, description: 'The filename of the design.'
|
||||
field :full_path, GraphQL::Types::String, null: false, description: 'The full path to the design file.'
|
||||
field :image, GraphQL::Types::String, null: false, extras: [:parent], description: 'The URL of the full-sized image.'
|
||||
field :id, GraphQL::Types::ID, description: 'ID of this design.', null: false
|
||||
field :project, Types::ProjectType, null: false, description: 'Project the design belongs to.'
|
||||
field :issue, Types::IssueType, null: false, description: 'Issue the design belongs to.'
|
||||
field :filename, GraphQL::Types::String, null: false, description: 'Filename of the design.'
|
||||
field :full_path, GraphQL::Types::String, null: false, description: 'Full path to the design file.'
|
||||
field :image, GraphQL::Types::String, null: false, extras: [:parent], description: 'URL of the full-sized image.'
|
||||
field :image_v432x230, GraphQL::Types::String, null: true, extras: [:parent],
|
||||
description: 'The URL of the design resized to fit within the bounds of 432x230. ' \
|
||||
'This will be `null` if the image has not been generated'
|
||||
|
@ -20,7 +20,7 @@ module Types
|
|||
null: false,
|
||||
calls_gitaly: true,
|
||||
extras: [:parent],
|
||||
description: 'The diff refs for this design.'
|
||||
description: 'Diff refs for this design.'
|
||||
field :event, Types::DesignManagement::DesignVersionEventEnum,
|
||||
null: false,
|
||||
extras: [:parent],
|
||||
|
@ -29,7 +29,7 @@ module Types
|
|||
GraphQL::Types::Int,
|
||||
null: false,
|
||||
method: :user_notes_count,
|
||||
description: 'The total count of user-created notes for this design.'
|
||||
description: 'Total count of user-created notes for this design.'
|
||||
|
||||
def diff_refs(parent:)
|
||||
version = cached_stateful_version(parent)
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
module Types
|
||||
class DiffPathsInputType < BaseInputObject
|
||||
argument :old_path, GraphQL::Types::String, required: false,
|
||||
description: 'The path of the file on the start sha.'
|
||||
description: 'Path of the file on the start SHA.'
|
||||
argument :new_path, GraphQL::Types::String, required: false,
|
||||
description: 'The path of the file on the head sha.'
|
||||
description: 'Path of the file on the HEAD SHA.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,7 +19,7 @@ module Types
|
|||
description: 'State of the environment, for example: available/stopped.'
|
||||
|
||||
field :path, GraphQL::Types::String, null: false,
|
||||
description: 'The path to the environment.'
|
||||
description: 'Path to the environment.'
|
||||
|
||||
field :metrics_dashboard, Types::Metrics::DashboardType, null: true,
|
||||
description: 'Metrics dashboard schema for the environment.',
|
||||
|
@ -28,6 +28,6 @@ module Types
|
|||
field :latest_opened_most_severe_alert,
|
||||
Types::AlertManagement::AlertType,
|
||||
null: true,
|
||||
description: 'The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.'
|
||||
description: 'Most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,6 +4,6 @@ module Types
|
|||
module EventableType
|
||||
include Types::BaseInterface
|
||||
|
||||
field :events, Types::EventType.connection_type, null: true, description: 'A list of events associated with the object.'
|
||||
field :events, Types::EventType.connection_type, null: true, description: 'List of events associated with the object.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -33,12 +33,12 @@ module Types
|
|||
type: GraphQL::Types::String,
|
||||
null: true,
|
||||
method: :project_creation_level_str,
|
||||
description: 'The permission level required to create projects in the group.'
|
||||
description: 'Permission level required to create projects in the group.'
|
||||
field :subgroup_creation_level,
|
||||
type: GraphQL::Types::String,
|
||||
null: true,
|
||||
method: :subgroup_creation_level_str,
|
||||
description: 'The permission level required to create subgroups within the group.'
|
||||
description: 'Permission level required to create subgroups within the group.'
|
||||
|
||||
field :require_two_factor_authentication,
|
||||
type: GraphQL::Types::Boolean,
|
||||
|
@ -101,7 +101,7 @@ module Types
|
|||
field :label,
|
||||
Types::LabelType,
|
||||
null: true,
|
||||
description: 'A label available on this group.' do
|
||||
description: 'Label available on this group.' do
|
||||
argument :title,
|
||||
type: GraphQL::Types::String,
|
||||
required: true,
|
||||
|
|
|
@ -64,7 +64,7 @@ module Types
|
|||
description: 'Diff head SHA of the merge request.'
|
||||
field :diff_stats, [Types::DiffStatsType], null: true, calls_gitaly: true,
|
||||
description: 'Details about which files were changed in this merge request.' do
|
||||
argument :path, GraphQL::Types::String, required: false, description: 'A specific file-path.'
|
||||
argument :path, GraphQL::Types::String, required: false, description: 'Specific file path.'
|
||||
end
|
||||
|
||||
field :diff_stats_summary, Types::DiffStatsSummaryType, null: true, calls_gitaly: true,
|
||||
|
@ -129,14 +129,14 @@ module Types
|
|||
description: 'Number of downvotes for the merge request.'
|
||||
|
||||
field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline,
|
||||
description: 'The pipeline running on the branch HEAD of the merge request.'
|
||||
description: 'Pipeline running on the branch HEAD of the merge request.'
|
||||
field :pipelines,
|
||||
null: true,
|
||||
description: 'Pipelines for the merge request. Note: for performance reasons, no more than the most recent 500 pipelines will be returned.',
|
||||
resolver: Resolvers::MergeRequestPipelinesResolver
|
||||
|
||||
field :milestone, Types::MilestoneType, null: true,
|
||||
description: 'The milestone of the merge request.'
|
||||
description: 'Milestone of the merge request.'
|
||||
field :assignees,
|
||||
type: Types::MergeRequests::AssigneeType.connection_type,
|
||||
null: true,
|
||||
|
|
|
@ -12,7 +12,7 @@ module Types
|
|||
field :version, GraphQL::Types::String, null: true,
|
||||
description: 'KAS version.'
|
||||
field :external_url, GraphQL::Types::String, null: true,
|
||||
description: 'The URL used by the Agents to communicate with KAS.'
|
||||
description: 'URL used by the Agents to communicate with KAS.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -6,7 +6,7 @@ module Types
|
|||
description 'Milestone ID wildcard values'
|
||||
|
||||
value 'NONE', 'No milestone is assigned.'
|
||||
value 'ANY', 'A milestone is assigned.'
|
||||
value 'ANY', 'Milestone is assigned.'
|
||||
value 'STARTED', 'An open, started milestone (start date <= today).'
|
||||
value 'UPCOMING', 'An open milestone due in the future (due date >= today).'
|
||||
end
|
||||
|
|
|
@ -40,7 +40,7 @@ module Types
|
|||
field :package_settings,
|
||||
Types::Namespace::PackageSettingsType,
|
||||
null: true,
|
||||
description: 'The package settings for the namespace.'
|
||||
description: 'Package settings for the namespace.'
|
||||
|
||||
field :shared_runners_setting,
|
||||
Types::Namespace::SharedRunnersSettingEnum,
|
||||
|
|
|
@ -40,9 +40,9 @@ module Types
|
|||
field :updated_at, Types::TimeType, null: false,
|
||||
description: "Timestamp of the note's last activity."
|
||||
field :discussion, Types::Notes::DiscussionType, null: true,
|
||||
description: 'The discussion this note is a part of.'
|
||||
description: 'Discussion this note is a part of.'
|
||||
field :position, Types::Notes::DiffPositionType, null: true,
|
||||
description: 'The position of this note on a diff.'
|
||||
description: 'Position of this note on a diff.'
|
||||
field :confidential, GraphQL::Types::Boolean, null: true,
|
||||
description: 'Indicates if this note is confidential.',
|
||||
method: :confidential?
|
||||
|
|
|
@ -6,7 +6,7 @@ module Types
|
|||
graphql_name 'DiffPositionType'
|
||||
description 'Type of file the position refers to'
|
||||
|
||||
value 'text', description: "A text file."
|
||||
value 'text', description: "Text file."
|
||||
value 'image', description: "An image."
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,10 +8,10 @@ module Types
|
|||
graphql_name 'PackageComposerJsonType'
|
||||
description 'Represents a composer JSON file'
|
||||
|
||||
field :name, GraphQL::Types::String, null: true, description: 'The name set in the Composer JSON file.'
|
||||
field :type, GraphQL::Types::String, null: true, description: 'The type set in the Composer JSON file.'
|
||||
field :license, GraphQL::Types::String, null: true, description: 'The license set in the Composer JSON file.'
|
||||
field :version, GraphQL::Types::String, null: true, description: 'The version set in the Composer JSON file.'
|
||||
field :name, GraphQL::Types::String, null: true, description: 'Name set in the Composer JSON file.'
|
||||
field :type, GraphQL::Types::String, null: true, description: 'Type set in the Composer JSON file.'
|
||||
field :license, GraphQL::Types::String, null: true, description: 'License set in the Composer JSON file.'
|
||||
field :version, GraphQL::Types::String, null: true, description: 'Version set in the Composer JSON file.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,7 +8,7 @@ module Types
|
|||
authorize :read_package
|
||||
|
||||
field :versions, ::Types::Packages::PackageType.connection_type, null: true,
|
||||
description: 'The other versions of the package.'
|
||||
description: 'Other versions of the package.'
|
||||
|
||||
field :package_files, Types::Packages::PackageFileType.connection_type, null: true, description: 'Package files.'
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@ module Types
|
|||
authorize :read_package
|
||||
|
||||
field :id, ::Types::GlobalIDType[::Packages::PackageFile], null: false, description: 'ID of the file.'
|
||||
field :created_at, Types::TimeType, null: false, description: 'The created date.'
|
||||
field :updated_at, Types::TimeType, null: false, description: 'The updated date.'
|
||||
field :created_at, Types::TimeType, null: false, description: 'Created date.'
|
||||
field :updated_at, Types::TimeType, null: false, description: 'Updated date.'
|
||||
field :size, GraphQL::Types::String, null: false, description: 'Size of the package file.'
|
||||
field :file_name, GraphQL::Types::String, null: false, description: 'Name of the package file.'
|
||||
field :download_path, GraphQL::Types::String, null: false, description: 'Download path of the package file.'
|
||||
|
|
|
@ -7,10 +7,10 @@ module Types
|
|||
description 'Represents a package tag'
|
||||
authorize :read_package
|
||||
|
||||
field :id, GraphQL::Types::ID, null: false, description: 'The ID of the tag.'
|
||||
field :name, GraphQL::Types::String, null: false, description: 'The name of the tag.'
|
||||
field :created_at, Types::TimeType, null: false, description: 'The created date.'
|
||||
field :updated_at, Types::TimeType, null: false, description: 'The updated date.'
|
||||
field :id, GraphQL::Types::ID, null: false, description: 'ID of the tag.'
|
||||
field :name, GraphQL::Types::String, null: false, description: 'Name of the tag.'
|
||||
field :created_at, Types::TimeType, null: false, description: 'Created date.'
|
||||
field :updated_at, Types::TimeType, null: false, description: 'Updated date.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -23,7 +23,7 @@ module Types
|
|||
field :metadata, Types::Packages::MetadataType, null: true,
|
||||
description: 'Package metadata.'
|
||||
field :versions, ::Types::Packages::PackageType.connection_type, null: true,
|
||||
description: 'The other versions of the package.',
|
||||
description: 'Other versions of the package.',
|
||||
deprecated: { reason: 'This field is now only returned in the PackageDetailsType', milestone: '13.11' }
|
||||
field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ module Types
|
|||
field :autoclose_referenced_issues, GraphQL::Types::Boolean, null: true,
|
||||
description: 'Indicates if issues referenced by merge requests and commits within the default branch are closed automatically.'
|
||||
field :suggestion_commit_message, GraphQL::Types::String, null: true,
|
||||
description: 'The commit message used to apply merge request suggestions.'
|
||||
description: 'Commit message used to apply merge request suggestions.'
|
||||
field :squash_read_only, GraphQL::Types::Boolean, null: false, method: :squash_readonly?,
|
||||
description: 'Indicates if `squashReadOnly` is enabled.'
|
||||
|
||||
|
@ -310,7 +310,7 @@ module Types
|
|||
field :container_expiration_policy,
|
||||
Types::ContainerExpirationPolicyType,
|
||||
null: true,
|
||||
description: 'The container expiration policy of the project.'
|
||||
description: 'Container expiration policy of the project.'
|
||||
|
||||
field :container_repositories,
|
||||
Types::ContainerRepositoryType.connection_type,
|
||||
|
@ -324,7 +324,7 @@ module Types
|
|||
field :label,
|
||||
Types::LabelType,
|
||||
null: true,
|
||||
description: 'A label available on this project.' do
|
||||
description: 'Label available on this project.' do
|
||||
argument :title, GraphQL::Types::String,
|
||||
required: true,
|
||||
description: 'Title of the label.'
|
||||
|
|
|
@ -15,6 +15,6 @@ module Types
|
|||
field :humanized_text,
|
||||
GraphQL::Types::String,
|
||||
null: false,
|
||||
description: 'The human-readable text of the alert condition.'
|
||||
description: 'Human-readable text of the alert condition.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -62,7 +62,7 @@ module Types
|
|||
argument :id,
|
||||
type: ::Types::GlobalIDType[::ContainerRepository],
|
||||
required: true,
|
||||
description: 'The global ID of the container repository.'
|
||||
description: 'Global ID of the container repository.'
|
||||
end
|
||||
|
||||
field :package,
|
||||
|
@ -84,13 +84,13 @@ module Types
|
|||
field :issue, Types::IssueType,
|
||||
null: true,
|
||||
description: 'Find an issue.' do
|
||||
argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'The global ID of the issue.'
|
||||
argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'Global ID of the issue.'
|
||||
end
|
||||
|
||||
field :merge_request, Types::MergeRequestType,
|
||||
null: true,
|
||||
description: 'Find a merge request.' do
|
||||
argument :id, ::Types::GlobalIDType[::MergeRequest], required: true, description: 'The global ID of the merge request.'
|
||||
argument :id, ::Types::GlobalIDType[::MergeRequest], required: true, description: 'Global ID of the merge request.'
|
||||
end
|
||||
|
||||
field :instance_statistics_measurements,
|
||||
|
|
|
@ -8,11 +8,11 @@ module Types
|
|||
@subtypes[[type, closed]] ||= Class.new(self) do
|
||||
argument :start, type,
|
||||
required: closed,
|
||||
description: 'The start of the range.'
|
||||
description: 'Start of the range.'
|
||||
|
||||
argument :end, type,
|
||||
required: closed,
|
||||
description: 'The end of the range.'
|
||||
description: 'End of the range.'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ module Types
|
|||
|
||||
argument :link_type, Types::ReleaseAssetLinkTypeEnum,
|
||||
required: false, default_value: 'other',
|
||||
description: 'The type of the asset link.'
|
||||
description: 'Type of the asset link.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,6 +7,6 @@ module Types
|
|||
|
||||
argument :links, [Types::ReleaseAssetLinkInputType],
|
||||
required: false,
|
||||
description: 'A list of asset links to associate to the release.'
|
||||
description: 'List of asset links to associate to the release.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -49,7 +49,7 @@ module Types
|
|||
|
||||
field :commit, Types::CommitType, null: true,
|
||||
complexity: 10, calls_gitaly: true,
|
||||
description: 'The commit associated with the release.'
|
||||
description: 'Commit associated with the release.'
|
||||
|
||||
def commit
|
||||
return if release.sha.nil?
|
||||
|
|
|
@ -13,12 +13,12 @@ module MergeRequests
|
|||
class MergeToRefService < MergeRequests::MergeBaseService
|
||||
extend ::Gitlab::Utils::Override
|
||||
|
||||
def execute(merge_request)
|
||||
def execute(merge_request, cache_merge_to_ref_calls = false)
|
||||
@merge_request = merge_request
|
||||
|
||||
error_check!
|
||||
|
||||
commit_id = commit
|
||||
commit_id = commit(cache_merge_to_ref_calls)
|
||||
|
||||
raise_error('Conflicts detected during merge') unless commit_id
|
||||
|
||||
|
@ -65,8 +65,9 @@ module MergeRequests
|
|||
params[:allow_conflicts] || false
|
||||
end
|
||||
|
||||
def commit
|
||||
if Feature.enabled?(:cache_merge_to_ref_calls, project, default_enabled: false)
|
||||
def commit(cache_merge_to_ref_calls = false)
|
||||
if cache_merge_to_ref_calls &&
|
||||
Feature.enabled?(:cache_merge_to_ref_calls, project, default_enabled: false)
|
||||
Rails.cache.fetch(cache_key, expires_in: 1.day) do
|
||||
extracted_merge_to_ref
|
||||
end
|
||||
|
|
|
@ -209,6 +209,7 @@ fixup
|
|||
Flawfinder
|
||||
Flowdock
|
||||
Fluentd
|
||||
Flycheck
|
||||
Forgerock
|
||||
formatters
|
||||
Fugit
|
||||
|
|
|
@ -74,7 +74,7 @@ Returns [`ContainerRepositoryDetails`](#containerrepositorydetails).
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="querycontainerrepositoryid"></a>`id` | [`ContainerRepositoryID!`](#containerrepositoryid) | The global ID of the container repository. |
|
||||
| <a id="querycontainerrepositoryid"></a>`id` | [`ContainerRepositoryID!`](#containerrepositoryid) | Global ID of the container repository. |
|
||||
|
||||
### `Query.currentLicense`
|
||||
|
||||
|
@ -185,7 +185,7 @@ Returns [`Issue`](#issue).
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="queryissueid"></a>`id` | [`IssueID!`](#issueid) | The global ID of the issue. |
|
||||
| <a id="queryissueid"></a>`id` | [`IssueID!`](#issueid) | Global ID of the issue. |
|
||||
|
||||
### `Query.iteration`
|
||||
|
||||
|
@ -219,7 +219,7 @@ Returns [`MergeRequest`](#mergerequest).
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="querymergerequestid"></a>`id` | [`MergeRequestID!`](#mergerequestid) | The global ID of the merge request. |
|
||||
| <a id="querymergerequestid"></a>`id` | [`MergeRequestID!`](#mergerequestid) | Global ID of the merge request. |
|
||||
|
||||
### `Query.metadata`
|
||||
|
||||
|
@ -1186,7 +1186,7 @@ Input type: `CreateDiffNoteInput`
|
|||
| <a id="mutationcreatediffnoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationcreatediffnoteconfidential"></a>`confidential` | [`Boolean`](#boolean) | Confidentiality flag of a note. Default is false. |
|
||||
| <a id="mutationcreatediffnotenoteableid"></a>`noteableId` | [`NoteableID!`](#noteableid) | Global ID of the resource to add a note to. |
|
||||
| <a id="mutationcreatediffnoteposition"></a>`position` | [`DiffPositionInput!`](#diffpositioninput) | The position of this note on a diff. |
|
||||
| <a id="mutationcreatediffnoteposition"></a>`position` | [`DiffPositionInput!`](#diffpositioninput) | Position of this note on a diff. |
|
||||
|
||||
#### Fields
|
||||
|
||||
|
@ -1236,7 +1236,7 @@ Input type: `CreateImageDiffNoteInput`
|
|||
| <a id="mutationcreateimagediffnoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationcreateimagediffnoteconfidential"></a>`confidential` | [`Boolean`](#boolean) | Confidentiality flag of a note. Default is false. |
|
||||
| <a id="mutationcreateimagediffnotenoteableid"></a>`noteableId` | [`NoteableID!`](#noteableid) | Global ID of the resource to add a note to. |
|
||||
| <a id="mutationcreateimagediffnoteposition"></a>`position` | [`DiffImagePositionInput!`](#diffimagepositioninput) | The position of this note on a diff. |
|
||||
| <a id="mutationcreateimagediffnoteposition"></a>`position` | [`DiffImagePositionInput!`](#diffimagepositioninput) | Position of this note on a diff. |
|
||||
|
||||
#### Fields
|
||||
|
||||
|
@ -3601,7 +3601,7 @@ Input type: `ReleaseAssetLinkCreateInput`
|
|||
| ---- | ---- | ----------- |
|
||||
| <a id="mutationreleaseassetlinkcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationreleaseassetlinkcreatedirectassetpath"></a>`directAssetPath` | [`String`](#string) | Relative path for a direct asset link. |
|
||||
| <a id="mutationreleaseassetlinkcreatelinktype"></a>`linkType` | [`ReleaseAssetLinkType`](#releaseassetlinktype) | The type of the asset link. |
|
||||
| <a id="mutationreleaseassetlinkcreatelinktype"></a>`linkType` | [`ReleaseAssetLinkType`](#releaseassetlinktype) | Type of the asset link. |
|
||||
| <a id="mutationreleaseassetlinkcreatename"></a>`name` | [`String!`](#string) | Name of the asset link. |
|
||||
| <a id="mutationreleaseassetlinkcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project the asset link is associated with. |
|
||||
| <a id="mutationreleaseassetlinkcreatetagname"></a>`tagName` | [`String!`](#string) | Name of the associated release's tag. |
|
||||
|
@ -3757,7 +3757,7 @@ Input type: `RepositionImageDiffNoteInput`
|
|||
| ---- | ---- | ----------- |
|
||||
| <a id="mutationrepositionimagediffnoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationrepositionimagediffnoteid"></a>`id` | [`DiffNoteID!`](#diffnoteid) | Global ID of the DiffNote to update. |
|
||||
| <a id="mutationrepositionimagediffnoteposition"></a>`position` | [`UpdateDiffImagePositionInput!`](#updatediffimagepositioninput) | The position of this note on a diff. |
|
||||
| <a id="mutationrepositionimagediffnoteposition"></a>`position` | [`UpdateDiffImagePositionInput!`](#updatediffimagepositioninput) | Position of this note on a diff. |
|
||||
|
||||
#### Fields
|
||||
|
||||
|
@ -4251,7 +4251,7 @@ Input type: `UpdateImageDiffNoteInput`
|
|||
| <a id="mutationupdateimagediffnotebody"></a>`body` | [`String`](#string) | Content of the note. |
|
||||
| <a id="mutationupdateimagediffnoteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
|
||||
| <a id="mutationupdateimagediffnoteid"></a>`id` | [`NoteID!`](#noteid) | Global ID of the note to update. |
|
||||
| <a id="mutationupdateimagediffnoteposition"></a>`position` | [`UpdateDiffImagePositionInput`](#updatediffimagepositioninput) | The position of this note on a diff. |
|
||||
| <a id="mutationupdateimagediffnoteposition"></a>`position` | [`UpdateDiffImagePositionInput`](#updatediffimagepositioninput) | Position of this note on a diff. |
|
||||
|
||||
#### Fields
|
||||
|
||||
|
@ -7752,7 +7752,7 @@ Represents an epic on an issue board.
|
|||
| <a id="boardepicduedatefixed"></a>`dueDateFixed` | [`Time`](#time) | Fixed due date of the epic. |
|
||||
| <a id="boardepicduedatefrommilestones"></a>`dueDateFromMilestones` | [`Time`](#time) | Inherited due date of the epic from milestones. |
|
||||
| <a id="boardepicduedateisfixed"></a>`dueDateIsFixed` | [`Boolean`](#boolean) | Indicates if the due date has been manually set. |
|
||||
| <a id="boardepicevents"></a>`events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. (see [Connections](#connections)) |
|
||||
| <a id="boardepicevents"></a>`events` | [`EventConnection`](#eventconnection) | List of events associated with the object. (see [Connections](#connections)) |
|
||||
| <a id="boardepicgroup"></a>`group` | [`Group!`](#group) | Group to which the epic belongs. |
|
||||
| <a id="boardepichaschildren"></a>`hasChildren` | [`Boolean!`](#boolean) | Indicates if the epic has children. |
|
||||
| <a id="boardepichasissues"></a>`hasIssues` | [`Boolean!`](#boolean) | Indicates if the epic has direct issues. |
|
||||
|
@ -8580,18 +8580,18 @@ A single design.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="designdiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
|
||||
| <a id="designdiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | Diff refs for this design. |
|
||||
| <a id="designdiscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
|
||||
| <a id="designevent"></a>`event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
|
||||
| <a id="designfilename"></a>`filename` | [`String!`](#string) | The filename of the design. |
|
||||
| <a id="designfullpath"></a>`fullPath` | [`String!`](#string) | The full path to the design file. |
|
||||
| <a id="designid"></a>`id` | [`ID!`](#id) | The ID of this design. |
|
||||
| <a id="designimage"></a>`image` | [`String!`](#string) | The URL of the full-sized image. |
|
||||
| <a id="designfilename"></a>`filename` | [`String!`](#string) | Filename of the design. |
|
||||
| <a id="designfullpath"></a>`fullPath` | [`String!`](#string) | Full path to the design file. |
|
||||
| <a id="designid"></a>`id` | [`ID!`](#id) | ID of this design. |
|
||||
| <a id="designimage"></a>`image` | [`String!`](#string) | URL of the full-sized image. |
|
||||
| <a id="designimagev432x230"></a>`imageV432x230` | [`String`](#string) | The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated. |
|
||||
| <a id="designissue"></a>`issue` | [`Issue!`](#issue) | The issue the design belongs to. |
|
||||
| <a id="designissue"></a>`issue` | [`Issue!`](#issue) | Issue the design belongs to. |
|
||||
| <a id="designnotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
|
||||
| <a id="designnotescount"></a>`notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
|
||||
| <a id="designproject"></a>`project` | [`Project!`](#project) | The project the design belongs to. |
|
||||
| <a id="designnotescount"></a>`notesCount` | [`Int!`](#int) | Total count of user-created notes for this design. |
|
||||
| <a id="designproject"></a>`project` | [`Project!`](#project) | Project the design belongs to. |
|
||||
|
||||
#### Fields with arguments
|
||||
|
||||
|
@ -8636,18 +8636,18 @@ A design pinned to a specific version. The image field reflects the design as of
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="designatversiondesign"></a>`design` | [`Design!`](#design) | The underlying design. |
|
||||
| <a id="designatversiondiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
|
||||
| <a id="designatversiondesign"></a>`design` | [`Design!`](#design) | Underlying design. |
|
||||
| <a id="designatversiondiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | Diff refs for this design. |
|
||||
| <a id="designatversionevent"></a>`event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
|
||||
| <a id="designatversionfilename"></a>`filename` | [`String!`](#string) | The filename of the design. |
|
||||
| <a id="designatversionfullpath"></a>`fullPath` | [`String!`](#string) | The full path to the design file. |
|
||||
| <a id="designatversionid"></a>`id` | [`ID!`](#id) | The ID of this design. |
|
||||
| <a id="designatversionimage"></a>`image` | [`String!`](#string) | The URL of the full-sized image. |
|
||||
| <a id="designatversionfilename"></a>`filename` | [`String!`](#string) | Filename of the design. |
|
||||
| <a id="designatversionfullpath"></a>`fullPath` | [`String!`](#string) | Full path to the design file. |
|
||||
| <a id="designatversionid"></a>`id` | [`ID!`](#id) | ID of this design. |
|
||||
| <a id="designatversionimage"></a>`image` | [`String!`](#string) | URL of the full-sized image. |
|
||||
| <a id="designatversionimagev432x230"></a>`imageV432x230` | [`String`](#string) | The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated. |
|
||||
| <a id="designatversionissue"></a>`issue` | [`Issue!`](#issue) | The issue the design belongs to. |
|
||||
| <a id="designatversionnotescount"></a>`notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
|
||||
| <a id="designatversionproject"></a>`project` | [`Project!`](#project) | The project the design belongs to. |
|
||||
| <a id="designatversionversion"></a>`version` | [`DesignVersion!`](#designversion) | The version this design-at-versions is pinned to. |
|
||||
| <a id="designatversionissue"></a>`issue` | [`Issue!`](#issue) | Issue the design belongs to. |
|
||||
| <a id="designatversionnotescount"></a>`notesCount` | [`Int!`](#int) | Total count of user-created notes for this design. |
|
||||
| <a id="designatversionproject"></a>`project` | [`Project!`](#project) | Project the design belongs to. |
|
||||
| <a id="designatversionversion"></a>`version` | [`DesignVersion!`](#designversion) | Version this design-at-versions is pinned to. |
|
||||
|
||||
### `DesignCollection`
|
||||
|
||||
|
@ -8995,9 +8995,9 @@ Describes where code is deployed for a project.
|
|||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="environmentid"></a>`id` | [`ID!`](#id) | ID of the environment. |
|
||||
| <a id="environmentlatestopenedmostseverealert"></a>`latestOpenedMostSevereAlert` | [`AlertManagementAlert`](#alertmanagementalert) | The most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned. |
|
||||
| <a id="environmentlatestopenedmostseverealert"></a>`latestOpenedMostSevereAlert` | [`AlertManagementAlert`](#alertmanagementalert) | Most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned. |
|
||||
| <a id="environmentname"></a>`name` | [`String!`](#string) | Human-readable name of the environment. |
|
||||
| <a id="environmentpath"></a>`path` | [`String!`](#string) | The path to the environment. |
|
||||
| <a id="environmentpath"></a>`path` | [`String!`](#string) | Path to the environment. |
|
||||
| <a id="environmentstate"></a>`state` | [`String!`](#string) | State of the environment, for example: available/stopped. |
|
||||
|
||||
#### Fields with arguments
|
||||
|
@ -9037,7 +9037,7 @@ Represents an epic.
|
|||
| <a id="epicduedatefixed"></a>`dueDateFixed` | [`Time`](#time) | Fixed due date of the epic. |
|
||||
| <a id="epicduedatefrommilestones"></a>`dueDateFromMilestones` | [`Time`](#time) | Inherited due date of the epic from milestones. |
|
||||
| <a id="epicduedateisfixed"></a>`dueDateIsFixed` | [`Boolean`](#boolean) | Indicates if the due date has been manually set. |
|
||||
| <a id="epicevents"></a>`events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. (see [Connections](#connections)) |
|
||||
| <a id="epicevents"></a>`events` | [`EventConnection`](#eventconnection) | List of events associated with the object. (see [Connections](#connections)) |
|
||||
| <a id="epicgroup"></a>`group` | [`Group!`](#group) | Group to which the epic belongs. |
|
||||
| <a id="epichaschildren"></a>`hasChildren` | [`Boolean!`](#boolean) | Indicates if the epic has children. |
|
||||
| <a id="epichasissues"></a>`hasIssues` | [`Boolean!`](#boolean) | Indicates if the epic has direct issues. |
|
||||
|
@ -9616,10 +9616,10 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
|||
| <a id="grouplfsenabled"></a>`lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
|
||||
| <a id="groupmentionsdisabled"></a>`mentionsDisabled` | [`Boolean`](#boolean) | Indicates if a group is disabled from getting mentioned. |
|
||||
| <a id="groupname"></a>`name` | [`String!`](#string) | Name of the namespace. |
|
||||
| <a id="grouppackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | The package settings for the namespace. |
|
||||
| <a id="grouppackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | Package settings for the namespace. |
|
||||
| <a id="groupparent"></a>`parent` | [`Group`](#group) | Parent group. |
|
||||
| <a id="grouppath"></a>`path` | [`String!`](#string) | Path of the namespace. |
|
||||
| <a id="groupprojectcreationlevel"></a>`projectCreationLevel` | [`String`](#string) | The permission level required to create projects in the group. |
|
||||
| <a id="groupprojectcreationlevel"></a>`projectCreationLevel` | [`String`](#string) | Permission level required to create projects in the group. |
|
||||
| <a id="grouprepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
|
||||
| <a id="grouprequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
|
||||
| <a id="grouprequiretwofactorauthentication"></a>`requireTwoFactorAuthentication` | [`Boolean`](#boolean) | Indicates if all users in this group are required to set up two-factor authentication. |
|
||||
|
@ -9628,7 +9628,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
|||
| <a id="groupsharedrunnerssetting"></a>`sharedRunnersSetting` | [`SharedRunnersSetting`](#sharedrunnerssetting) | Shared runners availability for the namespace and its descendants. |
|
||||
| <a id="groupstats"></a>`stats` | [`GroupStats`](#groupstats) | Group statistics. |
|
||||
| <a id="groupstoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | Total storage limit of the root namespace in bytes. |
|
||||
| <a id="groupsubgroupcreationlevel"></a>`subgroupCreationLevel` | [`String`](#string) | The permission level required to create subgroups within the group. |
|
||||
| <a id="groupsubgroupcreationlevel"></a>`subgroupCreationLevel` | [`String`](#string) | Permission level required to create subgroups within the group. |
|
||||
| <a id="grouptemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
|
||||
| <a id="grouptotalrepositorysize"></a>`totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
|
||||
| <a id="grouptotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. |
|
||||
|
@ -9913,7 +9913,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
|||
|
||||
##### `Group.label`
|
||||
|
||||
A label available on this group.
|
||||
Label available on this group.
|
||||
|
||||
Returns [`Label`](#label).
|
||||
|
||||
|
@ -10587,7 +10587,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
|||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="kasenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether the Kubernetes Agent Server is enabled. |
|
||||
| <a id="kasexternalurl"></a>`externalUrl` | [`String`](#string) | The URL used by the Agents to communicate with KAS. |
|
||||
| <a id="kasexternalurl"></a>`externalUrl` | [`String`](#string) | URL used by the Agents to communicate with KAS. |
|
||||
| <a id="kasversion"></a>`version` | [`String`](#string) | KAS version. |
|
||||
|
||||
### `Label`
|
||||
|
@ -10695,7 +10695,7 @@ Maven metadata.
|
|||
| <a id="mergerequestforceremovesourcebranch"></a>`forceRemoveSourceBranch` | [`Boolean`](#boolean) | Indicates if the project settings will lead to source branch deletion after merge. |
|
||||
| <a id="mergerequesthasci"></a>`hasCi` | [`Boolean!`](#boolean) | Indicates if the merge request has CI. |
|
||||
| <a id="mergerequesthassecurityreports"></a>`hasSecurityReports` | [`Boolean!`](#boolean) | Indicates if the source branch has any security reports. |
|
||||
| <a id="mergerequestheadpipeline"></a>`headPipeline` | [`Pipeline`](#pipeline) | The pipeline running on the branch HEAD of the merge request. |
|
||||
| <a id="mergerequestheadpipeline"></a>`headPipeline` | [`Pipeline`](#pipeline) | Pipeline running on the branch HEAD of the merge request. |
|
||||
| <a id="mergerequesthumantimeestimate"></a>`humanTimeEstimate` | [`String`](#string) | Human-readable time estimate of the merge request. |
|
||||
| <a id="mergerequesthumantotaltimespent"></a>`humanTotalTimeSpent` | [`String`](#string) | Human-readable total time reported as spent on the merge request. |
|
||||
| <a id="mergerequestid"></a>`id` | [`ID!`](#id) | ID of the merge request. |
|
||||
|
@ -10713,7 +10713,7 @@ Maven metadata.
|
|||
| <a id="mergerequestmergeable"></a>`mergeable` | [`Boolean!`](#boolean) | Indicates if the merge request is mergeable. |
|
||||
| <a id="mergerequestmergeablediscussionsstate"></a>`mergeableDiscussionsState` | [`Boolean`](#boolean) | Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged. |
|
||||
| <a id="mergerequestmergedat"></a>`mergedAt` | [`Time`](#time) | Timestamp of when the merge request was merged, null if not merged. |
|
||||
| <a id="mergerequestmilestone"></a>`milestone` | [`Milestone`](#milestone) | The milestone of the merge request. |
|
||||
| <a id="mergerequestmilestone"></a>`milestone` | [`Milestone`](#milestone) | Milestone of the merge request. |
|
||||
| <a id="mergerequestnotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
|
||||
| <a id="mergerequestparticipants"></a>`participants` | [`UserCoreConnection`](#usercoreconnection) | Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes. (see [Connections](#connections)) |
|
||||
| <a id="mergerequestproject"></a>`project` | [`Project!`](#project) | Alias for target_project. |
|
||||
|
@ -10780,7 +10780,7 @@ Returns [`[DiffStats!]`](#diffstats).
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="mergerequestdiffstatspath"></a>`path` | [`String`](#string) | A specific file-path. |
|
||||
| <a id="mergerequestdiffstatspath"></a>`path` | [`String`](#string) | Specific file path. |
|
||||
|
||||
##### `MergeRequest.pipelines`
|
||||
|
||||
|
@ -11397,7 +11397,7 @@ Contains statistics about a milestone.
|
|||
| <a id="namespaceistemporarystorageincreaseenabled"></a>`isTemporaryStorageIncreaseEnabled` | [`Boolean!`](#boolean) | Status of the temporary storage increase. |
|
||||
| <a id="namespacelfsenabled"></a>`lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
|
||||
| <a id="namespacename"></a>`name` | [`String!`](#string) | Name of the namespace. |
|
||||
| <a id="namespacepackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | The package settings for the namespace. |
|
||||
| <a id="namespacepackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | Package settings for the namespace. |
|
||||
| <a id="namespacepath"></a>`path` | [`String!`](#string) | Path of the namespace. |
|
||||
| <a id="namespacerepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
|
||||
| <a id="namespacerequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
|
||||
|
@ -11476,9 +11476,9 @@ Represents the network policy.
|
|||
| <a id="notebodyhtml"></a>`bodyHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `note`. |
|
||||
| <a id="noteconfidential"></a>`confidential` | [`Boolean`](#boolean) | Indicates if this note is confidential. |
|
||||
| <a id="notecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of the note creation. |
|
||||
| <a id="notediscussion"></a>`discussion` | [`Discussion`](#discussion) | The discussion this note is a part of. |
|
||||
| <a id="notediscussion"></a>`discussion` | [`Discussion`](#discussion) | Discussion this note is a part of. |
|
||||
| <a id="noteid"></a>`id` | [`NoteID!`](#noteid) | ID of the note. |
|
||||
| <a id="noteposition"></a>`position` | [`DiffPosition`](#diffposition) | The position of this note on a diff. |
|
||||
| <a id="noteposition"></a>`position` | [`DiffPosition`](#diffposition) | Position of this note on a diff. |
|
||||
| <a id="noteproject"></a>`project` | [`Project`](#project) | Project associated with the note. |
|
||||
| <a id="noteresolvable"></a>`resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
|
||||
| <a id="noteresolved"></a>`resolved` | [`Boolean!`](#boolean) | Indicates if the object is resolved. |
|
||||
|
@ -11580,10 +11580,10 @@ Represents a composer JSON file.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="packagecomposerjsontypelicense"></a>`license` | [`String`](#string) | The license set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypename"></a>`name` | [`String`](#string) | The name set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypetype"></a>`type` | [`String`](#string) | The type set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypeversion"></a>`version` | [`String`](#string) | The version set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypelicense"></a>`license` | [`String`](#string) | License set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypename"></a>`name` | [`String`](#string) | Name set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypetype"></a>`type` | [`String`](#string) | Type set in the Composer JSON file. |
|
||||
| <a id="packagecomposerjsontypeversion"></a>`version` | [`String`](#string) | Version set in the Composer JSON file. |
|
||||
|
||||
### `PackageDependency`
|
||||
|
||||
|
@ -11631,7 +11631,7 @@ Represents a package details in the Package Registry. Note that this type is in
|
|||
| <a id="packagedetailstypetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
|
||||
| <a id="packagedetailstypeupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
|
||||
| <a id="packagedetailstypeversion"></a>`version` | [`String`](#string) | Version string. |
|
||||
| <a id="packagedetailstypeversions"></a>`versions` | [`PackageConnection`](#packageconnection) | The other versions of the package. (see [Connections](#connections)) |
|
||||
| <a id="packagedetailstypeversions"></a>`versions` | [`PackageConnection`](#packageconnection) | Other versions of the package. (see [Connections](#connections)) |
|
||||
|
||||
### `PackageFile`
|
||||
|
||||
|
@ -11641,7 +11641,7 @@ Represents a package file.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="packagefilecreatedat"></a>`createdAt` | [`Time!`](#time) | The created date. |
|
||||
| <a id="packagefilecreatedat"></a>`createdAt` | [`Time!`](#time) | Created date. |
|
||||
| <a id="packagefiledownloadpath"></a>`downloadPath` | [`String!`](#string) | Download path of the package file. |
|
||||
| <a id="packagefilefilemd5"></a>`fileMd5` | [`String`](#string) | Md5 of the package file. |
|
||||
| <a id="packagefilefilemetadata"></a>`fileMetadata` | [`PackageFileMetadata`](#packagefilemetadata) | File metadata. |
|
||||
|
@ -11650,7 +11650,7 @@ Represents a package file.
|
|||
| <a id="packagefilefilesha256"></a>`fileSha256` | [`String`](#string) | Sha256 of the package file. |
|
||||
| <a id="packagefileid"></a>`id` | [`PackagesPackageFileID!`](#packagespackagefileid) | ID of the file. |
|
||||
| <a id="packagefilesize"></a>`size` | [`String!`](#string) | Size of the package file. |
|
||||
| <a id="packagefileupdatedat"></a>`updatedAt` | [`Time!`](#time) | The updated date. |
|
||||
| <a id="packagefileupdatedat"></a>`updatedAt` | [`Time!`](#time) | Updated date. |
|
||||
|
||||
### `PackageFileRegistry`
|
||||
|
||||
|
@ -11690,10 +11690,10 @@ Represents a package tag.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="packagetagcreatedat"></a>`createdAt` | [`Time!`](#time) | The created date. |
|
||||
| <a id="packagetagid"></a>`id` | [`ID!`](#id) | The ID of the tag. |
|
||||
| <a id="packagetagname"></a>`name` | [`String!`](#string) | The name of the tag. |
|
||||
| <a id="packagetagupdatedat"></a>`updatedAt` | [`Time!`](#time) | The updated date. |
|
||||
| <a id="packagetagcreatedat"></a>`createdAt` | [`Time!`](#time) | Created date. |
|
||||
| <a id="packagetagid"></a>`id` | [`ID!`](#id) | ID of the tag. |
|
||||
| <a id="packagetagname"></a>`name` | [`String!`](#string) | Name of the tag. |
|
||||
| <a id="packagetagupdatedat"></a>`updatedAt` | [`Time!`](#time) | Updated date. |
|
||||
|
||||
### `PageInfo`
|
||||
|
||||
|
@ -11910,7 +11910,7 @@ Represents vulnerability finding of a security report on the pipeline.
|
|||
| <a id="projectclusteragents"></a>`clusterAgents` | [`ClusterAgentConnection`](#clusteragentconnection) | Cluster agents associated with the project. (see [Connections](#connections)) |
|
||||
| <a id="projectcodecoveragesummary"></a>`codeCoverageSummary` | [`CodeCoverageSummary`](#codecoveragesummary) | Code coverage summary associated with the project. |
|
||||
| <a id="projectcomplianceframeworks"></a>`complianceFrameworks` | [`ComplianceFrameworkConnection`](#complianceframeworkconnection) | Compliance frameworks associated with the project. (see [Connections](#connections)) |
|
||||
| <a id="projectcontainerexpirationpolicy"></a>`containerExpirationPolicy` | [`ContainerExpirationPolicy`](#containerexpirationpolicy) | The container expiration policy of the project. |
|
||||
| <a id="projectcontainerexpirationpolicy"></a>`containerExpirationPolicy` | [`ContainerExpirationPolicy`](#containerexpirationpolicy) | Container expiration policy of the project. |
|
||||
| <a id="projectcontainerregistryenabled"></a>`containerRegistryEnabled` | [`Boolean`](#boolean) | Indicates if Container Registry is enabled for the current user. |
|
||||
| <a id="projectcontainerrepositoriescount"></a>`containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the project. |
|
||||
| <a id="projectcreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of the project creation. |
|
||||
|
@ -11966,7 +11966,7 @@ Represents vulnerability finding of a security report on the pipeline.
|
|||
| <a id="projectsshurltorepo"></a>`sshUrlToRepo` | [`String`](#string) | URL to connect to the project via SSH. |
|
||||
| <a id="projectstarcount"></a>`starCount` | [`Int!`](#int) | Number of times the project has been starred. |
|
||||
| <a id="projectstatistics"></a>`statistics` | [`ProjectStatistics`](#projectstatistics) | Statistics of the project. |
|
||||
| <a id="projectsuggestioncommitmessage"></a>`suggestionCommitMessage` | [`String`](#string) | The commit message used to apply merge request suggestions. |
|
||||
| <a id="projectsuggestioncommitmessage"></a>`suggestionCommitMessage` | [`String`](#string) | Commit message used to apply merge request suggestions. |
|
||||
| <a id="projecttaglist"></a>`tagList` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.12. Use `topics`. |
|
||||
| <a id="projectterraformstates"></a>`terraformStates` | [`TerraformStateConnection`](#terraformstateconnection) | Terraform states associated with the project. (see [Connections](#connections)) |
|
||||
| <a id="projecttopics"></a>`topics` | [`[String!]`](#string) | List of project topics. |
|
||||
|
@ -12408,7 +12408,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
|||
|
||||
##### `Project.label`
|
||||
|
||||
A label available on this project.
|
||||
Label available on this project.
|
||||
|
||||
Returns [`Label`](#label).
|
||||
|
||||
|
@ -12896,7 +12896,7 @@ The alert condition for Prometheus.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="prometheusalerthumanizedtext"></a>`humanizedText` | [`String!`](#string) | The human-readable text of the alert condition. |
|
||||
| <a id="prometheusalerthumanizedtext"></a>`humanizedText` | [`String!`](#string) | Human-readable text of the alert condition. |
|
||||
| <a id="prometheusalertid"></a>`id` | [`ID!`](#id) | ID of the alert condition. |
|
||||
|
||||
### `PushRules`
|
||||
|
@ -12950,7 +12950,7 @@ Represents a release.
|
|||
| ---- | ---- | ----------- |
|
||||
| <a id="releaseassets"></a>`assets` | [`ReleaseAssets`](#releaseassets) | Assets of the release. |
|
||||
| <a id="releaseauthor"></a>`author` | [`UserCore`](#usercore) | User that created the release. |
|
||||
| <a id="releasecommit"></a>`commit` | [`Commit`](#commit) | The commit associated with the release. |
|
||||
| <a id="releasecommit"></a>`commit` | [`Commit`](#commit) | Commit associated with the release. |
|
||||
| <a id="releasecreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of when the release was created. |
|
||||
| <a id="releasedescription"></a>`description` | [`String`](#string) | Description (also known as "release notes") of the release. |
|
||||
| <a id="releasedescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
|
||||
|
@ -15100,7 +15100,7 @@ Type of file the position refers to.
|
|||
| Value | Description |
|
||||
| ----- | ----------- |
|
||||
| <a id="diffpositiontypeimage"></a>`image` | An image. |
|
||||
| <a id="diffpositiontypetext"></a>`text` | A text file. |
|
||||
| <a id="diffpositiontypetext"></a>`text` | Text file. |
|
||||
|
||||
### `DoraMetricBucketingInterval`
|
||||
|
||||
|
@ -15522,7 +15522,7 @@ Milestone ID wildcard values.
|
|||
|
||||
| Value | Description |
|
||||
| ----- | ----------- |
|
||||
| <a id="milestonewildcardidany"></a>`ANY` | A milestone is assigned. |
|
||||
| <a id="milestonewildcardidany"></a>`ANY` | Milestone is assigned. |
|
||||
| <a id="milestonewildcardidnone"></a>`NONE` | No milestone is assigned. |
|
||||
| <a id="milestonewildcardidstarted"></a>`STARTED` | An open, started milestone (start date <= today). |
|
||||
| <a id="milestonewildcardidupcoming"></a>`UPCOMING` | An open milestone due in the future (due date >= today). |
|
||||
|
@ -16787,16 +16787,16 @@ Implementations:
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="designfieldsdiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | The diff refs for this design. |
|
||||
| <a id="designfieldsdiffrefs"></a>`diffRefs` | [`DiffRefs!`](#diffrefs) | Diff refs for this design. |
|
||||
| <a id="designfieldsevent"></a>`event` | [`DesignVersionEvent!`](#designversionevent) | How this design was changed in the current version. |
|
||||
| <a id="designfieldsfilename"></a>`filename` | [`String!`](#string) | The filename of the design. |
|
||||
| <a id="designfieldsfullpath"></a>`fullPath` | [`String!`](#string) | The full path to the design file. |
|
||||
| <a id="designfieldsid"></a>`id` | [`ID!`](#id) | The ID of this design. |
|
||||
| <a id="designfieldsimage"></a>`image` | [`String!`](#string) | The URL of the full-sized image. |
|
||||
| <a id="designfieldsfilename"></a>`filename` | [`String!`](#string) | Filename of the design. |
|
||||
| <a id="designfieldsfullpath"></a>`fullPath` | [`String!`](#string) | Full path to the design file. |
|
||||
| <a id="designfieldsid"></a>`id` | [`ID!`](#id) | ID of this design. |
|
||||
| <a id="designfieldsimage"></a>`image` | [`String!`](#string) | URL of the full-sized image. |
|
||||
| <a id="designfieldsimagev432x230"></a>`imageV432x230` | [`String`](#string) | The URL of the design resized to fit within the bounds of 432x230. This will be `null` if the image has not been generated. |
|
||||
| <a id="designfieldsissue"></a>`issue` | [`Issue!`](#issue) | The issue the design belongs to. |
|
||||
| <a id="designfieldsnotescount"></a>`notesCount` | [`Int!`](#int) | The total count of user-created notes for this design. |
|
||||
| <a id="designfieldsproject"></a>`project` | [`Project!`](#project) | The project the design belongs to. |
|
||||
| <a id="designfieldsissue"></a>`issue` | [`Issue!`](#issue) | Issue the design belongs to. |
|
||||
| <a id="designfieldsnotescount"></a>`notesCount` | [`Int!`](#int) | Total count of user-created notes for this design. |
|
||||
| <a id="designfieldsproject"></a>`project` | [`Project!`](#project) | Project the design belongs to. |
|
||||
|
||||
#### `Entry`
|
||||
|
||||
|
@ -16828,7 +16828,7 @@ Implementations:
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="eventableevents"></a>`events` | [`EventConnection`](#eventconnection) | A list of events associated with the object. (see [Connections](#connections)) |
|
||||
| <a id="eventableevents"></a>`events` | [`EventConnection`](#eventconnection) | List of events associated with the object. (see [Connections](#connections)) |
|
||||
|
||||
#### `MemberInterface`
|
||||
|
||||
|
@ -17251,8 +17251,8 @@ Input type for DastSiteProfile authentication.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="diffpathsinputnewpath"></a>`newPath` | [`String`](#string) | The path of the file on the head sha. |
|
||||
| <a id="diffpathsinputoldpath"></a>`oldPath` | [`String`](#string) | The path of the file on the start sha. |
|
||||
| <a id="diffpathsinputnewpath"></a>`newPath` | [`String`](#string) | Path of the file on the HEAD SHA. |
|
||||
| <a id="diffpathsinputoldpath"></a>`oldPath` | [`String`](#string) | Path of the file on the start SHA. |
|
||||
|
||||
### `DiffPositionInput`
|
||||
|
||||
|
@ -17434,7 +17434,7 @@ Fields that are available when modifying a release asset link.
|
|||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="releaseassetlinkinputdirectassetpath"></a>`directAssetPath` | [`String`](#string) | Relative path for a direct asset link. |
|
||||
| <a id="releaseassetlinkinputlinktype"></a>`linkType` | [`ReleaseAssetLinkType`](#releaseassetlinktype) | The type of the asset link. |
|
||||
| <a id="releaseassetlinkinputlinktype"></a>`linkType` | [`ReleaseAssetLinkType`](#releaseassetlinktype) | Type of the asset link. |
|
||||
| <a id="releaseassetlinkinputname"></a>`name` | [`String!`](#string) | Name of the asset link. |
|
||||
| <a id="releaseassetlinkinputurl"></a>`url` | [`String!`](#string) | URL of the asset link. |
|
||||
|
||||
|
@ -17446,7 +17446,7 @@ Fields that are available when modifying release assets.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="releaseassetsinputlinks"></a>`links` | [`[ReleaseAssetLinkInput!]`](#releaseassetlinkinput) | A list of asset links to associate to the release. |
|
||||
| <a id="releaseassetsinputlinks"></a>`links` | [`[ReleaseAssetLinkInput!]`](#releaseassetlinkinput) | List of asset links to associate to the release. |
|
||||
|
||||
### `SastCiConfigurationAnalyzersEntityInput`
|
||||
|
||||
|
@ -17505,8 +17505,8 @@ A time-frame defined as a closed inclusive range of two dates.
|
|||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| <a id="timeframeend"></a>`end` | [`Date!`](#date) | The end of the range. |
|
||||
| <a id="timeframestart"></a>`start` | [`Date!`](#date) | The start of the range. |
|
||||
| <a id="timeframeend"></a>`end` | [`Date!`](#date) | End of the range. |
|
||||
| <a id="timeframestart"></a>`start` | [`Date!`](#date) | Start of the range. |
|
||||
|
||||
### `UpdateDiffImagePositionInput`
|
||||
|
||||
|
|
|
@ -319,6 +319,38 @@ To configure Vale in your editor, install one of the following as appropriate:
|
|||
cases, `vale` should work. To find the location, run `which vale` in a terminal.
|
||||
|
||||
- Vim [ALE plugin](https://github.com/dense-analysis/ale).
|
||||
- Emacs [Flycheck extension](https://github.com/flycheck/flycheck).
|
||||
This requires some configuration:
|
||||
|
||||
- `Flycheck` supports `markdownlint-cli` out of the box, but you must point it
|
||||
to the `.markdownlint.yml` at the base of the project directory. A `.dir-locals.el`
|
||||
file can accomplish this:
|
||||
|
||||
```lisp
|
||||
;; Place this code in a file called `.dir-locals.el` at the root of the gitlab project.
|
||||
((markdown-mode . ((flycheck-markdown-markdownlint-cli-config . ".markdownlint.yml"))))
|
||||
|
||||
```
|
||||
|
||||
- A minimal configuration for Flycheck to work with Vale could look like this:
|
||||
|
||||
```lisp
|
||||
(flycheck-define-checker vale
|
||||
"A checker for prose"
|
||||
:command ("vale" "--output" "line" "--no-wrap"
|
||||
source)
|
||||
:standard-input nil
|
||||
:error-patterns
|
||||
((error line-start (file-name) ":" line ":" column ":" (id (one-or-more (not (any ":")))) ":" (message) line-end))
|
||||
:modes (markdown-mode org-mode text-mode)
|
||||
:next-checkers ((t . markdown-markdownlint-cli))
|
||||
)
|
||||
|
||||
(add-to-list 'flycheck-checkers 'vale)
|
||||
```
|
||||
|
||||
In this setup the `markdownlint` checker is set as a "next" checker from the defined `vale` checker.
|
||||
Enabling this custom Vale checker provides error linting from both Vale and markdownlint.
|
||||
|
||||
We don't use [Vale Server](https://errata-ai.github.io/vale/#using-vale-with-a-text-editor-or-another-third-party-application).
|
||||
|
||||
|
|
|
@ -8,6 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
This is a tailored extension of the Best Practices [found in the testing guide](../best_practices.md).
|
||||
|
||||
## Class and module naming
|
||||
|
||||
The QA framework uses [Zeitwerk](https://github.com/fxn/zeitwerk) for class and module autoloading. The default Zeitwerk [inflector](https://github.com/fxn/zeitwerk#zeitwerkinflector) simply converts snake_cased file names to PascalCased module or class names. It is advised to stick to this pattern to avoid manual maintenance of inflections.
|
||||
|
||||
In case custom inflection logic is needed, custom inflectors are added in the [qa.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/qa.rb) file in the `loader.inflector.inflect` method invocation.
|
||||
|
||||
## Link a test to its test-case issue
|
||||
|
||||
Every test should have a corresponding issue in the [Quality Test Cases project](https://gitlab.com/gitlab-org/quality/testcases/).
|
||||
|
@ -342,7 +348,7 @@ end
|
|||
|
||||
When something requires waiting to be matched, use `eventually_` matchers with clear wait duration definition.
|
||||
|
||||
`Eventually` matchers use the following naming pattern: `eventually_${rspec_matcher_name}`. They are defined in [eventually_matcher.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/spec/support/matchers/eventually_matcher.rb).
|
||||
`Eventually` matchers use the following naming pattern: `eventually_${rspec_matcher_name}`. They are defined in [eventually_matcher.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/qa/support/matchers/eventually_matcher.rb).
|
||||
|
||||
```ruby
|
||||
expect { async_value }.to eventually_eq(value).within(max_duration: 120, max_attempts: 60, reload_page: page)
|
||||
|
|
|
@ -182,7 +182,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab
|
|||
accordingly, while also consulting the
|
||||
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
|
||||
|
||||
`8.11.Z` -> [`8.12.0`](#upgrades-from-versions-earlier-than-812) -> `8.17.7` -> `9.5.10` -> `10.8.7` -> [`11.11.8`](#1200) -> `12.0.12` -> [`12.1.17`](#1210) -> `12.10.14` -> `13.0.14` -> [`13.1.11`](#1310) -> [latest `13.12.Z`](https://about.gitlab.com/releases/categories/releases/) -> [latest `14.0.Z`](#1400) -> [`14.1.Z`](#1410) -> [latest `14.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
|
||||
`8.11.Z` -> [`8.12.0`](#upgrades-from-versions-earlier-than-812) -> `8.17.7` -> `9.5.10` -> `10.8.7` -> [`11.11.8`](#1200) -> `12.0.12` -> [`12.1.17`](#1210) -> `12.10.14` -> `13.0.14` -> [`13.1.11`](#1310) -> [`13.8.3`](#1383) -> [latest `13.12.Z`](https://about.gitlab.com/releases/categories/releases/) -> [latest `14.0.Z`](#1400) -> [`14.1.Z`](#1410) -> [latest `14.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
|
||||
|
||||
The following table, while not exhaustive, shows some examples of the supported
|
||||
upgrade paths.
|
||||
|
@ -190,7 +190,7 @@ upgrade paths.
|
|||
| Target version | Your version | Supported upgrade path | Note |
|
||||
| -------------- | ------------ | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `14.1.2` | `13.9.2` | `13.9.2` -> `13.12.9` -> `14.0.7` -> `14.1.2` | Two intermediate versions are required: `13.12` and `14.0`, then `14.1`. |
|
||||
| `13.5.4` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.5.4` | Three intermediate versions are required: `12.10`, `13.0` and `13.1`, then `13.5.4`. |
|
||||
| `13.12.10` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.8.3` -> `13.12.10` | Four intermediate versions are required: `12.10`, `13.0`, `13.1` and `13.8.3`, then `13.12.10`. |
|
||||
| `13.2.10` | `11.5.0` | `11.5.0` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.2.10` | Six intermediate versions are required: `11.11`, `12.0`, `12.1`, `12.10`, `13.0` and `13.1`, then `13.2.10`. |
|
||||
| `12.10.14` | `11.3.4` | `11.3.4` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` | Three intermediate versions are required: `11.11`, `12.0` and `12.1`, then `12.10.14`. |
|
||||
| `12.9.5` | `10.4.5` | `10.4.5` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.9.5` | Four intermediate versions are required: `10.8`, `11.11`, `12.0` and `12.1`, then `12.9.5`. |
|
||||
|
@ -480,6 +480,17 @@ DETAIL: trigger trigger_0d588df444c8 on table application_settings depends on co
|
|||
To work around this bug, follow the previous steps to complete the update.
|
||||
More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160).
|
||||
|
||||
### 13.8.3
|
||||
|
||||
GitLab 13.8 includes a background migration to address [an issue with duplicate service records](https://gitlab.com/gitlab-org/gitlab/-/issues/290008). If duplicate services are present, this background migration must complete before a unique index is applied to the services table, which was [introduced in GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52563). Upgrades from GitLab 13.8 and earlier to later versions must include an intermediate upgrade to GitLab 13.8.3 and [must wait until the background migrations complete](#checking-for-background-migrations-before-upgrading) before proceeding.
|
||||
|
||||
If duplicate services are still present, an upgrade to 13.9.x or later results in a failed upgrade with the following error:
|
||||
|
||||
```console
|
||||
PG::UniqueViolation: ERROR: could not create unique index "index_services_on_project_id_and_type_unique"
|
||||
DETAIL: Key (project_id, type)=(NNN, ServiceName) is duplicated.
|
||||
```
|
||||
|
||||
### 13.6.0
|
||||
|
||||
Ruby 2.7.2 is required. GitLab does not start with Ruby 2.6.6 or older versions.
|
||||
|
|
|
@ -35,10 +35,9 @@ module API
|
|||
not_found!('Commit') unless @commit
|
||||
|
||||
@repo = user_project.repository
|
||||
@blob = @repo.blob_at(@commit.sha, params[:file_path])
|
||||
@blob = @repo.blob_at(@commit.sha, params[:file_path], limit: Gitlab::Git::Blob::LFS_POINTER_MAX_SIZE)
|
||||
|
||||
not_found!('File') unless @blob
|
||||
@blob.load_all_data!
|
||||
end
|
||||
|
||||
def commit_response(attrs)
|
||||
|
@ -48,13 +47,21 @@ module API
|
|||
}
|
||||
end
|
||||
|
||||
def content_sha
|
||||
Rails.cache.fetch("blob_content_sha256:#{user_project.full_path}:#{@blob.id}") do
|
||||
@blob.load_all_data!
|
||||
|
||||
Digest::SHA256.hexdigest(@blob.data)
|
||||
end
|
||||
end
|
||||
|
||||
def blob_data
|
||||
{
|
||||
file_name: @blob.name,
|
||||
file_path: @blob.path,
|
||||
size: @blob.size,
|
||||
encoding: "base64",
|
||||
content_sha256: Digest::SHA256.hexdigest(@blob.data),
|
||||
content_sha256: content_sha,
|
||||
ref: params[:ref],
|
||||
blob_id: @blob.id,
|
||||
commit_id: @commit.id,
|
||||
|
@ -154,6 +161,8 @@ module API
|
|||
get ":id/repository/files/:file_path", requirements: FILE_ENDPOINT_REQUIREMENTS do
|
||||
assign_file_vars!
|
||||
|
||||
@blob.load_all_data!
|
||||
|
||||
data = blob_data
|
||||
|
||||
set_http_headers(data)
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
"@gitlab/favicon-overlay": "2.0.0",
|
||||
"@gitlab/svgs": "1.211.0",
|
||||
"@gitlab/tributejs": "1.0.0",
|
||||
"@gitlab/ui": "32.2.1",
|
||||
"@gitlab/ui": "32.2.3",
|
||||
"@gitlab/visual-review-tools": "1.6.1",
|
||||
"@rails/actioncable": "6.1.3-2",
|
||||
"@rails/ujs": "6.1.3-2",
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'gitlab-qa'
|
||||
gem 'gitlab-qa', require: 'gitlab/qa'
|
||||
gem 'activesupport', '~> 6.1.3.2' # This should stay in sync with the root's Gemfile
|
||||
gem 'allure-rspec', '~> 2.14.1'
|
||||
gem 'capybara', '~> 3.35.0'
|
||||
|
@ -10,10 +10,9 @@ gem 'capybara-screenshot', '~> 1.0.23'
|
|||
gem 'rake', '~> 12.3.3'
|
||||
gem 'rspec', '~> 3.10'
|
||||
gem 'selenium-webdriver', '~> 4.0.0.beta4'
|
||||
gem 'airborne', '~> 0.3.4'
|
||||
gem 'airborne', '~> 0.3.4', require: false # airborne is messing with rspec sandboxed mode so not requiring by default
|
||||
gem 'rest-client', '~> 2.1.0'
|
||||
gem 'nokogiri', '~> 1.11.7'
|
||||
gem 'rspec-retry', '~> 0.6.1'
|
||||
gem 'rspec-retry', '~> 0.6.1', require: 'rspec/retry'
|
||||
gem 'rspec_junit_formatter', '~> 0.4.1'
|
||||
gem 'faker', '~> 1.6', '>= 1.6.6'
|
||||
gem 'knapsack', '~> 1.17'
|
||||
|
@ -24,6 +23,7 @@ gem 'parallel', '~> 1.19'
|
|||
gem 'rspec-parameterized', '~> 0.4.2'
|
||||
gem 'octokit', '~> 4.21'
|
||||
gem 'webdrivers', '~> 4.6'
|
||||
gem 'zeitwerk', '~> 2.4'
|
||||
|
||||
gem 'chemlab', '~> 0.7'
|
||||
gem 'chemlab-library-www-gitlab-com', '~> 0.1'
|
||||
|
|
|
@ -221,7 +221,6 @@ DEPENDENCIES
|
|||
faker (~> 1.6, >= 1.6.6)
|
||||
gitlab-qa
|
||||
knapsack (~> 1.17)
|
||||
nokogiri (~> 1.11.7)
|
||||
octokit (~> 4.21)
|
||||
parallel (~> 1.19)
|
||||
parallel_tests (~> 2.29)
|
||||
|
@ -237,6 +236,7 @@ DEPENDENCIES
|
|||
selenium-webdriver (~> 4.0.0.beta4)
|
||||
timecop (~> 0.9.1)
|
||||
webdrivers (~> 4.6)
|
||||
zeitwerk (~> 2.4)
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.22
|
||||
|
|
722
qa/qa.rb
722
qa/qa.rb
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
$: << File.expand_path(__dir__)
|
||||
|
||||
Encoding.default_external = 'UTF-8'
|
||||
|
||||
require_relative '../lib/gitlab'
|
||||
|
@ -10,683 +8,49 @@ require_relative '../config/initializers/0_inject_enterprise_edition_module'
|
|||
|
||||
require_relative 'lib/gitlab'
|
||||
|
||||
require 'chemlab'
|
||||
require 'bundler/setup'
|
||||
Bundler.require(:default)
|
||||
|
||||
module QA
|
||||
##
|
||||
# Helper classes to represent frequently used sequences of actions
|
||||
# (e.g., login)
|
||||
#
|
||||
module Flow
|
||||
autoload :Login, 'qa/flow/login'
|
||||
autoload :Project, 'qa/flow/project'
|
||||
autoload :Saml, 'qa/flow/saml'
|
||||
autoload :User, 'qa/flow/user'
|
||||
autoload :MergeRequest, 'qa/flow/merge_request'
|
||||
autoload :Pipeline, 'qa/flow/pipeline'
|
||||
autoload :SignUp, 'qa/flow/sign_up'
|
||||
end
|
||||
|
||||
##
|
||||
# GitLab QA runtime classes, mostly singletons.
|
||||
#
|
||||
module Runtime
|
||||
autoload :Release, 'qa/runtime/release'
|
||||
autoload :User, 'qa/runtime/user'
|
||||
autoload :Namespace, 'qa/runtime/namespace'
|
||||
autoload :Scenario, 'qa/runtime/scenario'
|
||||
autoload :Browser, 'qa/runtime/browser'
|
||||
autoload :Env, 'qa/runtime/env'
|
||||
autoload :Address, 'qa/runtime/address'
|
||||
autoload :Path, 'qa/runtime/path'
|
||||
autoload :Feature, 'qa/runtime/feature'
|
||||
autoload :Fixtures, 'qa/runtime/fixtures'
|
||||
autoload :Logger, 'qa/runtime/logger'
|
||||
autoload :GPG, 'qa/runtime/gpg'
|
||||
autoload :MailHog, 'qa/runtime/mail_hog'
|
||||
autoload :IPAddress, 'qa/runtime/ip_address'
|
||||
autoload :Search, 'qa/runtime/search'
|
||||
autoload :ApplicationSettings, 'qa/runtime/application_settings'
|
||||
autoload :AllureReport, 'qa/runtime/allure_report'
|
||||
|
||||
module API
|
||||
autoload :Client, 'qa/runtime/api/client'
|
||||
autoload :RepositoryStorageMoves, 'qa/runtime/api/repository_storage_moves'
|
||||
autoload :Request, 'qa/runtime/api/request'
|
||||
end
|
||||
|
||||
module Key
|
||||
autoload :Base, 'qa/runtime/key/base'
|
||||
autoload :RSA, 'qa/runtime/key/rsa'
|
||||
autoload :ECDSA, 'qa/runtime/key/ecdsa'
|
||||
autoload :ED25519, 'qa/runtime/key/ed25519'
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# GitLab QA fabrication mechanisms
|
||||
#
|
||||
module Resource
|
||||
autoload :ApiFabricator, 'qa/resource/api_fabricator'
|
||||
autoload :Base, 'qa/resource/base'
|
||||
|
||||
autoload :GroupBase, 'qa/resource/group_base'
|
||||
autoload :Sandbox, 'qa/resource/sandbox'
|
||||
autoload :Group, 'qa/resource/group'
|
||||
autoload :BulkImportGroup, 'qa/resource/bulk_import_group'
|
||||
autoload :Issue, 'qa/resource/issue'
|
||||
autoload :ProjectIssueNote, 'qa/resource/project_issue_note'
|
||||
autoload :Project, 'qa/resource/project'
|
||||
autoload :LabelBase, 'qa/resource/label_base'
|
||||
autoload :ProjectLabel, 'qa/resource/project_label'
|
||||
autoload :GroupLabel, 'qa/resource/group_label'
|
||||
autoload :MergeRequest, 'qa/resource/merge_request'
|
||||
autoload :ProjectImportedFromGithub, 'qa/resource/project_imported_from_github'
|
||||
autoload :ProjectImportedFromURL, 'qa/resource/project_imported_from_url'
|
||||
autoload :MergeRequestFromFork, 'qa/resource/merge_request_from_fork'
|
||||
autoload :DeployKey, 'qa/resource/deploy_key'
|
||||
autoload :DeployToken, 'qa/resource/deploy_token'
|
||||
autoload :ProtectedBranch, 'qa/resource/protected_branch'
|
||||
autoload :Pipeline, 'qa/resource/pipeline'
|
||||
autoload :CiVariable, 'qa/resource/ci_variable'
|
||||
autoload :Runner, 'qa/resource/runner'
|
||||
autoload :PersonalAccessToken, 'qa/resource/personal_access_token'
|
||||
autoload :PersonalAccessTokenCache, 'qa/resource/personal_access_token_cache'
|
||||
autoload :ProjectAccessToken, 'qa/resource/project_access_token'
|
||||
autoload :User, 'qa/resource/user'
|
||||
autoload :ProjectMilestone, 'qa/resource/project_milestone'
|
||||
autoload :GroupMilestone, 'qa/resource/group_milestone'
|
||||
autoload :Members, 'qa/resource/members'
|
||||
autoload :File, 'qa/resource/file'
|
||||
autoload :Fork, 'qa/resource/fork'
|
||||
autoload :SSHKey, 'qa/resource/ssh_key'
|
||||
autoload :Snippet, 'qa/resource/snippet'
|
||||
autoload :Tag, 'qa/resource/tag'
|
||||
autoload :ProjectMember, 'qa/resource/project_member'
|
||||
autoload :ProjectSnippet, 'qa/resource/project_snippet'
|
||||
autoload :UserGPG, 'qa/resource/user_gpg'
|
||||
autoload :Visibility, 'qa/resource/visibility'
|
||||
autoload :ProjectSnippet, 'qa/resource/project_snippet'
|
||||
autoload :Design, 'qa/resource/design'
|
||||
autoload :RegistryRepository, 'qa/resource/registry_repository'
|
||||
autoload :Package, 'qa/resource/package'
|
||||
autoload :PipelineSchedules, 'qa/resource/pipeline_schedules'
|
||||
autoload :ImportProject, 'qa/resource/import_project'
|
||||
|
||||
module KubernetesCluster
|
||||
autoload :Base, 'qa/resource/kubernetes_cluster/base'
|
||||
autoload :ProjectCluster, 'qa/resource/kubernetes_cluster/project_cluster'
|
||||
end
|
||||
|
||||
module Clusters
|
||||
autoload :Agent, 'qa/resource/clusters/agent.rb'
|
||||
autoload :AgentToken, 'qa/resource/clusters/agent_token.rb'
|
||||
end
|
||||
|
||||
module Events
|
||||
autoload :Base, 'qa/resource/events/base'
|
||||
autoload :Project, 'qa/resource/events/project'
|
||||
end
|
||||
|
||||
module Repository
|
||||
autoload :Commit, 'qa/resource/repository/commit'
|
||||
autoload :Push, 'qa/resource/repository/push'
|
||||
autoload :ProjectPush, 'qa/resource/repository/project_push'
|
||||
autoload :WikiPush, 'qa/resource/repository/wiki_push'
|
||||
end
|
||||
|
||||
module Wiki
|
||||
autoload :ProjectPage, 'qa/resource/wiki/project_page'
|
||||
autoload :GroupPage, 'qa/resource/wiki/group_page'
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# GitLab QA Scenarios
|
||||
#
|
||||
module Scenario
|
||||
##
|
||||
# Support files
|
||||
#
|
||||
autoload :Bootable, 'qa/scenario/bootable'
|
||||
autoload :Actable, 'qa/scenario/actable'
|
||||
autoload :Template, 'qa/scenario/template'
|
||||
autoload :SharedAttributes, 'qa/scenario/shared_attributes'
|
||||
|
||||
##
|
||||
# Test scenario entrypoints.
|
||||
#
|
||||
module Test
|
||||
autoload :Instance, 'qa/scenario/test/instance'
|
||||
module Instance
|
||||
autoload :All, 'qa/scenario/test/instance/all'
|
||||
autoload :Smoke, 'qa/scenario/test/instance/smoke'
|
||||
autoload :Airgapped, 'qa/scenario/test/instance/airgapped'
|
||||
end
|
||||
|
||||
module Integration
|
||||
autoload :Github, 'qa/scenario/test/integration/github'
|
||||
autoload :LDAPNoTLS, 'qa/scenario/test/integration/ldap_no_tls'
|
||||
autoload :LDAPNoServer, 'qa/scenario/test/integration/ldap_no_server'
|
||||
autoload :LDAPTLS, 'qa/scenario/test/integration/ldap_tls'
|
||||
autoload :InstanceSAML, 'qa/scenario/test/integration/instance_saml'
|
||||
autoload :Kubernetes, 'qa/scenario/test/integration/kubernetes'
|
||||
autoload :Mattermost, 'qa/scenario/test/integration/mattermost'
|
||||
autoload :ObjectStorage, 'qa/scenario/test/integration/object_storage'
|
||||
autoload :SMTP, 'qa/scenario/test/integration/smtp'
|
||||
autoload :SSHTunnel, 'qa/scenario/test/integration/ssh_tunnel'
|
||||
autoload :Registry, 'qa/scenario/test/integration/registry'
|
||||
end
|
||||
|
||||
module Sanity
|
||||
autoload :Framework, 'qa/scenario/test/sanity/framework'
|
||||
autoload :Selectors, 'qa/scenario/test/sanity/selectors'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Classes describing structure of GitLab, pages, menus etc.
|
||||
#
|
||||
# Needed to execute click-driven-only black-box tests.
|
||||
#
|
||||
module Page
|
||||
autoload :Base, 'qa/page/base'
|
||||
autoload :View, 'qa/page/view'
|
||||
autoload :Element, 'qa/page/element'
|
||||
autoload :PageConcern, 'qa/page/page_concern'
|
||||
autoload :Validator, 'qa/page/validator'
|
||||
autoload :Validatable, 'qa/page/validatable'
|
||||
|
||||
module SubMenus
|
||||
autoload :Common, 'qa/page/sub_menus/common'
|
||||
end
|
||||
|
||||
module Main
|
||||
autoload :Login, 'qa/page/main/login'
|
||||
autoload :Menu, 'qa/page/main/menu'
|
||||
autoload :OAuth, 'qa/page/main/oauth'
|
||||
autoload :TwoFactorAuth, 'qa/page/main/two_factor_auth'
|
||||
autoload :Terms, 'qa/page/main/terms'
|
||||
end
|
||||
|
||||
module Registration
|
||||
autoload :SignUp, 'qa/page/registration/sign_up'
|
||||
autoload :Welcome, 'qa/page/registration/welcome'
|
||||
end
|
||||
|
||||
module Settings
|
||||
autoload :Common, 'qa/page/settings/common'
|
||||
end
|
||||
|
||||
module Dashboard
|
||||
autoload :Projects, 'qa/page/dashboard/projects'
|
||||
autoload :Groups, 'qa/page/dashboard/groups'
|
||||
autoload :Welcome, 'qa/page/dashboard/welcome'
|
||||
autoload :Todos, 'qa/page/dashboard/todos'
|
||||
|
||||
module Snippet
|
||||
autoload :New, 'qa/page/dashboard/snippet/new'
|
||||
autoload :Index, 'qa/page/dashboard/snippet/index'
|
||||
autoload :Show, 'qa/page/dashboard/snippet/show'
|
||||
autoload :Edit, 'qa/page/dashboard/snippet/edit'
|
||||
end
|
||||
end
|
||||
|
||||
module Group
|
||||
autoload :New, 'qa/page/group/new'
|
||||
autoload :Show, 'qa/page/group/show'
|
||||
autoload :Menu, 'qa/page/group/menu'
|
||||
autoload :Members, 'qa/page/group/members'
|
||||
autoload :BulkImport, 'qa/page/group/bulk_import'
|
||||
autoload :DependencyProxy, 'qa/page/group/dependency_proxy'
|
||||
|
||||
module Milestone
|
||||
autoload :Index, 'qa/page/group/milestone/index'
|
||||
autoload :New, 'qa/page/group/milestone/new'
|
||||
end
|
||||
|
||||
module SubMenus
|
||||
autoload :Common, 'qa/page/group/sub_menus/common'
|
||||
end
|
||||
|
||||
module Settings
|
||||
autoload :General, 'qa/page/group/settings/general'
|
||||
autoload :PackageRegistries, 'qa/page/group/settings/package_registries'
|
||||
end
|
||||
end
|
||||
|
||||
module Milestone
|
||||
autoload :Index, 'qa/page/milestone/index'
|
||||
autoload :New, 'qa/page/milestone/new'
|
||||
autoload :Show, 'qa/page/milestone/show'
|
||||
end
|
||||
|
||||
module File
|
||||
autoload :Form, 'qa/page/file/form'
|
||||
autoload :Show, 'qa/page/file/show'
|
||||
autoload :Edit, 'qa/page/file/edit'
|
||||
|
||||
module Shared
|
||||
autoload :CommitMessage, 'qa/page/file/shared/commit_message'
|
||||
autoload :CommitButton, 'qa/page/file/shared/commit_button'
|
||||
autoload :Editor, 'qa/page/file/shared/editor'
|
||||
end
|
||||
end
|
||||
|
||||
module Project
|
||||
autoload :New, 'qa/page/project/new'
|
||||
autoload :Show, 'qa/page/project/show'
|
||||
autoload :Activity, 'qa/page/project/activity'
|
||||
autoload :Menu, 'qa/page/project/menu'
|
||||
autoload :Members, 'qa/page/project/members'
|
||||
|
||||
module Artifact
|
||||
autoload :Show, 'qa/page/project/artifact/show'
|
||||
end
|
||||
|
||||
module Branches
|
||||
autoload :Show, 'qa/page/project/branches/show'
|
||||
end
|
||||
|
||||
module Commit
|
||||
autoload :Show, 'qa/page/project/commit/show'
|
||||
end
|
||||
|
||||
module Import
|
||||
autoload :Github, 'qa/page/project/import/github'
|
||||
autoload :RepoByURL, 'qa/page/project/import/repo_by_url'
|
||||
end
|
||||
|
||||
module Pipeline
|
||||
autoload :Index, 'qa/page/project/pipeline/index'
|
||||
autoload :Show, 'qa/page/project/pipeline/show'
|
||||
autoload :New, 'qa/page/project/pipeline/new'
|
||||
end
|
||||
|
||||
module PipelineEditor
|
||||
autoload :Show, 'qa/page/project/pipeline_editor/show'
|
||||
end
|
||||
|
||||
module Tag
|
||||
autoload :Index, 'qa/page/project/tag/index'
|
||||
autoload :New, 'qa/page/project/tag/new'
|
||||
autoload :Show, 'qa/page/project/tag/show'
|
||||
end
|
||||
|
||||
module Job
|
||||
autoload :Show, 'qa/page/project/job/show'
|
||||
end
|
||||
|
||||
module Packages
|
||||
autoload :Index, 'qa/page/project/packages/index'
|
||||
autoload :Show, 'qa/page/project/packages/show'
|
||||
end
|
||||
|
||||
module Registry
|
||||
autoload :Show, 'qa/page/project/registry/show'
|
||||
end
|
||||
|
||||
module Settings
|
||||
autoload :Advanced, 'qa/page/project/settings/advanced'
|
||||
autoload :Main, 'qa/page/project/settings/main'
|
||||
autoload :Repository, 'qa/page/project/settings/repository'
|
||||
autoload :CICD, 'qa/page/project/settings/ci_cd'
|
||||
autoload :Integrations, 'qa/page/project/settings/integrations'
|
||||
autoload :GeneralPipelines, 'qa/page/project/settings/general_pipelines'
|
||||
autoload :AutoDevops, 'qa/page/project/settings/auto_devops'
|
||||
autoload :DeployKeys, 'qa/page/project/settings/deploy_keys'
|
||||
autoload :DeployTokens, 'qa/page/project/settings/deploy_tokens'
|
||||
autoload :ProtectedBranches, 'qa/page/project/settings/protected_branches'
|
||||
autoload :CiVariables, 'qa/page/project/settings/ci_variables'
|
||||
autoload :Runners, 'qa/page/project/settings/runners'
|
||||
autoload :MergeRequest, 'qa/page/project/settings/merge_request'
|
||||
autoload :MirroringRepositories, 'qa/page/project/settings/mirroring_repositories'
|
||||
autoload :ProtectedTags, 'qa/page/project/settings/protected_tags'
|
||||
autoload :DefaultBranch, 'qa/page/project/settings/default_branch'
|
||||
autoload :VisibilityFeaturesPermissions, 'qa/page/project/settings/visibility_features_permissions'
|
||||
autoload :AccessTokens, 'qa/page/project/settings/access_tokens'
|
||||
|
||||
module Services
|
||||
autoload :Jira, 'qa/page/project/settings/services/jira'
|
||||
autoload :Jenkins, 'qa/page/project/settings/services/jenkins'
|
||||
autoload :Prometheus, 'qa/page/project/settings/services/prometheus'
|
||||
end
|
||||
autoload :Monitor, 'qa/page/project/settings/monitor'
|
||||
autoload :Alerts, 'qa/page/project/settings/alerts'
|
||||
autoload :Integrations, 'qa/page/project/settings/integrations'
|
||||
end
|
||||
|
||||
module SubMenus
|
||||
autoload :CiCd, 'qa/page/project/sub_menus/ci_cd'
|
||||
autoload :Common, 'qa/page/project/sub_menus/common'
|
||||
autoload :Issues, 'qa/page/project/sub_menus/issues'
|
||||
autoload :Monitor, 'qa/page/project/sub_menus/monitor'
|
||||
autoload :Deployments, 'qa/page/project/sub_menus/deployments'
|
||||
autoload :Infrastructure, 'qa/page/project/sub_menus/infrastructure'
|
||||
autoload :Repository, 'qa/page/project/sub_menus/repository'
|
||||
autoload :Settings, 'qa/page/project/sub_menus/settings'
|
||||
autoload :Project, 'qa/page/project/sub_menus/project'
|
||||
autoload :Packages, 'qa/page/project/sub_menus/packages'
|
||||
end
|
||||
|
||||
module Issue
|
||||
autoload :New, 'qa/page/project/issue/new'
|
||||
autoload :Show, 'qa/page/project/issue/show'
|
||||
autoload :Index, 'qa/page/project/issue/index'
|
||||
autoload :JiraImport, 'qa/page/project/issue/jira_import'
|
||||
end
|
||||
|
||||
module Fork
|
||||
autoload :New, 'qa/page/project/fork/new'
|
||||
end
|
||||
|
||||
module Milestone
|
||||
autoload :New, 'qa/page/project/milestone/new'
|
||||
autoload :Index, 'qa/page/project/milestone/index'
|
||||
end
|
||||
|
||||
module Deployments
|
||||
module Environments
|
||||
autoload :Index, 'qa/page/project/deployments/environments/index'
|
||||
end
|
||||
end
|
||||
|
||||
module Infrastructure
|
||||
module Kubernetes
|
||||
autoload :Index, 'qa/page/project/infrastructure/kubernetes/index'
|
||||
autoload :Add, 'qa/page/project/infrastructure/kubernetes/add'
|
||||
autoload :AddExisting, 'qa/page/project/infrastructure/kubernetes/add_existing'
|
||||
autoload :Show, 'qa/page/project/infrastructure/kubernetes/show'
|
||||
end
|
||||
end
|
||||
|
||||
module Monitor
|
||||
module Metrics
|
||||
autoload :Show, 'qa/page/project/monitor/metrics/show'
|
||||
end
|
||||
|
||||
module Incidents
|
||||
autoload :Index, 'qa/page/project/monitor/incidents/index'
|
||||
end
|
||||
end
|
||||
|
||||
module Wiki
|
||||
autoload :Edit, 'qa/page/project/wiki/edit'
|
||||
autoload :Show, 'qa/page/project/wiki/show'
|
||||
autoload :GitAccess, 'qa/page/project/wiki/git_access'
|
||||
autoload :List, 'qa/page/project/wiki/list'
|
||||
end
|
||||
|
||||
module WebIDE
|
||||
autoload :Edit, 'qa/page/project/web_ide/edit'
|
||||
end
|
||||
|
||||
module Snippet
|
||||
autoload :New, 'qa/page/project/snippet/new'
|
||||
autoload :Show, 'qa/page/project/snippet/show'
|
||||
autoload :Index, 'qa/page/project/snippet/index'
|
||||
end
|
||||
|
||||
module Secure
|
||||
autoload :ConfigurationForm, 'qa/page/project/secure/configuration_form'
|
||||
end
|
||||
end
|
||||
|
||||
module Profile
|
||||
autoload :Menu, 'qa/page/profile/menu'
|
||||
autoload :PersonalAccessTokens, 'qa/page/profile/personal_access_tokens'
|
||||
autoload :SSHKeys, 'qa/page/profile/ssh_keys'
|
||||
autoload :Emails, 'qa/page/profile/emails'
|
||||
autoload :Password, 'qa/page/profile/password'
|
||||
autoload :TwoFactorAuth, 'qa/page/profile/two_factor_auth'
|
||||
|
||||
module Accounts
|
||||
autoload :Show, 'qa/page/profile/accounts/show'
|
||||
end
|
||||
end
|
||||
|
||||
module User
|
||||
autoload :Show, 'qa/page/user/show'
|
||||
end
|
||||
|
||||
module Issuable
|
||||
autoload :New, 'qa/page/issuable/new'
|
||||
end
|
||||
|
||||
module Alert
|
||||
autoload :AutoDevopsAlert, 'qa/page/alert/auto_devops_alert'
|
||||
autoload :FreeTrial, 'qa/page/alert/free_trial'
|
||||
end
|
||||
|
||||
module Layout
|
||||
autoload :Banner, 'qa/page/layout/banner'
|
||||
autoload :Flash, 'qa/page/layout/flash'
|
||||
autoload :PerformanceBar, 'qa/page/layout/performance_bar'
|
||||
end
|
||||
|
||||
module Label
|
||||
autoload :New, 'qa/page/label/new'
|
||||
autoload :Index, 'qa/page/label/index'
|
||||
end
|
||||
|
||||
module MergeRequest
|
||||
autoload :New, 'qa/page/merge_request/new'
|
||||
autoload :Show, 'qa/page/merge_request/show'
|
||||
end
|
||||
|
||||
module Admin
|
||||
autoload :Menu, 'qa/page/admin/menu'
|
||||
autoload :NewSession, 'qa/page/admin/new_session'
|
||||
|
||||
module Settings
|
||||
autoload :General, 'qa/page/admin/settings/general'
|
||||
autoload :MetricsAndProfiling, 'qa/page/admin/settings/metrics_and_profiling'
|
||||
autoload :Network, 'qa/page/admin/settings/network'
|
||||
|
||||
module Component
|
||||
autoload :IpLimits, 'qa/page/admin/settings/component/ip_limits'
|
||||
autoload :OutboundRequests, 'qa/page/admin/settings/component/outbound_requests'
|
||||
autoload :AccountAndLimit, 'qa/page/admin/settings/component/account_and_limit'
|
||||
autoload :PerformanceBar, 'qa/page/admin/settings/component/performance_bar'
|
||||
autoload :SignUpRestrictions, 'qa/page/admin/settings/component/sign_up_restrictions'
|
||||
end
|
||||
end
|
||||
|
||||
module Overview
|
||||
module Users
|
||||
autoload :Index, 'qa/page/admin/overview/users/index'
|
||||
autoload :Show, 'qa/page/admin/overview/users/show'
|
||||
end
|
||||
|
||||
module Groups
|
||||
autoload :Index, 'qa/page/admin/overview/groups/index'
|
||||
autoload :Show, 'qa/page/admin/overview/groups/show'
|
||||
autoload :Edit, 'qa/page/admin/overview/groups/edit'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Mattermost
|
||||
autoload :Main, 'qa/page/mattermost/main'
|
||||
autoload :Login, 'qa/page/mattermost/login'
|
||||
end
|
||||
|
||||
module Search
|
||||
autoload :Results, 'qa/page/search/results'
|
||||
end
|
||||
|
||||
##
|
||||
# Classes describing components that are used by several pages.
|
||||
#
|
||||
module Component
|
||||
autoload :Breadcrumbs, 'qa/page/component/breadcrumbs'
|
||||
autoload :CiBadgeLink, 'qa/page/component/ci_badge_link'
|
||||
autoload :ClonePanel, 'qa/page/component/clone_panel'
|
||||
autoload :DesignManagement, 'qa/page/component/design_management'
|
||||
autoload :LazyLoader, 'qa/page/component/lazy_loader'
|
||||
autoload :LegacyClonePanel, 'qa/page/component/legacy_clone_panel'
|
||||
autoload :Dropzone, 'qa/page/component/dropzone'
|
||||
autoload :GroupsFilter, 'qa/page/component/groups_filter'
|
||||
autoload :Select2, 'qa/page/component/select2'
|
||||
autoload :DropdownFilter, 'qa/page/component/dropdown_filter'
|
||||
autoload :UsersSelect, 'qa/page/component/users_select'
|
||||
autoload :Note, 'qa/page/component/note'
|
||||
autoload :ConfirmModal, 'qa/page/component/confirm_modal'
|
||||
autoload :CustomMetric, 'qa/page/component/custom_metric'
|
||||
autoload :DesignManagement, 'qa/page/component/design_management'
|
||||
autoload :ProjectSelector, 'qa/page/component/project_selector'
|
||||
autoload :Snippet, 'qa/page/component/snippet'
|
||||
autoload :NewSnippet, 'qa/page/component/new_snippet'
|
||||
autoload :InviteMembersModal, 'qa/page/component/invite_members_modal'
|
||||
autoload :Wiki, 'qa/page/component/wiki'
|
||||
autoload :WikiSidebar, 'qa/page/component/wiki_sidebar'
|
||||
autoload :WikiPageForm, 'qa/page/component/wiki_page_form'
|
||||
autoload :AccessTokens, 'qa/page/component/access_tokens'
|
||||
autoload :CommitModal, 'qa/page/component/commit_modal'
|
||||
autoload :VisibilitySetting, 'qa/page/component/visibility_setting'
|
||||
autoload :ContentEditor, 'qa/page/component/content_editor'
|
||||
|
||||
module Import
|
||||
autoload :Gitlab, 'qa/page/component/import/gitlab'
|
||||
autoload :Selection, 'qa/page/component/import/selection'
|
||||
end
|
||||
|
||||
module Issuable
|
||||
autoload :Common, 'qa/page/component/issuable/common'
|
||||
autoload :Sidebar, 'qa/page/component/issuable/sidebar'
|
||||
end
|
||||
|
||||
module IssueBoard
|
||||
autoload :Show, 'qa/page/component/issue_board/show'
|
||||
end
|
||||
|
||||
module WebIDE
|
||||
autoload :Alert, 'qa/page/component/web_ide/alert'
|
||||
|
||||
module Modal
|
||||
autoload :CreateNewFile, 'qa/page/component/web_ide/modal/create_new_file'
|
||||
end
|
||||
end
|
||||
|
||||
module Project
|
||||
autoload :Templates, 'qa/page/component/project/templates'
|
||||
end
|
||||
end
|
||||
|
||||
module Trials
|
||||
autoload :New, 'qa/page/trials/new'
|
||||
autoload :Select, 'qa/page/trials/select'
|
||||
end
|
||||
|
||||
module Modal
|
||||
autoload :DeleteWiki, 'qa/page/modal/delete_wiki'
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Classes describing operations on Git repositories.
|
||||
#
|
||||
module Git
|
||||
autoload :Repository, 'qa/git/repository'
|
||||
autoload :Location, 'qa/git/location'
|
||||
end
|
||||
|
||||
##
|
||||
# Classes describing services being part of GitLab and how we can interact
|
||||
# with these services, like through the shell.
|
||||
#
|
||||
module Service
|
||||
autoload :Shellout, 'qa/service/shellout'
|
||||
autoload :KubernetesCluster, 'qa/service/kubernetes_cluster'
|
||||
autoload :Omnibus, 'qa/service/omnibus'
|
||||
autoload :PraefectManager, 'qa/service/praefect_manager'
|
||||
|
||||
module ClusterProvider
|
||||
autoload :Base, 'qa/service/cluster_provider/base'
|
||||
autoload :Gcloud, 'qa/service/cluster_provider/gcloud'
|
||||
autoload :Minikube, 'qa/service/cluster_provider/minikube'
|
||||
autoload :K3d, 'qa/service/cluster_provider/k3d'
|
||||
autoload :K3s, 'qa/service/cluster_provider/k3s'
|
||||
autoload :K3sCilium, 'qa/service/cluster_provider/k3s_cilium'
|
||||
end
|
||||
|
||||
module DockerRun
|
||||
autoload :Base, 'qa/service/docker_run/base'
|
||||
autoload :Jenkins, 'qa/service/docker_run/jenkins'
|
||||
autoload :LDAP, 'qa/service/docker_run/ldap'
|
||||
autoload :Maven, 'qa/service/docker_run/maven'
|
||||
autoload :NodeJs, 'qa/service/docker_run/node_js'
|
||||
autoload :GitlabRunner, 'qa/service/docker_run/gitlab_runner'
|
||||
autoload :MailHog, 'qa/service/docker_run/mail_hog'
|
||||
autoload :SamlIdp, 'qa/service/docker_run/saml_idp'
|
||||
autoload :K3s, 'qa/service/docker_run/k3s'
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Classes that make it possible to execute features tests.
|
||||
#
|
||||
module Specs
|
||||
autoload :Config, 'qa/specs/config'
|
||||
autoload :Runner, 'qa/specs/runner'
|
||||
autoload :ParallelRunner, 'qa/specs/parallel_runner'
|
||||
autoload :LoopRunner, 'qa/specs/loop_runner'
|
||||
|
||||
module Helpers
|
||||
autoload :ContextSelector, 'qa/specs/helpers/context_selector'
|
||||
autoload :ContextFormatter, 'qa/specs/helpers/context_formatter'
|
||||
autoload :Quarantine, 'qa/specs/helpers/quarantine'
|
||||
autoload :QuarantineFormatter, 'qa/specs/helpers/quarantine_formatter'
|
||||
autoload :RSpec, 'qa/specs/helpers/rspec'
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Classes that describe the structure of vendor/third party application pages
|
||||
#
|
||||
module Vendor
|
||||
module SAMLIdp
|
||||
module Page
|
||||
autoload :Base, 'qa/vendor/saml_idp/page/base'
|
||||
autoload :Login, 'qa/vendor/saml_idp/page/login'
|
||||
end
|
||||
end
|
||||
|
||||
module Jenkins
|
||||
module Page
|
||||
autoload :Base, 'qa/vendor/jenkins/page/base'
|
||||
autoload :Login, 'qa/vendor/jenkins/page/login'
|
||||
autoload :Configure, 'qa/vendor/jenkins/page/configure'
|
||||
autoload :NewCredentials, 'qa/vendor/jenkins/page/new_credentials'
|
||||
autoload :NewJob, 'qa/vendor/jenkins/page/new_job'
|
||||
autoload :LastJobConsole, 'qa/vendor/jenkins/page/last_job_console'
|
||||
autoload :ConfigureJob, 'qa/vendor/jenkins/page/configure_job'
|
||||
end
|
||||
end
|
||||
|
||||
module Jira
|
||||
autoload :JiraAPI, 'qa/vendor/jira/jira_api'
|
||||
end
|
||||
end
|
||||
|
||||
# Classes that provide support to other parts of the framework.
|
||||
#
|
||||
module Support
|
||||
module Page
|
||||
autoload :Logging, 'qa/support/page/logging'
|
||||
end
|
||||
autoload :Api, 'qa/support/api'
|
||||
autoload :Dates, 'qa/support/dates'
|
||||
autoload :Repeater, 'qa/support/repeater'
|
||||
autoload :Run, 'qa/support/run'
|
||||
autoload :Retrier, 'qa/support/retrier'
|
||||
autoload :Waiter, 'qa/support/waiter'
|
||||
autoload :WaitForRequests, 'qa/support/wait_for_requests'
|
||||
autoload :OTP, 'qa/support/otp'
|
||||
autoload :SSH, 'qa/support/ssh'
|
||||
autoload :AllureMetadataFormatter, 'qa/support/allure_metadata_formatter.rb'
|
||||
end
|
||||
root = "#{__dir__}/qa"
|
||||
|
||||
loader = Zeitwerk::Loader.new
|
||||
loader.push_dir(root, namespace: QA)
|
||||
|
||||
loader.ignore("#{root}/specs/features")
|
||||
|
||||
loader.inflector.inflect(
|
||||
"ce" => "CE",
|
||||
"ee" => "EE",
|
||||
"api" => "API",
|
||||
"ssh" => "SSH",
|
||||
"ssh_key" => "SSHKey",
|
||||
"ssh_keys" => "SSHKeys",
|
||||
"ecdsa" => "ECDSA",
|
||||
"ed25519" => "ED25519",
|
||||
"rsa" => "RSA",
|
||||
"ldap" => "LDAP",
|
||||
"ldap_tls" => "LDAPTLS",
|
||||
"ldap_no_tls" => "LDAPNoTLS",
|
||||
"ldap_no_server" => "LDAPNoServer",
|
||||
"rspec" => "RSpec",
|
||||
"web_ide" => "WebIDE",
|
||||
"ci_cd" => "CiCd",
|
||||
"repo_by_url" => "RepoByURL",
|
||||
"oauth" => "OAuth",
|
||||
"saml_sso_sign_in" => "SamlSSOSignIn",
|
||||
"saml_sso_sign_up" => "SamlSSOSignUp",
|
||||
"group_saml" => "GroupSAML",
|
||||
"instance_saml" => "InstanceSAML",
|
||||
"saml_sso" => "SamlSSO",
|
||||
"ldap_sync" => "LDAPSync",
|
||||
"ip_address" => "IPAddress",
|
||||
"gpg" => "GPG",
|
||||
"user_gpg" => "UserGPG",
|
||||
"smtp" => "SMTP",
|
||||
"otp" => "OTP",
|
||||
"jira_api" => "JiraAPI"
|
||||
)
|
||||
|
||||
loader.setup
|
||||
end
|
||||
|
||||
QA::Runtime::Release.extend_autoloads!
|
||||
|
|
|
@ -5,10 +5,6 @@ module QA
|
|||
module Strategy
|
||||
extend self
|
||||
|
||||
def extend_autoloads!
|
||||
# noop
|
||||
end
|
||||
|
||||
def perform_before_hooks
|
||||
# The login page could take some time to load the first time it is visited.
|
||||
# We visit the login page and wait for it to properly load only once before the tests.
|
||||
|
|
|
@ -67,7 +67,7 @@ module QA
|
|||
end
|
||||
|
||||
def login_to_idp_if_required(username, password)
|
||||
Vendor::SAMLIdp::Page::Login.perform { |login_page| login_page.login_if_required(username, password) }
|
||||
Vendor::SamlIdp::Page::Login.perform { |login_page| login_page.login_if_required(username, password) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,7 +4,6 @@ require 'cgi'
|
|||
require 'uri'
|
||||
require 'fileutils'
|
||||
require 'tmpdir'
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Git
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Page
|
||||
module Project
|
||||
|
|
|
@ -4,7 +4,7 @@ module QA
|
|||
module Page
|
||||
module Project
|
||||
module Settings
|
||||
class CICD < Page::Base
|
||||
class CiCd < Page::Base
|
||||
include QA::Page::Settings::Common
|
||||
|
||||
view 'app/views/projects/settings/ci_cd/show.html.haml' do
|
||||
|
@ -43,4 +43,4 @@ module QA
|
|||
end
|
||||
end
|
||||
|
||||
QA::Page::Project::Settings::CICD.prepend_mod_with("Page::Project::Settings::CICD", namespace: QA)
|
||||
QA::Page::Project::Settings::CiCd.prepend_mod_with("Page::Project::Settings::CiCd", namespace: QA)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'pathname'
|
||||
|
||||
module QA
|
||||
module Page
|
||||
class View
|
||||
|
|
|
@ -55,7 +55,7 @@ module QA
|
|||
end
|
||||
end
|
||||
|
||||
include Support::Api
|
||||
include Support::API
|
||||
attr_writer :api_resource, :api_response
|
||||
|
||||
def api_put(body = api_put_body)
|
||||
|
|
|
@ -22,7 +22,7 @@ module QA
|
|||
|
||||
Page::Project::Menu.perform(&:go_to_ci_cd_settings)
|
||||
|
||||
Page::Project::Settings::CICD.perform do |setting|
|
||||
Page::Project::Settings::CiCd.perform do |setting|
|
||||
setting.expand_ci_variables do |page|
|
||||
page.click_add_variable
|
||||
page.fill_variable(key, value, masked)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class Issue < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
module KubernetesCluster
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
# Base label class for GroupLabel and ProjectLabel
|
||||
|
|
|
@ -12,7 +12,7 @@ module QA
|
|||
QA::Runtime::Logger.debug(%Q[Adding user #{user.username} to #{full_path} #{self.class.name}])
|
||||
|
||||
response = post Runtime::API::Request.new(api_client, api_members_path).url, { user_id: user.id, access_level: access_level }
|
||||
response.code == QA::Support::Api::HTTP_STATUS_CREATED
|
||||
response.code == QA::Support::API::HTTP_STATUS_CREATED
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -31,7 +31,7 @@ module QA
|
|||
QA::Runtime::Logger.debug(%Q[Sharing #{self.class.name} with #{group.name}])
|
||||
|
||||
response = post Runtime::API::Request.new(api_client, api_share_path).url, { group_id: group.id, group_access: access_level }
|
||||
response.code == QA::Support::Api::HTTP_STATUS_CREATED
|
||||
response.code == QA::Support::API::HTTP_STATUS_CREATED
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class MergeRequest < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class MergeRequestFromFork < MergeRequest
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class Package < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class Project < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'octokit'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class ProjectImportedFromGithub < Resource::Project
|
||||
|
@ -68,7 +66,7 @@ module QA
|
|||
response = post(request_url(api_trigger_mirror_pull_path), nil)
|
||||
|
||||
Runtime::Logger.info "Mirror pull request response: #{response}"
|
||||
response.code == Support::Api::HTTP_STATUS_OK
|
||||
response.code == Support::API::HTTP_STATUS_OK
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class ProjectImportedFromURL < Resource::Project
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class ProjectIssueNote < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class ProtectedBranch < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class RegistryRepository < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
module Repository
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'pathname'
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
module Repository
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class Runner < Base
|
||||
|
|
|
@ -72,7 +72,7 @@ module QA
|
|||
Support::Retrier.retry_until(max_duration: QA::EE::Runtime::Geo.max_db_replication_time, sleep_interval: 3) do
|
||||
response = get Runtime::API::Request.new(api_client, api_get_path).url
|
||||
|
||||
response.code == QA::Support::Api::HTTP_STATUS_OK &&
|
||||
response.code == QA::Support::API::HTTP_STATUS_OK &&
|
||||
parse_body(response)[:title].include?(title)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
class User < Base
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Resource
|
||||
module Wiki
|
||||
|
|
|
@ -12,8 +12,6 @@ module QA
|
|||
def configure!
|
||||
return unless Env.generate_allure_report?
|
||||
|
||||
require 'allure-rspec'
|
||||
|
||||
configure_allure
|
||||
configure_attachments
|
||||
configure_rspec
|
||||
|
|
|
@ -5,7 +5,7 @@ module QA
|
|||
module API
|
||||
module RepositoryStorageMoves
|
||||
extend self
|
||||
extend Support::Api
|
||||
extend Support::API
|
||||
|
||||
RepositoryStorageMovesError = Class.new(RuntimeError)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ module QA
|
|||
module Runtime
|
||||
class ApplicationSettings
|
||||
class << self
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
APPLICATION_SETTINGS_PATH = '/application/settings'
|
||||
|
||||
|
@ -18,7 +18,7 @@ module QA
|
|||
|
||||
QA::Runtime::Logger.info("Setting application settings: #{application_settings}")
|
||||
r = put(Runtime::API::Request.new(api_client, APPLICATION_SETTINGS_PATH).url, **application_settings)
|
||||
raise "Couldn't set application settings #{application_settings.inspect}" unless r.code == QA::Support::Api::HTTP_STATUS_OK
|
||||
raise "Couldn't set application settings #{application_settings.inspect}" unless r.code == QA::Support::API::HTTP_STATUS_OK
|
||||
end
|
||||
|
||||
def get_application_settings
|
||||
|
|
|
@ -4,7 +4,6 @@ require 'rspec/core'
|
|||
require 'rspec/expectations'
|
||||
require 'capybara/rspec'
|
||||
require 'capybara-screenshot/rspec'
|
||||
require 'selenium-webdriver'
|
||||
require 'webdrivers/chromedriver'
|
||||
require 'webdrivers/geckodriver'
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'active_support/deprecation'
|
||||
require 'gitlab/qa'
|
||||
require 'uri'
|
||||
|
||||
module QA
|
||||
|
|
|
@ -8,7 +8,7 @@ module QA
|
|||
class << self
|
||||
# Documentation: https://docs.gitlab.com/ee/api/features.html
|
||||
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
SetFeatureError = Class.new(RuntimeError)
|
||||
AuthorizationError = Class.new(RuntimeError)
|
||||
|
@ -17,7 +17,7 @@ module QA
|
|||
def remove(key)
|
||||
request = Runtime::API::Request.new(api_client, "/features/#{key}")
|
||||
response = delete(request.url)
|
||||
unless response.code == QA::Support::Api::HTTP_STATUS_NO_CONTENT
|
||||
unless response.code == QA::Support::API::HTTP_STATUS_NO_CONTENT
|
||||
raise SetFeatureError, "Deleting feature flag #{key} failed with `#{response}`."
|
||||
end
|
||||
end
|
||||
|
@ -100,7 +100,7 @@ module QA
|
|||
scopes[:user] = scopes[:user].username if scopes.key?(:user)
|
||||
request = Runtime::API::Request.new(api_client, "/features/#{key}")
|
||||
response = post(request.url, scopes.merge({ value: value }))
|
||||
unless response.code == QA::Support::Api::HTTP_STATUS_CREATED
|
||||
unless response.code == QA::Support::API::HTTP_STATUS_CREATED
|
||||
raise SetFeatureError, "Setting feature flag #{key} to #{value} failed with `#{response}`."
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,7 +5,7 @@ require 'tmpdir'
|
|||
module QA
|
||||
module Runtime
|
||||
module Fixtures
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
TemplateNotFoundError = Class.new(RuntimeError)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ require 'socket'
|
|||
module QA
|
||||
module Runtime
|
||||
module IPAddress
|
||||
include Support::Api
|
||||
include Support::API
|
||||
HostUnreachableError = Class.new(StandardError)
|
||||
|
||||
LOOPBACK_ADDRESS = '127.0.0.1'
|
||||
|
@ -15,7 +15,7 @@ module QA
|
|||
# we use the public facing IP address
|
||||
ip_address = if Env.running_in_ci? && !URI.parse(Scenario.gitlab_address).host.include?('test')
|
||||
response = get(PUBLIC_IP_ADDRESS_API)
|
||||
raise HostUnreachableError, "#{PUBLIC_IP_ADDRESS_API} is unreachable" unless response.code == Support::Api::HTTP_STATUS_OK
|
||||
raise HostUnreachableError, "#{PUBLIC_IP_ADDRESS_API} is unreachable" unless response.code == Support::API::HTTP_STATUS_OK
|
||||
|
||||
response.body
|
||||
elsif page.current_host.include?('localhost')
|
||||
|
|
|
@ -13,10 +13,6 @@ module QA
|
|||
# CE to EE.
|
||||
#
|
||||
class Release
|
||||
def initialize
|
||||
require "qa/#{version.downcase}/strategy"
|
||||
end
|
||||
|
||||
def version
|
||||
@version ||= ::File.directory?("#{__dir__}/../ee") ? :EE : :CE
|
||||
end
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Runtime
|
||||
module Search
|
||||
extend self
|
||||
extend Support::Api
|
||||
extend Support::API
|
||||
|
||||
RETRY_MAX_ITERATION = 10
|
||||
RETRY_SLEEP_INTERVAL = 12
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'resolv'
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
module Service
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
require 'mkmf'
|
||||
require 'pathname'
|
||||
|
||||
module QA
|
||||
module Service
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'octokit'
|
||||
|
||||
# rubocop:disable Rails/Pluck
|
||||
module QA
|
||||
# Only executes in custom job/pipeline
|
||||
|
|
|
@ -4,7 +4,7 @@ require 'airborne'
|
|||
|
||||
module QA
|
||||
RSpec.describe 'Plan' do
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
describe 'Issue' do
|
||||
let(:issue) do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
describe 'Default branch name instance setting', :requires_admin, :skip_live_env do
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'airborne'
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'API basics' do
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'airborne'
|
||||
require 'securerandom'
|
||||
require 'digest'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
describe 'Compare archives of different user projects with the same name and check they\'re different' do
|
||||
include Support::Api
|
||||
include Support::API
|
||||
let(:project_name) { "project-archive-download-#{SecureRandom.hex(8)}" }
|
||||
|
||||
let(:archive_types) { %w(tar.gz tar.bz2 tar zip) }
|
||||
|
|
|
@ -4,7 +4,7 @@ require 'airborne'
|
|||
|
||||
module QA
|
||||
RSpec.describe 'Package', only: { subdomain: %i[staging pre] } do
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
describe 'Container Registry' do
|
||||
let(:api_client) { Runtime::API::Client.new(:gitlab) }
|
||||
|
|
|
@ -3,12 +3,15 @@
|
|||
module QA
|
||||
RSpec.describe 'Manage', :orchestrated, :instance_saml do
|
||||
describe 'Instance wide SAML SSO' do
|
||||
it 'user logs in to gitlab with SAML SSO', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/671' do
|
||||
it(
|
||||
'user logs in to gitlab with SAML SSO',
|
||||
testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/671'
|
||||
) do
|
||||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||
|
||||
Page::Main::Login.perform(&:sign_in_with_saml)
|
||||
|
||||
Vendor::SAMLIdp::Page::Login.perform do |login_page|
|
||||
Vendor::SamlIdp::Page::Login.perform do |login_page|
|
||||
login_page.login('user1', 'user1pass')
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'nokogiri'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do
|
||||
describe 'Check for broken images', :requires_admin do
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
module QA
|
||||
RSpec.describe 'Plan', :orchestrated, :smtp, :requires_admin do
|
||||
describe 'Email Notification' do
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
let!(:user) do
|
||||
Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Plan', :reliable do
|
||||
describe 'Issues list' do
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
# frozen_string_literal: true
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Create', :requires_admin, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/195179', type: :flaky } do
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
describe 'Jira integration', :jira, :orchestrated, :requires_admin do
|
||||
let(:jira_project_key) { 'JITP' }
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
describe 'File templates' do
|
||||
|
|
|
@ -9,7 +9,7 @@ module QA
|
|||
# tests are run in parallel).
|
||||
# See: https://gitlab.com/gitlab-org/gitlab/-/issues/218620#note_361634705
|
||||
|
||||
include Support::Api
|
||||
include Support::API
|
||||
|
||||
before(:context) do
|
||||
@project = Resource::Project.fabricate_via_api! do |p|
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
describe 'Web IDE file templates' do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'faker'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner do
|
||||
describe 'Pipeline with protected variable' do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'faker'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner do
|
||||
describe 'Include multiple files from a project' do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'faker'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner do
|
||||
context 'When pipeline is blocked' do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'faker'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner do
|
||||
context 'When job is configured to only run on merge_request_events' do
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'faker'
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner do
|
||||
describe 'Pass dotenv variables to downstream via bridge' do
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue